1. 前言
论文下载:http://arxiv.org/abs/1506.02640
代码下载:https://github.com/pjreddie/darknet
核心思想:将整张图片作为网络的输入(类似于Faster-RCNN),直接在输出层对BBox的位置和类别进行回归。
目标检测之YOLO算法:YOLOv1,YOLOv2,YOLOv3,TinyYOLO,YOLOv4,YOLOv5,YOLObile,YOLOF详解:
2. YOLO v1算法详解
2.1 实现方法
- 将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。
![](https://img-blog.csdnimg.cn/img_convert/8bbb6932ee8d264eccb64a92c69cdb74.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/a1a715fa19a2318d6b03688cf4585a58.webp?x-oss-process=image/format,png)
- 每个网络需要预测B个BBox的位置信息和confidence(置信度)信息,一个BBox对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:
![](https://img-blog.csdnimg.cn/img_convert/eba82b326ff6e9f18aa239b722322a22.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/fd171ebf11b00b2f4d5e5e131b72450f.webp?x-oss-process=image/format,png)
- 每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。(注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。)
- 举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。整个网络结构如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/86029f68247bd5bc54b3d5fdafb3d719.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/5ac097651b7d771587d908297af7e594.webp?x-oss-process=image/format,png)
- 在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
![](https://img-blog.csdnimg.cn/img_convert/a6a087369899593d118e6b2ee3b78cd9.png)
![](https://img-blog.csdnimg.cn/img_convert/5c3dd481a7af28ae6537d20f0e370ce0.png)
- 得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
简单的概括就是:
(1) 给个一个输入图像,首先将图像划分成7*7的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3) 根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可
2.2 损失函数
在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。
这种做法存在以下几个问题:
- 第一,8维的localization error和20维的classification error同等重要显然是不合理的;
- 第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。
解决办法:
- 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight。
- 对没有object的box的confidence loss,赋予小的loss weight。
- 有object的box的confidence loss和类别的loss的loss weight正常取1。
对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。(也是个近似逼近方式)
![](https://img-blog.csdnimg.cn/img_convert/a2b6a491708457b85818543c5821ee32.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/c7494d3d46450ee9b84839aa525f9b03.webp?x-oss-process=image/format,png)
一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。
最后整个的损失函数如下所示:
![](https://img-blog.csdnimg.cn/img_convert/3c3d0c9ad5b04b09a7f65400a100ea03.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/023c7ff0c4dfde6b33bbce74e6c724b6.webp?x-oss-process=image/format,png)
这个损失函数中:
- 只有当某个网格中有object的时候才对classification error进行惩罚。
- 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。
其他细节,例如激活函数使用leak RELU,模型用ImageNet预训练,模型使用了Dropout(p=0.5)和数据增强来避免过拟合的问题,使用NMS来去除重复的框提高了2%-3%的mAP等等。
2.3 优点
- 快速,pipline简单.
- 背景误检率低。
- 通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。
2.4 缺点
- 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
- 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
- YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
2.5 实验结果
如下图所示,YOLOV1与其他实时检测系统的实验结果的对比(PASCAL VOC 2007),YOLOV1在检测的速度和精度方面效果都不错。
![](https://img-blog.csdnimg.cn/img_convert/84ce8f14b2f0740a3cdd9115a824c19b.png)
![](https://img-blog.csdnimg.cn/img_convert/eeefff4b6cb9846e5527b4f28994177e.png)
如下图所示,错误分析,Fast R-CNN vs. YOLOV1:YOLOV1很难正确地定位目标,在YOLOV1的错误中,定位错误所占的比重超过了其它所有错误的总和。Fast R-CNN的定位错误要少得多,但背景错误要多得多。Fast R-CNN预测背景检测的可能性几乎是YOLOV1的三倍。
![](https://img-blog.csdnimg.cn/img_convert/218bed2a526d607296e0ae2e3edb8557.png)
![](https://img-blog.csdnimg.cn/img_convert/26f1609f72834a1f061e9f37a479af78.png)
如下图所示,论文通过使用YOLOV1来消除来自Fast R-CNN的背景检测,得到了显著的性能提升,当与YOLOV1相结合时,其mAP增长3.2%至75.0%。不幸的是,这种组合并不能从YOLOV1的速度中受益。
![](https://img-blog.csdnimg.cn/img_convert/8db1759acdfdf7ea8535e4ace8235050.png)
![](https://img-blog.csdnimg.cn/img_convert/b00479ae4b407baa57d010ac855a0b80.webp?x-oss-process=image/format,png)
如下图所示,在VOC 2012测试中,YOLOV1的得分为57.9%。这比目前的技术水平要低,更接近使用VGG-16的原始R-CNN。与最接近的竞争对手相比,YOLOV1在检测小物体时比较困难。与YOLO结合后,Fast R-CNN提高了2.3%(Fast R-CNN + YOLO)。
![](https://img-blog.csdnimg.cn/img_convert/43c8a2d1634de29c707dee7b2b861c61.png)
![](https://img-blog.csdnimg.cn/img_convert/d4ed1a14ab31b35ff05ebd40a9fadf9a.png)
如下图所示,在Picasso和People-Art 数据集上,YOLOV1与其他检测方法的性能比较。针对于不同的数据集,R-CNN的mAP下降的非常快,而YOLO和DPM的mAP下降的比较缓慢。与DPM一样,YOLOV1为目标的大小和形状、目标之间的关系以及目标通常出现的位置建模。艺术品和自然图像在像素级别上有很大的不同,但它们在目标的大小和形状方面是相似的,因此YOLOV1仍然可以预测良好的边界框和检测。
![](https://img-blog.csdnimg.cn/img_convert/16ad22c3ae1e6bc3f2351f04d31de7f8.png)
![](https://img-blog.csdnimg.cn/img_convert/427dc4f6bd225ada014234b7ee3ec8f2.png)
YOLOV1在艺术品和自然图像上的检测结果如下,演示源代码:
![](https://img-blog.csdnimg.cn/img_convert/d0b98dc26a61f481ea66304863919b80.png)
![](https://img-blog.csdnimg.cn/img_convert/43ae4fbd4b3df44447eef81e74133e06.webp?x-oss-process=image/format,png)
Reference:https://zhuanlan.zhihu.com/p/362758477