1.Introduction
我们针对YOLO框架(YOLOv1,YOLOv2、YOLO9000)只是做了一些小的改动和优化,形成了YOLOv3。
2.The Deal
2.1.Bounding Box Prediction
在YOLO9000中,我们使用聚类的方法产生anchor box。每个bounding box预测出4个坐标: t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th。假设cell的左上角相对于整幅图像的左上角的offset为 ( c x , c y ) (c_x,c_y) (cx,cy),anchor box的宽和高为 p w , p h p_w,p_h pw,ph,那么预测结果为:
b x = σ ( t x ) + c x b_x = \sigma (t_x) + c_x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_y = \sigma (t_y) + c_y by=σ(ty)+cy
b w = p w e t w b_w = p_w e^{t_w} bw=pwetw
b h = p h e t h b_h = p_h e^{t_h} bh=pheth
训练使用均方误差(sum of squared error loss)。
YOLOv3使用逻辑回归为每个bounding box都预测一个objectness score。不像Faster R-CNN,对于每个ground truth object,我们只分配一个bounding box prior。没有被分配到ground truth object的bounding box prior不会参与coordinate和class的loss计算,只保留objectness部分(的loss)。
2.2.Class Prediction
bounding box的类别标签可能有多个(比如某一object既属于woman,也属于person),对于这种multilabel classification任务,softmax函数就不是很合适。因此我们使用多个独立的逻辑回归二分类器。在训练时,对于类别的预测,使用binary cross-entropy loss。
这一策略也使得我们可以将算法移植到更复杂的Open Images Dataset。
2.3.Predictions Across Scales
对于聚类产生anchor,在YOLOv2中,是不是也有这种可能:对于整幅图像来说,整个数据集聚类得到k种anchor box的大小,如果是针对每个grid cell,好像没这个必要。
我们使用了3种不同scale的feature map来预测box(见上图)。对于每种scale的feature map,每个grid cell都负责预测3个box,所以输出的tensor维度为: N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N \times N \times [ 3 * (4+1+80) ] N×N×[3∗(4+1+80)],4为bounding box的offset,1为objectness prediction,80为COCO数据集的类别数。
我们依然使用k-means生成anchor box。对于COCO数据集,一共使用了9种anchor box: ( 10 × 13 ) , ( 16 × 30 ) , ( 33 × 23 ) , ( 30 × 61 ) , ( 62 × 45 ) , ( 59 × 119 ) , ( 116 × 90 ) , ( 156 × 198 ) , ( 373 × 326 ) (10\times 13),(16 \times 30),(33\times 23),(30\times 61),(62\times 45),(59 \times 119),(116 \times 90),(156\times 198),(373\times 326) (10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。这9种anchor box我们随机均匀分配给3个scale的feature map,即每个scale的feature map分到3种anchor box。
2.4.Feature Extractor
我们使用一个新的网络用于特征提取,这个新的网络基于YOLOv2中的Darknet-19,我们添加了残差连接,我们将这个网络称之为Darknet-53:
Darknet-53比Darknet-19性能更好,比ResNet-101、ResNet-152效率更高,其在ImageNet上的测试结果见下:
每个网络的参数配置都一样,图像大小均为 256 × 256 256 \times 256 256×256,统计single crop准确率。run time在Titan X上进行测试。Darknet-53和SOTA分类器的性能相当,但是计算成本更低,速度更快。Darknet-53性能比ResNet-101要高,并且速度是ResNet-101的1.5倍快。Darknet-53和ResNet-152的性能相近,但是速度却是ResNet-152的2倍快。
Darknet-53每秒执行的浮点数计算(floating point operations)是最多的,说明Darknet-53对GPU的利用更为充分。ResNet因为层数太多,所以效率不高。
2.5.Training
我们在full image上进行训练,没有使用hard negative mining。使用multi-scale training和多种数据扩展方式、BatchNorm等一些标准操作。
3.How We Do
YOLOv3的结果相当好,见表3。使用了COCO中各种奇怪的AP指标作为评价标准,YOLOv3和SSD变体的性能相近,但速度快了3倍。但YOLOv3的性能远落后于RetinaNet。
但是如果我们看一些老的常用的AP指标,例如 A P 50 AP_{50} AP50(即IoU阈值为0.5时的mAP),YOLOv3的性能还是非常不错的,其和RetinaNet性能相当,且远优于SSD变体。但是当IoU的阈值变大时,例如 A P 75 AP_{75} AP75,YOLOv3的性能会出现大幅的下滑。
之前的YOLO版本对小目标的检测并不好,但是YOLOv3对这一缺点进行了改进。 A P S , A P M , A P L AP_S,AP_M,AP_L APS,APM,APL分别代表对小型目标、中型目标、大型目标的检测结果。从表3中可以看到,YOLOv3在小目标检测上的结果还算可以,但是其检测精度依然远低于对中型目标和大型目标的检测精度。
4.Things We Tried That Didn’t Work
我们列出了尝试过却没有起作用的方法。
Anchor box x,y offset predictions.
使用 x , y x,y x,y的offset(个人理解就是 t x , t y t_x,t_y tx,ty),通过一个线性函数来预测bounding box的宽和高(最终使用的不是线性函数,而是一个指数函数)。我们发现使用线性函数预测bounding box的宽和高会降低模型的稳定性,效果并不好。
Linear x,y predictions instead of logistic.
在YOLOv2中,我们使用了逻辑回归来预测 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th,以限制其范围在0~1之间。我们尝试换成普通的线性模型,结果导致mAP大幅下降。
Focal loss.
我们尝试使用focal loss,导致mAP下降了2个百分点。
Dual IOU thresholds and truth assignment.
Faster R-CNN在训练过程中使用了两个IoU阈值:IoU>0.7为正样本,IoU在[0.3,0.7]之间会被忽略,IoU<0.3为负样本。我们也尝试了相似的策略,但结果并不好。
5.What This All Means
YOLOv3速度快,精度高。
6.原文链接
👽YOLOv3:An Incremental Improvement
7.参考资料
想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️
个人博客网站:https://shichaoxin.com
GitHub:https://github.com/x-jeff