2021SC@SDUSC
- 2021/10/09第一次编辑
在阅读yolov5之前, 有必要先回顾下之前目标检测的相关算法, 尤其是yolo系列的, 本篇重点学习下yolov1的设计.
目标检测
目标检测算法常见的分为one-stage和two-stage.
经典的two-stage算法如RCNN使用selective search先选择2000个候选区域, 然后对每个候选区进行评估打分,最后非极大值抑制输出结果. 包括RCNN的后续改进版本fast RCNN和faster RCNN都需要先选择候选区域再评估.
这种方式有很多问题, 比如训练模型需要从选取, 评估两个角度设计. 由于选取的方式如selective search是人为设计的, 所以模型的迁移泛化能力不强. 其次, 只对候选区域进行判别, 导致模型不能对全局进行识别, 背景之类的容易误判.
one-stage顾名思义, 如yolo, you only look once, 它没有显式的候选区的选择. 因此模型有很强的迁移能力, 在保证正确率的同时速度很快.
YOLOv1的输入输出
我们从上图可以看出, yolov1包含多个卷积层, 属于深度神经网络.
把中间复杂的网络结构看作黑箱, 只看网络的输入和输出.
网络的输入是 448 ∗ 448 ∗ 3 448*448*3 448∗448∗3 的张量, 也就是固定大小的三通道图片.
网络的输出是 7 ∗ 7 ∗ 30 7*7*30 7∗7∗30 的张量, 包含网络的预测结果, 并通过一系列操作可以从这个张量中获得包含的目标及其位置信息.
输出的张量的含义
输出的
7
∗
7
∗
30
7*7*30
7∗7∗30 的张量很抽象, 理解这个张量需要知道yolo网络做了什么.
yolov1是目标检测网络, 最后能标注出图像中各个物体的类型及位置, 如上右图, 这里能预测20种不同的类型.
首先如图, 网络将图片分为 S ∗ S S*S S∗S 个块, 这里的S取的是7, 和输出张量的前两维 7 ∗ 7 7*7 7∗7 一一对应.
下面解释输出张量的第三个纬度.
网络对 7 ∗ 7 7*7 7∗7 的每个块, 都会生成两个Bounding box. 每个bounding box有4个参数 ( x , y , w , h ) (x, y, w, h) (x,y,w,h) ,由这四个参数我们可以确定一个矩形框. 有49个块也就生成98个矩形框, 如上图一堆大小各异的黑框框. 每个bounding box有个额外参数confidence, 这个confidence(置信度)参数描述的是, 在这个bounding box包含 20 种预测类型的概率.
对于每个bounding box, 如果它包含20种预测类型的一种, 我们要预测这个bounding box包含是具体的哪一种类型, 于是需要额外的20个参数描述来描述包含20中预测类型的条件概率.
用公式表示就是
P
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
P(Class_i | Object)
P(Classi∣Object), 我们知道
P
(
O
b
j
e
c
t
)
P(Object)
P(Object) 就是bounding box的confidence参数.
于是输出的 7 ∗ 7 ∗ 30 7*7*30 7∗7∗30 的第三个纬度的含义就很清晰了, 总结下就是 前十个表示两个bounding box及其置信度参数, 最后20个参数表示要预测检测的20个参数的条件概率.
由输出张量生成目标检测的结果
使用非极大抑制生成检测结果.
yolo的损失函数
上图为论文中的损失函数, 可以逐行解读.
首先解释形如 1 i o b j 1_i^{obj} 1iobj 的函数.
在yolov1中, S ∗ S S*S S∗S 个块每个块都会生成多个(2个) bounding box. 在设计损失函数的时候, 没必要为所有的块都去调整所有的权重, 因为相对只有小部分块或者bounding box都包含待检测对象. 论文用了"responsible"这个词描述一些重要的块.
我们判断"responsible"的依据, 比如对一个 块 而言, 训练集中标注的检测框的中点落入的块, 这个块就是重要的. 对生成的 bounding box而言, 这个bounding box 形状大小位置和训练标注的框大小位置越相似, 它也就越重要, 我们描述这种相似程度使用的是 IOU.
于是这些重要的部分就"responsible"去更新预测框的大小形状, 获得高的置信度并且准确的条件概率值. 而那些不重要的, 就只需要让自己的置信度越小越好.
上述公式中描述这种 责任 的是函数 1 i j o b j 1_{ij}^{obj} 1ijobj 与 1 i j n o o b j 1_{ij}^{noobj} 1ijnoobj . 顾名思义 1 i j o b j 1_{ij}^{obj} 1ijobj 就是第 i 个块中出现了对象, 且这个块生成的第 j 个bounding box是重要的(高IOU)
接着就不难理解每个行的loss的含义了.
形如 λ s o m e t h i n g \lambda_{something} λsomething 是的超参数.
yolov1的限制
我们可以看到, yolo对 S ∗ S S*S S∗S划分网络, 至多生成 S ∗ S S*S S∗S 个结果, 这对密集的目标不友好.
其次与同期two-stage的fast rcnn比错误率更高(在背景的表现要好)