YOLOv2也已经更新,为了阅读方便,直接更新在上周的博客里了,有兴趣的不妨前去观摩,这里主要介绍下YOLOv3,也是目前YOLO最新的版本。

YOLOv3

Introduction和Conclusion有很多吐槽无力的卖萌,看论文的话直接跳过就好了……总体来说,YOLOv3并没有像YOLOv1到v2那样取得performance和speed的全方位进步,主要还是提升performance吧,而速度按照作者的原话是”still faster”。

1. 主要改进

1. Bounding Box

这里的回归目标其实和v2版本是一样的:
目标检测论文阅读:YOLOv1-YOLOv3(二)
不过匹配策略可能不太一样,YOLOv2中的阈值是0.3,大于该阈值的被认为是gt;YOLOv3的机制我不是很理解,原文的说法是:If the bounding box prior is not the best but does overlap a ground truth object by more than some threshold we ignore the prediction, following [17] 以及Unlike [17] our system only assigns one bounding box prior for each ground truth object. If a bounding box prior is not assigned to a ground truth object it incurs no loss for coordinate or class predictions, only objectness. 每个GT只assign一个bbox比较好理解,问题是这里IOU大于某个阈值而IOU又不是最佳的bbox prior怎么处理的?忽略类别和位置,只考虑object的scores?那和负样本的区别是什么?我个人的理解是小于0.5的应该是直接淘汰掉的,然后大于0.5不是最佳的考虑object score的损失,最佳匹配的考虑全部损失……但是这样会不会样本不充足或者负样本过少?不知道是不是我的理解有问题。

2. Class Prediction

一般来说,前向传播的时候,预测出来的类比confidence要使用softmax**函数的,但是这里作者没有使用softmax或者v2版本的softmax tree,而是直接使用logistic的**函数,这样本质上就相对于各个类别的关系独立了。
这样处理的好处是可以应对多标签类别的问题,另一个优点我认为本质上和Mask R-CNN有点像,是对类别之间进行解耦。但是什么时候需要decouple,什么时候不需要,本文的方式和多个二类别softmax的优劣比较都是仍然需要分析思考的问题。

3. Across Scales

之前介绍的v2版本,作者concatenate不同feature map层的特征,来进行特征融合和预测,这里是这种思路进一步的拓展延伸,本质上和FPN很像,只是融合方式不同。
具体实现方法是:先在特征抽取后的最后一层(大小13x13)上进行预测,然后对这个feature map做2x的upsample,和之前(26x26)的feature map做concatenate,然后用通道连接后的特征做预测……在52x52大小的feature map上做预测的原理相同,另外,作者也会使用卷积来处理连接后的特征。
之前的v2版本工作中,作者使用聚类来得到anchor,这里也是一样的;不同的是,作者使用聚类得到9个聚类中心,然后对它们进行排序,再平均分配到三个尺度上,最后每个尺度有3个anchor。

4. Feature Extractor

这部分也没啥好说的了,一个新的特征抽取层……
目标检测论文阅读:YOLOv1-YOLOv3(二)
因为现在流行的是ResNet,作者主要对比了它们在ImageNet上的分类性能,可以看到这个网络还是很强力的:
目标检测论文阅读:YOLOv1-YOLOv3(二)

通过以上对比,作者取得了很不错的性能,YOLOv3可以在取得和SSD类似performance的同时,速度快3倍……
目标检测论文阅读:YOLOv1-YOLOv3(二)
和RetinaNet相比性能还是稍差的,尤其是AP,但是如果使用IOU为0.5的老的评价策略,还是比较出彩的,为什么IOU提高performance下降这么严重?这说明YOLOv3的定位准确度还是不够好,当然是和RetinaNet相比较而言的。但是和SSD包括和FRCNN对比可以看到,YOLO现在在small scale上的精度已经很高了,制约其性能的反而是对大目标的检测效果,这大概是YOLO现在细化网格带来的问题吧,不知道如果进一步提高多尺度的跨越范围会不会能解决这个问题。

2. 其它

1. 作者的一些尝试

  • Anchor box x,y offset predictions:直接用线性**函数预测x和y的偏移量相对于pw和ph的比例,模型不是很稳定
  • Linear x,y predictions instead of logistic: 直接用线性**函数预测x和y的偏移量,mAP下降
  • Focal loss**重点内容**:同样mAP下降,作者认为是focal loss要解决的问题,对于YOLOv3来说已经足够鲁棒了,我个人认为是和YOLOv3的匹配策略有关系

2. 总结

总的来说,YOLO还是非常经典的工作。我个人感觉,YOLOv2其实是YOLO思想最为明显的体现,通过精简的网络来提升速度,辅以大量的技巧提升performance,包括anchor的聚类求法,我认为可以视作对数据的预处理,非常贴近实际应用。我在读YOLO的时候,并没有读DenseNet或者一些很有突破性的文章那种畅快感,但是YOLO对技巧的整合、对网络的精简和大量的实验都是很值得学习的,它给我的感觉更贴近生产环境而不是学术研究,也正是这个原因,我才觉得YOLO的精华应该是在代码里而不是paper里的,希望有空可以学习一下。