图解目标检测算法之 YOLO
共 3567字,需浏览 8分钟
·
2022-04-26 20:13
YOLO v3 是目标检测各类算法中非常经典的一款,本文试着图解它的网络架构和基本流程,给想快速了解它的童鞋提供一些参考。
1引 言
近年来,由于在海量数据与计算力的加持下,深度学习对图像数据表现出强大的表示能力,成为了机器视觉的热点研究方向。图像的表示学习,或者让计算机理解图像是机器视觉的中心问题。
具体来说,图像理解包括分类、定位、检测与分割等单个或组合任务,如下图所示。
本篇关注目标检测,它可以认为是一个将分类和回归相结合的任务。
目标检测的核心问题可以简述为图像中什么位置有什么物体
。
1)定位问题:目标出现在图像中哪个位置(区域)。
2)分类问题:图像的某个区域里的目标属于什么类别。
当然,目标(物体)在图像中还存在其他问题,如尺寸问题,即物体具有不同大小;还有形状问题,即物体在各种角度下可以呈现各种形状。
基于深度学习的目标检测算法目前主要分为两类:Two-stage
和 One-stage
。
Tow-stage
先生成区域(region proposal,简称 RP),即一个可能包含待检物体的预选框,再通过卷积神经网络进行分类。
任务流程:特征提取 --> 生成 RP --> 分类/定位回归。
常见 Two-stage
目标检测算法有:R-CNN、Fast R-CNN、Faster R-CNN、SPP-Net 和 R-FCN 等。
One-stage
直接用网络提取图像特征来预测物体位置和分类,因此不需要 RP。
任务流程:特征提取–> 分类/定位回归。
常见的 One-stage
目标检测算法有:YOLO 系列、SSD 和 RetinaNet 等。不过,为了得到最终目标的定位和分类,往往需要后处理。
本篇主要来看 YOLO 系列中的 v3 版本。
2基本原理
首先,我们先从整体上来看一下 YOLO v3 是如何工作的。YOLO v3 算法通过将图像划分为
相应地,这些网格预测
由于网格的分辨率比起原图来说已经大大降低,而检测和识别步骤都是针对网格单元来处理的,因此这个方案大大降低了计算量。但是,由于多个单元格用不同的包围盒来预测同一个对象,因此会带来了很多重复的预测框。YOLO v3 使用非最大值抑制(Non-Maximum Suppression,NMS
)来处理这个问题。
下图给出了一个例子,展示了当
另外,为了兼顾图像中各种尺度的目标,可以使用多个不同分辨率的
3总体架构
先看一下网络架构,注意它有三个不同分辨率的输出分支。
下面看一下更加详细的网络架构图,注意有三个检测结果(Detection Result)。
输入图像通过 Darknet 得到三个尺度的特征图,从上往下为 (52×52×256), (26×26×512), (13×13×1024)
,也就是在三种尺度上进行以便检测到不同大小的目标。也可以结合下面这个更加精炼图来理解。
4关键步骤
目标检测也可以看作是对图像中的背景和前景作某种理解分析,即从图像背景中分离出感兴趣的目标,得到对于目标的描述<位置,类别>
。
由于可能有多个目标存在,模型输出是一个列表,包含目标的位置以及目标的类别。目标位置一般用矩形检测框(包围盒)的中心和宽高来表示。
¸模型输出值
分辨率最低的输出分支对应的结果是
这个结果的含义大致清楚了,但是还有个小问题,就是这个输出是根据什么信息计算而来呢?
如下图所示,在前一层得到的特征图上再接一个核大小为
上面说了,在这个尺度上会检测 3 个预测框,把它们拼接在一起,得到完整的结果示意图如下。
另外两个尺度上类似,它们对应的分支输出如下两个图所示。
网络会在 3 个尺度上分别检测,每个尺度上每个网格点都预设 3 个包围盒,所以整个网络共检测到 13×13×3 + 26×26×3 + 52×52×3 = 10647
个包围盒。
那么这里的 3 个预设包围盒又是怎么回事呢?
其实每个网格单元可以对目标的包围盒进行一定数量的猜测,比如下图中的示例,黄色网格单元进行两次包围盒(蓝色框)预测以定位人的位置。
而 YOLO v3 中采用 3 个预设包围盒,但值得注意的是这里限定只能检测同一个目标。
¸先验包围盒
还有一个问题,每个网格对应的包围盒怎么取呢?理论上,包围盒可以各种各样,但是这样的话就需要大量计算。
为了节省计算,不妨预先了解一下在图像中出现的目标一般具有怎么样的包围盒。可以通过在数据集 VOC 和 COCO 上使用聚类法寻找一般目标的包围盒尺寸。
而在 YOLO v3 中,通过聚类选出了 (10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)
。
¸包围盒预测
有了预设的先验包围盒,怎么来计算实际包围盒呢?总不能直接套到每个网格单元处就完事了吧。
YOLO v3 引入一个机制,可以适当调整预设包围盒来生成实际的包围盒。下图中的公式将网络输出值
¸包围盒后处理
YOLO v3 模型的输出并没有直接给出包含目标的包围盒,而是包含所有网格单元对应结果的张量,因此需要一些后处理步骤来获得结果。
首先,需要根据阈值和模型输出的目标置信度来淘汰一大批包围盒。而剩下的包围盒中很可能有好几个围绕着同一个目标,因此还需要继续淘汰。这时候就要用到非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以认为求局部最优解。用在此处的基本思路就是选择目标置信度最大的包围盒,然后排除掉与之 IoU 大于某个阈值的附近包围盒。
¸损失函数
由于网络的输出值比较多,因此损失函数也具有很多项,但总体还是清晰的,这里不作展开。
5实 验
网上基于 PyTorch[1] 或者 TF[2] 等库的 YOLO v3 实现版本很多,可以直接拿来把玩。下面是网上随手下载的几个图像的测试结果,看着效果是不是还可以呢。
6小 结
先回顾下面这个图,看看是否了解每个步骤的含义。
然后再用一个图来总结一下流程,
参考代码
PyTorch 实现: https://github.com/eriklindernoren/PyTorch-YOLOv3
[2]TensorFlow 实现: https://machinelearningmastery.com/how-to-perform-object-detection-with-yolov3-in-keras/
© THE END