You Only Look Once: Unified, Real-Time Object Detection

来源:互联网 发布:淘宝店铺被关闭 编辑:程序博客网 时间:2024/06/05 05:07

    首先谈谈为什么这个算法叫做yolo吧。在R-CNN出现之前目标检测算法多是采取滑窗法(sliding windows),在图像上进行滑窗操作,然后对每一个滑窗结果进行分类。后来在R-CNN中采用的提取窗口的方法改为了selective search等利用图像过分割和聚类的方法来提取这些窗口(proposals)了,SPP-net将proposals映射到feature maps,对提取proposals在速度上进行了提高,但本质上还是selective search算法提取的proposals,到了Faster R-CNN,作者直接加入了一个RPN(region proposal network),通过训练这个网络来提取proposals。可以直观的看到,这些方法都不是像人眼一样看一眼图片就知道物体在哪儿的,也就是说这些方法都是需要先提取proposals,然后再对proposals进行分类的。而对于一个人,你只要看一眼图片(you only look once,yolo),就知道哪个地方有什么东西了。这就是这篇论文想要达到的目的,也是为什么叫做yolo的原因。
    下面开始正式介绍yolo算法了。
    将图像分割为S*S个网格,如果一个物体所在ground truth矩形的的中心坐标落在了这个网格里面的话,那么这个网格就负责检测那个物体。效果如下图所示。
这里写图片描述
    每一个网格预测B个bounding boxes的每一个bounding box的坐标(x,y,w,h),同时还要为这B个bounding boxes的每一个bounding box预测一个confidence,这个confidence描述的是yolo人为其对应的bounding box包含物体的概率有多大。在训练阶段定义这个confidence为:
confidence=这里写图片描述
    因为训练阶段是否有物体落在某一个网格是已知的,也就是Pr(object)是0还是1是知道的,IOU部分就表示训练阶段预测的bounding boxes和真值bounding boxes的交并比。也就是说,对于每一个bounding box,都包含了5个预测,分别是坐标信息(x,y,w,h)以及该bounding box包含物体的概率confidence,在损失函数中,confidence记为C。当有物体落在了一个bounding box所在的网格,则confidence就是该bounding box和物体真值box的交并比,若没有物体落在这个bounding box所在的网格,则confidence为0。这5个预测是对于一个bounding box的预测,而B个bounding boxes才对应于一个网格,这个关系要理清楚的。
    除了要为每一个网格的B个bounding boxes分别预测一个(x,y,w,h,confidence)以外,yolo还对每一个网格预测C个条件概率Pr(Classi|Object),C是要检测的物体的类别总数。这些概率是建立在一个网格包含了一个物体的基础之上的,并且对于一个网格,只预测C个条件概率,而不是对网格的每一个bounding box都预测C个,总共预测CB个条件概率。在测试阶段,将这C个条件概率和之前的表示包含了物体的confidence相乘,即可得到每个bounding box分别属于C类的每个类别的概率了。
    最后计算一下网络的输出维数,一个图片被分为S*S个网格,每个网格要预测B个bounding boxes,每个boxes包括5个预测值(x,y,w,h,confidence),同时对每一个网格还要预测C个条件概率,所以网络总共输出(S*S*(5*B + C))。作者在PASCAL VOC上测试的时候,S=7,B=2,C=20,所以对于这种数据集下的输出维度是7*7*30。
    yolo的网络结构如下图所示,总共24个卷积层和2个全连接层。
这里写图片描述
    在训练阶段,先用yolo的前20个卷积层加上一个平均池化和一个全连接层构成一个临时的网络,用这个网络在ImageNet上预训练,达到了top5分类准确率为88%。然后再提取出那20层的卷积网络结构以及预训练的参数,在后面加上4个卷积层以及2个全连接层。同时把输入图像的分辨率由224*224改为448*448。在最后一层使用线性激活函数,其它层使用leaky rectified linear activation,和relu不太一样。如下图:
这里写图片描述
    在训练阶段,对于图片中一个存在的物体,我们只希望一个网格的预测的一个bounding box对这个物体的预测负责。而事实上一个网格会预测B个bounding boxes,那么怎么选择呢?由于训练阶段物体的ground truth box是知道的,所以在预测的B个bounding boxes中选取和这个ground truth box的IoU最大的一个bounding box对该物体的预测负责。
    损失函数定义如下图:这里写图片描述
    剩下的就是在训练的时候对于学习率、以及batchsize和epoch等参数的选择了,这里就不再继续介绍。
附yolo的两张检测效果图:
这里写图片描述这里写图片描述
    最后谈一下yolo的优缺点
    优点:
    [1]快、耗时间少,fps高。像之前几乎是最快且效果还好的算法应该算是Faster R-CNN的ZF网络版本了,可以达到17fps,而如果是VGG网络版本的话就只有5fps了。而要达到实时检测的效果需要多少fps呢?答案是30fps,也就是说Faster R-CNN的ZF网络版本放在摄像头上进行实时检测也会有明显的卡顿现象。那么yolo是多少呢?45fps和150fps(分别对应于yolo和fast yolo),也就是它可以实时检测。
    [2]预测检测结果的时候合理的考虑了全局信息。因为yolo是直接以整个图像作为输入,然后直接预测出物体所在的矩形框以及其类别,这和滑窗法等基于图像局部范围的操作比较而言,yolo更能够看到全局的图像信息,这样的好处是能产生更少的虚警,也就是把背景当作目标的情况的出现。
    [3]具有更强的泛化能力,比如在自然场景图片上训练的检测人,也可以用来检测绘画作品中的人物。
    缺点:
    [1]在准确率上,yolo比顶尖的检测器还差一些,比如Faster R-CNN。
    [2]对小物体的检测效果不是很好。
    [3]对于一些不常见的尺度和宽高比的物体检测效果不是很好。
    另外发现一篇还不错的对yolo论文核心部分的翻译,地址http://blog.csdn.net/u014696921/article/details/53141804

阅读全文
0 0
原创粉丝点击