精华内容
下载资源
问答
  • yolo系列出来之前,主流的做法是分段式的R-CNN系列,主要包括R-CNN、FastR-CNN、FasterR-CNN、MaskR-CNN等。R-CNN的基本结构如下图所示:R-CNN主要分为候选区提取和候选区分类两个阶段,并且两阶段分开训练。其...
  • 深度学习-物体检测-YOLO系列,完整版11章,附源码+课件+数据,2020年最新录制;整体风格通俗易懂,原理+实战实战 章节1 深度学习经典检测方法概述 章节2 YOLO-V1整体思想与网络架构 章节3 YOLO-V2改进细节详解 章节4...
  • yolo系列框架整理(面试用).md
  • YOLO系列 ppt

    2018-11-16 17:27:34
    详细介绍了YOLOv1 v2的内容
  • yolo系列之yolo v3【深度解析】

    万次阅读 多人点赞 2018-09-12 16:24:48
    yolo_v3是我最近一段时间主攻的算法,写下博客,以作分享交流。 看过yolov3论文的应该都知道,这篇论文写得很随意,很多亮点都被作者都是草草描述。很多骚年入手yolo算法都是从v3才开始,这是不可能掌握yolo精髓的...

    版权申明:转载和引用图片,都必须经过书面同意。获得留言同意即可
    本文使用图片多为本人所画,需要高清图片可以留言联系我,先点赞后取图
    这篇博文比较推荐的yolo v3代码是qwe的keras版本,复现比较容易,代码相对来说比较容易理解。同学们可以结合代码和博文共同理解v3的精髓。
    github地址:https://github.com/qqwweee/keras-yolo3


    前言

    前言就是唠唠嗑,想直接看干货可以跳过前言,直接看Yolo v3。
    yolo_v3是我最近一段时间主攻的算法,写下博客,以作分享交流。
    看过yolov3论文的应该都知道,这篇论文写得很随意,很多亮点都被作者都是草草描述。很多骚年入手yolo算法都是从v3才开始,这是不可能掌握yolo精髓的,因为v3很多东西是保留v2甚至v1的东西,而且v3的论文写得很随心。想深入了解yolo_v3算法,是有必要先了解v1和v2的。以下是我关于v1和v2算法解析所写的文章:
    v1算法解析:《yolo系列之yolo v1
    v2算法解析:《yolo系列之yolo v2
    yolo_v3作为yolo系列目前最新的算法,对之前的算法既有保留又有改进。先分析一下yolo_v3上保留的东西:

    1. “分而治之”,从yolo_v1开始,yolo算法就是通过划分单元格来做检测,只是划分的数量不一样。
    2. 采用"leaky ReLU"作为激活函数。
    3. 端到端进行训练。一个loss function搞定训练,只需关注输入端和输出端。
    4. 从yolo_v2开始,yolo就用batch normalization作为正则化、加速收敛和避免过拟合的方法,把BN层和leaky relu层接到每一层卷积层之后。
    5. 多尺度训练。在速度和准确率之间tradeoff。想速度快点,可以牺牲准确率;想准确率高点儿,可以牺牲一点速度。

    yolo每一代的提升很大一部分决定于backbone网络的提升,从v2的darknet-19到v3的darknet-53。yolo_v3还提供替换backbone——tiny darknet。要想性能牛叉,backbone可以用Darknet-53,要想轻量高速,可以用tiny-darknet。总之,yolo就是天生“灵活”,所以特别适合作为工程算法。
    当然,yolo_v3在之前的算法上保留的点不可能只有上述几点。由于本文章主要针对yolo_v3进行剖析,不便跑题,下面切入正题。


    YOLO v3

    网上关于yolo v3算法分析的文章一大堆,但大部分看着都不爽,为什么呢?因为他们没有这个玩意儿:

    图1. yolo_v3结构图
    yolo系列里面,作者只在v1的论文里给出了结构图,而v2和v3的论文里都没有结构图,这使得读者对后两代yolo结构的理解变得比较难。but,对于yolo学习者来说,脑子里没有一个清晰的结构图,就别说自己懂yolo了。上图是我根据官方代码和官方论文以及模型结构可视化工具等经过好几个小时画出来的,修订过几个版本。所以, 上图的准确性是可以保证的

    这里推荐的模型结构可视化工具是Netron
    netron方便好用,可以直观看到yolo_v3的实际计算结构,精细到卷积层。But,要进一步在人性化的角度分析v3的结构图,还需要结合论文和代码。对此,我是下了不少功夫。
    上图表示了yolo_v3整个yolo_body的结构,没有包括把输出解析整理成咱要的[box, class, score]。对于把输出张量包装成[box, class, score]那种形式,还需要写一些脚本,但这已经在神经网络结构之外了(我后面会详细解释这波操作)。
    为了让yolo_v3结构图更好理解,我对图1做一些补充解释:
    DBL: 如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。
    resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。
    concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

    我们可以借鉴netron来分析网络层,整个yolo_v3_body包含252层,组成如下:
    layers

    表0. yolo_v3_layers
    根据表0可以得出,对于代码层面的layers数量一共有252层,包括add层23层(主要用于res_block的构成,每个res_unit需要一个add层,一共有1+2+8+8+4=23层)。除此之外,BN层和LeakyReLU层数量完全一样(72层),在网络结构中的表现为: 每一层BN后面都会接一层LeakyReLU。卷积层一共有75层,其中有72层后面都会接BN+LeakyReLU的组合构成基本组件DBL。看结构图,可以发现上采样和concat都有2次,和表格分析中对应上。每个res_block都会用上一个零填充,一共有5个res_block。

    1. backbone

    整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的 1 / 2 5 1/2^5 1/25,即1/32。输入为416x416,则输出为13x13(416/32=13)。
    yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。可以对比v2和v3的backbone看看:(DarkNet-19 与 DarkNet-53)

    图2. darknet-19 vs darknet-53
    yolo_v2中对于前向过程中张量尺寸变换,都是通过 最大池化来进行,一共有5次。而v3是通过卷积核 增大步长来进行,也是5次。(darknet-53最后面有一个全局平均池化,在yolo-v3里面没有这一层,所以张量维度变化只考虑前面那5次)。
    这也是416x416输入得到13x13输出的原因。从图2可以看出,darknet-19是不存在残差结构(resblock,从resnet上借鉴过来)的,和VGG是同类型的backbone(属于上一代CNN结构),而darknet-53是可以和resnet-152正面刚的backbone,看下表:

    这里写图片描述

    表1. backbone对比图
    从上表也可以看出,darknet-19在速度上仍然占据很大的优势。其实在其他细节也可以看出(比如bounding box prior采用k=9), yolo_v3并没有那么追求速度,而是在保证实时性(fps>36)的基础上追求performance。不过前面也说了,你要想更快,还有一个 tiny-darknet作为backbone可以替代darknet-53,在官方代码里用一行代码就可以实现切换backbone。搭用tiny-darknet的yolo,也就是tiny-yolo在轻量和高速两个特点上,显然是state of the art级别,tiny-darknet是和squeezeNet正面刚的网络,详情可以看下表:
    表2. 轻量级对比图
    所以,有了yolo v3,就真的用不着yolo v2了,更用不着yolo v1了。这也是[yolo官方网站](https://pjreddie.com/darknet/),在v3出来以后,就没提供v1和v2代码下载链接的原因了。

    2. Output

    对于图1而言,更值得关注的是输出张量:

    yolo v3输出了3个不同尺度的feature map,如上图所示的y1, y2, y3。这也是v3论文中提到的为数不多的改进点:predictions across scales
    这个借鉴了FPN(feature pyramid networks),采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体。
    y1,y2和y3的深度都是255,边长的规律是13:26:52
    对于COCO类别而言,有80个种类,所以每个box应该对每个种类都输出一个概率。
    yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3*(5 + 80) = 255。这个255就是这么来的。(还记得yolo v1的输出张量吗? 7x7x30,只能识别20类物体,而且每个cell只能预测2个box,和v3比起来就像老人机和iphoneX一样)
    v3用上采样的方法来实现这种多尺度的feature map,可以结合图1和图2右边来看,图1中concat连接的两个张量是具有一样尺度的(两处拼接分别是26x26尺度拼接和52x52尺度拼接,通过(2, 2)上采样来保证concat拼接的张量尺度相同)。作者并没有像SSD那样直接采用backbone中间层的处理结果作为feature map的输出,而是和后面网络层的上采样结果进行一个拼接之后的处理结果作为feature map。为什么这么做呢? 我感觉是有点玄学在里面,一方面避免和其他算法做法重合,另一方面这也许是试验之后并且结果证明更好的选择,再者有可能就是因为这么做比较节省模型size的。这点的数学原理不用去管,知道作者是这么做的就对了。


    3. some tricks

    上文把yolo_v3的结构讨论了一下,下文将对yolo v3的若干细节进行剖析。
    Bounding Box Prediction
    b-box预测手段是v3论文中提到的又一个亮点。先回忆一下v2的b-box预测:想借鉴faster R-CNN RPN中的anchor机制,但不屑于手动设定anchor prior(模板框),于是用维度聚类的方法来确定anchor box prior(模板框),最后发现聚类之后确定的prior在k=5也能够又不错的表现,于是就选用k=5。后来呢,v2又嫌弃anchor机制线性回归的不稳定性(因为回归的offset可以使box偏移到图片的任何地方),所以v2最后选用了自己的方法:直接预测相对位置。预测出b-box中心点相对于网格单元左上角的相对坐标。

    公式1

    这里写图片描述
    yolo v2直接predict出( t x t_x tx, t y t_y ty, t w t_w tw, t h t_h th, t o t_o to),并不像RPN中anchor机制那样去遍历每一个pixel。可以从上面的公式看出,b-box的位置大小和confidence都可以通过( t x t_x tx, t y t_y ty, t w t_w tw, t h t_h th, t o t_o to)计算得来,v2相当直接predict出了b-box的位置大小和confidence。box宽和高的预测是受prior影响的,对于v2而言,b-box prior数为5,在论文中并没有说明抛弃anchor机制之后是否抛弃了聚类得到的prior(没看代码,所以我不能确定),如果prior数继续为5,那么v2需要对不同prior预测出 t w t_w tw t h t_h th
    对于v3而言,在prior这里的处理有明确解释:选用的b-box priors 的k=9,对于tiny-yolo的话,k=6。priors都是在数据集上聚类得来的,有确定的数值,如下:

    10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
    

    每个anchor prior(名字叫anchor prior,但并不是用anchor机制)就是两个数字组成的,一个代表高度另一个代表宽度。
    v3对b-box进行预测的时候,采用了logistic regression。这一波操作sao得就像RPN中的线性回归调整b-box。v3每次对b-box进行predict时,输出和v2一样都是( t x t_x tx, t y t_y ty, t w t_w tw, t h t_h th, t o t_o to),然后通过公式1计算出绝对的(x, y, w, h, c)。
    logistic回归用于对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。作者在论文种的描述如下:

    If the bounding box prior is not the best but does overlap a ground truth object by more than some threshold we ignore the prediction, following[17]. We use the threshold of 0.5. Unlike [17] our system only assigns one bounding box prior for each ground truth object.

    如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行predict。
    不同于faster R-CNN的是,yolo_v3只会对1个prior进行操作,也就是那个最佳prior。而logistic回归就是用来从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个。logistic回归就是用曲线对prior相对于 objectness score映射关系的线性建模。
    疑问解答和说明:

    在评论里有同学问我关于输出的问题,看来我在这里没有说的很清楚。了解v3输出的输出是至关重要的。
    
    第一点, 9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。
    
    第二点,每个输出y在每个自己的网格都会输出3个预测框,这3个框是9除以3得到的,这是作者设置
    的,我们可以从输出张量的维度来看,13x13x255。255是怎么来的呢,3*(5+80)。80表示80个种类,5表
    示位置信息和置信度,3表示要输出3个prediction。在代码上来看,3*(5+80)中的3是直接由
    num_anchors//3得到的。
    
    第三点,作者使用了logistic回归来对每个anchor包围的内容进行了一个目标性评分(objectness score)。
    根据目标性评分来选择anchor prior进行predict,而不是所有anchor prior都会有输出。
    

    loss function

    对掌握Yolo来讲,loss function不可谓不重要。在v3的论文里没有明确提所用的损失函数,确切地说,yolo系列论文里面只有yolo v1明确提了损失函数的公式。对于yolo这样一种讨喜的目标检测算法,就连损失函数都非常讨喜。在v1中使用了一种叫sum-square error的损失计算方法,就是简单的差方相加而已。想详细了解的可以看我关于v1解释的博文。我们知道,在目标检测任务里,有几个关键信息是需要确定的: ( x , y ) , ( w , h ) , c l a s s , c o n f i d e n c e (x, y), (w, h), class, confidence (x,y),(w,h),class,confidence
    根据关键信息的特点可以分为上述四类,损失函数应该由各自特点确定。最后加到一起就可以组成最终的loss_function了,也就是一个loss_function搞定端到端的训练。可以从代码分析出v3的损失函数,同样也是对以上四类,不过相比于v1中简单的总方误差,还是有一些调整的:

    xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2],
                                                                           from_logits=True)
    wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[..., 2:4])
    confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \
                              (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5],
                                                                        from_logits=True) * ignore_mask
    class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)
    
    xy_loss = K.sum(xy_loss) / mf
    wh_loss = K.sum(wh_loss) / mf
    confidence_loss = K.sum(confidence_loss) / mf
    class_loss = K.sum(class_loss) / mf
    loss += xy_loss + wh_loss + confidence_loss + class_loss
    

    以上是一段keras框架描述的yolo v3 的loss_function代码。忽略恒定系数不看,可以从上述代码看出:除了w, h的损失函数依然采用总方误差之外,其他部分的损失函数用的是二值交叉熵。最后加到一起。那么这个binary_crossentropy又是个什么玩意儿呢?就是一个最简单的交叉熵而已,一般用于二分类,这里的两种二分类类别可以理解为"对和不对"这两种。关于binary_crossentropy的公式详情可参考博文《常见的损失函数》。


    总结

    v3毫无疑问现在成为了工程界首选的检测算法之一了,结构清晰,实时性好。这是我十分安利的目标检测算法,更值得赞扬的是,yolo_v3给了近乎白痴的复现教程,这种气量在顶层算法研究者中并不常见。你可以很快的用上v3,但你不能很快地懂v3,我花了近一个月的时间才对v3有一个清晰的了解(可能是我悟性不够哈哈哈)。在算法学习的过程中,去一些浮躁,好好理解算法比只会用算法难得很多。

    展开全文
  • YOLO系列论文翻译

    2018-07-25 16:47:01
    此压缩包包含YOLOv1、YOLOv2、YOLOv3的论文翻译(已经过矫正)。
  • yolo系列论文.zip

    2021-09-08 19:56:38
    yolov1,yolov2(yolo9000),yolov3,yolov4
  • YOLO系列

    2021-09-09 19:46:05
    前言 本文是博主整理的学习笔记,不是yolo讲解文章,适合有一定yolo基础的同学复盘学习。 长文预告,多图预告。 yolo主要关注两个检测指标:mAP和速度。 mAP:综合衡量检测效果,包括精度和...整个yolo系列,在预

    前言

    本文是博主整理的学习笔记,不是yolo讲解文章,适合有一定yolo基础的同学复盘学习。
    长文预告,多图预告。

    yolo主要关注两个检测指标:mAP和速度。

    mAP:综合衡量检测效果,包括精度和recall(召回率)等,是精度和recall的交点与原点形成的矩形的面积。
    召回率:有多少框被检测到了(查全率)
    精度:iou(查准率)

    精度和召回率互相矛盾,一个高,另一个就低。所以就直接用mAP一个指标了。其实就是iou的阈值设置的原因。
    在这里插入图片描述

    yolo的口号:速度第一,mAP第二。
    整个yolo系列,在预测时的速度都是极快的,满足端到端的需求。

    YOLOV1

    yolov博主学习的较早,这次学习yolo系列没有重点关注这一部分,需要的同学可以移步这里

    网络结构

    卷积+全连接
    注意,在v1版本中还是有全连接层的,这无疑对输入图像的维度形成了限制,让我们看看后面都是怎么改进的。

    指标

    速度:45fps;
    mAP:63.4

    YOLOV2

    v2的改进:
    在这里插入图片描述
    让我们具体到每一行的指标去看看。

    网络结构

    • 加入了Darknet(19,大小可选),输入是416,32×13,奇数13是为了方便定位中心点
    • 去掉了全连接;
    • 用了5次降采样(/32)
    • 采用了1×1.

    聚类提取先验框

    不按照预先定义的好长宽比例,而是从coco数据集(或自己的数据集)中聚类出5类比例,使用k-means,聚类距离使用的是1-iou。

    Batch Normalization

    在yolov2中,已经舍弃了全连接层,因此也舍弃了dropout。每一个卷积层都加bn。

    高分辨率输入

    224改成448,更接近实际图像。

    Anchor Box

    数量:1313n。这个是为啥?不应该是32吗 v2的网格到底多大,不管它了。想通了。经过5次降采样,剩下的维度就是13×13了,就相当于网格是13×13.
    mAP没有提升(微降),但召回率大大提升。

    两人最好的人参加比赛,比派十个人去平均成绩更好。但多派人能覆盖更多项目。
    在这里插入图片描述

    Directed Location Prediction(坐标映射与还原)

    目的:位置微调,预测偏移量。
    方法:限制偏移量,防止在训练的时候它不收敛飘了。使用的相对于网格的偏移量,是一个相对位置。这样怎么飘都飘不出这个格子。

    σ \sigma σ是为了回归到[0-1],红色的点是网格位置(cx,cy)pw,ph是原始的宽高等比例缩小后的(/32)

    在这里插入图片描述
    我的理解:预测值都是预测的偏移量。位置偏移,宽高偏移。bw,bh得到的是偏移后的相对网格的大小,还原。
    在这里插入图片描述

    YOLOV3

    yolo原作者更新到v3就跑路了。其实是因为他看到yolo被美国军方使用,心里不好受,同时也觉得yolo完成了它的历史使命了。
    v3最大的改进就是网络结构,v2是哪个地方都试试。
    v3的极度凡尔赛,把自己画到了象限外。
    在这里插入图片描述

    多尺度(scale)

    yolo的大改进终于来了,之前对小目标检测效果一直不好,这不,针对小目标的多尺度它就来了。
    大中小3×3=9种候选框。网格大小分别是:52.26.13.
    在多尺度时使用了特征融合,
    在这里插入图片描述

    Resnet

    resnet在网络结构里对应的是shortcut层,注意在v3的网络机构里,shortcut层对应的相加的操作,也就是维度不会有任何改变,是数值上的改变。而route层是拼接的操作,是数值不变,维度相加。

    softmax->logistic

    因为考虑到多类别时有些物体可能同时属于多类,比如既属于狗,又属于哈士奇。
    此时用softmax不大合适,改为对每个类别都判断一个二分类(是与不是)

    网络结构

    darknet53(就是resnet卷积)
    不用池化了,用stride=2的下采样。
    在这里插入图片描述

    YOLOV4

    yolov4的作者不是原作者(但是得到了原作者的认可),在4版本没有什么原创内容,但带来的效果比原创更好。作者融合了当下最前沿的一些算法,把效果好的能试的都试了,融合在了网络里。是一个集大成者。
    这个图和v3一样,还是学到了原作者的精髓。
    在这里插入图片描述
    v4的两大核心改善:数据层面和网络结构层面。

    Bag of Freebies(BOF)

    只增加训练成本,不影响推理速度。如:

    • 数据增强,v4用到了很多数据增强方法;
    • 网络正则化:dropout、dropblock;
    • 类别不平衡的损失函数设计。

    马赛克数据增强

    参考了cutmix
    在这里插入图片描述

    dropblock

    直接吃掉一个区域,增加游戏难度.
    在这里插入图片描述

    labelsmothing-标签平滑

    [0,1]—>[0.05,0.95]
    使用之后的效果,类间间距更大,类内更密集
    在这里插入图片描述

    iou-giou-diou-ciou损失

    (1)iou损失
    1-iou
    问题:不相交的时候iou=0,而且相同的iou也对应着多种情况,网络学习方向不强。
    (2)giou损失
    做了一个大框,包裹住两个小框,就是图中的C,然后在1-iou的基础上再加上一个相对于大框的损失
    在这里插入图片描述
    但是当原本的一个框本来就在另外一个框里面时就失灵了。
    (3)diou
    直线距离优化,速度更快,并且解决了giou的问题。
    在这里插入图片描述
    (4)ciou
    这个是yolov4最终采用的损失,在diou的基础上,又加了一项宽高比损失。
    综合考虑了重叠面积、中心距离、宽高比
    在这里插入图片描述

    soft-nms(diou-nms)

    之前yolo用的nms都太生硬了,soft-nms就是对那些和高分框重合度较高的anchor并没有直接杀死,而是下调了得分,然后它又有资格参与计算了。最终会显示出来吗?这个暂时没弄清。
    在这里插入图片描述

    Bag of specials(BOS)

    稍微增加推算代价,但能提高模型精度。如:

    • 注意力机制
    • 特征金字塔(spp)
    • 网络细节设计
    • 激活函数

    SPPNet(spatial pyramid pooling)

    在v3中为了更好得满足不同的输入大小,需要在训练的时候改变输入数据的大小。
    spp就是用最大池化满足最终输入特征一致。
    可以增加感受野。

    CSPNet* 核心

    将特征图的channel分成两部分,一部分正常走流程,一部分直接拉后面concat,速度会更快,精度不下降。
    在这里插入图片描述

    SAM(CBAM)注意力机制

    CBAM是卷积 block attention module,嵌在卷积中的注意力 ,长这样
    假设有一个32×32×256的特征层:
    channel注意力就是从256个特征图出发,加一些权重,注意一下哪些是重要的,哪些不重要。有点类似一个256个类别的softmax。
    spatial注意力就是从32出发,注意空间上哪些地方重要。是空间位置上的注意力。
    在这里插入图片描述
    v4中用的是SAM是空间(spatial)注意力机制,也就是阉割版的CBAM,一切为了速度。
    并且,v4也对SAM阉割了,直接删去了pooling,上卷积,得到一个概率参数,然后相乘就完事了。

    PAN(path aggregation network)

    FPN开始讲起。看这个图,想要提取特征,用了resnet,p2-p5提取的是不同层次的特征。为了融合不同层次的特征,fpn中是自顶向下流动。橙色箭头。
    在这里插入图片描述
    但是这是一个单向的流动,就像是只有大领导问小破民有没有什么困难啊,但是小破民不能向上打报告的那种感觉。
    而PAN就是建立了这种双向机制,既可以从p5到p2,也可以从p2到p5.但是从时间成本上,另一条路径并不会经过resnet,而是直接走了捷径,也就是绿色的这条路。
    在这里插入图片描述
    v4中用的PAN又做了一点小改变,上上个图中的那个红色圆圈,是不同层的特征融合,以直接相加的方式,而v4决定使用直接拼接的方式而不是相加。感觉没多大变化

    Mish激活函数

    relu有点太绝对了,mish更符合实际情况。感觉就是把leaky relu做的更丝滑了
    但是计算量确实增加了。
    对底层没发挥好的特征没有一棒子打死,而是给一个微小的改过自新的机会。
    在这里插入图片描述

    网络架构

    在这里插入图片描述
    总结:yolov4大的改变没有,但小的改变非常多。并且单gpu也能训练得很好。

    YOLOV5

    v5版本与前四个版本都不一样,前四个都是偏学术的论文版本,v5没有论文,是一个更偏工程化的代码,相当于是从工程上对yolov4更好的实现.

    展开全文
  • 需要快速学习YOLO系列的童鞋,通过网络结构--损失函数--训练过程--测试过程,带你快速撸YOLO.
  • yolo系列.rar

    2019-11-07 09:38:26
    yolov1,yolov2,yolov3论文原文,从yolov1开始看,对yolo系列会有更深刻的理解
  • Yolo系列详解

    千次阅读 2020-08-05 15:20:38
    yolo 系列和大部分的目标检测算法的本质思想来源于人进行目标检测的过程。  通过“部分”的图像信息就能推测出图像大致位置。 对识别的物体需要有先验的经验信息。 “部分”图像离 GroundTruth 不能太“远”。...

    零、图像基本概念

    图像表示为二维的矩阵

    灰阶图像
    0-255,0表示黑色,255表示白色,其余表示灰色。

    图像的坐标轴

     

     

    彩色图像

    注意:颜色信息对于任务有时候有用,有时候没用。

    一、什么是目标检测

    目标检测是计算机视觉中的经典的原子问题,即通过输入的图像来完成物体的检测,它需要解决两个问题:

    • 物体在哪里
    • 物体是什么

    目标检测算法的传统实现 sift hog 等算法。这些算法的大致逻辑如下:

    • 通过人定义的算法和规则提炼关键点。
    • 通过人设计的算子和计算流程计算关键点的向量。
    • 通过匹配算法对向量进行匹配,返回可能匹配到的点。

    2012年后,深度学习开始火爆,深度学习开始在计算机视觉领域开始发展。
    You Only Look Once 是目标检测算法中,one stage 算法的开端。You Only Look Once 即你只看一眼,表达的含义是只用一个步骤就完成目标检测的过程。

    目标检测用矩阵框来框出待检测的目标。在二维图像中,表示一个矩阵框至少需要 2 个点(即 4 个值)。有以下两种表示的方式?

    哪种表示方式更好呢?

    在目标检测中,有几个很重要的名词:

    • bounding box (简称 bbox)
    • ground truth bounding box(简称 gd)
    • predicted bounding box (简称 pd)

    如何度量 pd 相对于 gd 的好坏呢?经典的方法,就是 IOU 。


    yolo 系列和大部分的目标检测算法的本质思想来源于人进行目标检测的过程。

    通过“部分”的图像信息就能推测出图像大致位置。

    • 对识别的物体需要有先验的经验信息。
    • “部分”图像离 GroundTruth 不能太“远”。
    • 能区分背景和待测物体。

    重新审视一下神经网络:

    以分类网络举例,神经网络的 logit 输出可以看做是特征提取的过程。最后一层接的就是简单的逻辑斯特回归(线性模型)。

    后面所有的 yolo 系列算法会从

    • 网络结构
    • 损失函数
    • 训练过程
    • 测试过程

    四个方面进行讲解。其中所有的网络结构均以 darknet 官方的 github 库为准1 ,为简略图,目的是方便大家理解和学习。网络结构的详细图在对应的文件附件中。


    二、 YoloV1 算法

    在 two stage 算法中,需要先找出候选区,然后识别候选区中的对象。

    yolo 是 one stage 算法的开篇之作,它并没有真正的去掉候选区,而是划分了“负责”区域(7\(\times\)7 个网格)。在每个“负责”区域会预测两个 bbox ,所以一共会预测 98 个 bbox。

    RCNN 系列是先通过算法找到候选区,然后对候选区进行边框回归,得到最终的 bbox。yolov1 则是直接对负责区域直接进行判别和回归,一步到位的 bbox。

    回想一下前面说的关于人进行目标检测的本质。“负责”区域可能包含“部分”我们关心的待检对象,通过一系列复杂运算,推理出物体的 bbox。

    2.1 网络结构

    YoloV1 的网络结构如上图所示。

    在 YoloV1 才出来时,作者并没有加上卷积的 BatchNorm,这里是作者修复后版本,加上了 BatchNorm。

    最左边是图片的输入,输入图片是 448\(\times\)448\(\times\)3 (注意,ImageNet 的数据是 224\(\times\)224\(\times\)3)

    从输入图像开始,一直到第一行最右边的立方体 \(7\times7\times1024\) 都是通过卷积得到对应的 feature map 。如果直接将 \(7\times7\times1024\) flatten 对接 12544 的全连接,这个参数量是非常可怕的。

    所以作者选择了通过局部连接层(卷积 = 局部连接+共享参数)。然后 flatten 后接 dropout 层,最后接 1715 的全连接,再reshape 成 \(7\times7\times35\) 的输出 tensor。(github 上有的代码实现会在两个全连接中,再增加一个 512 的全连接,以减少参数量)

    可以看到,整个网络结构使用的是 leakyrelu 激活函数。最后一层的输出没使用激活函数,所以输出是 logit。

    按照我们前面对神经网络的理解,可以把 \(7\times7\times35\) 看成是提炼出的特征。

    注意,由于最后输出的 tensor 是通过全连接得到的。所以每一个像素点的包含了整个输入图片的信息。

    分析一下 \(7\times7\times1024\) 的立方体和输入原始图片的感受野对应关系。该立方体的每一个点对应的感受野是有交集的,并不是相互之间不相交的。这里要特别注意。


    最后来分析一下 \(7\times7\times35\) 的 tensor 表示的含义 。每一个 \(1\times1\times35\) 会“负责”原始图像 \(64\times64\) 的区域。输出的 30 维向量。主要包含以下的信息。

    这里有两个 Bbbox,Bbox1(2) 的置信度和 Bbox1(2) 坐标对应。

    Bbox 置信度:

    Bbox 的置信度的公式如下:

    \[Bbox 置信度 = P(Object)*IOU_{pred}^{truth}\]

    \(P(Object)\) 表示是否存在待检对象。在训练阶段,如果这个像素点的“负责”的区域没有 gd,则 \(P(Object) = 0\) 反之为 1 。然后就是计算 gd 和 pd 的 IOU 的值。

    Bbox 置信度表达了这个像素点对应的“负责”区域有没有,且 Bbox 准不准的程度。反应了 Bbox 的准确性程度。

    要注意,Bbox置信度虽然有多个,(一个像素点对应的负责区域会有多个 Bbox,比如这里是2个)。但我们只看和 GroudTruth IOU 大的那个,另外一个自动设定为 0 。

    Bbox 置信度的大小期望在 [0,1] 之间。

    具体对象的概率:

    具体对象的概率公式如下:

    \[P(c_i|object) = 0.6\]

    表示这个像素点“负责“原始图像的区域“存在”对应对象的概率。注意,这里的前提是该网格中存在待检测的对象。每一个值的大小期望在 [0,1] 之间。

    如何定义前面说的“存在”对应对象呢?如果原始图像的待检目标的 bbox 的中心点在对应的“负责”区域内。则表示存在对应对象。

    Bbox 的坐标:

    2 个 Bbox 需要 8 个值进行存储。

    \[(b_x,b_y,b_w,b_h)\times2\]

    我们主要需要看一下 gd 的 Bbox 的坐标表示。 gd 的 Bbox 坐标会做一些变换(编码)。

    \(g_w,g_h\) 会除以图像对应的 \(img_w,img_h\),从而使得 \(g_w,g_h\) 归一化到 [0,1] 之间。

    直接让 \(b_x,b_y\) 回归 gd 的 \(g_x,g_y\) 会有一定难度,既然我们已知 \(g_x,g_y\) 一定在对应的“负责”区域内。所以我们将 \(g_x,g_y\) 相对于负责区域的左上角坐标进行归一化,从而使得 \(g_x,g_y\) 也归一化到 [0,1] 之间。

    为什么我们需要两个 Bbox 来进行预测呢?

    在训练时,我们希望两个框同时工作,但真正计算损失的时候,我们只去对 IOU 最大的框进行梯度下降和修正。类似于一个相同的工作,让两个人一起做,为了保障工作正常完成。在训练最后,会发现两个框意见开始出现了分工,比如一个框倾向于去检测细长型的物体。另一个框倾向于去检测扁宽型的物体。

    总结一下就是,在训练阶段,输出的两个 Bbox 只会选择其中一个参与损失的计算(和 gd IOU大的那个)。
    在测试阶段,输出的两个 Bbox 只有一个有实际预测的意义。

    通过前面讲解,可以看到 YoloV1 至多只能预测 49 个目标,即每个“负责”区域输出一个目标。

    注意!我们可以使用不止 2 个 Bbox,理论上 Bbox 越多效果越好,但是效率会降低。作者取两个 Bbox 的原因是因为性能和效率的取舍。

    2.2 损失函数

    损失函数章节我们关心两个东西。一是损失函数的输入,也就是标签值(gd)和预测值(pd)。二是损失函数的具体形式。

    通过 2.1 关于 Bbox 坐标的讲解,我们知道训练样本的标签是动态变化的,和 yolov1 预测出的 bbox 的 iou 有关。

     

    公式中
    \(1_i^{obj}\) 表示网格 i 中存在对象。
    \(1_{ij}^{obj}\) 表示 网格 i 的第 j 个 Bbox 中存在对象。
    \(1_{ij}^{noobj}\)表示网格 i 的第 j 个 Bbox 中不存在对象。

    yoloV1 将预测和真实标签看做回归问题。使用均方误差作为损失函数。

    思考一下: 为什么 yolov1 概率处的损失函数不使用交叉熵?

    对象分类误差:

    \(1_i^{obj}\) 意味着存在对象的网格才计入误差,不存在的不计入损失。

    BBox 置信度误差:

    \(1_{ij}^{obj}\) 意味着两个 Bbox 只有被选择的那个(IOU比较大的)才会计入损失。

    \(1_{ij}^{noobj}\) 意味着不存在对象的 Bbox 置信度应该要尽量的低。

    Bbox 位置误差:

    \(1_{ij}^{obj}\) 意味着两个 Bbox 只有被选择的那个(IOU比较大的)才会计入损失。

    而且 \(x,y\) 和 \(w,h\) 略有不通。\(w,h\) 有更好,目的是为了减少 \(w,h\) 的敏感度(检测框大小对损失的影响)。

    最后 \(\lambda_{coord}\) 和 \(\lambda_{noobj}\) 是超参数,用来控制不同项的比重。论文中 \(\lambda_{coord} =5, \lambda_{noobj}=0.5\)

    2.3 训练过程

    YoloV1 先使用 ImageNet 数据集对前几十层的卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测,在训练过程中,加入了数据增强,lrelu 的值设定为 0.1 ,dropout的值设定为 0.5 。

    训练过程中的标签生成如前面所述,这里不再赘述。

    2.4 测试过程

    在测试阶段,Bbox置信度和对象概率相乘,得到的是存在对应类别目标的概率:

    \[p(c_i|Object)*p(Object)*IOU_{pred}^{truth}=p(c_i)*IOU_{pred}^{truth}\]

    对每一个网格的每一个 bbox 执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)

    得到 98 个 bbox 的信息后,用 NMS 算法去掉重复率较大的 bounding box 。

    注意,在测试阶段需要将 dropout 也开启为测试模式。(如果有 BatchNorm 需要将 BatchNorm 也开启为测试模式,原始论文中没有 BatchNorm 层)。

    NMS计算方法如下

    • 设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)
    • 遍历每一个对象类别
      • 遍历该对象的98个得分
      • 找到Score最大的那个对象及其bounding box,添加到输出列表
      • 对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU
      • 根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
      • 如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
    • 输出列表即为预测的对象

    最后预测的结果,需要还原到原始图像的坐标值。(预测的 bbox 都是做了归一化的)

    在结束 YoloV1 讲解之前,我们再提一个小点:

    最后输出的 \(7\times7\times35 \) 立方体其实就是图片的每一个“负责区域”的特征,这个特征无法直接去拟合最终的 gd。所以我们需要对 gd 进行适当的“编码”。然后才能通过一个线性层进行拟合。 yolov1 的“编码”方式并不是很好,可以思考一下为什么?


    二、 YoloV2 算法

    YoloV2 至少有两个不同的版本,Yolo9000 和 YoloV2'(为了加以区别,我加上'这个符号)。总的说来 YoloV2 是 YoloV3 正式发布前的试水,网络的结构变化不大,但也有四个很有意思的创新和启发。

    • 引入 anchor(借鉴 two stage 的算法)
    • 改变 gd 的编码方式
    • 引入 PA 层(开始尝试 feature map的其他融合方式)
    • 联合训练

    BTW, yolov9000 这个名字是因为它扩展到了能检测 9000 种不同对象。

    2.1 网络结构

    首先来看一下 anchor 。在 YoloV1 中我们提过,两个 bbox 会各司其职,起到不同的预测 bbox 的效果。比如一个预测长的,一个预测宽的。所以为何不直接先指定一个先验框,然后最终的检测 bbox 就是在先验框(anchor)的基础上去做修正(two stage 中就是这种思想)

    首先我们会将原始图片划分成 \(S \times S\) 的区域,然后在每个“负责”区域上设定先验的 anchor 框。这些框的长宽比均不相同。注意,原始图的 anchor 将映射到最终的输出的 feature map 上,因为后面我们的损失计算是相对于 feature map 上的 anchor 计算的。(如何映射呢?最简单的除以 scale 的倍数即可)

    还有一个问题,anchor 的长宽到底该如何设定呢?在 two stage 的算法中都是人为设置。在 YoloV2 作者创新的用 Kmeans 对训练数据聚类得到。

    注意这里 Kmeans 的距离定义如下:
    \[ dis(A,B) = 1-IOU(A,B)\]

    下面我们来分别看一下 Yolo9000 和 Yolov2 的网络结构图

    Yolo9000 的结构和 YoloV1 差距不大,非常不一样的地方在于,最后的输出层改为了 \(1\times1\) 卷积,大大减少了参数量。

    相比于 Yolo9000,YoloV2 的最大不同在于引入了 \(V2\) 这个模块(这个名字是我自己起的)这个模块的目的期望减少 feature map 空间维度的同时尽量不损失信息。而且它具有了 split transform merge 的形式,一定程度上开始有了特征融合的感觉。

    最后是网络的输出 tensor,这个输出 tensor 的含义如下:

    \[N\times N\times B\times(C+5)\]

    N 表示输出特征图空间维度,B 表示 anchor 的个数,C 表示识别的类别个数,5 表示 Bbox 的坐标(4个)和 Bbox 的置信度(1个)。

    下面我们就来详细的说一下 Bbox 的坐标,和 YoloV1 的思想一样,我们要将 gd 的 Bbox 坐标进行编码(不同的是,现在是相对于 anchor 进行编码)

    假设输出 tensor 的 Bbox 坐标为 \((t_x,t_y,t_w,t_h)\) 。由于最后的 tensor 只是线性层,所以理论上每一个值的值域 \([-\infty,\infty]\)。

    假设 gd 的映射到最后 feature map 的 Bbox 坐标为 \((g_x,g_y,g_w,g_h)\)。现在我们需要将 \((g_x,g_y,g_w,g_h)\) 相对于 anchor 进行编码。

    假设 anchor 所在“负责”区域在最后 feature map 上对应的左上角坐标为 \((c_x,c_y)\),对应的长宽为 \(p_w,p_h\)。(注意这里用的是所在“负责”区域的左上交坐标)

    从 anchor 的 Bbox 变换到 gd 的 Bbox 的最简单方式就是对点做平移,对长宽分别做放缩。

    \[x坐标平移 = g_x - c_x\\
    y坐标平移 = g_y - c_y\\
    宽的放缩 = \frac{g_w}{p_w}\\
    长的放缩 = \frac{g_h}{p_h}\]

    直接用 \((t_x,t_y,t_w,t_h)\) 去拟合上面几个值是不合理的,因为 \((t_x,t_y,t_w,t_h)\) 的取值范围是 \([-\infty,\infty]\) 。但坐标平移范围在 \([0,1]\)(因为最后 feature map 的相邻点距离是一个单位)。长宽的放缩范围在 \([0,\infty]\)。不能把无约束优化问题直接去套有约束优化问题。所以需要进一步编码。

    \[t_x = \sigma^{-1}( g_x - c_x)\\
    t_y = \sigma^{-1}(g_y - c_y)\\
    t_w = log(\frac{g_w}{p_w})\\
    t_h = log(\frac{g_h}{p_h})\]

    最后经过反向的解码就得到了原始论文的样子

    \((b_x,b_y,b_w,b_h)\) 是在最后一层 feature map 上的坐标。为了方便收敛,也为了后这一行数据的类别概率,置信度量纲保持一致,我们需要将 \((b_x,b_y,b_w,b_h)\) 归一化,如何归一化呢?

    方法很简单,计算 \((b_x,b_y,b_w,b_h)\) 相对于最后一层 feature map 的相对大小。 \((\frac{b_x}{f_w},\frac{b_y}{f_h},\frac{b_w}{f_w},\frac{b_h}{f_h})\) , \((f_w,f_h)\) 表示最后一层 feature map 的宽和高。

    在测试阶段,只需要将这个值乘到原始图像的大小上,就能得到原始的图像上的 pd 框。

    2.2 损失函数

    yoloV2 的损失函数在论文中并没有详细说明,需要通过源码进行比对分析。总的说来和 yoloV1 的基本思想保持一致。

    详细解读可以参考连接:

    YoloV2损失

    关于这个损失函数,有几个地方需要强调一下:

    1. 为了解决 \(w,h\) 的敏感度(检测框大小对损失的影响)的问题。这里采用的是 \((2-w_i*h_i)\) 去掉了,在YoloV1 中使用的是 \(w_i,h_i\) 的根号。\(w_i,h_i\) 已经是解码后的值,所以在 \([0,1]\) 之间。
    2. 类别变量使用 softmax, bbox 的置信域使用 sigmoid(因为编码前的 tx 等都属于负无穷到正无穷了,编码后控制在了 [0,1] 之间,为了使得量纲一致)。但损失仍然使用的 MSE。
    3. 最后一项是去修正没有预测准的框,为了加速收敛。仅在前一万多次迭代的时候使用。

    2.3 训练过程

    YoloV2 的训练过程比较有意思,从这里能感受到“炼丹”的不易。

    高分辨率预训练:

    图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 \(224\times 224\) 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 \(448\times 448\) 的图像作为输入。但这样切换对模型性能有一定影响。

    所以YOLO2在采用 \(224\times 224\) 图像进行分类模型预训练后,再采用 \(448\times 448\) 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 \(448\times 448\) 的分辨率。然后再使用 \(448\times 448\) 的检测样本进行训练,缓解了分辨率突然切换造成的影响。

    多尺度训练:

    由于是全卷积网络,其降采样的倍数是 32 。所以可以支持输入任何的 32 倍数尺寸的图片。于是可以输入不同尺寸的图片进行训练。

    每10个batch之后,就将图片resize成{320, 352, ..., 608}中的一种。

    联合训练:

    联合训练方法思路简单清晰,Yolov2中物体矩形框生成,不依赖于物理类别预测,二者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其余部分loss为零。当然,一般的训练策略为,先在检测数据集上训练一定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,作者对coco数据集进行了上采样,使得coco数据总数和 ImageNet 大致相同。

    注意:联合训练和预训练是不同的东西。

    由于 coco 和 Imagenet 数据类别不一致的问题,为了能正常联合训练,作者引入了 wordtree。

    wordtree 在工业界上是很有大的启发。因为真实场景下的标准数据少,如何最大的利用已有标准数据,wordtree 和联合训练是很有意思的想法。

    2.4 测试过程

    同 YoloV1,最后注意下一下预测框需要还原到原始图像上,这个前面有提,这里不再赘述。


    三、YoloV3

    YoloV3 的网络框架有了很大的改变,它在“特征融合”上做了很大的改进。YoloV3 也有两个版本,一个是普通版,一个是YoloV3-spp。YoloV3-spp 版本很重要,因为它直接启发了后续的 YoloV4。

    YoloV3 采用和 YoloV2 同样的 gd 编码方式。并也采用了 anchor 的思想。它借鉴了特征图金字塔的思想,用不同尺度的特征图来检测目标。小尺寸特征图感受野大,于是用来检测大尺寸的物体,大尺寸的特征图感受野小,检测小尺寸的物体。(其实也算是借鉴了 SSD 的思想)

    3.1 网络框架

    YoloV3 总共输出 3 个不同尺度的特征图,分别是 \(19\times 19,38\times38,76\times76\)

    对于这个网络结构如果熟悉 FPN 的读者,应该不难看出,后半部分的“特征融合”就是借鉴了 FPN 网络。

    接下来是 YoloV3-SPP,YoloV3-SPP 的网络结构和 YoloV3 几乎一致,唯一不同的是,YoloV3 借鉴 SPPNET 的思想,增加了 SPP 模块。

    这个思想其实很简单,就是以不同的 kernel (\(1\times1,5\times5,9\times9,13\times13\))去 pooling feature map 然后 concat 起来(为了保证 concat 需要进行 padding的操作),以得到不同尺度的信息。仍然满足 split transform merge 的范式。

    关于 anchor ,YoloV3 也使用了 YoloV2 的技巧,使用 Kmeans 进行聚类作为先验框(距离仍然使用 \(1-IOU\) )。使用 COCO 数据集,一共聚类得到了 9 个 \(w\timesh\)的框 (10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198),(373 × 326) 。

    注意看输出的立方体 tensor (\(255 = 3\times(80+4+1)\))。所以每一个立方体 tensor 只会对应三类先验框。前面说过,大的 tensor 感受野小适合小目标检测,需要小的 anchor。反之小的tensor 感受野大适合大目标检测,需要大的 anchor。

    特征图 \(19\times 19\),对应(116 × 90), (156 × 198),(373 × 326) anchor。

    特征图\(38\times 38\),对应(30×61),(62×45),(59× 119) anchor。

    特征图\(76\times 76\),对应(10×13),(16×30),(33×23) anchor。

    gd 的编码方式和解码方式和 YoloV2 保持一致,略有不同的是,类别概率输出使用 sigmoid,不再是 softmax。这样一个“负责”区域可以同时输出多个类别。

    3.2 损失函数

    损失函数和 YoloV2 基本保持一致

    不同的地方在于,对于类别和置信度的损失使用交叉熵。

    3.3 训练过程

    YoloV3 的训练过程,特别是样本的选择和 V1 和 V2 已经完全不一样了。

    在 V1 和 V2 中是看 gd 中心所落的负责区域来确定 gd 由哪个点来负责。由于 V3 中有多个最终的 feature map。使用这种策略可能会导致矛盾(即一个 gd 同时属于多个点负责)。所以需要新的方式确定样本由哪个点的区域负责。原则很简单:

    所有预测的 pd 中和 gd 的 IOU 最大的那个就是正样本。

    作者还创新的把预测 pd 分成三类:

    • 正例:产生回归框 loss 和类别置信度 loss。
    • 负例:只产生置信度 loss。
    • 忽略:不产生任何 loss。

    正例:
    对任意的 gd,与所有的 pd 计算IOU,IOU 最大那个就是正例。一个pd,只能分配给一个gd。比如第一个 gd 已经匹配了一个正例的 pd,那么下一个 gd,需要在剩下的 pd 中寻找 IOU 最大的作为正例。

    负例:
    除正例以外(与 gd 计算后 IOU 最大的检测框,但是IOU小于阈值,仍为正例),与全部 gd 的 IOU 都小于阈值(论文中为 0.5),则为负例。

    忽略:
    除正例以外,与任意一个 gd 的 IOU 大于阈值(论文中为 0.5),则为忽略。

    在 YoloV3 中置信域标签直接设置为 1 和0。而不是 YoloV1 的 IOU 值。原因是假设 iou 是0.8,但学习到的可能只有 0.6 总是会低一些。不如直接将标签设为 1 (学习到的可能就是 0.8)。

    3.4 测试过程

    由于有三个特征图,所以需要对三个特征图分别进行预测。

    三个特征图一共可以出预测 19 × 19 × 3 + 38 × 38 × 3 + 76 × 76 × 3 = 22743 个 pd 坐标以及对应的类别和置信度。

    测试时,选取一个置信度阈值,过滤掉低阈值 box,经过 NMS(非极大值抑制),输出整个网络的预测结果。注意最后要还原到原始坐标。该改成测试模式的模块需要改成测试模式(比如 BatchNorm)


    四、YoloV4

    Yolo 系列的原作者在推出了 YoloV3 后宣布退出 CV 界。俄罗斯的程序员 Alexey Bochkovskiy 凭借自己的摸索复现了 Yolo 系列全部模型,并总结了最接近几年目标检测的各种套路。就在前几个推出了 YoloV4.

    YoloV4 将最近几年 CV 界大量的trick 集中在一套模型中。这篇论文不仅仅可以看作是一个模型的学习,更能看成是一个不错的文献总署。更有意思的是作者提出了 backbone,neck,head 的目标检测通用框架套路。

    backbone, neck, head 其实非常的形象。它表示组成一个“人”的三个部分。从下到上就是 backbone, neck, head 。

    • backbone:各类卷积网络,目的是对原始图像做初步的特征提取。
    • neck:各类结构,目的是从结构上做“特征的融合”。主要为解决小目标检测,重叠目标检测等问题。
    • head:gd 编码,回归和解析。

    YoloV3 就是一个典型的 backbone, neck, head 结构:

    4.1 网络结构

    Mish 激活函数:

    \[ Mish=x * tanh(ln(1+e^x)) \]

    Dropblock:

    对 feature map 的“局部区域”进行丢弃。其实就是 cutout 的推广形式。

    PANET结构:

    和正常的 PANET 结构的区别:

    特征图和 anchor 的对应方式和 YoloV3 一致。原则是大的特征图对应小的 anchor,小的特征图对应大的 anchor。

    4.2 损失函数

    YoloV4 的损失函数相比 YoloV3 有一定的变化,主要体现在 Bbox 边框回归的损失上。

    YoloV1-3 都是使用 MSE 进行回归(只是编码方式不同)。作者认为这种损失是不合理的。因为 MSE 的 \(x,y,w,h\) 四者是解耦独立的。但实际上这四者并不独立,应该需要一个损失函数能捕捉到它们之间的相互关系。

    IOU 能捕捉到他们之间的关系 (\(L_{iou} = 1-IOU\)),但 IOU 有很多的问题,后面有陆续的一些推广和改进,最终 YoloV4 选择了 CIOU ,CIOU 是 DIOU 的进一步延伸。

    首先看一下 DIOU 对应的损失的公式:

    \[L_{diou} = 1-IOU+\frac{\rho^2(b, b^{gt}) }{c^2}\]

    \(b^{gt}\) 表示 gd 中心点,\(b\) 表示 pd 中心点,\(\rho^2\) 表示欧式距离。\(c\) 表示包含两个框的最小矩阵的对角线。

    DIOU 考虑到了

    • 两边框交集的面积
    • 两边框中心点距离

    但是没有考虑到长宽比。一个好的 pd,应该和 gd 的长宽比尽量保持一致。

    于是我们有了 CIOU:

    4.3 训练过程

    • Mosaic数据增强
    • cmBN
    • SAT自对抗训练

    4.4 测试过程

    测试过程重要注意两点:

    • 多个特征图需要检测,但是 \(78\times78\) 的特征图不参与检测。
    • 使用 DIOU_NMS 代替 NMS 。

    \[DIOU = IOU- \frac{\rho^2(b, b^{gt}) }{c^2}\]

    这里 NMS 不用 CIOU 是合理的。因为只有 gd 和对应的 pd 才需要保持 bbox 的长宽比一致。在测试阶段,pd 之间并不一定长宽比一致。

     

    需要yolov1-v4的pdf论文以及目标检测相关性的探讨请关注

     

    展开全文
  • YOLO系列算法1. 基本概念2. 目标检测算法分类及流程2.1 算法分类2.2 基本流程2.3 Two-stage与One-stage基本流程比较3. YOLO系列目标检测模型3.1 YOLO v13.1.1 基本思想3.1.2 网络结构3.1.3 训练过程3.1.4 优缺点参考...


    友情提示:参考文献中附有原论文地址

    1. 基本概念

    目标检测(Object Detection)是在图像中对一类或多类感兴趣的目标进行查找和分类,确定它们的类别和位置。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域具有挑战性的问题。

    计算机视觉中关于图像识别有四大类任务:

    (1)分类(Classification):解决“是什么”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。

    (2)定位(Location):解决“在哪里”的问题,即定位出这个目标的的位置。

    (3)检测(Detection):解决“在哪里,是什么”的问题,即定位出这个目标的位置并且知道目标物是什么。

    (4)分割(Segmentation):分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

    因此,我们可以发现目标检测网络是一个多任务的网络,它不仅要进行一个分类还要进行定位回归,如下图1所示。

    在这里插入图片描述

    图1 图像识别

    目标检测中需解决的问题:

    (1)分类问题:即图片(或某个区域)中的图像属于哪个类别。

    (2)定位问题:目标可能出现在图像的任何位置。

    (3)大小问题:目标有各种不同的大小。

    (4)形状问题:目标可能有各种不同的形状。

    2. 目标检测算法分类及流程

    2.1 算法分类

    近年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region ProposalR-CNN系列算法(R-CNNFast R-CNN, Faster R-CNN等),它们属于two-stage算法,需要算法先产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是YOLOSSD这类one-stage算法,其仅仅使用一个主干卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是识别精度较高,但是速度慢,第二类算法是速度较快,但识别精度较低,如下图2所示。

    在这里插入图片描述

    图2 目标检测算法

    2.2 基本流程

    传统的目标检测流程如下图3所示。首先输入图像,然后通过输入候选框,对候选框进行特征的提取,再利用分类器对候选框进行判断属于目标还是背景,最后利用非极大值抑制对候选框进行合并,删除冗余的候选框,最终得到目标输出的结果。

    在这里插入图片描述

    图3 传统目标检测流程

    基于深度学习的Two-stage的目标检测算法流程如图4所示。将候选框、特征提取和分类器判断通过RPN网络来完成候选框的推荐,取代手动设计特征滑动窗口的方式。
    在这里插入图片描述

    图4 Two-stage目标检测算法流程

    基于深度学习的One-stage的目标检测算法直接采用特征提取与回归的方式对感兴趣目标区域进行提取,如下图5所示。
    在这里插入图片描述

    图5 One-stage目标检测算法流程

    传统的目标检测算法与基于深度学习的目标检测方法的区别主要取决于是否采用手动设计特征的方式还是采用卷积神经网络的方式

    2.3 Two-stage与One-stage基本流程比较

    Two-stage网络中,Img为输入的图像,Conv&Pooling为深度卷积神经网络,不代表只有一个卷积层,而是代表主干基础网络(如GooleNetResNet等)。通过主干网络进行深度特征的提取,再将输出的特征图(Feature Map)经过RPN网络完成原有通过滑动窗口完成的任务,即产生候选区域。候选区域提取的同时完成区域分类的任务,区分是背景还是目标,还会对目标位置进行初步的预测,即区域分类和位置粗修两个环节,在得到候选框后,后续会进一步精确地定位。Roi_Pooling层可以理解为一个抠图的过程,得到候选框特征后再通过全连接FC层对特征进行表示,最后通过分类与回归完成对候选目标位置的分类和精修,Lcls识别出目标的种类,Lreg得到目标的位置坐标。在One-stage中,通过输入图像Img,然后主干网络进行深度特征的提取,接着直接进行区域的回归与分类,完成目标检测任务。

    在这里插入图片描述

    (a) Two-stage基本流程

    在这里插入图片描述

    (b) One-stage基本流程
    图6 Two-stage与One-stage基本流程比较

    3. YOLO系列目标检测模型

    3.1 YOLO v1

    3.1.1 基本思想

    YOLOYou Only Look Once)是继RCNNFAST-RCNNFASTER-RCNN之后,Ross Girshick针对深度学习目标检测速度问题提出的另一种框架,其核心思想是将整张图片作为网络的输入(类似于Faster-RCNN),直接在输出层对Bounding Box的位置和所属类别进行回归

    基于Region ProposalR-CNN系算法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后续处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各网络目标检测流程简图。

    在这里插入图片描述

    图7 各网络目标检测流程简图

    实际上,YOLO并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为7*7个网格,每个网格允许预测出2个边框,总共49*2bounding box,可以理解为98个候选区域,它们很粗略地覆盖了图片的整个区域。YOLO以降低mAP为代价,大幅提升了时间效率。

    在这里插入图片描述

    图8 图像网格划分产生候选框

    图8是将一幅图像划分为7*7(S×S)个网格,其中的红点代表的是Ground Truth,即物体的中心,包含有Ground Truth的格子用来预测狗这个目标,橙色的这个格子在训练过程中是用来预测外面包含狗的这个红色Bounding Box的,而绿色和白色的格子在训练过程中仅作为分类的依据,并不参与狗的这个Bounding Box的预测。

    每个格子用来预测B个Bounding Box及其置信度,以及C个类别的概率,其中每个Bounding Box包含 [ x , y , w , h , c ] [x,y,w,h,c] [x,y,w,h,c] 5个参数新, ( x , y ) (x,y) (x,y)坐标表示中心点相对于网格的偏移量,宽度 w w w和高度 h h h是相对于整张图像预测的比例,置信度 c c c预测表示预测框与实际边界框之间的IOU。因此,每幅图像所输出的向量长度为 S × S × ( 5 × B + C ) S×S×(5×B+C) S×S×(5×B+C),如图9所示。置信度分数反映了该模型对框是否包含目标的可靠程度,以及它预测框的准确程度。置信度定义为:

    P r ( O b j e c t ) ∗ I O U p r e d t r u t h , 其 中 P r ( O b j e c t ) ∈ { 0 , 1 } Pr(Object)*IOU_{pred}^{truth}, \quad其中Pr(Object)∈\left\{0,1\right\} Pr(Object)IOUpredtruth,Pr(Object){0,1}

    如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU)。每个网格单元还预测 C C C个类别条件概率 P r ( C l a s s i ∣ O b j i e c t ) Pr(Class_i|Objiect) Pr(ClassiObjiect)
    在这里插入图片描述

    图9 图像输出的向量长度

    下图可以更清晰看到YOLO v1的预测过程,对于每一个网格预测2个Bounding Box,每个Bounding Box包含有5个与测量和20个类别概率,即最终输出了1470个向量。通过NMSBounding Box的合并,并过滤掉冗余的候选框得到相应的检测结果。

    在这里插入图片描述

    图10 YOLO v1的预测过程

    3.1.2 网络结构

    YOLO v1网络结构有24个卷积层,后面是2个全连接层。仅使用1×1卷积降维层,后面是3×3卷积层,如下图所示。

    在这里插入图片描述

    3.1.3 训练过程

    • 预训练。采用前20个卷积层、平均池化层、全连接层进行了大约一周的预训练;
    • 输入。输入数据为224×224448×448大小的图像。
    • 采用相对坐标。通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间,边界框 x x x y y y坐标参数化为特定网格单元位置的偏移量,边界也在0和1之间。
    • 损失函数。由坐标预测、是否包含目标物体置信度、类别预测构成。如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类错误。如果预测器“负责”实际边界框(即该网格单元中具有最高IOU的预测器),则它也仅惩罚边界框坐标错误。

    在这里插入图片描述

    • 学习率。第一个迭代周期,慢慢地将学习率从 1 0 − 3 10^{-3} 103提高到 1 0 − 2 10^{-2} 102,然后继续以 1 0 − 2 10^{-2} 102的学习率训练75个迭代周期,用 1 0 − 3 10^{-3} 103的学习率训练30个迭代周期,最后用 1 0 − 4 10^{-4} 104的学习率训练30个迭代周期。
    • 避免过拟合策略。使用dropout和数据增强来避免过拟合。

    3.1.4 优缺点

    (1)优点

    • YOLO检测物体速度较快,其增强版GPU中能跑45fpsframe per second),简化版155fps
    • YOLO在训练和测试时都能看到一整张图的信息(而不像其它算法看到局部图片信息),因此YOLO在检测物体是能很好利用上下文信息,从而不容易在背景上预测出错误的物体信息。
    • YOLO可以学到物体泛化特征

    (2)缺点

    • 精度低于其它state-of-the-art的目标检测网络。
    • 对小物体检测效果不好,尤其是密集的小物体,因为一个栅格只能检测2个物体,限制检测效率。
    • 容易产生定位错误

    3.2 YOLO v2

    3.2.1 基本介绍

    YOLO v2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。在精度上利用一些列训练技巧,在速度上应用了新的网络模型DarkNet19,在分类任务上采用联合训练方法,结合wordtree等方法,使YOLO v2的检测种类扩充到了上千种,作者在论文中称可以检测超过9000个目标类别,所以也称YOLO 9000YOLO v2模型可以以不同的尺寸运行,从而在速度和准确性之间提供了一个简单的折衷,在67fps时,YOLO v2VOC 2007上获得了mAP=76.8 %;在40fps时,YOLO v2获得了mAP=78.6%,比使用ResNetFaster R-CNNSSD等先进方法表现更出色,同时仍然运行速度显著更快。

    3.2.2 改进之处

    YOLO v2相对YOLO v1采取了很多改进措施,以提高模型mAP,如下图所示:

    在这里插入图片描述
    (1)批量归一化(Batch Normalization)

    批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLO v2不再使用dropout),从而能够获得更好的收敛速度和收敛效果,mAP提升2.4%

    通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),BN层进行如下变换:① 对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。从而使得每一批训练样本在每一层都有类似的分布,这一变换不需要引入额外的参数。② 对上一步的输出再做一次线性变换,假设上一步的输出为Z,则Z1=γZ + β。这里γβ是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。

    (2)高分辨率图像分类器(High resolution classifier)

    YOLO v1在预训练的时候采用的是224×224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448×448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLO v2则将预训练分成两步:先用224×224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448×448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上微调(fine-tuning),也就是detection的时候用448×448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高mAP 3.7%

    (3)带Anchor Boxes的卷积(Convolutional With Anchor Boxes)

    YOLO v1利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLO v2去掉了YOLO v1中的全连接层,使用Anchor Boxes预测边界框,同时为了得到更高分辨率的特征图,YOLO v2还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLO v2通过缩减网络,使用416×416的输入,模型下采样的总步长为32,最后得到13×13的特征图,然后对13×13的特征图的每个cell预测5个anchor boxes,对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后,YOLO v2可以预测13×13×5=845个边界框,模型的召回率由原来的81%提升到88%mAP由原来的69.5%降低到69.2%,召回率提升了7%,准确率下降了0.3%

    (4)维度聚类(Dimension Clusters)

    Faster R-CNN和SSD中,先验框都是手动设定的,带有一定的主观性。YOLO v2采用k-means聚类算法对训练集中的边界框做了聚类分析,选用boxes之间的IOU值作为聚类指标。综合考虑模型复杂度和召回率,最终选择5个聚类中心,得到5个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值,这使得模型更容易训练学习。

    在这里插入图片描述

    (5)直接定位预测(Direct location Prediction)

    Faster R-CNN使用anchor boxes预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。YOLO v2沿用YOLO v1的方法,根据所在网格单元的位置来预测坐标,则Ground Truth的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid函数中,让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是 c x c_x cx c y c_y cy,先验框的宽度和高度分别是 p w p_w pw p h p_h ph,则预测的边界框相对于特征图的中心坐标 ( b x , b y ) (b_x, b_y) (bx,by)和宽度 b w b_w bw b h b_h bh的计算公式如下图所示。其中,σ为sigmoid函数, t x t_x tx t y t_y ty是预测的坐标偏移值(中心点坐标), t w t_w tw t h t_h th是尺度缩放,分别经过sigmoid,输出0-1之间的偏移量,与 c x c_x cx c y c_y cy相加后得到bounding box中心点的位置。

    在这里插入图片描述

    (6)细粒度特征(Fine-Grained Features)

    YOLO v2借鉴SSD使用多尺度的特征图做检测,提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLO v2提取Darknet-19最后一个max pool层的输入,得到26×26×512的特征图。经过1×1×64的卷积以降低特征图的维度,得到26×26×64的特征图,然后经过pass through层的处理变成13×13×256的特征图(抽取原特征图每个2×2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与13×13×1024大小的特征图连接,变成13×13×1280的特征图,最后在这些特征图上做预测。使用细粒度特征(Fine-Grained Features),YOLO v2的性能提升了1%

    (7)多尺度训练(Multi-Scale Training)

    YOLO v2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLO v2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸,由于Darknet-19下采样总步长为32,输入图片的尺寸一般选择32的倍数{320,352,…,608}(最小的选项是320×320,最大的是608×608。我们调整网络的尺寸并继续训练)。采用多尺度训练(Multi-Scale Training), 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降。

    3.2.3 训练过程

    • 第一阶段:先在ImageNet分类数据集上训练Darknet-19,此时模型输入为224×224,共训练160轮。
    • 第二阶段:将网络输入调整为448×448,继续在ImageNet分类数据集上训练细调模型,共10轮,此时分类模型top-1准确率为76.5%,而top-5准确度为93.3%
    • 第三阶段:修改Darknet-19分类模型为检测模型,并在检测数据集上继续细调网络。

    3.2.4 优缺点

    (1)优点

    • YOLO v2使用了一个新的分类器作为特征提取部分,较多使用了3×3卷积核,在每次池化后操作后把通道数翻倍。网络使用了全局平均池化,把1×1卷积核置于3×3卷积核之间,用来压缩特征。也用了batch normalization稳定模型训练。
    • 最终得出的基础模型就是Darknet-19,包含19个卷积层,5个最大池化层,- 运算次数55.8亿次,top-1图片分类准确率72.9%top-5准确率91.2%
    • YOLO v2VGG16更快,精度略低于VGG16

    (2)缺点

    • YOLO v2检测准确率不够,比SSD稍差。
    • 不擅长检测小物体。
    • 对近距离物体准确率较低。

    3.3 YOLO v3

    3.3.1 基本介绍

    YOLO v3总结了在YOLO v2的基础上做了一些尝试性的改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,一个是使用残差模型,进一步加深了网络结构另一个是使用FPN架构实现多尺度检测

    3.3.2 改进之处

    (1)引入FPN(特征金字塔网络),实现多尺度预测 。
    (2)使用新网络结构darknet-53(类似于ResNet引入残差结构)。
    (3)分类器不在使用Softmax分类损失采用二分类交叉损失熵binary cross-entropy loss)。主要考虑因素有两个:

    • Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类。
    • Softmax可被独立的多个logistic分类器替代,且准确率不会下降。

    3.3.3 多尺度预测

    YOLO v3在基本特征提取器上添加几个卷积层,其中最后一个卷积层预测了一个三维张量——边界框,目标和类别预测。 在COCO实验中,为每个尺度预测3个框,4个边界框偏移量,1个目标预测和80个类别预测,张量的大小为 N × N × [ 3 × ( 4 + 1 + 80 ) ] N×N×[3 ×(4 + 1 + 80)] N×N×[3×(4+1+80)]

    YOLO v3还从主干网络层中获取特征图,并使用按元素相加的方式将其与上采样特征图进行合并。这种方法能够从上采样的特征图中获得更有意义的语义信息,同时可以从更前的层中获取更细粒度的信息。然后,再添加几个卷积层来处理这个组合的特征图,并最终预测出一个类似的张量。

    每种尺度预测3个boxanchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3个尺度。

    • 尺度1: 在基础网络之后经过卷积输出13×13特征层信息。
    • 尺度2: 从尺度1中倒数第二13×13卷积层上采样(x2)后与主干网络26x26大小的特征图相堆叠,再通过卷积后输出26×26特征层信息。
    • 尺度3: 与尺度2类似卷积后输出52×52特征层信息。

    3.3.4 基础网络 Darknet-53

    YOLO v3在之前Darknet-19的基础上引入了残差块,并进一步加深了网络,改进后的网络有53个卷积层,取名为Darknet-53,网络结构如下图所示(以256×256的输入为例):

    在这里插入图片描述

    YOLO v1YOLO v2再到YOLO9000YOLO v3YOLO经历三代变革,在保持速度优势的同时,不断改进网络结构,同时汲取其它优秀的目标检测算法的各种trick,先后引入anchor box机制、引入FPN实现多尺度检测等。

    在这里插入图片描述
    每个网络都使用相同的设置进行训练,并在256×256的图像上进行单精度测试。 运行时间是在Titan X上用256×256图像进行测量的。因此,Darknet-53可与最先进的分类器相媲美,浮点运算更少,速度更快。 Darknet-53ResNet-101更好,且速度快1.5倍。 Darknet-53ResNet-152具有相似的性能,但速度快2倍。

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

    3.3.5 主干架构的性能对比

    (1)兼顾速度与准确率。在COCO数据集上,mAP指标与SSD模型相当,但速度提高了3倍;mAP指标比RetinaNet模型差些,但速度要高3.8倍。

    在这里插入图片描述

    (2)小目标检测有所提升,但中等和更大尺寸的物体上的表现相对较差。

    在这里插入图片描述

    3.4 YOLO v4

    3.4.1 基本介绍

    YOLO v4的特点是集大成者,类似综述,但有实验的过程。YOLO v4COCO数据集上,可达 AP 43.5%,速度高达65fps,最终达到这么高的性能,一定是不断尝试、不断总结、不断调参的结果。主要包括以下方面:

    • Weighted-Residual-Connections (WRC)
    • Cross-Stage-Partial-connections (CSP)
    • Cross mini-Batch Normalization (CmBN)
    • Self-adversarial-training (SAT)
    • Mish-activation
    • Mosaic data augmentation
    • CmBN
    • DropBlock regularization
    • CIoU loss

    3.4.2 贡献之处

    (1)提出了一种高效而强大的目标检测模型。可以使用1080 Ti2080 Ti GPU 训练超快速和准确的目标检测器。

    (2)在检测器训练期间,验证了SOTABag-of FreebiesBag-of-Specials方法的影响。

    (3)改进了SOTA的方法,使它们更有效,更适合单GPU训练,包括CBN [89],PAN [49],SAM [85]等。文章将目前主流的目标检测器框架进行拆分:input、backbone、neck 和 head,如下图所示。

    在这里插入图片描述

    (4)对于GPU,作者在卷积层中使用:CSPResNeXt50 / CSPDarknet53
    (5)对于VPU,作者使用分组卷积,但避免使用(SE)块-具体来说,它包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3
    作者的目标是在输入网络分辨率,卷积层数,参数数量和层输出(filters)的数量之间找到最佳平衡。

    YOLO v4框架:

    • Backbone:CSPDarknet53
    • Neck:SPP,PAN
    • Head:YOLO v3

    其中YOLO v4用到相当多的技巧:

    • 用于backboneBoFCutMixMosaic数据增强,DropBlock正则化,Class label smoothing
    • 用于backboneBoSMish激活函数,CSPMiWRC
    • 用于检测器的BoFCIoU-lossCmBNDropBlock正则化,Mosaic数据增强,Self-Adversarial 训练,消除网格敏感性,对单个ground-truth使用多个anchorCosine annealing scheduler,最佳超参数,Random training shapes
    • 用于检测器的BosMish激活函数,SPPSAMPANDIoU-NMS

    YOLO v4部分组件:
    在这里插入图片描述

    3.4.3 实验

    YOLO v4实验的充分性:

    在这里插入图片描述

    在这里插入图片描述
    YOLO v4实验结果:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    具体试验结果数据详见论文原文

    3.5 YOLO v5

    3.5.1 基本介绍

    2020年2月YOLO之父Joseph Redmon宣布退出计算机视觉研究领域,2020 年 4 月 23 日YOLO v4 发布,YOLO V4YOLO系列一个重大的更新,其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10%12%,并得到了Joseph Redmon的官方认可,被认为是当前最强的实时对象检测模型之一。正当计算机视觉的从业者们正在努力研究YOLO V4的时候,6月25日,Ultralytics发布了YOLO V5 的第一个正式版本,其性能与YOLO V4不相伯仲,同样也是现今最先进的对象检测技术,并在推理速度上是目前最强。

    3.5.2 模型效果

    YOLO v5按从小到大分为四个模型YOLO v5sYOLO v5mYOLO v5lYOLO v5x,这四个模型的表现见下图(v4.0版):

    在这里插入图片描述

    YOLO v5 v5.0版本新增四个模型,加入了P6层,因此模型名后面加了个6,四个模型效果分别为:

    在这里插入图片描述

    大家对YOLO v5命名是争议很大,因为YOLO v5相对于YOLO v4来说创新性的地方很少。不过它的性能应该还是有的,现在kaggle上active检测的比赛小麦检测前面的选手大部分用的都是YOLO v5的框架。

    4. 结尾

    YOLO系列目标检测目前已有5个版本,其核心思想大同小异,由于时间仓促,加之小编水平有限,文中难免疏漏及不足之处,敬请广大读者批评指正,不吝赐教,谢谢!

    参考文献

    1. You Only Look Once:Unified, Real-Time Object Detection
    2. YOLO9000: Better, Faster, Stronger
    3. YOLOv3: An Incremental Improvement
    4. YOLOv4: Optimal Speed and Accuracy of Object Detection
    5. YOLO v1代码
    6. YOLO v4,3,2代码
    7. YOLO v5代码
    8. 目标检测(Object Detection)
    9. YOLO系列:YOLOv1,YOLOv2,YOLOv3,YOLOv4,YOLOv5简介
    10. 目标检测综述
    11. YOLO 9000 中的WordTree细节问题
    12. GitHub wudashuo/yolov5: YOLOv5 汉化版,保持同步更新
    如果文章对你有帮助,请记得点赞与关注,谢谢!

    在这里插入图片描述

    展开全文
  • YOLO系列算法简要分析

    2021-09-16 14:30:31
    YOLO系列目标检测算法是最为常用的目标检测算法之一,一般仅仅拿来用的话,是无法看清它的发展过程,本文综合部分资料进行简要分析。
  • YOLO系列总结

    2021-11-01 08:34:47
    深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 https://zhuanlan.zhihu.com/p/143747206 作者江大白 该文讲了一些基础知识,相当于论文翻译,可以适当看看,不理解的就看论文...
  • YOLO系列论文

    2021-05-11 14:43:24
    YOLO系列论文 YOLOv1 YOLOv2 YOLOv3 论文网址:https://arxiv.org/abs/1804.02767 YOLOv4
  • 学习YOLO系列的个人总结

    千次阅读 2020-07-10 09:05:41
    最近这段时间学习了YOLO系列原理,也跑了pytorch_yolov4、darknet框架yolov4、pytorch_yolov3、dakrnet框架yolov3等模型。这里要感谢网上大佬们的博文,没有你们,自己要走很多弯路。 本篇博客主要是记录自己学习...
  • 全网最详细的YOLO,从v1到v4!从小白到大佬!
  • YOLO系列详解

    千次阅读 多人点赞 2019-06-04 16:42:30
    文章目录YOLO v1YOLO的核心思想YOLO的实现方法YOLO的实现细节YOLO的缺点YOLO9000 YOLOv2摘要简介BETTERFasterStronger总结YOLO v3改进之处多尺度预测YOLO v.s Faster R-CNN YOLO v1 这是继RCNN,fast-RCNN和faster-...
  • 说明:本人是非科班出身,本科是机械电子工程专业,硕士期间的研究方向是机器学习和深度学习,因为我的简历上有关于YOLO的项目,所以我着重准备了YOLO系列的面试可能遇到的问题。 决定开启这个面试问题总结的系列,...
  • 1 YOLO 1.1 Grid Cell YOLO将输入图像分成S×S网格。 每个网格单元仅预测一个对象。 例如,下面的黄色网格单元试图预测其中心(蓝点)落在网格单元内的“人”对象。 每个网格单元预测固定数量的边界框。 在此示例中...
  • YOLO的思想: 本文逐步介绍yolov1-v3的设计过程 一、YOLOv1基本思想 YOLO将输入图像分成SxS个格子,如果某物体的Ground truth的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。 每个格子...
  • YOLO系列文章汇总

    千次阅读 多人点赞 2020-04-28 14:43:57
    YOLOv4横空出世,我也已经写了有一系列有关于YOLO的文章,所以这篇文章,我把所有有关于YOLO的文章在这里做一个汇总,该汇总也会根据文章的扩充不断更新,方便大家查看学习。 1、论文笔记 目前我写的有关于论文...
  • 深入浅出Yolo系列之Yolox核心基础完整讲解

    千次阅读 多人点赞 2021-08-13 08:37:23
    而从2015年的Yolov1,2016年Yolov2,2018年的Yolov3,再到2020年的Yolov4、Yolov5,Yolo系列也在不断的进化发展。 就在大家质疑,Yolo如何进一步改进时,旷视科技发表了研究改进的Yolox算法。 大白对于Yolox文章和...
  • YOLOv2 的时候,作者在 YOLOv1 的基础上运用了许多有效的 tricks,所以展示了...速度始终是YOLO系列安身立命之本. 这是极具挑衅的一张性能对比图。 以实时性要求为分界,这世界上只有 2 种算法,YOLOv3 和其它。 ...
  • YOLO系列网络原理

    千次阅读 2020-02-26 22:01:10
    文章目录初代YOLO算法优点算法结构网络结构YOLOv2YOLOv3 初代YOLO 论文地址:https://arxiv.org/abs/1506.02640 研究代码地址:https://pjreddie.com/darknet/yolo/ 算法优点 1,速度非常快,在Titan X GPU上的速度...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,922
精华内容 3,968
关键字:

yolo系列