YOLOv3论文精读

摘要

        我们对YOLO做了一些更新!我们使用了一系列小的设计上的改变来让它变得更好。我们也训练这个新的网络,这个新网络很有趣。这比上次提出的模型(YOLOv2)稍微大了一些,但是更加准确了。但是别担心,它仍然是足够快的。对于320*320分辨率的图像,YOLOv3对每一张图片运行只需要22ms,并且保持着28.2的mAP,这和SSD算法一样准确但是速度快了三倍。当我们使用这个旧的0.5为IoU阈值时的mAP检测指标时,YOLOv3是很好的。在Titan X显卡上可以以51ms一次推理的速度得到57.9的AP_{50}值,与RetinaNet在相等条件下以198ms获得57.5的AP_{50}值相比,性能上很接近(甚至高一点),但是快了3.8倍。与惯例一样,所有的代码都可以在线获取,获取地址为:https://pjreddie.com/yolo/。

1.引言

        你知道吗?有时候你只是一年都在打电话。我今年都没做许多研究,而是在推特上花了很多时间。玩了玩GAN网络。我还有一些去年遗留下来的动力,我设法对YOLO做了一些改进。但是,说实话,没什么特别有趣的,只是做了一些改变使得它更好了。我也帮别人做了些研究。

        事实上,这就是我们今天带到这里来的东西。我们有一个待印刷(论文)的截止日期快到了,并且我们也需要在那篇文章中引用我对YOLO做的一些随意的更新,但是我们没有引用来源。所以我们准备了一片技术报告(这篇论文)!

        技术报告很棒的事情在于不需要导言,所以你们知道我们为什么会选择发技术报告。所以这段引言的最后我们会介绍这篇文章剩余部分的要点。首先我们会告诉你YOLOv3的思想。然后我们将告诉你我们是怎么做的。我们也告诉你我们做的一些并没有起作用的改进。最后我们将思考这一切都意味着什么。

2.思想

        所以这里就是YOLOv3的思想:我们绝大部分思路都来自于他人。我们也训练了一个新的分类网络(DarkNet-53),这个网络比其他的分类网络更好。我们将仅仅带你从头过一遍整个系统,然后你就能大体上理解它。

图 1. 我们从Focal Loss那篇论文中摘出了这幅图,并做了一些改变(加了YOLOv3的曲线)。在同等性能(精度)的条件下,YOLOv3运行地得比其他的检测检测方法快。时间测试结果来自于M40或者Titan X显卡,这两张显卡性能上几乎一致(YOLOv3快的明显,因此说明不可能是显卡性能差异导致的,而是模型本身更优秀)。

2.1 Bounding Box 预测

        我们遵循了YOLO9000,我们的系统使用维度聚类得到anchor boxes后再预测bounding boxes。这个网络对每一个bounding box都预测了4个坐标值:t_x,t_y,t_w,t_h。每一个cell对应到原图后,左上角点坐标为(c_x,c_y),并且这个bounding box的先验框(anchor)的宽度和高度分别为p_w,p_h,预测结果的对应关系如下:

b_x=\sigma(t_x)+c_x

b_y=\sigma(t_y)+c_y

b_w=p_we^{t_w}

b_h=p_he^{t_h}

        当训练的时候,我们使用平方误差损失(定位误差部分)。如果一些坐标预测值的真实标签值为t_*,那么我们使用的梯度就是真实标签值(从真实标注框中计算得到)减去我们的预测值:\hat{t_*}-t_*。真实值的计算通过反向利用上述公式就可以得到。

这里对反向利用公式计算标注值解释一下,我们使用g_*表示标注框的值(中心点、长宽):

g_x=\sigma(\hat{t_x})+c_x

g_y=\sigma(\hat{t_y})+c_y

g_w=p_w*e^{\hat{t_w}}

g_h=p_h*e^{\hat{t_h}}

反解除上述公式中的\hat{t_*}就是我们要得标注值。不知道是不是作者写反了,笔者印象中带hat的值是预测值,不带hat的标签值。

值得注意的是,上述所有的g_*都是特征图尺度下的值。例如,原来长宽为320的标注框,在经过32倍下采样之后,宽高都变成了10=320/32。

        YOLOv3为每一个bounding box都使用逻辑回归(sigmoid函数)预测目标置信度分数(confidence)。如果bounding box对应的先验框(anchor)与一个真实标注框的重叠部分比其他bouning box的先验框都高(IoU值高),那么这个bounding box的置信度分数的标签值就应该设置为1。如果这个bounding box与真实标注框的重叠部分(IoU值)并不是最高的但是超过了类似Faster R-CNN中那样设置的IoU阈值,我们就忽略这个预测。我们使用0.5作为阈值。与Faster R-CNN不同的是,我们的系统对于每一个真实物体,只会分配一个bounding box的先验框来预测它。如果一个bounding box的先验框没有被分配给任何一个真实物体,它就不会带来任何的坐标或者类别预测损失,仅仅有置信度损失(置信度标签值为0,作为负样本)。

对于YOLOv3来说,存在3种样本:正样本、忽略样本、负样本

正样本:与真实物体存在最大IoU值的Anchor

忽略样本:与真实物体的IoU值大于阈值,但不是最大的

负样本:除正样本和忽略样本之外的所有样本

之所以有一个忽略样本的设定,是因为作者认为如果我们让那些忽略样本直接作为样本是不合适的,因为IoU>0.5说明这个Anchor与真实物体的重合度还是挺高的,如果强行作为负样本反而会造成不稳定,这就像是让一个明明可以预测到物体的Anchor变得预测不到物体。不让其作为正样本仅仅是因为它不是最优的。这一点和SSD、Faster R-CNN都不一样,这两个方法都可以让多个Anchor对应一个物体,而YOLOv3的原则是一个物体一个Anchor。

图 2.带尺度先验的Bounding boxes和定位预测。我们以从聚类中心得到的Anchor为基准,预测了宽和高的形变量。我们使用一个sigmoid函数预测了box的中心点坐标的相对位置。这幅图是公开的自我剽窃,因为它是来自于YOLO9000的。

2.2 类别预测

        每一个box使用多标签分类方法预测bounding box可能包含的物体的概率。我们没有使用softmax函数是因为我们发现它对于好的分类性能并不是必要的,取而代之的是我们直接使用了独立的逻辑分类器(sigmoid)。在训练时我们使用二元交叉熵损失作为类别预测损失。

        这个公式帮助我们可以将网络迁移到更加复杂的数据领域入Open Images 数据集。在这个数据集中,许多标签之间存在重叠(如女性和人类,这样的标签并不是完全独立的,因此不适合使用softmax)。使用softmax就是强行假设每一个box都有一个确定的类别,但现实情况往往并不是这样。一个多标签的方法可以更好地对数据建模。

2.3 跨尺度预测

        YOLOv3在3个不同的尺度下预测boxes。我们的系统使用一个与FPN(特征金字塔)类似的方式从这些尺度上抽取特征。在我们的基础特征提取器上,增加了一些额卷积层(用于特征的跨层连接与传递)。这三部分的最后预测了一个编码了bounding box坐标信息、置信度分数和类别预测的3维tensor。我们的实验使用了COCO数据集,我们在每个尺度上预测3个boxes,所以每一个输出层的tensor尺度为N*N*[3*(4+1+80)],其中4个是bounding box相对于Anchor的偏移(包括中心点偏移和宽高形变量),1个置信度分数,80个类别预测。

注:N是特征图大小。

        接着我们从预测输出的前两层提取特征图并且使用步长为2的上采样方法进行采样。我们也从网络浅层提取特征图并且将它与我们上采样过后的特征图按照通道的维度进行拼接。这个方法使得我们从经过上采样的特征中获取更多的语音信息,从浅层特征图上获取细粒度信息。然后我们增加了一些卷积层来处理这个结合后的特征图,最终预测一个相似的tensor,但是输出尺度变为2倍(宽高各两倍)。

即深层输出为N*N*[3*(4+1+80)],那么它的上一层输出为2N*2N*[3*(4+1+80)],以此类推。

        上述的设计我们又重复了一次,最后得到三个预测层,这三层的输出合起来才是最终的所有预测。因此我们的第3个尺度(最浅层)的预测从所有的先验框计算中收益(获取语义信息),正如它在网络的浅层,因此可以接收到更多的细粒度特征。

        我们仍然使用k-means聚类来决定我们的Anchro尺度,我们有些随意地选取了9个聚类中心和3个尺度,并且将聚类结果均匀地分配3个尺度。在COCO数据集上,9个聚类中心为:(10 × 13), (16 × 30), (33 × 23), (30 × 61), (62 × 45), (59 ×119), (116 × 90), (156 × 198), (373 × 326)。

注:作者称Anchor为bounding box prior是因为在YOLOv3中,每一个Anchor只会被分配给一个bounding box,笔者为了方便,直接写Anchor。

2.4 特征提取器

        我们使用一个新的网络来执行特征提取任务。我们的新网络是YOLOv2中使用的Darknet-19与新奇的残差网络结构的混合。我们的网络使用连续的3*3和1×1卷积层,但是现在也多了一些短连接层(resnet中的结构),所以网络相对来说也大得多。它有53个卷即层,因此我们就叫它。。。听好了。。。Darknet-53!

表 1.Darknet-53

        这个新网络比Darknet-53更强大但是运算效率比ResNet-101或者ResNet-152更高效。这里是一些ImageNet数据集上的测试结果:

表 2.骨干网络的比较。各个网络的精度、billions of operations, billion floating point operations per second、帧率。

BFLOPS有两个不同场景下的解释,第一种是描述硬件运算性能的单位,这时其全称是Billion Float operations per second,即每秒能进行多少个 十亿次浮点运算符;第二种是描述某次卷积运算需要的多少个十亿次浮点运算,其全称是billion float operations,将多次卷积等运算所耗费的blops加起来就可以来表示某个算法模型的复杂度.
————————————————
版权声明:本文为CSDN博主「wanghua609」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38145317/article/details/106281462

        每一个网络使用相同的设置进行训练和测试,使用的图片分辨率为256×256,测试方法为single crop精度测试。运行时间是以256*256的分辨率在Titan X上进行衡量的。因此Darknet-53的精度与最先进的分类器平分秋色,但是浮点操作次数(卷积运算)更少,并且速度更快。Darknet-53要优于ResNet-101并且快了1.5倍。Darknet-53性能接近ResNet-152并且速度是它的两倍。

        Darknet-53也拥有最高的BFlop/s。这意味着这个网络结构可以更好地利用GPU,使得它更高小弟评估并且因此更快。这绝大部分是因为ResNets只是层数太多了并且不是很高效。

参考地址:关于 single crop evaluation 的疑问 - CaffeCN深度学习社区

既然知道single crop evaluation这个名词,那就从它开始吧。
训练的时候,当然随机裁剪,但测试的时候就需要有点技巧了。

Evaluation呢,就是指模型训练好了,测试评估它的性能。
Singl Crop Evaluation通常是指在测试过程中,将图像Resize到某个尺度(比如256xN),选择其中的Center Crop(即图像正中间区域,比如224x224),作为CNN的输入,去评估该模型。

Crops Evaluated不是个专业名词,仅仅表示用多少个Crops作为输入,去评估(Evaluate)模型。
10个Crops呢,一般是取(左上,左下,右上,右下,正中)各5个Crop,以及它们的水平镜像,共10个Crops,输入到CNN模型中,得到10个概率输出,然后平均一下,作为最后的结果。
144个Crops,略复杂点,以ImageNet为例,它首先将图像Resize到了4个尺度(比如256xN,320xN,384xN,480xN),每个尺度上去取(最左,正中,最右)3个位置的正方形区域,然后对这些正方形区域取上述的10个224x224的Crops,然后加上将这正方形区域直接Resize到224x224以及这Resize后的镜像,也就是每个正方形区域得到12个Crops,最后得到4x3x12=144个Crops,输入CNN,得到输出取平均,即为最终模型输出。

2.5 训练

        我们仍然是直接在整副图像上训练,并没有使用难例挖掘或者其他类似的技术。我们使用多尺度训练,许多的数据增强,批量归一化等所有的标准化组件。我们使用Darknet神经网络框架来训练和测试。

关于难例挖掘:

本篇总结了一下知乎上的回答,原文链接:https://www.zhihu.com/question/46292829

在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),则认为它是positive sample,否则为negative sample,考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练啰。

那么负样本中哪些是困难负样本(hard negative)呢?困难负样本是指哪些容易被网络预测为正样本的proposal,即假阳性(false positive),如roi里有二分之一个目标时,虽然它仍是负样本,却容易被判断为正样本,这块roi即为hard negative,训练hard negative对提升网络的分类性能具有极大帮助,因为它相当于一个错题集。

如何判断它为困难负样本呢?也很简单,我们先用初始样本集(即第一帧随机选择的正负样本)去训练网络,再用训练好的网络去预测负样本集中剩余的负样本,选择其中得分最高,即最容易被判断为正样本的负样本为困难样本,加入负样本集中,重新训练网络,循环往复,然后我们会发现:咦!我们的网络的分类性能越来越强了!假阳性负样本与正样本间也越来越相似了!(因为此时只有这些妖怪区域能迷惑我们的分类器了)。
————————————————
版权声明:本文为CSDN博主「热带巨兽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36570733/article/details/83444245

3. 我们怎么做

        YOLOv3很棒!看表3。从COCO那奇怪额平均精度AP指标的角度来看,YOLOv3与SSD的变体精度相同,但是速度是它们的3倍。但是在这个指标下,YOLOv3会有些落后于其他类似于RetinaNet的模型。

        但是,当我们看这个"旧的"检测指标-以IoU为0.5的mAP(或者表格中的AP_{50})时,YOLOv3是很强大的。它几乎与RetinaNet平分秋色,并且远高于SSD的变体们。这表明YOLOv3是一个非常强大的检测器,它擅长于为物体产生合适的boxes。但是,当IoU阈值增加时,YOLOv3的性能会大幅度下降,这表明YOLOv3很难将预测的boxes与目标进行完美地对齐。

        以前的YOLO很难检测到小目标。但是,现在我们看到YOLO在这个趋势(很难检测小目标)上有反转。使用多尺度的预测(3个预测层)后,我们发现YOLOv3在AP_S指标上相对地提高了。但是,中等尺度和大尺度的目标的检测性能反而相对糟糕了。还需要做一些调查来为以上的结果提供证据。

        当我们以AP_{50}(见图5)为指标绘制精度和速度曲线图时,我们发现YOLOv3极大地超过了其他检测系统。也就是说,它是快速且更好的。

4. 那些我们尝试了但没有奏效的方案

        当我们依靠YOLOv3做一些工作时,我们尝试了许多方案。许多方案并没有奏效。这里是一些我们还记得的我们做过的尝试。

        Anchor box 宽高w,h 偏移量的预测。我们尝试了使用普通的anchor box的预测机制,  使用一个线性激活函数预测t_w,t_h的值作为bounding box长宽的倍数。我们发现这个公式降低了模型的不稳定性,并且也没有很好地奏效。

解释:作者实际使用的方案为,使用LeakyReLU得到t_w,t_h,最终预测得到的bounding box框的宽高为

b_w=p_we^{t_w}

b_h=p_he^{t_h}

而作者这里尝试的方案为

b_w=p_w*t_w

b_h=p_h*t_h

        使用线性函数预测x,y值而不是逻辑函数。我们尝试使用一个线性激活函数来直接预测x,y的偏移量而不是逻辑激活函数。这导致mAP值降低了几个点。

解释:作者使用的方案为

b_x=\sigma(t_x)+c_x

b_y=\sigma(t_y)+c_y

而作者这里尝试的方案为

b_x=t_x+c_x

b_y=t_y+c_y

        Focal loss。我们尝试使用focal loss。它使得mAP值降低了2个点。对于focal loss正在尝试解决的问题(正负样本不均衡问题)来说,YOLOv3可能已经足够鲁棒,因为它将置信度预测与条件类别预测分离。因此对于大部分例子来说,并没有类别预测?或者别的什么?我们也不是完全确定。

感谢我的同事:陈工啊 给出的解释

Focal Loss的目的在于难例挖掘,即让loss更偏向关注那些当前分类不准的损失,例如对于正负例的分类,判断为0.5,这种样本是正样本和负样本的可能性一半一半,随着这个值接近0或者1,不确定性都在减小,此时为了提高模型的性能,更需要关注的是如何解决或者减少那部分不确定性。但是对于带Anchor的目标检测算法来说,由于Anchor本身的匹配机制(尤其是YOLOv3中Anchor的分配是依据Anchor与Ground Truth的IoU值来的)就具有很大的确定性,因此使用Focal Loss的意义并不大。

AP_S:COCO数据集中定义,长和宽均<=32的为小目标,而AP_S就是小目标的平均精度

表 3.说句正经的,我只是从Focal Loss这篇论文中投了所有的这些他们从头开始花了很多时间制作的表格(并增加了YOLOv3的性能结果)。好,YOLOv3的表现很令人满意。脊柱RetinaNet需要比YOLOv3长3.8倍的时间来处理一副图像。在AP_{50}的指标上,YOLOv3比SSD的变体要好得多,并且与最先进的模型相当。

图 3.这幅图还是从Focal Loss论文中摘出并且做了些改编得到的,时间指标展示了在使用IoU=0.5为阈值的条件下的mAP的 速度/精度 之间的权衡。你可以说YOLOv3是很好的,因为为它的性能曲线很高(准确)并且远在左边(速度快)。你能引用我们的论文吗?猜猜谁这么做了,这个人->我自己发的YOLOv3(好家伙-。-)。哦,我忘了,我们也修复了YOLOv2中的一个数据加载的bug,这帮助mAP提高了2个点。就偷偷写在这里,这样就不会打乱文章的布局。

        双IOU阈值与真实框分配。Faster R-CNN在训练时使用了两个IoU阈值。如果预测与物体真实框的IoU达到0.7,就是正样本,如果处于[0.3,0.7],就忽略,如果与所有物体标注框小于0.3,就是负样本。我们尝试了一个类似的策略但是并没有得到好的结果。

        我们很喜欢我们现在的公式,它似乎至少是一个局部最优的。有可能有一些技巧能够最终得到更好的结果,也许他们仅仅需要调整一下使得训练更加稳定。

5. 这都意味着什么

        YOLOv3是一个好的检测器。他很快也很准确。在COCO数据集使用的0.5~0.95分别作为IoU阈值求mAP取平均后的mAP(mAP_{0.5:0.95})指标下,YOLOv3不是很好。但是使用那个IoU=0.5为阈值的旧的检测指标效果很好。

前方高能:作者喷mAP0.5:95指标QaQ

        总之为什么我们要切换指标?原始的COCO论文只是有了这么一句晦涩难懂的话:一旦评估服务完成,那么关于评估指标的一个完整讨论将被加入进来[没读懂]。“ Russakovsky等人报告说人类是很难区分IoU为0.3~0.5之间的区别的!”训练人类从视觉上精确地观察IoU值为0.3的bunding box与IoU值为0.5的bounding box之间的区别是惊人地困难。“如果人类都很难于区分这个差异,那它为什么这么重要呢?

        但是可能一个更好的问题是:”我们要用现在锁拥有的检测器做些什么?“。做这方面研究许多人都是Google和Faceboook的。我猜我至少我们知道奇数目前是在好人的手里,并且肯定不会被用来获取你的个人信息并且出售给。。。等等,你说这就是这个技术将要被用来做的事情??哦,天呐。

       当然,其他人大量地赞助视觉研究是为了军事,并且他们从没有做恐怖的事情,像是使用新技术杀死许多人或者接下来。。。

        我很希望大部分人用计算机视觉只是做一些有趣的、好的事情,像是数数国家公园里斑马的数量,或者当猫绕着屋子闲逛的时候追踪一下他们的猫。但是计算机视觉已经被用于一些别有用心的应用上,作为研究者,我们有责任至少考虑一下我们的工作可能带来的伤害,并且思考一些限制的方法。这方面,我们欠世界太多了。

        最后,不要@我。(因为我退出推特了。 注:最近又回来了,真香=/=)

版权声明:本文为CSDN博主「WALL-SQ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39304630/article/details/121341732

WALL-SQ

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

visdrone+yolov5

1.数据集转换 VisDrone2019-DET-train 下载地址 http://aiskyeye.com/download/object-detection/解压后只有images、annotations两个文件夹 使用数据集转换工具v

小目标检测方法介绍

目标检测发展很快,但对于小目标 的检测还是有一定的瓶颈,特别是大分辨率图像小目标检测 。比如79202160,甚至1600016000的图像,还有一些遥感图像 。 图像的分辨率很大&#xf