项目地址

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个坐标,即txtytwth。如果某cell相对图像左上角的偏置offsets是(cxcy)并且预测的bounding box对应的先验知识width和height分别为pwph,那么预测到的bounding box的实际坐标为:

式中,txty是相对于所在cell的offsets,logistic回归函数将txty约束在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时尝试了但是没有起作用的措施:

尽管上述策略没有起作用,但是不排除还有一些技术能够继续改进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: An Incremental Improvement的更多相关文章

  1. 深度学习论文翻译解析(一):YOLOv3: An Incremental Improvement

    论文标题: YOLOv3: An Incremental Improvement 论文作者: Joseph Redmon Ali Farhadi YOLO官网:YOLO: Real-Time Obje ...

  2. 目标检测:yolo-v3与faster-rcnn

    一. 算法背景 1. 机器视觉实际应用往往涉及包含多个物体的复杂场景,基于深度卷积神经网络的特征提取器,需要结合其他算法来准确定位多个目标,并进行识别. 2. 工业领域,目标检测算法在安防和质检系统都 ...

  3. [YOLO]《YOLOv3: An Incremental Improvement》笔记

    相比较于前两篇论文,个人感觉YOLO3作者有点来搞笑的!!!虽然加了一些新的点子进来,但是,论文的开头是这样的: 简单理解就是作者花了很多时间玩Twitter去了,所以没有做啥研究!!!! 然后: 你 ...

  4. 论文阅读笔记三十二:YOLOv3: An Incremental Improvement

    论文源址:https://pjreddie.com/media/files/papers/YOLOv3.pdf 代码:https://github.com/qqwweee/keras-yolo3 摘要 ...

  5. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  6. 目标检测网络之 YOLOv3

    本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...

  7. 从YOLOv1到YOLOv3,目标检测的进化之路

    https://blog.csdn.net/guleileo/article/details/80581858 本文来自 CSDN 网站,作者 EasonApp. 作者专栏: http://dwz.c ...

  8. 手把手教你用深度学习做物体检测(七):YOLOv3介绍

    YOLOv3 论文:< YOLOv3: An Incremental Improvement > 地址: https://arxiv.org/pdf/1804.02767.pdfyolov ...

  9. 【转】目标检测之YOLO系列详解

    本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...

随机推荐

  1. ANTLR v4 权威参考笔记(目录)

    ANTLR v4是一款强大的语法分析器生成器,可以用来读取.处理.执行和转换结构化文本或二进制文件.通过称为文法的形式化语言描述,ANTLR可以为该语言自动生成词法分析器.生成的语法分析器可以自动构建 ...

  2. openfire课程

    https://blog.csdn.net/huwenfeng_2011/article/category/2874473/2 https://www.cnblogs.com/Fordestiny/p ...

  3. Oracle 11gR2 RAC DBCA无法识别ASM磁盘组(ORA-19504,ORA-15045,ORA-17502,ORA-15081)

    ORA-19504: failed to create file "+DATA" ORA-15045: ASM file name '+DATA' is not in refere ...

  4. oracle学习创建和准备Oracle样例数据库

    此处有一个Oracle创建数据库和表和插入数据的脚本: http://www.forta.com/books/0672336073/

  5. redhat 7.5 更换 yum源

    因为 redhat 的 yum 是收费,所以需要换成 Centos 的 yum 才可以 首先,卸载 redhat 的 yum 软件 sudo rpm -qa|grep yum 其次,下载 Centos ...

  6. BrainFuck 指令

    BrainFuck只有八条指令: 指令 含义 等价的C代码 > 指针加一 ++ptr; < 指针减一 --ptr; + 指针指向的字节的值加一 ++*ptr; - 指针指向的字节的值减一 ...

  7. HAProxy配置说明(转)

    原文地址:http://www.cnblogs.com/sagech/p/5695466.html global # 全局参数的设置 log 127.0.0.1 local0 info # log语法 ...

  8. spring gateway 截取response 长度缺失

    网上找到一段获取修改response的代码:https://blog.csdn.net/tianyaleixiaowu/article/details/83618037 代码如下: import or ...

  9. MyBatis Plus:No qualifying bean of type 'com.baomidou.mybatisplus.mapper.BaseMapper<?>' available: expected single matching bean but found 4

    场景: 应用MyBatis Plus 和通用Mapper 继承自ServiceImpl实现对Service里的方法进行包装再处理. public interface IServiceBase2< ...

  10. iOS 使用xib定义一个View,修改frame无效问题解决

    遇到过好多次使用自定义view,修改frame无效问题, 之前都是放弃xib,直接手写,发现手写简单的还行,复杂的UI就坑逼了.所以还是需要用到可视化编辑的xib. 整理一下,自己备忘也供iOS开发的 ...