GitChat · 人工智能 | 人工智能产品测试方法探索

程序员用GitChat赚钱的6种方法 GitChat出来没多久,我就开始使用了,算是有一些经验,今天给大家分享下用GitChat赚钱的6种方法 GitChat平什么 先说下GitChat这个平台,其主页是:https://gitbook.cn/,微信中可以直接搜索“GitChat”找到它的服务号,关注后可以使用。现在还有对应的APP,也可以下载使用。 GitChat是针对技术人的知识付费平台,创始人是谢工,中途被优快云收购,现在属于... 阅读详情

GitChat 作者:孙高飞
原文: 人工智能产品测试方法探索
关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术

自我介绍

大家好,我叫孙高飞,是来自第四范式的测试开发工程师。 今天我想跟大家讨论一下要如何测试人工智能相关的产品。我们知道人工智能是出了名的难测试,不论是我们以前在互联网就经常看到的内容推荐系统,还是金融领域常用的信息分类系统。

测试介入的都不多。 我们最常做的测试其实就是直接看模型效果, 效果不好就慢慢调。你也说不清是不是有bug。 为了改变这种现状,我们希望测试人员也能做一些事情,参与到人工智能服务的质量保证当中来。 所以我们在日常工作中总结了一些经验跟大家讨论一下。

什么是人工智能

再讲如何测试人工智能产品之前,我觉得我要先跟不熟悉人工智能的同学们解释一下什么是人工智能。毕竟想要测试一个东西,就要先了解它么。用一句话来概括现阶段的人工智能就是:人工智能=大数据+机器学习。

我理解的现阶段的人工智能是使用机器学习算法在大量的历史数据下进行训练,从历史数据中找到一定的规律并对未来做出的预测行为。这么说有点拗口。我举个例子,我们曾经给银行做过反欺诈项目。

以前在银行里有一群专家,他们的工作就是根据经验向系统中输入一些规则。例如某一张卡在一个城市有了一笔交易,之后1小时内在另一个城市又有了一笔交易。这些专家根据以前的经验判断这种情况是有盗刷的风险的。

他们在系统中输入了几千条这样的规则,组成了一个专家系统。 这个专家系统是建立在人类对过往的数据所总结出的经验下建立的。 后来我们引入了机器学习算法,对过往所有的历史数据进行训练,最后在25亿个特征中抽取出8000万条有效特征。

大家可以把这些特征就暂且当成是专家系统中的规则。8000万对不到1万,效果是可以预想的。当时对第一版模型上线后的数据做统计,反欺诈效果提升了7倍, 这就是二分类算法典型的业务场景。

为什么叫机器学习呢,因为它给人一种感觉,机器能像人类一样从过去的数据中学习到经验,只不过机器的能力更强。 如果想再稍微深究一下机器学习训练出来的模型到底是什么,那大家可以暂且理解为一个二分类的模型主要是就是一个key,value的数据库。

key就是在数据中抽取出来的特征,value就是这个特征的权重。 当我们想要预测一个用户的行为的时候,就会从用户的数据中提取特征并在模型中查找对应的权重。 最后根据这些特征的权重算出一个分,也可以说是一个概率。 如果大家看过最强大脑这个节目的话。

应该记得第一次人机大战项目是人脸识别,第三回合的时候机器给出了两个答案。因为当时做人脸识别项目的志愿者中有一对双胞胎。所以机器计算出的这两个人的概率只差了0.1%,最后为了谨慎起见机器输出两个答案出来。以至于吴恩达先生也很纠结到底该选哪一个答案。

再之后的人机对战项目里我们也能看到虽然小度一路高歌,毫无败绩。但是其中是有选错过几次的。所以大家可以看到我们得到的答案其实是一个概率,是一个根据以往的数据进行总结并作出预测的一个行为。并不是100%准确的。即便是阿尔法狗当初也是输过一局的。所以其实我们测试的痛点也就来了,你怎么测试一个概率呢。 接下来我们慢慢的来说这个问题。

enter image description here

这个图就是一个人工智能服务的略缩图。 在历史数据上训练出模型,并发布一个预测服务,这个预测服务可能就是一个http的接口。 然后新的数据过来以后,根据模型算出一个预测值。经过刚才的说明,我们看到数据是人工智能的根本。拥有的数据越多,越丰富,越真实,那么训练出的模型效果越好。

测试思路

  • 数据测试
  • 分层测试
  • 训练集与测试集对比
数据测试

根据我们之前对人工智能的定义,我们发现数据是人工智能的根据。 保证数据的正确定是非常必要的。 而且几乎所有的机器学习算法对数据的容错能力都很强,即便数据稍有偏差,它们也能通过一次一次的迭代和对比来减少误差。 所以即便我们的数据有一点问题最后得出的模型效果可能还不差, 但是这个时候我们不能认为模型就没问题了。 因为很可能在某些特定场景下就会出现雪崩效应。

再举个例子。当初阿尔法狗与李世石一战成名。如果说前三盘的结果令各路专家大跌眼镜的话。那第四盘可能是让所有人都大跌眼镜了。阿尔法狗连出昏招,几乎是将这一局拱手相让。那阿尔法狗出bug了?DeepMind团队说,这是一个系统问题。那我们来看看这个系统到底有什么问题。根据当时公布出来的数据我们发现阿尔法狗的养成方法是这样的。

阿尔法狗如何养成
  1. 整理过去人类对弈的80多万盘棋局

  2. 拿1的棋谱,训练一只狗狗,能够预测人类下一步会下在哪里

  3. 拿2得到的狗狗,每天自己和自己下100万盘棋

  4. 拿1和3的棋谱,再训练一只狗狗,这就是阿尔法狗。

阿尔法狗是基于1亿+盘机器棋局和80万人类棋局训练出来的狗狗。问题出在哪?我们看到,训练阿尔法狗所用的棋谱,只有80万是人类棋局,总数上亿的棋局是机器对弈的。它下的每一步,都是将局面导向历史上(也就是80万人类棋局和1亿自己对弈的棋局)胜率最大的局面。

问题就恰恰出在这里,80万和1亿。相差甚多。那么阿尔法狗选择的所谓胜率最大,一定是赢自己的概率最大,而不是赢人类的概率最大。这样的标准在顺丰棋尚且不容易出问题,一旦遇到逆风局,它的选择就变成了,选择对手犯错概率最大的棋,而这个对手恰恰就是它自己。

这就是为什么当初阿尔法狗在逆风局中下出一些匪夷所思的棋。当然这些都只是行业内的人的猜测。但从这个例子就可以看到数据的重要性。数据出现偏差会直接导致不可估计的后果。

所以我们总结出的第一个突破口就是数据测试。保证我们用来建模的数据是正确的。在这里的数据测试会跟我们以往的测试有些不一样。

  1. 首先是数据规模的增长。数据大了里面的有些数据可能会发生一些很诡异的事情。

  2. 然后是存储介质和技术栈的变化,我们用来训练模型的数据都会存放在hadoop集群上,所以一般都会用spark或者Hbase来编写测试脚本。

  3. 最后是验证方式的变化,之前我们测试的时候都是精确的测试每条数据的正确性。 但是现在我们需要根据业务设定每一个字段的规则。然后扫描每一行数据,如果这条数据超出了这个字段的规定范围,会发出报警。 假如用户年龄这个字段,正常值可能是0~100岁。如果突然出现个300岁,那么这条数据肯定是有问题的。我们之前曾经碰见过这样的数据。本来这条数据应该是30岁的,但不知道抽了什么风多了个0.

针对这方面的测试,一般都是使用spark或者Hbase这种大数据处理框架把任务提交到集群上去扫描每一张表。 这方面不多说了,脚本其实蛮好写的,只是需要十分熟悉业务,才能制定出相应的规则去扫表。

分层测试

虽然我们能测试用来做训练的数据是正确的。但是一个人工智能系统是很复杂的, 我们只是保证了作为源头的数据貌似是不够的。以前我们测试的时候都知道把系统拆解开做分层测试,所以我们的第二个突破口就是基于这个思路。我们先来了解一下,一个模型的诞生都经理了哪些步骤。

模型诞生的步骤:

  • 数据引入

  • 数据处理(清洗,拆分,拼接等)

  • 特征工程

  • 模型训练

  • 模型上线

数据引入:将历史数据引入到系统中,并做第一步的预处理。例如处理一些明显的异常的行。

数据处理: 其中又包含很多种操作。 例如对数据进行清洗,拆分。 把两张表进行拼接等。

特征工程:我们从数据中按一定规律提取一些特征出来。之后需要将提取的样本表传递给机器学习算法进行训练

enter image description here

可以看到我们把数据引入到系统后,先是用SQL算子对数据做了拼接,然后清洗一些无效数据。 再把数据拆分为训练集和测试集。分别对两个数据集做特征抽取。之后训练集传递给逻辑回归这个机器学习算法进行训练。训练之后使用测试集来测试一下模型的效果。大家看到这个图了,这是创建一个模型比较常见的流程。

图中的逻辑归回就是一种机器学习算法,也是一种最简单的二分类算法,其他的算法诸如 GBDT,SVM,DNN等算法的模型都是这个流程。我们可以看到算法上面的流程。全部与机器学习无关。他们都属于大数据处理范畴。而且一个成型的系统在每一个模块都会提供一些固定的接口。

例如我们公司在特征抽取算法上就提供了近百个特征抽取的接口,可以根据不同的情况使用不同的方式提取数据中的特征。 数据拆分也有很多种不同的拆分方法,按随机拆分,分层拆分,规则拆分。

每个子模块都会提供一些接口供上层调用。 所以既然提到接口层面的东西了,大家应该都知道怎么测了吧。 只不过有些接口并不是http或者RPC协议的。 有时候需要我们在产品的repo里写测试用例。

训练集与测试集对比

enter image description here

这是我们的第三种测试思路。 我们刚才一直用来举例的分类算法是一种监督学习。 什么是监督学习呢,就是我们的历史数据中是有答案的。还拿刚才的反欺诈的例子说,就是我们的数据中都有一个字段标明了这条数据是否是欺诈场景。 所以我们完全可以把历史数据拆分为训练集和测试集。将测试集输入到模型中以评价模型预测出的结果的正确率如何。所以每次版本迭代都使用同样的数据,同样的参数配置。 统计模型效果并进行对比。当然这种测试方式是一种模糊的方式。就如我再刚开始说的一样,这种方式无法判断问题出在哪里。是bug,还是参数设置错了?我们无法判断。

常见的测试场景

自学习

enter image description here

enter image description here

几乎所有的人工智能服务都必须要支持自学习场景。就像阿尔法狗一样,它输了一局,就会从输的这一局中学习到经验,以后他就不会那么下了,这也是机器学习恐怖的地方,它会变的越来越无懈可击,以前人类还能赢上一局,但是未来可能人类再也赢不了阿尔法狗了。 做法就是我们的数据每天都是在更新的,用户行为也是一直在变化的。所以我们的模型要有从最新的数据中进行学习的能力。

上面是常见的自学习场景流程图。假如我们用历史上n天的数据训练出一个模型并发布成了一个预测的服务。 那么到了隔天的时候。我们抛弃之前第一天的数据,使用第二天到第n+1天的数据重新训练一个模型并代替之前的模型发布一个预测服务。这样不停的循环,每一天都收集到最新的数据参与模型训练。 这时候大家应该明白该测试什么了。每天收集到的新数据,就是测试重点。就是我们刚才说的第一种测试思路,使用spark,Hbase这些技术,根据业务指定规则,扫描这些数据。一旦有异常就要报警。

预测服务

下面一个场景是预测服务的。预测服务的架构一般都满复杂的,为了实现高可用,负载均衡等目的,所以一般都是标准的服务发现架构。以etcd这种分布式存储机制为载体。 所有的预测服务分别以自注册的方式来提供服务。

enter image description here

上面的一个图是一个比较流行的预测服务的架构。当然我做了相应的简化,隐去了一些细节。所有的部署任务由master写入ETCD。 所有agent以自注册的方式将自己的信息写入ETCD以接受master的管理并执行部署任务。 而router也同样读取etcd获取所有agent提供的预测服务的信息并负责负载均衡。 有些公司为了做高可用和弹性伸缩甚至将agent纳入了kubernetes的HPA中进行管理。由此我们需要测试这套机制能实现他该有的功能。例如:

  • router会按规则把压力分发到各个agent上。

  • 把某个agent的预测服务被kill掉后,router会自动切换。

  • 预估服务挂掉,agent会自动感知并重新拉起服务。

  • agent被kill掉后,也会被自动拉起。

  • 如果做了弹性伸缩,需要将预测服务压到临界点后观察系统是否做了扩容等等。

性能测试

我们要接触的性能测试跟互联网的不太一样。我们知道预测服务仍然还是访问密集型业务。但是模型调研的过程是属于计算密集型业务。我们要模拟的情况不再是高并发。而是不同的数据规模,数据分布和数据类型。我们日常的性能测试都是需要在各种不同的数据下跑各种不同的算子和参数。所以我们首先需要一种造数机制,能帮助我们按需求生成大规模的数据。我们选择的是spark,利用分布式计算在hadoop集群上生成大量的数据。

原理也很简单,接触过spark的同学肯定都知道在spark中生成一个RDD有两种方式, 一种是从文件中读取,另一种是从内存中的一个list种解析。第一种方式肯定不是我们想要的, 所以从内存中的list解析就是我们选择的方式。假如我们想生成一个10亿行的数据。就可以先使用python 的xrange造一个生成器以防止内存被撑爆。然后用这个生成器初始化一个有着10亿行的空的RDD,定义并操作RDD的每一行去生成我们想要的数据,然后设置RDD的分片以及消耗的container,内存,cpu等参数。提交到集群上利用集群庞大的计算资源帮助我们在段时间内生成我们需要的数据。 前两天我再一个3个节点的集群上造过一个1.5T的数据,大概用了5个小时。这样一开始的时候我们是写spark脚本来完成这些事。后来需求越来越多,我们发现可以造数做成一个工具。把表和字段都提取到配置文件中进行定义。就这样我们成立了shannon这个项目。慢慢的从造数脚本到造数工具再到造数平台。

它的架构特别简单,就是对原生spark的应用,这里我就不展示spark的架构是什么样了。就贴一下造数工具的设计图吧。

enter image description here

简单来说shannon分了3层。最底层是基本数据类型层。负责字段实例化,定义并实现了shannon支持的所有数据类型。例如,随机,枚举,主键,unique key,控制分布,大小,范围等等。

测试环境管理

常见的测试场景我们基本上都说完了。 我们再说一说测试环境管理的问题。 为了能够保证研发和测试效率,一个能够支撑大规模测试环境的基础设施是十分必要的。为什么这么说呢?

  • 首先但凡是涉及到机器学习的业务,运行时间都非常慢。 有时候做测试的时候跑一个模型要几个小时甚至一天都是有的。也就是说,我们运行测试的成本比较高。如果在运行测试的途中环境出了什么问题那么损失还是很大的。多人共用一套环境难免会有互相踩踏的情况,例如一个RD在测试自己的模块,另一个人上来把服务重启了。这时候我们心里一般就是一万头某种动物飘过。所以我们一般希望每个人都能拥有一套独立的环境甚至一个人多套环境。这就增加了测试环境的数量。尤其是团队越来越大的时候,测试环境的数量已经到达了一个恐怖的量级。

  • 其次如果各位所在的公司也像我们一样做TO B的业务,那么我们的测试环境就需要多版本管理,要有能力随时快速的搭建起特定版本的产品环境供开发,产品,测试,以及技术支持人员使用。所以这无疑又增加了环境管理设置的复杂度。

  • 再有就是随着环境数量的扩张,我们的环境从单节点走向集群,这时候我们对环境调度能力的要求会比较高,例如我们要对环境的资源进行计算和限制,保证最大化利用资源的同时不会撑爆系统。例如我们要保证系统有足够的冗余,在某些环境出现故障的时候能够自动检测出来并在冗余节点进行恢复。例如我们需要能够实现多租户管理,执行资源管控,限制超售行为. 例如我们希望系统有一定能力的无人值守运维能力等等。

所以我们经过一段时间的讨论和实验,引入了k8s+docker来完成这个目标。docker的优势大家应该都知道,快速,标准化,隔离性,可迁移性都不错。 通过镜像我们可以迅速的将测试环境的数量提升一个量级,镜像的版本管理正适合TO B业务的多版本管理。 之所以选择k8s,是因为k8s相较于swarm和mesos 都拥有着更强大的功能和更简单的部署方式。刚才说的预测服务需要部署很多个agent,使用k8s的话只需要设置一下replica set的数量,k8s就会自动帮我们维护好这个数量的实例了,很方便 。k8s的调度机制能很轻松的满足我们刚才说的对于灾难恢复,冗余,多租户,高可用,负载均衡,资源管理等要求。所以我们当初怀揣着对google莫名的憧憬走上了k8s的踩坑之旅。

enter image description here

首先说一下我们都用容器做什么。主要三大类,第一种是诸如testlink,jenkins这种基础服务。第二种是产品的测试环境,这是占比最多的。然后就是我们的测试执行机器了。例如UI自动化,我们采取的是分别将selenium hub和node docker化的做法。如下图:

enter image description here

当UI自动化的case增多的时候,分布式运行往往是最好的解决方案。 目前我们通过这种方式容器化了20个浏览器进行并发测试。这些镜像都有官方的版本,使用起来还是蛮方面的。

然后说一下比较关键的网络解决方案,我们从单机到集群,中途历经了集中网络模型的变化。从一开始的端口映射,到利用路由规则给容器分配真实的ip,再到给每个容器在DHCP和DNS服务器上注册和续租。到最后我们演进出了下面这个k8s的网络模型。

enter image description here

我们知道每个docker宿主机都会自己维护一个私有网络。如果想让容器跨主机通讯或者外部访问容器。一般就是通过三种方式: 端口映射,路由规则以及overlay网络。我们选择在k8s中引入的overlay网络是weave,以解决夸主机通信问题。安装kube-dns实现服务发现。之后为了能让外部访问容器服务, 使用了k8s提供的ingress机制来实现。这个ingress网络其实就是在集群中启动一个容器,这个容器既能访问容器网络的同是还监听了宿主机的80端口。容器里是一个nginx,它会负责帮忙转发请求。nginx负责转发的有servicename和path,这里我们是无法使用路径进行转发的。所以我们在公司内部的DNS上做了泛域名解析。所有testenv为后缀的域名都会解析成集群的master节点的ip。这样我们的请求就能命中nginx中固定的servicename并做转发了。通过这种机制我们就可以很方面的访问容器提供的服务。当然ingress的缺点是暂时还无法做4层转发。如果要访问4层协议的服务暂时还是只能暴露node port。

我们这个测试环境的管理平台主要的架构是这样的:

enter image description here

集群中所有的镜像都过公司内部搭建的镜像仓库进行共享,我们在集群之上安装了各种服务来满足测试环境的需要。例如使用NFS做数据持久化,Heapster+Grafana+InfluxDB做性能监控,kube-DNS做服务发现,dashboard提供web管理界面,weave做集群网络,ingress做服务的转发。并且我们在这个整体上针对k8s的APIserver做了一层cli的封装。我们尝试过脚本管理,web服务管理,但是发现大家对这些方式的接受度都不高。我们面对的大多数都是一帮做梦都在写代码的人,所以我们换做提供一个cli的方式可以让使用者更灵活来定制自己需要的服务。通过这种形式,我们在公司内部搭建了一个可以提供测试资源的私有云,配合jenkins我们可以很方便的一键部署我们需要的环境并执行UT,接口,UI自动化测试等等,并提供一个详细的测试报告。下面是我们的部署一个环境后所提供的测试报告。

enter image description here

好了,关于k8s+docker的内容我暂时就讲到这,其实这块内容比较多,完全可以单独拉出来当做一个topic来讲了。但是今天由于时间限制我们先讲这么多吧。我今天的分享也就到此结束了。关于人工智能类产品的测试我们也属于摸着石头过河,还有很多不足的地方。


实录:《孙高飞:人工智能产品测试方法实战解析》


这里写图片描述

LVGL在RTOS下的线程安全实践:从卡死到流畅的界面切换 本文探讨LVGL在RTOS环境下的线程安全实践,重点分析FreeRTOS多任务同步机制,包括互斥锁、任务通知和消息队列方案。通过实际案例展示如何避免界面卡顿和系统死锁,实现从卡死到流畅的界面切换,为嵌入式GUI开发提供可靠的适配解决方案。 阅读详情

相关推荐

STM32实战:滑模观测器与PLL锁相环融合的FOC无感控制精解

本文深入解析了STM32平台下结合滑模观测器(SMO)与PLL锁相环的无感FOC控制技术。通过实战案例详细介绍了PLL锁相环在消除SMO高频抖振、提升角度跟踪精度方面的关键作用,并分享了工程调参技巧、C语言实现细节及系统联调方法,为电机控制开发者提供了一套完整的解决方案。

weixin_30838873的博客 190

GitChat,一个记录技术和躺着赚零花钱的免费平台

目录 NEW项目九:小白和你聊秋招 NEW项目八:用 PyTorch 框架做深度学习会如此简单 项目一:一个项目带你快速入门 Qt Creator 项目二:手把手实践 YOLO 深度残差神经网络拐点检测 项目三:从凸优化理解高维特征下的深度学习 项目四:YOLO V3 一步步训练自己的目标检测 项目五:机器学习必备的5个脚本工具详解 项目六:YOLO V1和YOLO V3深度学习目...

钱多多先森 2496

Windows Server双机热备实战:用IIS+ARR+NLB搭建高可用Web服务(附避坑指南)

本文详细介绍了在Windows Server环境下,利用IIS、ARR(Application Request Routing)和NLB(Network Load Balancing)构建高可用Web服务的实战方案。通过双机热备架构,实现从网络层到应用层的全面冗余与智能流量分发,并提供了关键的配置步骤、常见避坑指南及性能调优建议,确保企业级Web服务的连续性与可靠性。

weixin_29210759的博客 384

大模型时代,还不懂云原生会怎么样?

关注我们丨文末赠书大厂为什么都在卷云原生?自从 OpenAI 发布 ChatGPT 以来,国内各家大厂在大模型领域展开了激烈的军备竞赛。掌握着数据与云计算资源的大厂也成为大模型的头部玩家,相关的产品如雨后春笋:百度的文心大模型、阿里的通义千问、腾讯的混元大模型、华为的盘古大模型,等等。这些超大规模的模型其训练参数都在千亿以上,有的甚至超过万亿级。对于各家大厂来说,要想在竞争中胜出,就必须充分利用算...

dotNET跨平台 930

手把手教你用CV5200模块搭建无人机高清图传系统(含实测数据)

本文提供了一份基于CV5200模块搭建远距离无人机高清图传系统的完整实战指南。文章详细解析了系统架构、硬件连接、软件配置与优化,并分享了实地飞行测试数据。核心在于利用CV5200的LR-WiFi私有协议,在视距下实现数公里级的稳定高清视频传输,为DIY爱好者和行业应用提供了高性价比的解决方案。

day7的博客 720

ViViT视频分类实战:从Tubelet Embedding到4种Attention变体的保姆级解析

本文深入解析ViViT(Video Vision Transformer)在视频分类中的实战应用,重点介绍Tubelet Embedding技术和4种Attention变体的实现细节。通过对比分析Spatio-Temporal、Factorised Encoder等不同Attention机制的性能特点,提供工程优化策略和Kinetics数据集上的实战示例,帮助开发者掌握这一前沿视频理解技术。

weixin_29292535的博客 387

我的 2023 年终总结 -- 一个小小工程师的 15 年

严格来说再过半年时间我在测试行业的摸爬滚打才满 15 年,不过这也不重要了。犹记得 09 年的夏天,就在大三升大四的那个暑假之前。我们 4 个男生在市场买了一堆水果敲响了两位导员的家门(我们的两个导员是两口子)。当时学校不准我们出来实习,而我们都知道如果错过了这次实习的机会,那么在这所不入流的大学毕业的我们的未来将是一片黑暗。那一次的筛选只选了 5 个人,4 个男生 1 个女生。所以我们 4 个男生就负责拎着水果,求两位导员能睁一只眼闭一只眼(当时实在是没钱,也买不起什么好东西)。

ycwdaaaa的博客 1218

Vue - 超强实现网页禁止浏览器缩放功能,浏览器缩放时保持网页不变形、元素不会被挤压等,屏蔽浏览器鼠标滚轮缩放页面(提供详细示例代码,一次引入整个网站无人可以搞乱你的页面布局及样式)

vue,nuxt,禁止浏览器缩放,如何用户缩放浏览器导致页面变形,网页缩放后页面变形了怎么办,怎么解决网站被缩放后元素乱套错乱,vue怎么禁止网页不被缩放,vue如何禁止浏览器缩放,vue缩放网页变形影响布局怎么办,vue电脑分辨率及缩放导致页面变形的问题,前端页面解决浏览器或者系统被放大和缩小导致的显示问题,Vue中页面自适应缩放,如何防止Vue页面缩放时变形/调整大小,Vue项目中,防止页面被缩放和放大,vue等比例缩放网页,网页缩放后界面变形咋办,禁止页面缩放,vue禁止浏览器改变窗口大小,Vue项目

🏆 前端领域优质创作者 1万+

【亲测免费】 GitChat 使用指南

GitChat 使用指南 项目介绍 GitChat 是一个基于人工智能的聊天机器人,专为简化您对 GitHub 仓库的交互而设计。通过 GitChat,您能够向您的代码库提问并获得相关解答,无论是为了快速了解一个新项目还是在组织内部提供一个辅助工具,帮助工程师高效地查询私有仓库信息。该聊天机器人利用了 Vercel 的 Next.js 框架,并集成 Google 认证以及用户会话管理,以提供流畅的...

gitblog_00753的博客 908

Android 13 RK3588 编译烧写实录全程

本文详细记录了RK3588主板在Android 13系统下的各项功能测试与编译过程。主要内容包括:1)网络功能测试(以太网、WiFi、蓝牙连接);2)外设接口测试(耳机、麦克风、USB、TF卡);3)硬件功能验证(RTC时钟、ADC采样、MIPI摄像头);4)系统设置(手势导航、开发者选项);5)Android 13 SDK编译环境搭建与源码获取方法。通过图文并茂的方式展示了各功能的配置方法、操作步骤和测试结果,为开发者提供了全面的参考指南。

hnjzfwy的博客 239

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

Gitchat

本文首发于Gitchat,原作者王晓雷,经作者同意授权转发。转载请联系作者或GitChat。 背景 很多人问,对话式交互系统就是语音交互么?当然不是。语音交互本身真的算不上新概念,大家可能都给银行打过电话,“普通话服务请按1,英文服务请按2……返回上一层请按0” 这也算对话式交互系统,我想大家都清楚这种交互带来的用户体验有多低效。那么对话式交互系统已经可以取代人类提供服务了么?也没

yuanshuai1136的博客 3003

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GitChat 项目使用教程

GitChat 项目使用教程 1. 项目的目录结构及介绍 GitChat 项目的目录结构如下: GitChat/ ├── app/ │ ├── components/ │ ├── lib/ │ ├── public/ │ ├── .env.example │ ├── .eslintrc.json │ ├── .gitignore │ ├── LICENSE │ ├─...

gitblog_00131的博客 596

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

GitChat·架构 | 如何从零开始搭建高性能直播平台?

GitChat 作者:七夜 直播已经成为人们分享交流的新方式,应用场景众多,主要分为:金融类直播、大型演出类、互动类、会议类直播等4大类。在本文中,我将先从 rtmp 协议开始,一步步带领大家搭建一个简易高性能的直播平台

技术杂谈 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

GitChat·管理 | 一篇文章读懂项目管理中的精髓

GitChat 作者:白云城主 更多IT技术分享,尽在微信公众号:GitChat 技术杂谈 做任何事情都有方法和经验可循,这就是真正意义上的捷径。对于项目管理来说,就是把握好三个点,战略、战术、实战。未来仍然属于我们当中那些人仍然愿意弄脏双手的少数分子。

技术杂谈 1760

Git-Chat 项目使用教程

Git-Chat 项目使用教程 1. 项目的目录结构及介绍 git-chat/ ├── README.md ├── bin/ │ └── git-chat ├── lib/ │ └── git-chat.rb ├── config/ │ └── settings.yml ├── spec/ │ └── git-chat_spec.rb └── Gemfile README.md...

gitblog_00771的博客 518

GitChat & 优快云学院课程教学

(尊重劳动成果,转载请注明出处:https://blog.youkuaiyun.com/qq_25827845/article/details/84404377冷血之心的博客) 关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~ 目录 GitChat : (一)知名互联网公司校招中常见的算法题 (二)知名互联网公司校招 Java 开发岗面试知识点解析 (三)Maven ...

冷血之心的博客 2306

GitChat在做什么

GitChat是知识经济的新物种,面向 IT 的新产品~

安晓辉生涯——聚焦程序员的职业规划与成长 2万+

GitChat·安全 | 搭建并使用便携式 4G/LTE 伪基站研究移动安全

GitChat 作者:Seeker 本文介绍如何使用 SDR + 开源 4G/5G 项目 OpenAirInterface + 便携式掌上电脑,搭建一台可以手持或者放在口袋里随身携带,随时随地开始渗透攻击的开源伪基站

技术杂谈 4580

优快云邀您加入GitChat,让知识变现!

GitChat 是什么? GitChat GitChat 是一个知识分享平台,我们的目的是通过这款产品改变 IT 知识的学习方式,让专业读者获得自主选择权,让知识分享者获得收益。 Chat 是什么? 一场 Chat 包含一篇文章和一场为该文章的读者和作者定制的专属线上交流活动。 博主们如果觉得自己的内容有价值,希望自己的内容可以影响更多的小伙伴,那就别犹豫,发布 Chat,接受预订,让读者...

优快云 官方博客 6万+

孙高飞:人工智能测试_高飞学习钓鱼:为什么好的文档很重要

孙高飞:人工智能测试 无论您从事哪种类型的项目,都不能指望用户自己完全理解它。 那就是文档的来源。文档可以是任何东西,从简单的过程到详尽的用户故事。 当然,Web UI有时可以说出自己的话(最好的话),但是我敢肯定,您已经看到了一些读者质疑基本UI路径或在命令行中执行任何操作的故事。 这就是为什么即使对于最基本的主题而言,创建文档对用户也很重要的原因。 如果您想要更多的证据,让我们谈谈高...

cuml0912的博客 429

收藏!7个国内「小众」的程序员社区

技术社区是大量开发者的集聚地,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流。国内知名的技术社区有优快云、博客园、开源中国、51CTO,还有近两年火热的掘金,除此之外,还有一些不知名但在某个方面做的有声有色的小众社区,也值得大家关注一下。

Mr_HelloWorldx的博客 2万+

原来程序员们都喜欢这些网站。。从零基础到精通,收藏这篇就够了!

今天给大家推荐一些程序员经常使用的网站,也是我经常上的一些网站,我将会从多个角度、多个层面分别为你整理归纳这些网站和论坛。

Javachichi的博客 1331

完整制作个人博客系统

这篇GitChat是为了教小伙伴们更好更快地使用Wordpress制作免费的个人博客系统。很多云主机卖家都有虚拟空间免费使用的业务,不过你懂的,这边文章教你如何使用免费的虚拟空间搭建个人博客系统。 在本场Chat中,会用到如下的工具 1.Wordpress 5.3.2 2.Php版本 7.0.30 3‘插件 SyntaxHighlighte...

GitChat 1022

常见问题

我是读者 Chat 是什么? Chat 是一种阅读/写作互动体验产品。一场 Chat 至少包含一篇文章,除此之外,您还可以选择与文章作者以及其他读者进行一场线上交流。 文章还没有的话,我如何能找到质量更加可靠的 Chat? 您可以通过作者资质(包括作者评分,作品发布量和评论等)来判断;也可以把「严选 Chat」作为一种参考,GitChat 内容团队会定期用人工筛选的方式评选「严选 Chat」。 我预订活动后多久能看到文章? 活动正式开启(预订人数达标)后的 1 周内,GitChat 会把文章推送给您(您可以

xuehy_csdn的博客 228

GitChat · 人工智能 | 肿瘤医疗影像 AI 识别技术实践

来自 GitChat 作者:王晓明更多IT技术分享,尽在微信公众号:GitChat技术杂谈 进入 GitChat 阅读原文 前言 医学影像与人工智能的结合,是数字医疗领域较新的分支和产业热点。医学影像的解读需要长时间专业经验的积累,医生的培养周期相对较长,很多程度上,深度学习和医生的学习过程是一样的,通过海量知识的学习理解和应用,而人工智...

weixin_34381687的博客 1465
上一篇: GitChat · 前端 | 从软件工程角度看大前端技术栈
下一篇: GitChat · 架构 | 大规模私有云产品自动升级的架构选型和实战
软件供应链安全
软件供应链安全 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 347原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值