在YOLO系列中,YOLOv1是整个系列的基础,也是很经典的一种算法,同时我也完成了一些对v2和v3的解读:
YOLOv2的解读:《【深度学习YOLO系列】对YOLO v2的解读》
YOLOv3的解读:《【深度学习YOLO系列】对YOLO v3的解读》
YOLO v1结构
它的核心思想就是利用整张图作为网络的输入,将目标检测作为回归问题解决,直接在输出层回归预选框的位置及所属的类别。输入图像大小为 448 ∗ 448 448*448 448∗448,将其分割成了 7 × 7 = 49 7×7=49 7×7=49个网络,每个网格要预测两个 b o u n d i n g b o x bounding\ box bounding box(候选框)的坐标 ( x , y , w , h ) (x, y, w, h) (x,y,w,h) 和 b o x box box内是否包含物体的置信度 c o n f i d e n c e confidence confidence (每个 b o u n d i n g b o x bounding\ box bounding box有一个 c o n f i d e n c e confidence confidence),以及物体属于 20 20 20类别中每一类的概率( Y O L O v 1 YOLO\ v1 YOLO v1的训练数据集为 v o c 2012 voc2012 voc2012,它是一个 20 20 20分类的数据集)。所以一个网格对应一个 ( 4 × 2 + 2 + 20 ) = 30 (4×2+2+20)=30 (4×2+2+20)=30维的向量。
![CSDN图标](https://i-blog.csdnimg.cn/blog_migrate/10bc51fb3514e83fe572cedf18e66854.png)
如下图所示, 7 × 7 7×7 7×7网格内的每一个grid(红色框),对应两个大小形状不同的 b o u n d i n g b o x bounding\ box bounding box (黄色框)。每个box的位置坐标为 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) , x x x 和 y y y 表示 b o x box box 中心点与该格子边界的相对值, w w w和 h h h表示预测 b o x box box的宽度和高度相对于整幅图像的宽度和高度的对比。 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 会限制在 [ 0 , 1 ] [0,1] [0,1] 之间。与训练数据集上标定的物体真实坐标 ( G x , G y , G w , G h ) (Gx,Gy,Gw,Gh) (Gx,Gy,Gw,Gh) 进行对比训练,每个 g r i d grid grid 负责检查中心落在该格子的物体。
这个置信度只是为表达 b o x box box内有无物体的概率(类似于 F a s t e r R − C N N Faster\ R-CNN Faster R−CNN中 R P N RPN RPN层的 s o f t m a x softmax softmax预测 a n c h o r anchor anchor是前景还是背景的概率),并不预测box内物体属于哪一类。
![](https://i-blog.csdnimg.cn/blog_migrate/0f6e0a91d71b7b1ff597c9acd9f0c575.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e75ab7ddb91cf0834dbd102adc896076.png)
- c o n f i d e n c e confidence confidence置信度
P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU^{truth}_{pred} Pr(Object)∗IOUpredtruth
其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的IOU。值越大则box越接近真实位置。
confidence是针对bounding box的,每个网格有两个bounding box,所以每个网格会有两个confidence与之对应。
YOLO v1预测工作流程
- 1、每一个格子得到两个bounding boxes
- 2、每个网格预测的class信息和bounding boxes预测的confidence信息相乘,得到每个bounding box预测具体物体的概率和位置重叠的概率PrIOU
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 t h = P r ( c l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_i|Object)*Pr(Object)*IOU^{truth}_{pred} = Pr(class_i)*IOU^{truth}_{pred} Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(classi)∗IOUpredtruth - 3、对于每一个类别,对PrIOU进行排序,去除小于阈值的PrIOU,然后做非极大值抑制。
![CSDN图标](https://i-blog.csdnimg.cn/blog_migrate/251a979add6f7ea4d7aa26fe595df35f.png)
YOLO v1代价函数
YOLO v1的loss function如下所示,包含三部分:位置误差、confidence误差、分类误差。
![CSDN图标](https://i-blog.csdnimg.cn/blog_migrate/2216a467d1c6babe2871d3452fd74911.png)
YOLO v1的图解如下所示:
![CSDN图标](https://i-blog.csdnimg.cn/blog_migrate/0991ad1ea805ec4b330da488e0415647.png)
- loss代价函数中 w w w 为什么要开根号 w \sqrt{w} w ?
如下图所示:绿色为bounding box,红色为真实标注。如果w和h没有平方根,那么bounding box跟两个真实标注的位置loss是相同的,但是从面积看来B框是A框的25倍,C框是B框的81/25倍,B框跟A框的大小偏差更大,不应该得到相同的loss。
如果w和h加上平方根,那么B对于A的位置loss约为3.06,B对C的位置约为1.17,B对A的位置loss的值更大,更符合我们的实际判断。
![CSDN图标](https://i-blog.csdnimg.cn/blog_migrate/603abafa955df3edaa76f6cc31d0501b.png)
- YOLO v1代价函数的weight(权重)说明
不同的任务重要程度不同,所以也应给予不同的loss weight:
1).每个网格两个预测框坐标比较重要,给这些损失前面赋予更大的loss weight,在pascal VOC取值为5。
2).对没有object的box的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5.
3).有object的box的confidence loss和类别的loss的loss weight正常取1。
YOLO v1的缺点
1、每个网格只对应两个bounding box,当物体的长款比不常见(也就是训练数据集覆盖不到时),效果较差。
2、原始图片只划分7×7的网格,当两个物体靠的很近时,效果比较差。
3、最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
4、每个图片中比较小的物体,效果比较差。