目标检测之YOLO原理与实现

守給你的承諾、 提交于 2019-12-02 09:12:39

YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时目标检测系统。

现在YOLO已经发展到v3版本,不过新版本也是在原有版本基础上不断改进演化的,所以本文先详细分析YOLO v1版本。

YOLO提供了另一种更为直接的思路: 直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。

YOLOv1网络结构设计:在这里插入图片描述
在这里插入图片描述

训练:

预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是上图中的前20个卷机网络+average-pooling layer+ fully connected layer 作为Pretrain的网络(此时网络输入是224*224)。

训练检测网络:转换模型去执行检测任务,将Pretrain的结果的前20层卷积层应用到Detection中,并添加4个卷积层和2个全连接层,随机初始化权重。检测要求细粒度的视觉信息,获取更加精细化的结果,所以把网络输入由224×224提升到448×448。

最后一层输出为 (7×7)×30的维度。每个 1×1×30的维度对应原图7×7个cell中的一个,1×1×30中含有类别预测和bounding box坐标预测。
在这里插入图片描述
①每个网格(1×1×30维度对应原图中的cell)要预测2个bounding box 的坐标(中心点的坐标以及宽度、高度),其中:四个坐标均需要进行归一化。
②每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息(是否包含对象且位置准确的程度):confidence = Pr(Object)×IOU(预测的bounding box与真实的bounding box的接近程度)。
(IOU:交集部分/并集部分,哪个比较大(更接近对象实际的bounding box),就由哪个bounding box来负责预测该对象是否存在,即该bounding box的 Pr(Object)=1,confidence=IOU;另一个bounding box的置信度为零)
每个bounding box要预测想x,y,w,h,confidence,共5个值 ,2个bounding box共10个值,对应 1×1×30维度特征中的10个。
③对于输入图像中的每个对象,先找到其中心点。例如上图中自行车,其中心点在黄色圆点位置,中心点落在黄色网格内,所以这个黄色网格对应的30维向量中,自行车的概率是1,其它对象的概率是0。所有其它48个网格的30维向量中,该自行车的概率都是0。这就是所谓的"中心点所在的网格对预测该对象负责"。(这种做法称作bounding box predictor的specialization(专职化)。)
(通用公式: SxS个网格,每个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5*B+C)的一个tensor。 注意:class信息是针对每个网格的,而confidence信息是针对每个bounding box的)
在这里插入图片描述

损失函数

在这里插入图片描述
损失函数的设计目标是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
简单的全部采用了sum-squared error loss来做这件事会有以下不足: a) 8维的localization error和20维的classification error同等重要显然是不合理的; b) 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

解决方案如下:

更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,(在前面添加一个系数)在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weigh,(在前面添加一个系数)在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。

对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。

测试

测试的时候,每个网格预测的class信息(Pr(Class(i)|Object)和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score。
等式前面第一项为每个网格的条件类别概率,后两项为每个bounding box预测的confidence信息,两者相乘
NMS(非极大值抑制)
在这里插入图片描述
每个网格有:20个对象的概率*2个bounding box的置信度,共40个得分(候选对象)。一共有49个网格
设置一个score的阈值,低于该阈值的候选对象排除掉(将该score设为0),然后找到score最大的那个对象及其bounding box,添加到输出列表,对每个score不为0的候选对象,计算其与输出对象的bounding box的IOU,根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)。如果所有bounding box要么在输出列表中,要么Score=0,则NMS完成

总结

yolov1优点:
①检测物体的速度很快
②假阳性率低
③能够学到更加抽象的物体的特征
缺点:
①精度低
②容易产生物体的定位错误
③对小物体的检测效果不好(可能是因为一个网格只能预测两个bounding box,而且可能在NMS的时候被去除掉)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!