《YOLO算法的原理与实现.docx》由会员分享,可在线阅读,更多相关《YOLO算法的原理与实现.docx(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、当我们谈起计算机视觉时,首先想到的就是图像分类,没错,图像分类是计算 机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的 任务,如目标检测,物体定位,图像分割等,见图1所示。其中目标检测是一 件比拟实际的且具有挑战性的计算机视觉任务,其可以看成图像分类与定位的 结合,给定一张图片,目标检测系统要能够识别出图片的目标并给出其位置, 由于图片中目标数是不定的,且要给出目标的精确位置,目标检测相比分类任 务更复杂。目标检测的一个实际应用场景就是无人驾驶,如果能够在无人车上 装载一个有效的目标检测系统,那么无人车将和人一样有了眼睛,可以快速地 检测出前面的行人与车辆,从而作出实时决策
2、。Classification+ LocalizationObjectDetectionInstanceSegmentationSemantic SegmentationGRASS, CAT, TREE, SKY V No objects, just pixelsSingle Object图1计算机视觉任务(来源:cs231n ) 在介绍Yolo算法之前,首先先介绍一下滑动窗口技术,这对我们理解Yolo算 法是有帮助的。采用滑动窗口的目标检测算法思路非常简单,它将检测问题转 化为了图像分类问题。其基本原理就是采用不同大小和窗口在整张图片上以一 最后8个元素是边界框的(x,y,w,h)。大家可能
3、会感到奇怪,对于边界框为什么 把置信度c和(x,y,w,h)都分开排列,而不是按照(x,y,w,h)这样排列,其实纯粹 是为了计算方便,因为实际上这30个元素都是对应一个单元格,其排列是可 以任意的。但是别离排布,可以方便地提取每一个局部。这里来解释一下,首 先网络的预测值是一个二维张量P ,其sh叩e为batch,7*7*30。采用切片, 那么勺:,0:7*7*20就是类别概率局部,而勺:,7*7*20:7*7*(20+2);,是置信度局部,最后剩余局部尸:,7*7*(20+2):是边界框的预测结果。这样,提取每个局部是非常方便的,这会方面后面的训 练及预测时的计算。Tensor value
4、s interpretationclast probsbox,confidncs图9预测张量的解析网络训练在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8 中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后, 在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接 层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加 到了 448x448。整个网络的流程如下列图所示:Inference图10 Yolo网络流程下面是训练损失函数的分析,Yolo算法将目标检测看成回归问题,所以采用的 是均方差损失函数。但是对
5、不同的局部采用了不同的权重值。首先区分定位误 差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重coordcoord=5c然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值=05。其它权重值均设为lo然后采用均方误差,其同等对待大小不同的边界框, 但是实际上较小的边界框的坐标误差应该要比拟大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为1(叫少乒、v)另外一点时,由于每个单元格预测多个边界框。但是其对应类别只有一个。那 么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的 I
6、OU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这 样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适 用不同大小,不同高宽比的目标,从而提升模型性能。大家可能会想如果一个 单元格内存在多个目标怎么力,其实这时候丫。1。算法就只能选择其中一个来 训练,这也是丫。1。算法的缺点之一。要注意的一点时,对于不存在对应目标 的边界框,其误差项就是只有置信度,左标项误差是没法计算的。而只有当一 个单元格内确实存在目标时,才计算分类误差项,否那么该项也是无法计算的。综上讨论,最终的损失函数计算如下:S2 BXcoord 2-I.? + Oi)?i=0 j=0S2 B+
7、EE 噌 9-di i=0 j=0S2 BQ+ Anoobj lbj (G 0)i=0 j=0S2+ 汇 K (PM。)一自 9)22=0c classes其中第一项为哪一项边界框中心坐标的误差项,指的是第i个单元格存在目标,且该单元格中的第j个边界框负责预测该目标。 第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差 项。第四项是不包含目标的边界框的置信度误差项。而最后一项为哪一项包含目标的 单元格的分类误差项,指的是第i个单元格存在目标。网络预测在说明Yolo算法的预测过程之前,这里先介绍一下非极大值抑制算法(non maximum suppression, NMS ),
8、这个算法不单单是针对Yolo算法的,而是 所有的检测算法中都会用到。NMS算法主要解决的是一个目标被屡次检测的 问题,如图11中人脸检测,可以看到人脸被屡次检测,但是其实我们希望最 后仅仅输出其中一个最好的预测框,比方对于美女,只想要红色那个检测结 果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到 置信度最大的那个框,然后挨个计算其与剩余框的IOU ,如果其值大于一定阈 值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程, 直到处理完所有的检测框。Volo预测过程也需要用到NMS算法。图11 NMS应用在人脸检测F面就来分析Yol。的预测过程,这里我们不考虑
9、batch ,认为只是预测一张输 入图片。根据前面的分析,最终的网络输出是7*7*30,但是我们可以将其分割 成三个局部:类别概率局部为7720,置信度局部为7,722,而边界框局部 为7,724(对于这局部不要忘记根据原始图片计算出其真实值)。然后将前 两项相乘可以得到类别置信度值为7,7,2,20,这里总共预测了 7*7*2=98边 界框。所有的准备数据已经得到了,那么我们先说第一种策略来得到检测框的结果, 我认为这是最正常与自然的处理。首先,对于每个预测框根据类别置信度选取 置信度最大的那个类别作为其预测标签,经过这层处理我们得到各个预测框的 预测类别及对应的置信度值,其大小都是7,7,
10、2。一般情况下,会设置置信度 阈值,就是将置信度小于该阈值的box过滤掉,所以经过这层处理,剩余的是 置信度比拟高的预测框。最后再对这些预测框使用NMS算法,最后留下来的 就是检测结果。一个值得注意的点是NMS是对所有预测框一视同仁,还是区 分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别 分别使用NMS ,但是看了很多实现,其实还是同等对待所有的框,我觉得可 能是不同类别的目标出现在相同位置这种概率很低吧。上面的预测方法应该非常简单明了,但是对于Yol。算法,其却采用了另外一 个不同的处理思路(至少从C源码看是这样的),其区别就是先使用NMS , 然后再确
11、定各个box的类别。其基本过程如图12所示。对于98个boxes , 首先将小于置信度阈值的值归0 ,然后分类别地对置信度值采用NMS ,这里 NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box 的类别,当其置信度值不为0时才做出检测结果输出。这个策略不是很直接, 但是貌似Yolo源码就是这样做的。Yolo论文里面说NMS算法对Yolo的性能是影响很大的,所以可能这种策略对丫。|。更好。但是我测试了普通的图片检 测,两种策略结果是一样的。图12 Yolo的预测处理流程算法性能分析7这里看一下Yolo算法在PASCAL VOC 2007数据集上的性能,这里Yolo与 其它检测
12、算法做了比照,包括DPM , R-CNN , Fast R-CNN以及Faster R- CNN。其比照结果如表1所示。与实时性检测方法DPM比照,可以看到 Yolo算法可以在较高的mAP上到达较快的检测速度,其中Fast Yolo算法比 快速DPM还快,而且mAP是远高于DPM0但是相比Faster R-CNN , Yolo 的mAP稍低,但是速度更快。所以。Yolo算法算是在速度与准确度上做了折 中。表1 Yolo在PASCAL VOC 2007上与其他算法的比照为了进一步分析Yolo算法,文章还做了误差分析,将预测结果按照分类与定 位准确性分成以下5类:Real-Time Detecto
13、rsTrainmAPFPS100Hz DPM 51200716.010030Hz DPM 200726.130Fast YOLO2007+201252.7155YOLO2007+201263.445Less Than Real-TimeFastest DPM 3S200730.415R-CNN Minus R 200753.56Fast R-CNN 142007+201270.00.5Faster R-CNN VGG-162 2007+201273.27Faster R-CNN ZF 2S2007+201262.118YOLO VGG-162007+201266.421Correct:类别正确
14、,IOU0.5;(准确度) Localization :类别正确,0.1 IOU0.1 ; Other:类别错误JOU 0.1;Background :对任何目标其I0U (x, y, w, h)boxes = tf. reshape (self, predicts 0, idx2: , self. S, self. S, self. B, 4)# convert the x, y to the coordinates relative to the top left point of the image# the predictions of w, h are the square root
15、# multiply the width and height of imageboxes = tf. stack (boxes:, 0 + tf. constant (self. x_offset, dtype=tf.float32) / self. S * self, width,(boxes:, 1 + tf. constant (self. y_offset, dtype=tf. float32) / self. S * self, height,tf. square (boxes2) * self, width,tf. square(boxes: , 3) * self, heigh
16、t, axis=3)# class-specific confidence scores S, S, B, Cscores = tf. expand_dims(confs, -1) * tf. expand dims(class_probs, 2)scores = tf. reshcipe(scores, -1, self. C) # S*S*B, Cboxes = tf. reshape(boxes, -1, 4) # S*S*B, 4# find each box class, only select the max scorebox classes = tf. argmax(scores
17、, axis=l)box_class_scores = tf. reduce_max(scores, axis=l)# filter the boxes by the score threshold filter mask = box class scores = self, threshold scores = tf. boolean mask (box class scores, filter mask) boxes = tf. boolean_mask(boxes, filter_mask)box classes = tf. boolcan mask(box classcs, fiIte
18、r mask)# non max suppression (do not distinguish different classes)# ref: s:/tensorflow. google, cn/api docs/python/1f/image/non max suppre ssion# box (x, y, w, h) - box (xl, yl, x2, y2)boxes = tf. stack(boxes:, 0, - 0. 5 * boxes:, 2., boxes:, 11 - 0. 5 * box es:, 3,boxes:, O + 0. 5 * boxesf:, 2., b
19、oxes1 + 0. 5 * box es:, 3, axis=l)nms indices = tf. image, non max suppression( boxes, scores,self. max_output_size, self. iou_t hreshold)self, scores = tf. gather(scores, nms_indices)self, boxes = tf. gather(boxes, nms_indices)self, box classes = tf. gather(box classes, nms indices)其他的就比拟容易了,详细代码附在
20、Github上了,欢迎给点个赞,权重文件 在这里下载。最后就是愉快地测试你自己的图片了:当然,如果你对训练过程感兴趣,你可以参考这里的实现,如果你看懂了预测 过程的代码,这里也会很容易阅读。小结9这篇长文详细介绍了 Yolo算法的原理及实现,当然Yolo-vl还是有很多问题 的,所以后续可以读读Yolo9000算法,看看其如何改进的。Ng说Yolo的 paper是比拟难读的,其实是很多实现细节,如果不看代码是很难理解的。所 以,文章中如果有错误也可能是难免的,欢迎交流指正。参考文献101. You Only Look Once: Unified, Real-Time Object Detect
21、ion.2. Yolo 官网.3. Yolo的TF实现.4. YOLO: You only look once (How it works).(注:很多实现细 节,需要墙)Ng 的 deeplearning.ai 课程.Fast R-CNNFPS: 0.5 mAP: 70Faster R-CNNFPS: 7mAP: 73.2SSDFPS:58mAP: 72.1YOLO产生了 Yolo9000算法。本文主要讲述Yolo-vl算法的原理,特别是算法的训练与预测中详细细节,最后将给出如何使用TensorFlow实现Yolo算法。mAPBig pictureFPS: 45mAP: 63 4R-CNNF
22、PS:-mAP 58.5DPMFPS: 0.5mAP: 34.3Nov 2013Apr 2015Juno 2015Dec 2015Time图2目标检测算法进展与比照滑动窗口与CNN在介绍Yolo算法之前,首先先介绍一下滑动窗口技术,这对我们理解Yolo算 法是有帮助的。采用滑动窗口的目标检测算法思路非常简单,它将检测问题转 化为了图像分类问题。其基本原理就是采用不同大小和窗口在整张图片上以一 定的步长进行滑动,然后对这些窗口对应的区域做图像分类,这样就可以实现 对整张图片的检测了,如下列图3所示,如DPM就是采用这种思路。但是这个 方法有致命的缺点,就是你并不知道要检测的目标大小是什么规模,所
23、以你要 设置不同大小的窗口去滑动,而且还要选取合适的步长。但是这样会产生很多 的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分 类器不能太复杂,因为要保证速度。解决思路之一就是减少要分类的子区域, 这就是R-CNN的一个改进策略,其采用了 selective search方法来找到最有 可能包含目标的子区域(Region Proposal ),其实可以看成采用启发式方法 过滤掉很多子区域,这会提升效率。图3采用滑动窗口进行目标检测(来源:deeplearning.ai)如果你使用的是CNN分类器,那么滑动窗口是非常耗时的。但是结合卷积运 算的特点,我们可以使用CNN实现更高
24、效的滑动窗口方法。这里要介绍的是 一种全卷积的方法,简单来说就是网络中用卷积层代替了全连接层,如图4所 示。输入图片大小是16x16,经过一系列卷积操作,提取了 2x2的特征图,但 是这个2x2的图上每个元素都是和原图是一对应的,如图上蓝色的格子对应 蓝色的区域,这不就是相当于在原图上做大小为14x14的窗口滑动,且步长为 2 ,共产生4个字区域。最终输出的通道数为4 ,可以看成4个类别的预测概率 值,这样一次CNN计算就可以实现窗口滑动的所有子区域的分类预测。这其 实是overfeat算法的思路。之所可以CNN可以实现这样的效果是因为卷积操 作的特性,就是图片的空间位置信息的不变性,尽管卷积
25、过程中图片大小减 少,但是位置对应关系还是保存的。说点题外话,这个思路也被R-CNN借 鉴,从而诞生了 Fast R-CNN算法。12 x 12 x 166x6x16 fo5 2 x400K2 x 2 x 400 1 12 x 2 x 4 )图4滑动窗口的CNN实现(来源:deeplearning.ai) 上面尽管可以减少滑动窗口的计算量,但是只是针对一个固定大小与步长的窗 口,这是远远不够的。Yolo算法很好的解决了这个问题,它不再是窗口滑动 了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这 样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始 图片的一个
26、小方块,然后用每个元素来可以预测那些中心点在该小方格内的目 标,这就是Yolo算法的朴素思想。下面将详细介绍Yolo算法的设计理念。这就是Yolo算法的朴素思想。下面将详细介绍Yolo算法的设计理念。设计理念3整体来看,Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,整个系统如图5所示:首先将输入图片resize到448x448 ,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的。1. Resize image.2. Run convolutional netwo
27、rk.3. Non-max suppression.图5 Yolo检测系统具体来说,Yolo的CNN网络将输入的图片分割成S*S网格,然后每个单元格 负责去检测那些中心点落在该格子内的目标,如图6所示,可以看到狗这个目 标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元 格会预测B个边界框(bounding box )以及边界框的置信度(confidence score )。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大 小,二是这个边界框的准确度。前者记为Pr(object),当该边界框是背景时 (即不包含目标),此时Pr(object)=0o而当该边界框包含
28、目标时, Pr(object)=lo边界框的准确度可以用预测框与实际框(ground truth )的 IOU (intersection over union ,交并比)来表征,记为I0Uo因此置信度可 以定义为Pr(object)*IOUo很多人可能将丫。1。的置信度看成边界框是否含有 目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。 边界框的大小与位置可以用4个值来表征:(x,y,h,w),其中(x,y)是边界框的中 心坐标,而和是边界框的宽与高。还有一点要注意,中心坐标的预测值(x,y)是 相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的, 单元格
29、的坐标定义如图6所示。而边界框的w和h预测值是相对于整个图片的 宽与高的比例,这样理论上4个元素的大小应该在0口范围。这样,每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小 与位置,而最后一个值是置信度。图6网格划分 还有分类问题,对于每一个单元格其还要给出预测出C个类别概率值,其表征 的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率 值其实是在各个边界框置信度下的条件概率,即Pr(clasSi object)(值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率 值,这是Yolo算法的一个缺点,在后来的改进版本中,Yo
30、lo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置 彳言度(class-specificconfidence scores ):PrclasSiobject) * Pr(object) * IOU黑,=Prclassi) *,边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边 界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测 框。总结一下,每个单元格需要预测(B*5+C )个值。如果将输入图片划分为S*S 网格,那么最终预测值为S*S*(B*5+C)大小的张量。整个模型的预测值结构如 下列图所示。对于PASCALVOC
31、数据,其共有20个类别,如果使用S=7,B=2, 那么最终的预测结果就是7*7*30大小的张量。在下面的网络结构中我们会详 细讲述每个单元格的预测值的分布位置。S x S grid on inputBounding boxes + confidenceFinal detectionsClass probability map图7模型预测值结构网络设计4Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参 考GooLeNet模型,包含24个卷积层和2个全连接层,如图8所示。对于卷 积层,主要使用1x1卷积来做channle reduction ,然后紧跟3x3卷积。对于 卷积层和全连接层,采用Leaky ReLU激活函数:max(x,0)e但是最后一层却 采用线性激活函数。除