YOLO
本文最后更新于 2025年4月18日 晚上
Motivation
大二那年做了一个大创,题目是基于深度学习的GUI图像识别自动化测试,那时对深度学习的各种概念都一知半解,虽然认真读文献、认真做过,但学到的东西很有限,又过了这么久,更是忘得差不多了。
为了能写在简历上,经得住拷打,专门复习复习YOLO以及自动化测试相关的八股,同时复习复习这个历时一年的(真正在做的时间大概半年)的首段"科研"学习经历。
复习采用:
1 |
|
YOLO部分
为什么选择YOLO?
其他的目标检测算法有:Fast R-CNN、SSD等。
拉表来说明:
特性 | YOLO | Faster R-CNN |
---|---|---|
类型 | 单阶段 | 两阶段 |
速度 | 非常快,实时 | 较慢 |
精度 | 比Faster R-CNN高 | 相比更低 |
适合场景 | 实时,轻量,部署灵活 | 离线分析、复杂场景 |
缺点 | 对密集目标效果差 | 慢,部署复杂 |
特性 | YOLO | SSD |
---|---|---|
网络结构 | 更现代 | 较旧 |
精度 | 高,特别是小目标 | 相对更低 |
速度 | 快 | 慢 |
工具支持 | Ultralytics持续支持 | 维护较少 |
拉表可得,YOLO在识别GUI元素这种:
- 几乎不可能有密集目标(谁家GUI把一堆控件重叠堆在一起的)
- 目标较小(按钮、滑动条、输入框之类)
- 轻量化,方便集成进测试工具链
的情境下,缺点被避免,而优点被放大,是最优的选择
关于Faster R-CNN和SSD的简单了解
Faster R-CNN
是R-CNN系列的第三代,实现了目标检测流程的端到端训练
端到端:核心思想是将目标检测任务视为一个整体的优化问题,而不是将其分解为多个子任务(如特征提取、候选区域生成、分类和回归等)。
其将目标检测任务分解为两个主要部分:
- 区域提议网络(Region Proposal Network, RPN):生成候选目标区域。
- Fast R-CNN:对候选区域进行分类和边界框回归。
尽管 Faster R-CNN 仍然包含两个主要阶段,但它通过共享卷积特征来实现端到端训练,使得整个过程可以联合优化。
SSD
SSD (Single Shot MultiBox Detector),另一种端到端目标检测模型,结合了 YOLO 的单次检测思想和 Faster R-CNN 的多尺度检测能力。
SSD 在多个尺度的特征图上同时预测目标的边界框和类别概率
- SSD 在不同尺度的 feature maps(如 conv4_3、conv7 等)上同时做检测。
- 每个尺度负责检测不同大小的目标(低层检测小目标,高层检测大目标)。
默认框(Default Boxes)机制
SSD 预定义了多个比例和长宽比的 default boxes(类似于 anchor boxes),在每个 feature map 的每个位置做分类和回归。
模型会学习每个 default box 的类别概率以及相对真实框的位置偏移
YOLO的原理和机制 简介
YOLO可以目标检测和图像分割
最初的YOLO借鉴了GoogLeNet模型,24个卷积层,2个全连接层。
YOLO将目标检测视为回归问题,将CNN应用于整个图像,将图像划分为区域并预测每个区域的边界框和概率。
图像会被分割成不同大小的网格(SxS),有多种尺度,用以检测不同大小的目标。
每个网格预测固定数量的边界框和类别概率,边界框是个五元组(中心坐标x,中心坐标y,宽,高,概率)
图像预处理输入模型,输出为一个shape为 \(S \times S \times(B \times 5+C)\) 的向量,S是网格大小,B是每个网格预测的边界框数量,C是类别数量,5即为五元组。
最后的特征向量4096维。
写的时候想到的问题,有点stupid:
为什么把图像预处理成446 * 446后喂给模型就能吐出7 * 7 *30维的输出向量了?
因为深度学习或者说机器学习训练时就是为了拟合一个分布,拟合一个函数或者映射,尽管这看起来很奇怪,直觉上不觉得有映射关系,但是训练时的优化损失函数会调整网络中的各个参数,让网络能够映射。
一开始肯定是喂图像吐不出设计好的向量格式,但是训练后,拟合了,就可以吐出来了。
YOLOv8的AnchorFree
Anchor不是YOLO里的预测框(box),而是一个预定义的锚框,帮助模型预测,比如YOLOv5中有3种anchor,对应3种不同尺度,用来检测不同大小的对象。
非极大值抑制
Non-Maximum Suppression,用于去除冗余的重复检测框,基本步骤:
- 将所有预测框中 objectness score 小于阈值的框去掉
- 对每个类别,分别进行
- 将该类下所有框按置信度从高到低排序
- 取出置信度最高的
- 计算其他框与最高的之间的IoU
- 如果IoU大于阈值,则认为重复,去掉
- 重复直到没有框剩下
mAP
mean Average Precision
目标检测中常用的评估指标,衡量检没检测到、框得准不准得综合性指标
IoU
\[ \text{IoU}=\frac{\text{预测框与真实框的交集}}{预测框与真实框的并集} \]
判断是否为TP()
Precision & Recall
Pr,准确率和召回率,分别表示预测为正的框有多少是真正的目标;真实目标中有多少被检测出来
检测错检测和漏检测
AP
Average Precision,每个类别都有AP,表示在不同Recall水平下的Precision的平均值,通过PR曲线积分得到,面积越大越好
mAP
所有类别AP的平均值,衡量整体性能
自动化测试部分
自动化测试类型:

OCR部分
由于根本没实现,只在专利里提了一嘴,所以回顾一下专利里怎么”画饼“的(lll¬ω¬)
用OCR识别图像中的文字,要得到文字内容和文字框的位置。
将文字框和YOLO预测框计算IoU来判断重合,关联上文字框和YOLO框,关联不上的就单独作为一个预测框。
识别出的文字用来跟待测目标的说明文字对比
待测目标指的是:在这个场景下,要先截图上传要测的控件的图片,示例如下:
![]()
代码中的两个图就是上传的待测目标,在我这里会额外要求一个文字description或者label
至于怎么融合图像匹配和文字匹配的结果,专利里略过去的,毕竟没实现,硬要说心中的设想,就是类似于: \[ \lambda \text{Image}+(1-\lambda)\text{Text} \] 这种加权平均了。
专利不需要写代码实现,甚至也不需要这么详细的实现思路,只需要说”辅助“就好了。所以才能够略过(lll¬ω¬)
项目部分
为什么选择基于深度学习的GUI自动化测试?和传统相比
项目的立项根本问题之一,简单。
项目要解决的问题,据一个实际的例子就是:一个测试员,在自己的电脑上,针对PC端的网页写了一个自动化测试脚本。结果到另一台显示器分辨率,也就是尺寸,不一样的电脑上,脚本就用不了了,比如显示屏太宽了、是竖屏等等。进一步的,在手机端、平板端、车机端,都没法用,得为每个屏幕都单独写一个脚本。
传统方法有不基于视觉的,通过HTML的标签,也就是DOM(文件对象模型)树来触发行为,但是页面是会迭代的,DOM结构的小改变就可能引起对象获取失败,脚本又没法用了。
基于传统视觉(模板匹配、特征点匹配)的就说各自的缺点就好了,至少深度学习的image recognition可以说强于传统。
总结来说就是,DOM脆弱,维护难,传统不鲁棒。就得用机器学习的图像识别。