![在这里插入图片描述](https://img-blog.csdnimg.cn/20210129121339654.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjc2NDkzMg==,size_16,color_FFFFFF,t_70)
网格化
即将图片分成 7 ∗ 7 7*7 7∗7 的网格,网络输出张量为 b a t c h _ s i z e ∗ 7 ∗ 7 ∗ 30 batch\_size*7*7*30 batch_size∗7∗7∗30
在Yolo中,如果一个物体的中心点,落在了某个格子中,那么这个格子将负责预测这个物体。以此取代滑窗
网络结构
输入图像大小为 448 ∗ 448 448*448 448∗448,经过若干个卷积层与池化层,变为 7 ∗ 7 ∗ 1024 7*7*1024 7∗7∗1024张量(图一中倒数第三个立方体),最后经过两层全连接层,输出张量维度为 7 ∗ 7 ∗ 30 7*7*30 7∗7∗30
输出的含义
7 ∗ 7 7*7 7∗7即网格,那 30 30 30呢?
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置(x, y, w, h)之外,还要附带预测一个confidence值。 每个网格还要预测一个类别信息,记为C类。
则SxS个网格的输出就是S x S x (5*B+C)的一个tensor。
在PASCAL VOC中, 图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
即 这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。
坐标(x, y, w, h)
其中中心坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。
不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值。例如,第一个格点中物体坐标为(2.3,3.6) ,另一个格点中的物体坐标为(5.4,6.3),这四个数值让神经网络暴力回归,有一定难度。所以这里的offset是指,既然格点已知,那么物体中心点的坐标一定在格点正方形里,相对于格点左上角的位移值一定在区间[0, 1)中。让神经网络去预测 (0.3,0.6) 与 (0.4,0.3) 会更加容易,在使用时,加上格点左上角坐标即可。
confidence
confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息
c
o
n
f
i
d
e
n
c
e
=
P
(
o
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
e
confidence=P(object)*IOU^{true}_{pred}
confidence=P(object)∗IOUpredtrue
如果有object落在一个grid cell里,第一项取1,否则取0。
第二项是预测的bounding box和实际的groundtruth之间的IoU值。
损失函数
https://blog.csdn.net/c20081052/article/details/80236015
Yolo面临的物体检测问题,是一个典型的类别数目不均衡的问题。其中49个格点,含有物体的格点往往只有3、4个,其余全是不含有物体的格点。此时如果不采取点措施,那么物体检测的mAP不会太高,因为模型更倾向于不含有物体的格点。因此让含有物体的格点,在损失函数中的权重更大,让模型更加“重视”含有物体的格点所造成的损失。
- 重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λ c o o r d λ_{coord} λcoord, 在pascal VOC训练中取5。
- 有object的box的confidence loss和类别的loss的loss weight正常取1。
- 对没有object的box的confidence loss,赋予小的loss weight,记为 λ n o o b j λ_{noobj} λnoobj, 在pascal VOC训练中取0.5。
- 对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。
预测
置信度过滤
在推理时,使用物体的类别预测最大值 p 乘以 预测框的最大值 c ,作为输出预测物体的置信度class-specific confidence score。
设置阈值过滤掉一些得分低的矩形框。输出检测物体的置信度,
同时考虑了矩形框与类别,满足阈值的输出更加可信。
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
e
=
P
r
(
C
l
a
s
s
i
)
∗
I
O
U
p
r
e
d
t
r
u
e
Pr(Class_i|Object)*Pr(Object)*IOU^{true}_{pred}=Pr(Class_i)*IOU^{true}_{pred}
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtrue=Pr(Classi)∗IOUpredtrue
使用NMS非极大抑制生成预测框
-
取置信度class-specific confidence score最大的框作为目标
-
遍历剩下的框,去掉和第一个框重合度IOU大于某阈值的框
-
剩下的框里找到置信度class-specific confidence score最大的框作为第二个目标,返回2,直到没有剩下框
性能与小结
性能
backbone同为VGG-16,Yolo比Faster R-CNN少了将近7点mAP,但是速度变为三倍,Fast Yolo和Yolo相比,少11点mAP,但是速度可以达到155张图片每秒。后续的Yolo v3中,准确率和速度综合再一次提升,所以v1的性能不再过多分析。
不足
-
Yolo的Localization错误率更高,直接对位置进行回归,确实不如滑窗式的检测方式准确率高。
-
作者提到Yolo对于小物体检测效果欠佳,不过在v2与v3中都做了不少改进。
-
YOLO的每一个网格只预测两个boxes,一种类别。这导致模型对相邻目标预测准确率下降。因此,YOLO对成队列的目标(如 一群鸟)识别准确率较低。
-
YOLO是从数据中学习预测bounding boxes,因此,对新的或者不常见角度的目标无法识别。
优点
一,非常快。YOLO预测流程简单,速度很快。我们的基础版在Titan X GPU上可以达到45帧/s; 快速版可以达到150帧/s。因此,YOLO可以实现实时检测。
二,YOLO采用全图信息来进行预测。与滑动窗口方法和region proposal-based方法不同,YOLO在训练和预测过程中可以利用全图信息。Fast R-CNN检测方法会错误的将背景中的斑块检测为目标,原因在于Fast R-CNN在检测中无法看到全局图像。相对于Fast R-CNN,YOLO背景预测错误率低一半。
三,YOLO可以学习到目标的概括信息(generalizable representation),具有一定普适性。我们采用自然图片训练YOLO,然后采用艺术图像来预测。YOLO比其它目标检测方法(DPM和R-CNN)准确率高很多。
链接:https://zhuanlan.zhihu.com/p/70387154
https://zhuanlan.zhihu.com/p/25053311