论文名称:You only look once unified real-time object detection
1.YOLO v1 算法简介
作者在YOLO算法中把物体检测(object detection)问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。
2.YOLO算法的优缺点
优
1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。
2、YOLO是基于图像的全局信息进行预测的。这一点和基于sliding window以及region proposal等检测算法不一样。与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。
3、YOLO可以学到物体的generalizable representations。可以理解为泛化能力强。
4、准确率高,有实验证明。
缺
1、位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。
2、YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。
3.YOLO v1 算法内容
算法结构图如Fig1:结构上主要的特点就是 统一检测(unified detection),不再是原来许多步骤组成的物体检测,这使得模型的运行速度快,可以直接学习图像的全局信息,且可以end-to-end训练。
a.算法首先把输入图片划分成S*S个格子,实际上这个格子不用我们手动划分,因为可以利用卷积核操作的方法结合卷积神经网络的特性,实际上每个格子的大小就是卷积核的大小。
b.将图片放入卷积神经网络中,进行训练,要求每个格子都有两个预测的bounding boxes,每个box包含5个值(x,y---对象的中心位置,w,h---边界框的大小,c---confidence,置信度),也要求每个格子都预测该格子里面的物体是什么类别的概率,即:预测C个假定类别的概率。
note:
1)这里x,y中心坐标是与格子的相对照的,x,y是说处于某个格子中的某一位置,一般我们设格子均为1的正方形。同时每个格子预测的w,h是相对于总的w,h来说的,也就是占总的比值。因此x,y,w,h都是范围处于0~1
2)置信度confidence:每个bounding box都对应一个confidence score,其计算公式为:
Pr(object)*IOU-----如果没有object,Pr(object)=0,confidence=0;
如果有object,Pr(object)=1,confidence=IOU(交并比);
交并比:预测框与真实框的比值
3)所以如何判断一个grid cell中是否包含object呢?
答案是:如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。
4)每个格子预测类别的概率都是个条件概率,条件为:该格子预测有object
5)类别置信度(class-specific confidence scores):
类别置信度=Pr(Class|object)*Pr(object)*IOU
-----如果没有object,Pr(object)=0,类别置信度=0;
如果有object,Pr(object)=1,类别置信度=Pr(Class)*IOU;
c.假设我们输入的图片是划分成7*7个格子,最终的输出是一个7*7*30的张量:
30包括20个类别概率,2个bounding boxes(分别有5个预测值xywhc)
如上图:
两个框分别对应红色格子预测的两个bounding boxes,这两个bounding boxes怎么来的?
我们先求出每一个bounding boxes对应的类别置信度
然后对每个格子重复以上操作
d.接下来,我们开始对上面所有类别置信度进行逐类分析:
---为什么要逐类分析--因为我们最后希望能用框把每个类别都框出来,逐类分析帮助我们更精确的确定框的位置
先设置阈值,小于阈值的进行置零,然后对该类的置信度进行降序排列,最后再用非极大值限制法对剩下的bboxes进行置零
f.非极大值限制法(Non-Maximum Suppression)
根据之前的降序,我们第一次先选出最大的类别置信度,然后根据降序,将其他的类别置信度的框逐个和最大的类别置信度所对应的框进行计算IOU,如果IOU>0.5,那么就该类别置信度置零,保留最大的。第一趟轮完后,再进行第二趟,之前保留下来的最大置信度,不再参与其中,重复此操作。最终我们会发现,只有两个框留下来
g.画框
最终根据保留下来的类别置信度,在每一个boundingboxes中选择最大的置信度,如果score大于0,取最大的score,则表示该框的对象为最大score所对应的对象,如果小于0,说明这个bounding box里面没有物体,跳过即可。
4.YOLO损失函数
损失函数方面,作者采用sum-squared error的方式把localization error(bounding box的坐标误差)和classificaton error整合在一起。但是如果二者的权值一致,容易导致模型不稳定,训练发散。因为很多grid cell是不包含物体的,这样的话很多grid cell的confidence score为0。所以采用设置不同权重方式来解决,一方面提高localization error的权重,另一方面降低没有object的box的confidence loss权值,loss权重分别是5和0.5。而对于包含object的box的confidence loss权值还是原来的1。详见下面的原文解释和loos function函数。
这里详细讲一下loss function。在loss function中,前面两行表示localization error(即坐标误差),第一行是box中心坐标(x,y)的预测,第二行为宽和高的预测。这里注意用宽和高的开根号代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w=1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。
第三、四行表示bounding box的confidence损失,就像前面所说的,分成grid cell包含与不包含object两种情况。这里注意下因为每个grid cell包含两个bounding box,所以只有当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项。
第五行表示预测类别的误差,注意前面的系数只有在grid cell包含object的时候才为1。
所以具体实现的时候是什么样的过程呢?
训练的时候:输入N个图像,每个图像包含M个objec,每个object包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7*7*30大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数的第一、二 、五行。至于第二三行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了。
测试的时候:输入一张图像,跑到网络的末端得到7*7*30的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。