YOLO

本文最后更新于 2025年4月18日 晚上

Motivation

大二那年做了一个大创,题目是基于深度学习的GUI图像识别自动化测试,那时对深度学习的各种概念都一知半解,虽然认真读文献、认真做过,但学到的东西很有限,又过了这么久,更是忘得差不多了。

为了能写在简历上,经得住拷打,专门复习复习YOLO以及自动化测试相关的八股,同时复习复习这个历时一年的(真正在做的时间大概半年)的首段"科研"学习经历。

复习采用:

1
2
3
4
5
6
7
// 猜测可能的问题
solve(problem){
stack.add(problem)
// 解答可能的问题,在解答过程中遇到新的问题则入栈,递归解决
while(!stack.isEmpty()) solve(stack.poll())
}
// 每遇到一个问题需要记录在这里,防止脑子内存不足而StackOverflow

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系列的第三代,实现了目标检测流程的端到端训练

端到端:核心思想是将目标检测任务视为一个整体的优化问题,而不是将其分解为多个子任务(如特征提取、候选区域生成、分类和回归等)。

其将目标检测任务分解为两个主要部分:

  1. 区域提议网络(Region Proposal Network, RPN):生成候选目标区域。
  2. Fast R-CNN:对候选区域进行分类和边界框回归。

尽管 Faster R-CNN 仍然包含两个主要阶段,但它通过共享卷积特征来实现端到端训练,使得整个过程可以联合优化。

SSD

SSD (Single Shot MultiBox Detector),另一种端到端目标检测模型,结合了 YOLO 的单次检测思想和 Faster R-CNN 的多尺度检测能力

  1. SSD 在多个尺度的特征图上同时预测目标的边界框和类别概率

    • SSD 在不同尺度的 feature maps(如 conv4_3、conv7 等)上同时做检测。
    • 每个尺度负责检测不同大小的目标(低层检测小目标,高层检测大目标)。
  2. 默认框(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的平均值,衡量整体性能

自动化测试部分

自动化测试类型:

当初中期答辩的PPT第一页

OCR部分

由于根本没实现,只在专利里提了一嘴,所以回顾一下专利里怎么”画饼“的(lll¬ω¬)

用OCR识别图像中的文字,要得到文字内容和文字框的位置。

将文字框和YOLO预测框计算IoU来判断重合,关联上文字框和YOLO框,关联不上的就单独作为一个预测框。

识别出的文字用来跟待测目标的说明文字对比

待测目标指的是:在这个场景下,要先截图上传要测的控件的图片,示例如下:

在脚本中包含待操作控件的截图

代码中的两个图就是上传的待测目标,在我这里会额外要求一个文字description或者label

至于怎么融合图像匹配和文字匹配的结果,专利里略过去的,毕竟没实现,硬要说心中的设想,就是类似于: \[ \lambda \text{Image}+(1-\lambda)\text{Text} \] 这种加权平均了。

专利不需要写代码实现,甚至也不需要这么详细的实现思路,只需要说”辅助“就好了。所以才能够略过(lll¬ω¬)

项目部分

为什么选择基于深度学习的GUI自动化测试?和传统相比

项目的立项根本问题之一,简单。

项目要解决的问题,据一个实际的例子就是:一个测试员,在自己的电脑上,针对PC端的网页写了一个自动化测试脚本。结果到另一台显示器分辨率,也就是尺寸,不一样的电脑上,脚本就用不了了,比如显示屏太宽了、是竖屏等等。进一步的,在手机端、平板端、车机端,都没法用,得为每个屏幕都单独写一个脚本。

传统方法有不基于视觉的,通过HTML的标签,也就是DOM(文件对象模型)树来触发行为,但是页面是会迭代的,DOM结构的小改变就可能引起对象获取失败,脚本又没法用了。

基于传统视觉(模板匹配、特征点匹配)的就说各自的缺点就好了,至少深度学习的image recognition可以说强于传统。


总结来说就是,DOM脆弱,维护难,传统不鲁棒。就得用机器学习的图像识别。

参考

YOLO 详解:从 v1 到 v11 - 知乎


YOLO
http://43.143.57.238/2025/04/17/YOLO/
作者
Leoo Yann
发布于
2025年4月17日
更新于
2025年4月18日
许可协议