YOLO-v3 阅读笔记
【UPDATE】
读了一篇写得很好的文章,结合源码很容易理解。
https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch-part-4/
fork了一个不错的代码:
https://github.com/eriklindernoren/PyTorch-YOLOv3
YOLO-v3论文标题:《YOLOv3: An Incremental Improvement》。论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf。项目官网:https://pjreddie.com/darknet/yolo/(当然GitHub上也有很多复现啦)
YOLOv3的论文读起来很有趣,又短又好(?),建议大家自己感受一下大佬的幽默。与之前的系列一样,YOLOv3依然少了很多细节,网上的许多博主作了很多分析,但大部分是直接讲改进的模块,切入门槛挺高。我从头做了一些翻译,并且插入了一些写得好的分析博文,有些放到了参考文献中。想要真正理解还是去读源码。
摘要
我们更新了YOLO,它依然又快又好。
第一章 介绍
我对YOLO作了一些改进,但是说实话,没有什么特别有趣的东西,就是做了一些改变使它更好。另外这是一份技术报告,不需要引入介绍,因为我们大家都知道要讲什么。
第二章 The Deal
YOLO3的改进在于吸取了别人的好想法,并且训练了一个新的更好的分类网络(Darknet-53)。
2.1. Bounding Box Prediction
我们的系统和YOLO9000一样,使用dimension clusters来初始化anchor box,使用边界框回归算法进行预测(YOLOv2里有写),复习一下公式,
在训练过程中,我们使用平方误差之和作为损失函数,如果某些坐标预测的GT为tˆ*,我们的梯度计算是GT减去我们的预测:tˆ*-t*。其中GT 的值tˆ*也是通过上述公式转换而来。
YOLOv3用Logistic回归预测每个Bbox的objectness score(存在目标的概率),如果这个Bbox与GT框的IOU比其他Bbox高,那么其得分为1。与之前版本同样的,每个目标类别只取一个Bbox。如果当前的预测不是最好的,但它和ground truth对象重合到了一定阈值以上,神经网络会忽视这个预测。如果先前的边界框并未分配给相应对象,那它只是检测错了对象(objectness score),而不会对坐标或分类预测造成影响。
2.2. Class Prediction
每个框使用多标签分类来预测Bbox可能包含的类,不再使用只能预测一个类的softmax,我们只使用独立的logistic分类器。在训练过程中,我们使用二值的交叉熵损失进行类预测。(这部分介绍的很粗略)
2.3. Predictions Across Scales
- YOLOv3在3种不同的尺度进行预测,使用类似FPN的特征金字塔结构来提取特征。在我们基本的特征提取器中又添加了几个卷积层,最后一个卷积层输出的是一个3维张量,包含边界框信息、objectness(是否含有目标)和分类预测。
- 在COCO数据集的实验中,每种尺度我们会预测3个Bbox,因此最终的tensor尺寸为:
N × N × [3 ∗ (4 + 1 + 80)],4是Bbox的偏移量,1是objectness,80是分类预测。 - 接下来,我们从前两层中提取特征映射,并将其向上采样2倍。我们还从早期的网络中获取一个特征映射,并使用concat将其与我们的上采样特征合并(类似shortcut的操作)。该方法使我们能够从上采样的特征中获取更有意义的语义信息,从早期的特征映射中获得更细粒度的信息。然后,我们再添加几个卷积层来处理这个concat之后的特征图,并最终预测一个类似的张量,尽管现在是放大两倍后的尺寸。
- 在3种尺度中,每一个尺度都可以从上一个尺度以及前期网络中获取细粒度信息,再加以融合。这样说似乎有些抽象,作者并没有给出网络结构图,放一张网上大神的图片(侵删)。
- 最后,先验眶尺寸的选择上,依然先使用k均值进行聚类。
2.4. Feature Extractor
在Darknet-19 和残差网络思想的基础上提出了新的Darknet-53分类网络。(此处Darknet-53的网络结构就不放了,直接查论文就好)作了与其它分类网络的横向对比,效果又快又好。顺便说一句,Resnet有太多的层,而且效率不高。
2.5. Training
我们仍然训练完整的图像,没有hard negative样本挖掘或其他任何东西。我们使用多尺度的训练,大量的数据增强,批量规范化,所有标准的东西.我们使用Darknet神经网络框架进行训练和测试。
第三章 How We Do
- YOLO3太好使了,就COCO的奇怪的平均AP评估方法(笑)而言,它与SSD的变体方法不相上下,但速度却提升了3倍。但是跟其它检测器比,比如RetinaNet,效果还是差一截。
2 在IOU=0.5时的AP值还不错,但是,随着IOU阈值的增加,性能明显下降,这表明YOLO3很难使Bbox与目标完全一致,也就是说定位准确性不足。
3 YOLO3在小目标检测上的性能有所增强,即下表中的Aps。然而,它在中、大尺寸对象上的性能相对较差。需要更多的研究才能找到真相。
- 论文中的图3(是图3哦,论文中此处写的是图5)展示了YOLO3与其它检测器在准确率和速度方面的对比。啥也不说了,上图吧。(这个图与论文中的图1是不一样的,虽然看着很相似……图1用的是AP,下图用的是AP50,即IOU=0.5,我觉得直接看上表得了,反正都是用表上的数据做的哈哈哈)
第四章 Things We Tried That Didn’t Work
- 我们在YOLO3上作了很多的尝试,下面是我们还记得的一些失败的案例。(帮你踩了坑)
- 使用anchor box来预测偏移,其中,使用线性激活将x,y偏移量预测为box宽或高度的倍数。这会降低模型的稳定性,不好使。
- 使用线性回归而不是logistics回归来预测x,y的偏移,两者不相同哦,logistics回归实质是一种分类方法,(说着我就掏出了我的西瓜书……)这会使得mAP下降。
- Focal loss。我们尝试过使用Focal loss(RetinaNet中使用的),这会使得我们mAP下降2%(不是所有trick都适用于自己的模型哦)YOLOv 3可能已经对Focal loss试图解决的问题具有足够的鲁棒性,因为它有独立的objectness predictions and conditional class predictions。
- Dual IOU thresholds and truth assignment.
Faster R-CNN在训练中使用了两个IOU阈值,如预测框与GT框的IOU大于0.7,则被认为是一次正样本;在0.3-0.7之间的Bbox将被忽略;在0.3以下的将被认为是负样本。我们在YOLO3中试过同样的方法,但是并不怎么奏效。
第五章 What This All Means
- 尽管在AP50-AP95之间,YOLO的成绩不算很好,但YOLO3在AP50上取得了不错的成绩,为啥我们要选择这个指标呢(笑),COCO数据集的论文中有一句这样的话:“A full discussion of evaluation metrics will be added once the evaluation server is complete”. Russakovsky等人曾经有一份报告,说人类很难区分.3与.5的IOU:“训练人们用肉眼区别IOU值为0.3的边界框和0.5的边界框是一件非常困难的事”。如果人类都难以区分这种差异,那这个指标有多重要?(有道理)
- (以下内容属于严肃的思考,我直接放翻译了,不舍得改动~)
但也许更好的一个问题是:现在我们有了这些检测器,我们能用它们来干嘛?很多从事这方面研究的人都受雇于Google和Facebook,我想至少我们知道如果这项技术发展得完善,那他们绝对不会把它用来收集你的个人信息然后卖给……等等,你把事实说出来了!!Oh.
那么其他巨资资助计算机视觉研究的人还有军方,他们从来没有做过任何可怕的事情,比如用新技术杀死很多人oh wait………呸呸呸
(脚注:作者由海军研究办公室和谷歌资助。)
我非常希望大多数人会把计算机视觉技术用于快乐的、幸福的事情上,比如计算国家公园里斑马的数量,或者追踪小区附近到底有多少猫。但是计算机视觉技术的应用已经步入歧途了,作为研究人员,我们有责任思考自己的工作可能带给社会的危害,并考虑怎么减轻这种危害。我们非常珍惜这个世界。
最后,不要在Twitter上@我,我已经弃坑了!
如有错误,欢迎指正。
我要去玩YOLO源码了,下篇更新什么还没想好。
参考文献
[1] https://blog.csdn.net/leviopku/article/details/82660381
[2] https://www.jianshu.com/p/d13ae1055302
[3] https://blog.csdn.net/baidu_27643275/article/details/82964784