目标检测(七)YOLOv3: An Incremental Improvement
Abstract
该技术报告主要介绍了作者对 YOLOv1 的一系列改进措施(注意:不是对YOLOv2,但是借鉴了YOLOv2中的部分改进措施)。虽然改进后的网络较YOLOv1大一些,但是检测结果更精确,运行速度依然很快。在输入图像分辨率为320*320时,YOLOv3运行耗时22ms,mAP达到28.2,这和SSD一样精确,但是速度比SSD快三倍。当我们使用旧的检测指标0.5 IOU mAP(IOU阈值取为0.5,然后比较mAP)时,YOLOv3依旧表现得相当好。在一个 Titan X上,YOLOv3耗时为51ms,AP50为57.9,而RetinaNet耗时198ms,AP50为57.5。可见,二者的性能相近,但是YOLOv3的速度是RetinaNet的3.8倍快。
2. The Deal
报告中对YOLOv1的改进大多数来自于别人的good ideas,同时也有作者自己的贡献,比如训练了一个新的比其它分类器性能要好的classifier network。下面就详细描述各个改进措施:
2.1 Bounding Box Prediction
和YOLOv2一样,YOLOv3使用dimension clusters(k-means聚类的结果)作为anchor boxes(锚箱)来预测bounding boxes。网络为每个bounding box预测4个坐标,即tx,ty,tw,th。如果某cell相对图像左上角的偏置offsets是(cx,cy)并且预测的bounding box对应的先验知识width和height分别为pw,ph,那么预测到的bounding box的实际坐标为:
式中,tx,ty是相对于所在cell的offsets,logistic回归函数将tx,ty约束在0-1范围内,这样保证了每个cell预测到的bounding boxes位于当前cell内。
训练时使用误差平方和损失(Sum of squared error loss)。因此,如果ground-truth box(真实的box)对应的预测坐标是 t,那么相应的梯度(gradient)就是预测坐标减去ground-truth box的真实坐标:t-t*。t*可以通过反转上述公式很容易地计算出,如下:
式中,b*是bounding box对应的ground-truth box的实际坐标;t*是根据实际坐标推算出来的该bounding box对应的理想输出
YOLOv3使用logistic regression为每个bounding box预测一个objectness score(用来表示该bounding box包含一个object的可能性)。在训练时,如果该bounding box对应的prior(即anchor box)与一个ground truth box的IOU高于其它任何bounding box prior,那么该bounding box的objectness score就被置为1;如果该bounding box对应的prior不是最好的但是又确实与一个ground truth box的IOU高于设定的阈值,那么该bounding box会被忽略。论文中作者使用的阈值是0.5。另外,YOLOv3在训练时为每个ground truth object只分配一个bounding box prior(相当于一个bounding box,因为每个cell有k个bounding box prior,每个bounding box prior对应一个bounding box)。如果一个bounding box没有分配到ground truth object,那么在计算定位损失和分类损失时它不会被考虑在内,也就是说只有包含ground truth object的bounding box才会参与训练损失的计算。
2.2 Class Prediction
YOLOv3使用多标签分类为每个bounding box均预测属于各个类别的概率,但是作者没有使用softmax,而是简单地使用了独立的 logistic classifier。体现在网络结构上就是将softmax层替换为一个1*1 卷积层 + logistic激活函数的结构。作者在训练时也使用binary cross-entropy 来计算分类损失。
作者之所以使用 logistic classifier而不是softmax,主要是因为在某些复杂的训练数据集或应用场景中,类别标签labels是有重叠的(比如Woman and Person),而Softmax的使用前提是每个box只属于一类,这与实际情况往往不符。logistic classifier正好能够帮助网络适应这种分类,更好地对数据进行建模。
2.3 Predictions Across Scales
通常一幅图像包含各种不同的objects,且有大有小。因此,网络必须具备能够检测出不同大小物体的能力。在网络中,网络越深,特征图就会越小,所以越往后小的物体越难检测出来。SSD的做法是:在不同深度的feature map中直接检测目标。这样小的物体会在相对较浅的faeture map中被检测出来,而大的物体会在相对较深的feature map中被检测出来,从而达到检测不同scale目标的目的。然而这样的做法忽视了一个问题,那就是不同深度的feature maps所包含的信息不是绝对相同的。比如,浅层的feature map主要包含低级的特征(如物体边缘、颜色、初级位置信息等),而随着网络层加深,feature maps中的高等信息(如物体的语义信息:汽车、猫、狗等)逐渐增多。所以在不同深度的feature map中检测不同尺寸的objects的做法虽然听起来比较合理,但是实际上可能效果并不好
目前实现多重scale的主流方法主要有以下几种:
- (a) :先为一幅图像建立图像金字塔,然后将不同级别的金字塔图像输入到网络当中,用于不同scale物体的检测。显而易见,这样做会导致训练和测试的速度比较慢
- (b) :检测只在最后一个feature map上进行,所以该方法无法检测不同大小的物体
- (c) :在不同深度的feature map上均进行检测。SSD采用的就是这种方法。另外可以看到,每个feature map获得的特征仅来自于之前的层,之后的层的特征无法获取并利用
- (d) :FPN(特征金字塔网络)。与(c)相似,不同的是,当前层的feature map会与更深层的feature maps经过上采样后连接,这样当前层的feature map就可以利用深层的特征,以提高检测精度
YOLOv3在 3 种不同的尺度上预测 B 个boxes(每个尺度对应 B/3 个boxes)。YOLOv3使用类似于 feature pyramid network(特征金字塔网络)的方法提取 3 中不同尺度的特征。从网络中的 base feature extractor(Darknet-53)开始,作者添加了若干层卷积层。其中最后一层卷积层(第一个 scale)输出一个3-d tensor,这个张量包含了 bounding box coordinates,objectness score 和 class predictions。比如在COCO数据集上,每种scale预测3个boxes,那么输出的张量为 N*N*[3*(4+1+80)],包含4个 bounding box offsets,1 个objectness prediction 和 80 个 class predictions
接着对倒数第二层卷积层输出的 feature map 进行 2x 上采样(upsample),再将前面卷积层的 feature map 与上采样后的结果进行拼接(Concatenation)。这样做能够从经过上采样的feature map中获得更加有意义的语义信息(semantic information),也能从前面的feature map中获得更细粒度的信息(finer-grained information)。之后再添加一些卷积层来处理拼接后的feature map,最终输出一个类似的 3-d tensor(第二个scale。与之前相比,size扩大两倍)
再次使用相同的方式可以获得第三个scale(size 再扩大两倍)。因此,基于第三个scale的预测得益于网络中所有prior computation和来自于低层的细粒度特征(fine-grained features)。
在YOLOv3中,作者采用和YOLOv2相同的方法 k-means clustering 来确定bounding box priors(即anchor boxes),之后将确定的 9 个clusters 平均分配给 3 种scales。比如在COCO数据集上得到的 9 个clusters为:(10*13),(16*30),(33*23),(30*61),(62*45),(59*119),(116*90),(156*198),(373*326)。需要注意的是,9个clusters在分配时深层的feature map应该得到最大的3个clusters,浅层的feature map应该得到最小的3个clusters。这是因为深层的feature map是用来检测大目标的,而浅层的feature map是用来检测小目标的。
2.4 Feature Extractor
YOLOv3使用一种新的网络作为 base feature extractor 来提取特征,该网络是基于 YOLOv2使用的 Darknet-19 和流行的残差网络设计的。作者在网络中除了使用了连续的 3*3 卷积层和 1*1 卷积层,还使用了一些shortcut connections,而且该网络结构显著变大。因为该网络有53层卷积层,所以被称为 Darknet-53,其具体结构如Table 1所示:
可以发现,Darknet-53主要由上图中不同颜色的Residual Blocks构成。同时应该能够发现,所有Residual Blocks中的kernel size相同,且第一层卷积层的filters数量是第二层的2倍,随后又是第三层的1倍,依此循环若干次。残差的操作流程如下:
Darknet-53比Darknet-19强大很多,而且仍旧比ResNet-101 或 ResNet-152 高效。Table 2是各分类模型在数据集ImageNet的对比:
从表中可知,Darknet-53的性能可以与最先进的分类器媲美,但是需要更少的浮点运算,速度也更快。此外,Darknet-53每秒的浮点运算次数也是最高的,这说明该网络的结构能够与GPU更好地统一,使得网络的evaluate更快,更高效。
至此,YOLOv3网络的大致结构已经知晓,如下:
再详细点的结构图如下所示:
更详细的网络结构图如下:
2.5 Training
YOLOv3 的训练没有像R-CNN那样使用hard negative mining,类似的也没有,而是依旧直接在整幅image上训练。此外,训练过程中还使用了multi-scale training,lots of data augmentation,batch normalization 以及其它所有的标准措施。当然,YOLOv3在训练和测试时都使用了Darknet neural network framework(Darknet-53)
3. How We Do
在这部分作者将YOLOv3与众多模型在COCO数据集上的检测结果进行了比较,如 Table 3 所示,表中AP50即预测时IOU阈值取为0.5,同样AP75为IOU阈值等于0.75;AP(S,M,L)分别是检测小、中、大目标时的mean AP:
从表中第三列可知,当从旧的 mAP检测指标(AP50,即IOU=0.5时的mAP)比较各模型的性能时,YOLOv3表现得很强,它几乎可以与RetinaNet相媲美,并且超过SSD的variants很多。这说明YOLOv3是一个很强大的detector,擅长为objects生成合适的boxes。但是,当IOU阈值增加时(比如增加到0.75,即AP75),YOLOv3的性能下滑明显,这说明YOLOv3很难将 boxes 与 object 完美对齐。也就是说,YOLOv3能够很快地为objects确定大概的boxes,但是精度不是非常高。
从表中第四列可知,通过multi-scale prediction,YOLOv3在检测小目标时有相当高的 mAPS(尤其与YOLOv2相比),但是在检测中等目标和大目标时性能相对变差。这与YOLOv1很难检测小目标但是中大目标检测效果较好的特性完全相反。作者在报告中提到,出现在这个问题的具体原因还需要进一步的研究。
作者还绘制了各模型在AP50时检测精度与速度的曲线,如Fig.3所示。从图中可知,在预测时IOU阈值选择为0.5的话,YOLOv3拥有比其它检测系统显著的优势,也就是说,此时YOLOv3比其它模型又快又准。
4. Things We Tried That Didn’t Work
这部分记录了一些作者在改进YOLOv1时尝试了但是没有起作用的措施:
- Anchor box x, y offset predictions
作者尝试使用Faster RCNN中提到的 normal anchor box prediction mechanism来对bounding boxes中心相对图像的offsets进行预测,但是发现正如YOLO9000中说的那样,这样做会降低模型的稳定性,效果并不好。 - Linear x, y predictions instead of logistic
作者尝试使用线性激活函数代替logistic activation来直接预测x,y偏置,即将下列公式中的sigmiod函数更换为线性函数,但是作者发现这样做会导致mAP下降几个百分点。 - Focal loss
作者也尝试了使用 focal loss,但是结果造成mAP下降大约两个百分点。对于原因作者也不确定。 - Dual IOU thresholds and truth assignment
Faster RCNN在训练时使用了两个IOU 阈值。如果一个预测得的box与ground truth的IOU高于0.7,那么就会被视为 a positive example;如果在0.3-0.7之间就会被忽略;如果与任何ground truth的IOU均低于0.3就会被视为 a negative example。作者尝试了一个类似的方案,但是没有得到较好的结果
尽管上述策略没有起作用,但是不排除还有一些技术能够继续改进YOLOv3只是作者没有发现,也不排除作者没有正确使用以上策略的可能。
5. What This All Means
作者在这部分以及报告后面的部分着重于对COCO metric侧重强调边框定位准确性的批评,因为他认为定位精度足够即可,没有太大必要追求过高的定位精度
YOLOv3是一个 good detector,不仅快,还很准确。可是YOLOv3在COCO数据集上测试时,IOU metric取为0.5-0.95的话,mAP并不太好。相反,当使用 old detection metric(IOU=0.5)时,YOLOv3的表现非常好。既然如此,那有必要更换 metrics 吗?
事实上,人类很难区分0.3-0.5之间的IoU值,也就是说最终预测到的边框位置与ground truth box的IoU在0.3-0.5时,人类在感觉上没有明显的区别。所以在测试时,虽然没有ground truth box进行比较,但是只要有一定的精度保证,即使定位边框的精度不太高也没有多少影响
6. YOLOv3-tiny
具体结构如下:
参考资料
- 近距离观察YOLOv3
- Focal Loss论文阅读笔记
- yolov3
- 实现代码 github
- 探索 YOLO v3 实现细节(共六篇)
- TensorFlow + Keras 实战 YOLO v3 目标检测图文并茂教程
- YOLOv3: 训练自己的数据
- yolov3-tiny调参记录之learning rate相关参数