本文为个人学习过程中所记录笔记,便于梳理思路和后续查看用,如有错误,感谢批评指正!
参考:
paper
项目地址
相同点
和YOLOv2相同,YOLOv3同样采用基于anchor的方法,预测的值与YOLOv2也是相同,gird的左上角的偏移来得到中心cx, cy,bounding box的宽高便宜缩放得到宽高。
训练过程中,采用误差平方损失和。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出 tx, ty, tw, th真值)。
采用逻辑回归预测每个box的objectness分数,对于重合度最大的anchor设为1,但是如果不是最大的,但是大于阈值,依旧不进行预测。一个真值仅分配一个anchor,如果先前的边界框未分配给grounding box对象,则不会对坐标或类别预测造成损失,仅有objectness loss(参考【论文解读】Yolo三部曲解读——Yolov3解释这里有歧义,其实是忽略样本,不计算任何loss,负样本才仅仅计算objectness loss)。
不同点
1、YOLOv3采用多标签分类,用多个独立的logistic分类器代替softmax函数,以考虑多标签的情况。在计算分类损失进行训练时,YOLOv3对每个标签使用二元交叉熵损失。
2、为解决之前YOLO算法一直对于小目标检测的劣势,YOLOv3引入了多尺度预测。分为三个不同尺度的头,分别针对不同大小的目标进行检测。每个尺度的特征图上有3个bounding box,因此预测向量是N * N * 3 * (4 + 1 + 80)。然后上采样其中两个特征图,concatenate起来,这里用了FPN。
3、同样采用聚类方法得到anchor,不过每个grid设置9个anchor。
4、backbone引入Resnet的跳跃连接,叫darknet53。比YOLOv2的darknet19更强。甚至强于Resnet101和Resnet152。
作者分析YOLOv3下表的性能发现,在iou阈值0.5的情况下的性能和Retinanet及其变体的性能差得不多,但是当阈值调到0.75以后,性能会大幅度下降,这表明,YOLOv3的回归存在一定的问题,框很难与真值对得特别齐。作者还发现与之前一直苦于诟病的小目标检测效果较差相反,采用了多尺度预测的YOLOv3在中大型目标上的预测反而相对较差。
作者尝试了没用的方法
1、Anchor box(锚定框)坐标的偏移预测:我们尝试了常规的Anchor box预测方法,比如利用线性激活将坐标x、y的偏移程度预测为边界框宽度或高度的倍数。但我们发现这种做法降低了模型的稳定性,且效果不佳。
2、线性x,y预测,而不是逻辑预测:我们尝试使用线性激活来直接预测x,y偏移量,而不是Logistic激活。这导致map下降了几个百分点。
3、Focal loss:我们试着用Focal loss。它使我们的map下降了大约2个点。YOLOv3可能已经对Focal loss试图解决的问题具有鲁棒性,因为它有单独的客观性预测和条件类预测。因此,对于大多数例子来说,类预测没有损失吗?还是别的什么?我们不能完全确定。
4、双IOU阈值和真值分配:在训练期间,Faster RCNN用了两个IOU阈值,如果预测的边框与0.7的ground truth重合,那它是个正面的结果;如果在[0.3—0.7]之间,则忽略;如果和0.3的ground truth重合,那它就是个负面的结果。我们尝试了这种思路,但效果并不好。我们对现在的更新状况很满意,它看起来已经是最佳状态。有些技术可能会产生更好的结果,但我们还需要对它们做一些调整来稳定训练。