Poly-YOLO:改进YOLOv3实现速度更快、更准确的检测和分割.
YOLOv3评价性能是在比赛数据上测试的,在实际项目数据上效果可能不太好。本文所提出的改进版本YOLOv3就是在特定场景下所提出的改进算法。
1. YOLOv3的问题
(1)标签重写问题
标签重写是指由于yolo特有的网格负责预测bbox的特点,可能会出现两个物体分配给了同一个anchor,导致仅仅有一个物体被保留负责预测,另一个物体被当做背景忽略了。当输入分辨率越小,物体越密集,物体的宽高大小非常接近时,标签重写现象比较严重。如图所示,红色表示被重写的bbox,可以看出27个物体有10个被重写了。
具体来说,以416x416大小的图像为例,在图像分辨率随着卷积下降到13x13的特征图大小时,这时特征图一个像素点对应32x32大小的图像patch。而YOLOV3在训练时候,如果出现相同两个目标的中心位于同一个cell,且分配给同一个anchor,那么前面一个目标就会被后面目标重写,也就是说两个目标由于中心距离太近以至于在特征图上将采样成为同一个像素点的时候,这时其中有个目标会被重写而无法进行到训练当中。
这种现象在coco数据上不明显的原因是bbox分布比较均匀,不同大小物体会分配到不同预测层,标签重写概率比较低。但是在很多实际应用中,比如工业界的特定元件检测时候,物体排布非常紧密,且大小几乎一致,此时就可能会出现标签重写问题,作者指出在Cityscapes数据上该现象也比较明显。
(2)kmeans计算anchor问题
yolo系列采用kmeans算法聚类得到特定要求的9个anchor,并且以每三个为一组,用于大输出图(检测小物体)、中等输出图和小输出图层(检测大物体)的默认anchor。可以看出不同大小的物体会被这三组anchor分配到不同预测层进行预测。
在实际项目中发现这种kmeans算法得出的结果是有问题的。大部分特定场景的目标检测数据集中仅仅有特定的几种尺度,此时采用kmeans这一套流程会导致几乎一样大的物体被强制分到不同层去预测。
kmeans这种设置,仅仅在边界框分布是均匀分布时采用是合理的。假设$r$是输入图片分辨率,如果物体的大小分布是满足边界为$0$到$r$的均匀分布$U[0,r]$,也就是说在图片上各种大小尺度的bbox都会存在的情况下,kmeans做法是合理的。但是可能大部分场景中边界框都是均值为$0.5r$,标准差为$r$的正态分布$N(0.5r,r^2)$,如果按照默认的kmeans算法对anchor的计算策略,那么由于大部分物体都是中等尺寸物体,会出现其余两个分支没有得到很好训练。
2. Poly-YOLO
对于标签重写问题,只能通过增加输入图片分辨率大小或增加输出特征图大小实现。本文的做法是增加输出特征图大小,采用的是$1/4$尺度输出。对于kmeans聚类带来的问题,可以设置只有一个输出层,所有物体都是在这个层预测即可。
基于前面的思想,作者设计的网络如下:
作者对YOLOv3网络结构做出如下改动:
- 网络方面,为了减少参数量,首先减少了通道数目,同时为了提高性能,引入了通道注意力单元来加强特征
- 输出层只有一个,但是也采用了多尺度融合方式
- neck部分提出了hypercolumn + stairstep上采样操作
通过上述参数设置,作者设计的neck和head较轻,共有37.1M的参数,显著低于YOLOv3的61.5M,Poly-YOLO比YOLOv3的精度更高,在可训练参数减少$40\%$的情况下,mAP精度大概也提高了$40\%$。同时为了进一步提速,作者还设计了lite版本,参数仅仅16.5M, 精度和YOLOv3差不多。