论文 https://arxiv.org/pdf/1804.02767.pdf
代码 https://github.com/qqwweee/keras-yolo3
Darknet 53
yolo v3借用了FPN特征融合的思想,但是又与Faster-Rcnn里的FPN不同,这里是通过concat的方式融合,faster-rcnn里则是通过add的方式。yolo v2中则是通过passthrough层实现网络浅层和深层特征的融合。
网络通过多尺度预测输出三个大小不同的预测,分别为13×13×255,26×26×255,52×52×255,这里255=3×(80+5)
y_true的shape为[(m, 13, 13, 3, 25), (m, 26, 26, 3, 25), (m, 52, 52, 3, 25)],其中m是batch size,25是voc数据集的class_num + 5, 5是4个坐标和1个置信度。9个anchor的大小为(10,13), (16,30), (33,23), (30,61), (62,45), (59,119), (116,90), (156,198), (373,326)。根据大小将9个anchor分配到三个不同的输出层,计算gt box与anchor的iou,注意这里只考虑形状,即将gt box和anchor的中心对齐后再计算iou,找到每个gt box对应iou最大的anchor,分配到y_true中对应的位置。
Loss
其中带*号的表示预测值,不带*号的表示标签。具体来说分为三个部分
- 位置损失,xy损失是BCE loss,wh损失是MSE loss
- 目标置信度损失,即obj loss,是BCE loss
- 类别损失是BCE loss
其中在计算位置损失时,乘上了一个(2 - gt_w * gt_h)的系数,这里的gt_w和gt_h是归一化后的结果。这样会减小大目标的loss权重,增大小目标的loss权重,这样在一定程度上会防止小目标因为梯度太小而被直接丢弃的情况,起到和yolo v1中采用的平方根以降低boxes的大小对误差的影响同样的效果。
MMDetection中的yolo v3实现和官方的区别
- 去掉了位置损失中的权重系数(2 - gt_w * gt_h)
- 对于max_iou > thresh,但和gt不匹配的情况下,作为负样本。官方实现中是忽略其损失
参考
https://blog.csdn.net/dz4543/article/details/90049377