YOLO_v3论文解读

官方代码:https://pjreddie.com/yolo/
pytorch代码链接:https://github.com/ultralytics/yolov3
keras代码链接:https://github.com/qqwweee/keras-yolo3

摘要

我们对YOLO做了一些设计上的变化来使得它运行的更好,并对新网络重新训练,也证明了新网络可以工作的很好,它虽然比之前的网络(YOLO v1和v2)稍微大了一点,但是它的精度更高了。同时检测速度也很快,这一点不用担心,对于 320 × \times × 320的输入,YOLOv3用了22ms实现了28.2的mAP,这个精度与SSD一样高,但是速度却快了三倍。当我们使用旧的 IOU = 0.5 作为mAP检测指标时,YOLOv3仍然可以工作的很好,它在Titan X上 51 ms内实现了 57.5 的 A P 50 AP_{50} AP50,与之前RetinaNet的198ms内实现 57.5 的 A P 50 AP_{50} AP50,相似的精度下速度快了3.8倍。

1. Introduction

在文章的剩余部分:

  1. 首先我们告诉你 the deal with YOLOv3
  2. 接着告诉你我们是怎样做的;
  3. 同时告诉你我们尝试过的一些没有work的改进;
  4. 最后告诉你这些究竟意味着什么?

2. The deal

所以这里先说 the deal with YOLOv3(这里不知道怎么翻译好):我们的大多数想法来自其他人。我们也训练了一个新的分类网络,它比之前的其他网络都好。接下来我们会带你从头理解下整个系统。
在这里插入图片描述

2.1. Bounding Box预测

按照YOLO9000,我们的系统使用anchor boxes做边框预测,网络会为每一个边框预测4个相关量—— t x , t y , t w , t h t_{x},t_{y},t_{w},t_{h} tx,ty,tw,th c x , c y c_{x},c_{y} cx,cy是feature map中grid cell的左上角坐标, p w , p h p_{w},p_{h} pw,ph是feature map中预先设定的anchor box的宽和高。

那么标签 t x , t y , t w , t h t_{x},t_{y},t_{w},t_{h} tx,ty,tw,th是如何得到的呢?

t x = G x − c x t_{x}=G_{x}-c_{x} tx=Gxcx
t y = G y − c y t_{y}=G_{y}-c_{y} ty=Gycy
t w = l o g ( G w / P w ) t_{w}=log(G_{w}/P_{w}) tw=log(Gw/Pw)
t h = l o g ( G h / P h ) t_{h}=log(G_{h}/P_{h}) th=log(Gh/Ph)

上面的 P x 、 P y P_{x}、P_{y} PxPy在 faster-rcnn 系列文章是预设的anchor box在feature map上的中心点坐标。 P w 、 P h P_{w}、P_{h} PwPh是预设的 anchor box 在feature map上的宽和高。至于 G x 、 G y 、 G w 、 G h G_{x}、G_{y}、G_{w}、G_{h} GxGyGwGh自然就是ground truth在这个feature map的4个坐标了。然后训练完成后,对于一张新的图片,我们对每一个bounding box会预测四个值 t x , t y , t w , t h t_{x},t_{y},t_{w},t_{h} tx,ty,tw,th,它们都是偏移量,如何通过偏移量计算真正的边框坐标呢?
在这里插入图片描述

其实就是标签计算的逆运算,至于为什么要在 t x 、 t y t_{x}、t_{y} txty上加一个sigmoid函数,我认为是为了保证回归得到的边框还是在原来负责预测它的bounding box所在的grid cell内,强行让 t x 、 t y t_{x}、t_{y} txty值在 [ 0 , 1 ] [0, 1] [0,1]之间。需要注意的是这里求得的 b x 、 b y 、 b w 、 b h b_{x}、b_{y}、b_{w}、b_{h} bxbybwbh只是相对于feature map上的目标位置,还要通过stride以及前期的图片resize尺寸映射到最终图片上的目标位置。

关于yolo3中bounding box更详细的理解可以参见:https://www.zhihu.com/search?type=content&q=YOLOv3

YOLOv3使用逻辑斯蒂回归为每一个bounding box都预测一个目标得分,如果一个bounding box先验框与真实的ground truth的IOU大于其他任何的先验框,那么就将这个框对应的得分标签置1。对于那些与真实的ground truth的IOU不是最大但超过阈值(比如0.5)的先验框,我们忽略它的预测。不同于Faster R-CNN,我们的系统为每一个ground truth仅仅指定一个bounding box与之匹配。如果一个bounding box先验框没有与任何ground truth相匹配,那么它对位置和分类损失损失没有贡献,仅仅在置信度损失上有贡献。

2.2. Class Prediction

预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个目标有Woman 和 Person两个标签)。

2.3. Predictions Across Scales

YOLOv3以三种不同的尺度预测边框,我们的系统采用了和特征金字塔网络相类似的理念来从这些尺度中提取特征。在我们基本的特征提取器后面添加了几个卷积层。最后一个卷积层是一个3-d张量,编码了bounding box的位置信息、置信度以及类别预测。在我们的COCO实验中,我们基于每种尺度预测3个boxes,所以张量的维度为 N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N \times N \times [3*(4+1+80)] N×N×[3(4+1+80)]——4个位置偏移量、一个置信度预测和80个类别得分。
在这里插入图片描述
结合上图看,卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是 416 × 416 416\times 416 416×416的话,这里的特征图就是 13 × 13 13\times 13 13×13了。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。

为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图拼接(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。

最后,第91层特征图再次上采样,并与第36层特征图拼接(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。

随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO2已经开始采用K-means聚类得到先验框的尺寸,YOLO3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。分配上,在最小的1313特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的2626特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52*52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。

2.4. Feature Extractor

我们使用了一个新网络来做特征提取,我们的新网络融合了YOLOv2、Darknet-19和新型残差网络。我们的网络连续使用 3x3 和 1x1 的卷积层,而且层之间也有shortcut,所以变得更大了。它有53个卷积层,所以我们将它称为 Darknet-53。
在这里插入图片描述
这个网络比Darknet-19更强大,同时比ResNet-101和ResNet-152更高效。下面是在ImageNet数据集上的结果:
在这里插入图片描述
每个网络都使用相同的设置进行训练,输入256×256的图片,在Titan X上进行单精度测试。我们得出的结论是Darknet-53在精度上可以与最先进的分类器相媲美,同时它的浮点运算更少,速度也更快。和ResNet-101相比,Darknet-53的速度是前者的1.5倍;而ResNet-152和它性能相似,但用时却是它的2倍以上。

Darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,使其预测效率更高,速度更快。这主要是因为ResNets的层数太多,效率不高。

2.5. Training

我们仍然在整个数据集上训练,没有使用hard negative mining来平衡正负样本。实验过程中涉及的多尺寸训练、大量数据增强和batch normalization等操作均符合标准。模型训练和测试的框架是Darknet神经网络。

3. How We Do

在这里插入图片描述
YOLOv3的表现是非常好的,参见table 3,就COCO数据集而言,SSD的平均MAP和YOLOv3相当,但是速度快了3倍。它仍然比RetinaNet精度低点。

如果仔细看这个表,我们可以发现在IOU=0.5(即表中的AP50)时,YOLOv3非常强大。它几乎与RetinaNet相当,并且远高于SSD变体。这就证明了它其实是一款非常灵活的检测器,擅长为检测对象生成合适的边界框。然而,随着IOU阈值增加,YOLOv3的性能开始同步下降,这时它预测的边界框就不能做到完美对齐了。

在过去,YOLO一直致力于对小型对象进行检测。但现在我们可以预见其中的演变趋势,随着新的多尺寸预测功能上线,YOLOv3将具备更高的 A P S AP_{S} APS性能。但是它目前在中等尺寸或大尺寸物体上的表现还相对较差,仍需进一步的完善。

当我们基于 A P 50 AP_{50} AP50指标绘制精度和速度时,我们发现YOLOv3与其他检测系统相比具有显着优势。也就是说,它的速度更快更好。

总结:

1.box是否含有物体改进
利用logistic回归计算每个bounding box是否含有物体(二分类:有或者没有)。在该过程中,之前的YOLOv2算法是看ground truth的位置中心坐标在哪,来判定当前bounding box是否含有物体。而在YOLOv3中将与ground truth的IOU最大的那个bounding box认为是包含该物体,因此YOLOv3的特点是每个ground truth都仅仅分配一个bounding box。对于那些没有被分配的bounding box,网络计算损失时,仅仅计算是否包含物体损失,不计算坐标和类概率损失。

2.类概率预测改进
对于类概率预测,在YOLOv2中是直接利用softmax进行类概率预测。而在YOLOv3中对于每一个类,使用独立的logistic分类器,使用交叉熵损失计算类概率损失。用这种策略的原因是,考虑到在利用softmax分类时,需要把所有的类别独立开来(one hot编码的特点),但是一旦遇到如(女人 ,人)这种包含类别时,用softmax就不是那么合适了。因此才引入logistic分类器结合多标签,来处理此类问题。

3.多尺度检测策略改进
YOLOv3的多尺度策略在三个不同的尺度作detection。v2只在一个尺度上做detection,v3一下变成了3个,在3个不同尺度的feature map上进行detection。在输入为416的情况下这三个特征图的尺度为1313,2626,52*52,这应该是对小目标影响最大的地方。

4. Things We Tried That Did’t Work

我们在研究YOLOv3时尝试了很多东西,但很多都没work,下面是一些我们尝试过的东西:

Anchor box x,y 偏移预测:我们尝试了正常的anchor box预测机理,即使用线性激活来预测box的宽和高的偏移量,我们发现效果不好,会影响模型稳定性;

线性x,y 预测代替逻辑斯蒂回归:我们尝试使用线性激活函数来直接预测x,y的偏移量,而不是使用logistic激活函数,这导致mAP降低很多;

Focal loss:我们尝试着使用focal loss,它使得我们的mAP下降了大约了2个百分点,YOLOv3可能已经对focal loss尝试解决的这个问题很鲁棒了,因为它已经将置信度分数和类别概率分开了,因此对于大多数例子,类别概率方面可能也没啥损失了?或者其他的东西?我们不太确定;

双IOU阈值和truth分配:Faster R-CNN在训练期间使用两个IOU阈值,如果边框和ground truth的IOU大于0.7,就将这个边框看作正样本,IOU在[0.3, 0.7]之间的样本忽略,IOU小于0.3的就是负样本。我们尝试了类似的策略但是结果并不好;

我们非常喜欢目前的方法,它至少目前看起来是最优的。这些技术中的一些最终会产生好的结果,可能仅仅需要一些微调来稳定训练。

参考文献:
https://zhuanlan.zhihu.com/p/35023499
https://blog.csdn.net/just_sort/article/details/80882474
https://blog.csdn.net/leviopku/article/details/82660381
https://www.zhihu.com/search?type=content&q=YOLOv3
https://zhuanlan.zhihu.com/p/49556105

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值