欢迎关注个人我的微信公众号:小纸屑算法
2015年6月,YOLOv1横空出世,标志着一步式物体检测算法时代的到来,同年12月,经典一步式物体检测算法SSD出世,在准确度和速度上均击败了傲娇的YOLOv1。通过一年的探索,2016年12月,YOLOv1做者Joseph Redmon发布YOLOv2,以图扳回一城。微信
下图是深度学习时代物体检测算法的里程碑,能够看到YOLO系列的相对位置。网络
YOLOv2的效果可谓很是理想(貌似没有论文的结果不理想。。。。),以下图,在VOC数据集上准确度作到了当时的SOTA(state of the art),速度上更不用说,YOLOv2确定是一骑绝尘,别的模型难以望其项背。性能
具体做者怎么作到的呢?无他,惟有trick而已。做者使用了整十个trick来提高性能,下图是做者给出的各个trick的对比试验,由衷感叹trick的重要性。学习
提高 2.4mPA Batch Normalization主要用来解决internal covariance shift问题,能够加快训练和收敛速度,同时还有必定的正则化做用。总体上,还能够提高性能,这里提高了2.4mPA,很是多了。如今基本是CV标配,dropout反而用的比较少。设计
提高 3.7mPA3d
上图是YOLOv1的网络结构,feature extractor network是在ImageNet上训练的,这里的classifier指的就是feature extractor network。 YOLOv1只是在224x224分辨率上训练classifier,但物体检测的图片输入是448x448,存在分辨率不匹配的状况,因此YOLOv2采用的训练策略是,先在224x224分辨率上训练,最后10个epoch在448x448分辨率上训练。性能提高3.7mPA,提高显著。orm
提高 -0.3mPA,但recall从81%提高到87%cdn
1)convolutionalblog
从YOLOv1的网络结构能够看出,YOLOv1输入是448x448x3,输出是7x7x30,YOLOv1输出前的object detection layers是两层全链接层。但明显的7x7x30这种结构与卷积的输出形式一致,所以用卷积实现更方便,也即将上图中的两个全链接层直接改成卷积层便可。 全卷积实现还有个很是大的好处,输入图片尺寸再也不固定,能够任意变化,只要大于总体步长便可。这也是YOLOv2能够在准度和速度之间作权衡的本质。当图片分辨率高,输出的分辨率也高,通常更准,但计算量也更大,速度会变慢。当图片分辨率较小时,输出的分辨率也较小,准度降低,但计算量更小,速度更快。 改成全卷积实现后,输入图片的分辨率也从448x448变为418x418,总体分辨率缩减步长从64变为32,加强位置语义,相对应的输出分辨率也就从7x7变为13x13,输出的框更多。
2)anchor boxes
YOLOv1没有使用anchor box,借鉴Faster R-CNN和SSD,YOLOv2也使用了anchor box,3个ratio,3个scale,总共9个anchor box,加强学习的多样性,下降学习难度。 YOLOv2最终的输出为13x13x9x25。 用convolutional实现,并使用anchor box,最终致使准度降低0.3mAP,但recall从81%提高到87%,为其余trick提高准确度奠基基础。
提高0.4mAP 借鉴Inception、VGG和Network in Network等网络模型优势,做者从新设计了特征提取网络Darknet19。网络结构以下图。
最终准度提高0.4mAP,并不算多,但网络速度更快,这才是做者的主要目的。
提高4.8mAP
1)dimension priors
第四项trick中,做者使用了3个固定ratio和3个固定scale,总共9个anchor box来提升框的多样性。anchor box实际上是先验框,网络最终回归的是anchor box与GT之间的差别,很显然,若是anchor box与GT约接近,则学习难度会更小。一个经常使用方法是,将真实的GT聚类产生anchor box。dimension priors就是经过聚类产生anchor box尺寸。 聚类中,每个样本到中心点的距离通常用欧式距离,但这并不适合先验框尺寸的回归,由于先验框聚类是寻找与全部样本框的平均IOU最大的中心点,也即1-IOU最小的中心点。所以做者把聚类的距离定义为下式: d(box,controid) = 1 - IOU(box,controid) 最终平均IOU与类簇数量之间的关系以下图:
2)location prediction
Faster R-CNN预测中心点坐标,预测的是相对与anchor box长宽的相对值。
这两项改进的提高效果是极其显著的,性能增长了4.8mAP。
提高1.0mAP SSD使用多分辨率输出,YOLOv2则采用了另一个思路,将高分辨率的特征融合到输出所用的分辨率的feature map。这其实离低分辨率特征融合到高分辨率特征的FPN很是近了,惋惜惋惜。 具体怎么作的呢?以下图
将最后一个26x26x512的feature map,reshape成13x13x2048,再与最后一个13x13x1024的feature map Concatenate。而后再进行物体检测。
最终性能提高1.0mAP。
提高1.4mAP 再进行物体检测训练时(是在VOC或者COO上,不是在ImageNet),输入图片的分辨率不固定,而是随机从{320, 352, …, 608}中选取一个。这样使整个网络具备分辨率自适应的能力,避免过拟合于一个分辨率。
提高1.8mAP 由于全卷积实现,YOLOv2输入的分辨率能够任意调整,输入分辨率越高,准度也越大。所以high resolution detector也能够提高性能。
不幸的是,YOLOv2在COCO上的表现都不好,都不如SSD300。
主要是YOLOv2对小物体检测不给力,backbone也不够强大。这个问题在YOLOv3上有所改善,但仍是有所欠缺。
不过不要紧,快并且准度OK就好了,生产环境场景没有COCO那么复杂。
YOLOv2充分展现了各个trick累计产生的巨大能量。昭示咱们,不要小看任何一个小trick的做用。 YOLOv2在COCO上的表现依旧差强人意,主要是YOLOv2对小物体检测不给力,backbone也不够强大。 真心但愿看到一个又快又准的YOLOv4?