目标检测 /yolo算法原理的详解

前言

目标检测 /yolo算法原理的详解

目标检测

目标检测目前有两类流行算法:一类是基于Region Proposal的R-cnn系列(比如r-cnn,fast r-cnn,faster r-cnn),他们是属于two stage的,需要先使用Selective search 或者cnn网络(RPN)来产生Region proposal,然后再对Region proposal上做分类和回归。 另一类就是yolo,ssd系列的one stage算法,它仅仅使用一个cnn来直接预测不同目标的类别和位置;第一类方法精确度要高一些,但速度比较慢,第二类方法精确度相比第一类要低一些,但速度比较快。本文主要讲述YOLO v1算法的原理。

一. yolo v1算法原理

从整体上看,yolo是通过一个cnn网络模型来实现end-to-end的目标检测,整个流程如下图所示:

目标检测 /yolo算法原理的详解

YOLO的检测过程

该过程整体上首先是将输入的图像resize成448*448的大小,然后送入cnn中,运行该cnn网络,接着采用非极大值抑制的方法进行筛选,最后处理网络预测结果得到检测的目标。

接下来详细的分析整个过程,首先对输入的图像resize成448448的大小送入到cnn模型中,yolo中的cnn模型是将输入的图像分割成SS大小的网格,然后对每一个单元格都会预测B个边界框(bounding boxes),每个边界框都包含5个预测值:x,y,w,h 和confidence(置信度),其中x,y就是预测边界框的中心坐标,中心坐标(x,y)的预测值 是相对于该单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,与单元格对齐(即相对于当前grid cell的偏移值),使得范围变成0到1,单元格的坐标定义如图1所示 ;而边界框的w和h的预测值是相对于整个图片的宽和高的比例(即w和h进行归一化,分别除以图像的w和h,这样最后的w和h就在0到1范围了) 。另外每一个单元格(grid cell)都有C个类别的概率预测值,其表示的是由该单元格负责预测的边界框,在包含目标条件下属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即p(classi | object).

图1

所谓 置信度其实就是 这个边界框含有目标的可能性大小与这个边界框的准确度的乘积。前者记为Pr(object),当边界框的为背景时(没有目标),Pr(object)=0,当边界框包含目标时,Pr(object)=1,

后者记为边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表示,记为

目标检测 /yolo算法原理的详解因此置信度为目标检测 /yolo算法原理的详解

前面已经有 每一个单元格(grid cell)的C个类别的概率预测值Pr(class i | object),我们可以计算 每个边界框的类别置信度

目标检测 /yolo算法原理的详解

边界框类别置信度反映的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏

每个边界框的类别置信度的过程图如下:这里把图片分割成了77的网格,每个单元格有2个预测边框,一共有20个类别,则整张图片共有772个边框,每个边框的类别置信度为201

目标检测 /yolo算法原理的详解

图2

即得到每个边界框属于20类的confidence score。也就是说最后会得到20(772)=2098的置信度矩阵。

二.网络模型

网络上采用的是 GoogLeNet,24个卷积层+2个全连接层,卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标。输入的是448448,最后的输出是7730,这个30是20+25,20代表类别数量,2代表每一个单元格有2个边界框,5代表(x,y,w,h,c),具体含义前面讲过,7*7是单元格的数量。模型如下图3

目标检测 /yolo算法原理的详解

图3

PS:这里有三点需要注意

①原文YOLO模型未使用inception module,而是使用1×1卷积层(此处1×1卷积层的存在是为了跨通道信息整合)+3×3卷积层简单替代

②原文YOLO作者先在ImageNet数据集上预训练网络,而且网络只采用fig3的前面20个卷积层,输入是224224大小的图像。然后在检测的时候再加上随机初始化的4个卷积层和2个全连接层,同时输入改为更高分辨率的448448。

③Relu层改为pRelu,即当x

三.损失函数

YOLO算法是将目标检测看出一个回归问题,所以将均方差作为损失函数,损失函数分为定位误差部分和分类误差部分,对于不同部分他们的比重值 λ;对于定位误差,即边界框中心坐标误差以及边界框的宽高误差,均采用的比重是λcoord​=5, 而对于不含目标的边界框的置信度误差所采用的比重是λnoobj​=0.5, 含有目标的边框的置信度误差的比重λ=1, 每个单元格的分类误差的比重λ=1, 所以采用均方误差

对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相等的位置偏差占大物体的比例远小于同等偏差占小物体的比例,比如原来大物体w=10,h=20,预测出来w=8,h=22,跟原来小物体w=3,h=5,预测出来w1,h=7相比,经过计算两个物体损失影响是一样的,实际上大物体的误差对检测的影响要比小物体小,所以YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题,即预测值变为了(x,y,目标检测 /yolo算法原理的详解 w,目标检测 /yolo算法原理的详解 h)

另外由于每一个单元格有多个边界框,但是每一个单元格其对应类别只有一个, 如果在训练时,多个边界框存在目标,那就只选择与真实边框(ground truth)的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的结果使每一个单元格只对应一个边框,一个类别。大家可能会想如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一。要注意的一点时,对于不存在对应目标的边界框,其误差项就是只有置信度,坐标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。
综上所述,损失函数如下:

目标检测 /yolo算法原理的详解

第一行的式子表示边界框中心坐标的误差,第二行式子表示边界框的宽高误差,第三行式子表示含有目标的边界框的置信度误差,第四项式子表示不含有目标的边界框的置信度误差,第五行式子表示含有目标的单元格的类别误差;这里注意置信度Ci的值,如果不存在目标,则Pr(object)=0,那么置信度Ci=0,如果存在目标,则Pr(object)=1,需要确定

目标检测 /yolo算法原理的详解值,才能得到置信度Ci的值;为了方便计算,你可以将Ci置为1;

四.网络训练

前面已经讲过YOLO的cnn模型(GoogleNet),在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用之前图中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224×224增加到了448×448。整个网络的流程如下图所示:

目标检测 /yolo算法原理的详解

一张图片经过该模型的处理后得到一个7730的张量,刚好是我们需要的所有数据信息,这个30是20+25,20代表类别数量,2代表每一个单元格有2个边界框,5代表(x,y,w,h,c),具体含义前面讲过,77是单元格的数量。我们可以将其划分为三个部分:①类别概率部分,[7,7,20],②边界框置信度部分,[7,7,2],③边界框部分,[7,7,2,4],类别概率部分边界框置信度部分=边界框类别置信度(矩阵[7,7,2]乘以[7,7,20],为了方便计算,我们可以先将它们各补一个维度来完成[7,7,2,1]×[7,7,1,20]),两者相乘可以得到边界框类别置信度[7,7,2,20],这里总共有77*2=98个边界框,如前面的图二所示,所有的数据信息已经得到,接下来有两种策略得到边界框的类别结果和置信度

第一种策略: 对于每个预测框选择类别置信度最大的类别作为该预测框的类别标签,然后通过上一步得到了每个预测框的类别标签以及该类别的置信度,然后设置置信度阈值,将小于该置信度阈值的边框过滤掉,经过这样处理后,剩下的就是置信度比较高的边框,然后对这些预测框进行NMS算法处理,最后留下来的检测结果。

这里提一下非极大值抑制算法(NMS),NMS算法主要解决一个目标被多次检测到的问题,比如人脸识别,如果人脸被多个边界框检测到,这时我们通过nms算法得到的是一个效果最好的检测框;NMS算法原理是首先从所有预测边界框中选择类别置信度最大的边界框,然后计算该边界框与剩余其他边界框进行IOU(交并比),如果其IOU值大于一定阈值(重复度过高),则将该边界框过滤掉,接下来对剩余的边界框重复上述过程,直至处理完所有的边界框。

第二种策略: 是原YOLO论文中使用的策略,首先对每个类别使用NMS,然后再确定各个边界框的类别,其过程如下图4所示,其过程是对于772=98个边界框,首先设置一定阈值,然后对每一个边界框的类别置信度与阈值作比较,如果小于该阈值,则将该类别置信度设置为0,接着对所有边界框的置信度从高到低做排序,然后对所有边界框分类别 (矩阵的每一行)进行NMS,得到一个最佳边界框获得该类别以及其置信度(该过程NMS:针对某一类别,选择类别置信度最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于阈值0.5,说明重复率较大,该置信度设为0,如果IOU不大于阈值0.5,则不改,再选择该行剩下的置信度里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复比较阈值过程,直到这一行所有的边界框结束为止;然后进行下一个类别,每一类别重复以上过程直到最后) ,这里不是剔除其他边界框,最后从每一个边界框中选择最大的类别置信度作为该边界框的类别标签以及置信度,最后筛选出置信度大于0的边界框作为检测的最后结果, 如果小于0,说明这个边界框里面没有物体,跳过即可

目标检测 /yolo算法原理的详解

图4

五.YOLO v1的代码实现

源码:https://e.coding.net/xucancan1/yolov1/YOLOv1.git

效果:

目标检测 /yolo算法原理的详解

六.YOLO的优缺点

优点:

第一点Yolo采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以Yolo算法比较简洁且速度快。

第二点由于Yolo是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。

缺点:

第一点Yolo各个单元格仅仅预测两个边界框,而且属于一个类别,如果一个单元格有两个以上的目标,就只能预测一个,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟

第二点定位不准确,Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。

参考:

https://blog.csdn.net/u014380165/article/details/72616238

https://zhuanlan.zhihu.com/p/32525231

Original: https://blog.csdn.net/hgnuxc_1993/article/details/116945869
Author: 无尽的沉默
Title: 目标检测 /yolo算法原理的详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/686670/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球