必威体育Betway必威体育官网
当前位置:首页 > IT技术

YOLO文章详细解读

时间:2019-08-20 03:44:35来源:IT技术作者:seo实验室小编阅读:62次「手机版」
 

yolo

文章《You Only Look Once: Unified, Real-Time Object Detection》提出方法下面简称YOLO。

目前,基于深度学习算法的一系列目标检测算法大致可以分为两大流派:

1.两步走(two-stage)算法:先产生候选区域然后再进行CNN分类(RCNN系列),

2.一步走(one-stage)算法:直接对输入图像应用算法并输出类别和相应的定位(YOLO系列)

之前的R-CNN系列虽然准确率比较高,但是即使是发展到faster R-CNN,检测一张图片如下图所示也要7fps(原文为5fps),为了使得检测的工作能够用到实时的场景中,提出了YOLO。

这里写图片描述

YOLO的检测思想不同于R-CNN系列的思想,它将目标检测作为回归任务来解决。

下面来看看YOLO的整体结构:

这里写图片描述

这里写图片描述

由上两图所示,网络是根据GoogleNet改进的,输入图片为448*448大小,输出为7×7×(2×5+20)" role="presentation" style="position: relative;">7×7×(2×5+20),现在看来这样写输出维度很奇怪,下面来看一下输出是怎么定义的。

将图片分为S×S" role="presentation" style="position: relative;">S×S个单元格(原文中S=7),之后的输出是以单元格为单位进行的:

1.如果一个object的中心落在某个单元格上,那么这个单元格负责预测这个物体。

2.每个单元格需要预测B个bbox值(bbox值包括坐标和宽高,原文中B=2),同时为每个bbox值预测一个置信度(confidence scores)。也就是每个单元格需要预测B×(4+1)个值。

3.每个单元格需要预测C(物体种类个数,原文C=20,这个与使用的数据库有关)个条件概率值.

所以,最后网络的输出维度为S×S×(B×5+C)" role="presentation" style="position: relative;">S×S×(B×5+C),这里虽然每个单元格负责预测一种物体(这也是这篇文章的问题,当有小物体时可能会有问题),但是每个单元格可以预测多个bbox值(这里可以认为有多个不同形状的bbox,为了更准确的定位出物体,如下图所示)。

这里写图片描述

因为这里是当作回归问题来解决的,所以所有的输出包括坐标和宽高最好都定义在0到1之间。网上看见一张比较详细的图如下。

来看一下每个单元格预测的B个(x,y,w,h,confidence)的向量和C的条件概率中,每个参数的含义(假设图片宽为{w_i}高为{hi},将图片分为S×S" role="presentation" style="position: relative;">S×S):

1.(x,y)是bbox的中心相对于单元格的offset

对于下图中蓝色框的那个单元格(坐标为(xcol=1,yrow=4)" role="presentation" style="position: relative;">(xcol=1,yrow=4)),假设它预测的输出是红色框的bbox,设bbox的中心坐标为(xc,yc)" role="presentation" style="position: relative;">(xc,yc),那么最终预测出来的(x,y)是经过归一化处理的,表示的是中心相对于单元格的offset,计算公式如下:

x=xcwiS−xcol,y=ychiS−yrow" role="presentation" style="position: relative;">x=xcwiSxcol,y=ychiSyrow

2.(w,h)是bbox相对于整个图片的比例

预测的bbox的宽高为wb,hb" role="presentation" style="position: relative;">wb,hb,(w,h)表示的是bbox的是相对于整张图片的占比,计算公式如下:

w=wbwi,h=hbhi" role="presentation" style="position: relative;">w=wbwi,h=hbhi

3.confidence

这个置信度是由两部分组成,一是格子内是否有目标,二是bbox的准确度。定义置信度为Pr(Object)∗IOUpredtruth" role="presentation" style="position: relative;">Pr(Object)IOUpredtruth

这里,如果格子内有物体,则Pr(Object)=1" role="presentation" style="position: relative;">Pr(Object)=1,此时置信度等于IoU。如果格子内没有物体,则Pr(Object)=0" role="presentation" style="position: relative;">Pr(Object)=0,此时置信度为0

4.C类的条件概率

条件概率定义为Pr(Classi|Object)" role="presentation" style="position: relative;">Pr(Classi|Object),表示该单元格存在物体且属于第i类的概率。

在测试的时候每个单元格预测最终输出的概率定义为,如下两图所示(两幅图不一样,代表一个框会输出B列概率值)

Pr(Classi|Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth" role="presentation" style="position: relative;">Pr(Classi|Object)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth

最后将(S×S)×B×20" role="presentation" style="position: relative;">(S×S)×B×20 列的结果送入NMS,最后即可得到最终的输出框结果

最后来看一下训练YOLO使用的损失函数定义(本想自己用latex打的,后来有个符号一直打不出来,使用网友的图如下)

这里强调两点:

1.每个图片的每个单元格不一定都包含object,如果没有object,那么confidence就会变成0,这样在优化模型的时候可能会让梯度跨越太大,模型不稳定跑飞了。为了平衡这一点,在损失函数中,设置两个参数λcorrd" role="presentation" style="position: relative;">λcorrdλnoobj" role="presentation" style="position: relative;">λnoobj,其中λcorrd" role="presentation" style="position: relative;">λcorrd控制bbox预测位置的损失,λnoobj" role="presentation" style="position: relative;">λnoobj控制单个格内没有目标的损失。

2.对于大的物体,小的偏差对于小的物体影响较大,为了减少这个影响,所以对bbox的宽高都开根号

参考

1.https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_1822

2.https://blog.csdn.net/u011974639/article/details/78208773

相关阅读

yoloV3的惊艳结果--比较yoloV2

转自:https://zhuanlan.zhihu.com/p/35394369【目标检测简史】进击的YOLOv3,目标检测网络的巅峰之作浩克匠心计算视觉与深度学习老

YOLOv3 论文翻译及解读

yolo系列介绍好文章:https://www.cnblogs.com/makefile/p/YOLOv3.html YOLOv3: An Incremental Improvement(一项渐进式的更新)

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

本文来自 CSDN 网站,作

初学JetsonTX2之部署YOLO

本人准备使用YOLO进行人脸检测,硬件设备为Jetson TX2。查阅YOLO官网,要部署YOLO,首先要安装CUDA、CUDNN、OPENCV,然后部署Darknet,最后

分享到:

栏目导航

推荐阅读

热门阅读