来自 | 知乎 作者 | 科技猛兽链接 | https://zhuanlan.zhihu.com/p/183781646编辑 | 深度学习这件小事公众号本文仅作学术交流,如有侵权,请联系后台删除。上篇文章我们介绍了YOLO v1的设计和演变过程(你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上)),从本文开始我们继续介绍YOLO series接下来的工作,但是因为YOLO下面的工作内容太多,所以本文只介绍YOLO v2 v3 v4 v5对于检测头head和损失函数loss的优化,剩下的backbone方面的优化留到下一篇文章吧。
为了使本文尽量生动有趣,我仍然用葫芦娃作为例子展示YOLO的过程(真的是尽力了。。。)。
葫芦娃 下面进入正题,首先回顾下YOLO v1的模型结构,忘记了的同学请看上面的文章并点赞,如下面2图所示:
YOLO YOLO 我们认为,检测模型=特征提取器+检测头
在YOLO v1的模型中检测头就是最后的2个全连接层(Linear in PyTorch),它们是参数量最大的2个层,也是最值得改进的2个层。后面的YOLO模型都对这里进行改进:
YOLO v1一共预测49个目标,一共98个框。
5 YOLO v2YOLO v1虽然快,但是预测的框不准确,很多目标找不到:
预测的框不准确:准确度不足。
很多目标找不到:recall不足。
我们一个问题一个问题解决,首先第1个:
当时别人是怎么做的?
同时代的检测器有R-CNN,人家预测的是偏移量。
什么是偏移量?
YOLO v2 之前YOLO v1直接预测x,y,w,h,范围比较大,现在我们想预测一个稍微小一点的值,来增加准确度。
不得不先介绍2个新概念:基于grid的偏移量和基于anchor的偏移量。什么意思呢?
基于anchor的偏移量的意思是,anchor的位置是固定的,偏移量=目标位置-anchor的位置。
基于grid的偏移量的意思是,grid的位置是固定的,偏移量=目标位置-grid的位置。
Anchor是什么玩意?
Anchor是R-CNN系列的一个概念,你可以把它理解为一个预先定义好的框,它的位置,宽高都是已知的,是一个参照物,供我们预测时参考。
上面的图就是YOLO v2给出的改进,你可能现在看得一脸懵逼,我先解释下各个字母的含义:
通过这样的定义我们从直接预测位置改为预测一个偏移量,基于Anchor框的宽和高和grid的先验位置的偏移量,得到最终目标的位置,这种方法也叫作location prediction。
这里还涉及到一个尺寸问题:
刚才说到 图1:原始值
如图1所示,假设此图分为9个grid,GT如红色的框所示,Anchor如紫色的框所示。图中的数字为image的真实信息。
我们首先会对这些值归一化,结果如下图2所示:
图2:要预测的值 归一化之后你会发现,要预测的值就变为了:
methods to get the 5 anchor
方法:对于任意一个数据集,就比如说COCO吧(紫色的anchor),先对训练集的GT bounding box进行聚类,聚成几类呢?作者进行了实验之后发现5类的recall vs. complexity比较好,现在聚成了5类,当然9类的mAP最好,预测的最全面,但是在复杂度上升很多的同时对模型的准确度提升不大,所以采用了一个比较折中的办法选取了5个聚类簇,即使用5个先验框。
所以到现在为止,有了anchor再结合刚才的 YOLO v2损失函数
这里的W=13,H=13,A=5。 每个 YOLO v1和v2的比较
6 YOLO v3之前在说小目标检测仍然是YOLO v2的痛,YOLO v3是如何改进的呢?如下图所示。
YOLO v3 我们知道,YOLO v2的检测头已经由YOLO v1的 YOLO v3
检测头是DBL,定义在图上,没有了FC。
还有一种画法,更加直观一点:
YOLO v3 head
anchor和YOLO v2一样,依然是从数据集中统计得到的。
YOLO v3损失函数 第4行说明:loss分3部分组成: 第1行代表geo_loss,S代表13,26,52,就是grid是几乘几的。B=5。 第2行代表class_loss,和YOLO v2的区别是改成了交叉熵。 第3行代表confidence_loss,和YOLO v2一模一样。 最后我们做个比较:
YOLO v1 v2和v3的比较 7 疫情都挡不住的YOLO v4第一次看到YOLO v4公众号发文是在疫情期间,那时候还来不了学校。不得不说疫情也挡不住作者科研的动力。。。
YOLO v4的作者换成了Alexey Bochkovskiy大神,检测头总的来说还是多尺度的,3个尺度,分别负责大中小目标。只不过多了一些细节的改进:
1.Using multi-anchors for single ground truth
之前的YOLO v3是1个anchor负责一个GT,YOLO v4中用多个anchor去负责一个GT。方法是:对于 图3:YOLO v2,YOLO v3要预测的值
这里其实还隐藏着一个问题:
模型预测的结果是: 图4:IoU Loss不能反映两者的距离大小
图4:GIoU Loss
GIoU Loss可以解决上面IoU Loss对距离不敏感的问题。但是GIoU Loss存在训练过程中发散等问题。
图5:DIoU Loss
DIoU loss可以直接最小化两个目标框的距离,因此比GIoU loss收敛快得多。
但是DIoU loss依然存在包含的问题,即:
这2种情况anchor是怎么用的
有了anchor的
本文只介绍了YOLO v2 v3 v4 v5对于检测头head和损失函数loss的优化,剩下的backbone方面的优化实在是写不动了,放到下一篇吧。
— 完—
为您推荐 你一定从未看过如此通俗易懂的YOLO系列解读 (上)这21张深度学习速查表让你代码能力突飞猛进22课时、19大主题,CS 231n进阶版课程视频上线数据分析入门常用的23个牛逼Pandas代码如何在科研论文中画出漂亮的插图?