目标检测系列:yolov1解析

接触目标检测一段时间,回过头来总结一下看过的论文。


深度学习听起来很高大上,其实就只有两种问题,1. 分类问题, 2.回归问题,目标检测可以说是两种问题的结合。学过深度学习的人上手的第一个代码应该就是手写数字的分类,也就是对图像的分类问题,目标检测第一个任务也就是分类。
看下面这张图,yolov1就是在图像上画大量的默认框,这些框足以圈住所有的物体,如图中,加粗的边框包住了狗,汽车和自行车。我们对所有给出的默认框当成一幅独立的图片,那么这就变成一个和手写数字分类一样的图像分类问题,对所有的默认框进行分类,框中有物体的保留,没有物体的舍去,这样分类任务就结束了。
对上述得到的边框进行回归这样就会使结果框更准确。
yolov1执行过程总结如下:

  1. 给出大量默认框
  2. 对默认框中的物体进行分类,有物体的保留,没有舍去
  3. 对上述得到的边框进行回归,修正结果

所有的目标检测都是这个过程,所以在看论文的时候记住这个主线,就没什么难度了
目标检测系列:yolov1解析

1.生成默认边框

默认框的生成对检测的速度影响很大,r-cnn和fast-rcnn中使用selective serch生成默认框,这个过程很慢,对时效性影响太大,yolo使用了很简单,快速的方法,如上图,将一张图片分成sxs个grid(这里使用的s=7),在每个grid位置产生B(这里是2个)boxes,如下图所示,红圈为该grid的中心,然后为这个grid中心产生两个boxes,黄框所示。这个边框的选择可以根据不同的问题选择不同的尺寸,比如在VOC2007中的物体偏大,所以选择的默认框尺寸偏大。

目标检测系列:yolov1解析

2 物体分类

物体的分类其实分为两个阶段

  • 第一个阶段:判断方框内是否有物体
  • 第二阶段: 确定方框有物体后,判断属于哪个类别

目标检测系列:yolov1解析
先介绍一下IOU的概念,IOU其实很简单就是iou = ABAB\frac{A\bigcap B}{A\bigcup B},这是干什么用的呢?用于第一阶段的分类,判断边框内是否有物体,若默认box和真实box之间的iou大于某阀值的时候,认为有物体,小于该阀值,认为没有物体a,如1中图所示,假设阀值为0.5,显然,box1和ground_truth之间的iou小于阀值,认为没有物体这里记为Pr(object)=0,box2与ground_truth之间的iou大于阀值,所以认为有物体,Pr(object)=1。
接下来,我们要对物体进行分类:
目标检测系列:yolov1解析
上述是输整个网络的结构,输入是224x224的图片,最后的输出是(7x7x30)的向量先分析一下这输出,然后封装训练数据。7x7是上述所说的将图片分为7x7的grid,一个一个grid处理。每个grid有(5x2+20)个输出值,可以看出来,两个boxes分别处理的,每个box预测x,y,w,h,confidence, 注意,这五个值是以box为单位进行预测的,20个类别是按grid进行预测的,confidence是判断boxes内是否有物体,要注意:x,y,w,h并不是直接预测边框的x,y,w,h,是对box的微调值,细节后面再讲

要对图片进行分类,那么必须要有标签,(x,y,w,h,confidence,20个类别),想,在ground_truth所在的grid内,confidence=1,而(x,y)是这个ground_truth所在grid的中心点,(w,h)是ground_truth的长宽,类别很简单,就是单纯的类别,voc2007有20个类别,每个类别之所以用20个数表示,是因为类别用one-hot表示的。

3 对分类后的边框进行回归

上面我们说预测的x,y,w,h并不是直接预测边框的x,y,w,h,x,y是相对该物体中心所在grid的左上角的偏移,w,h是对生成box的w,h的放缩,细节后面再讲我们之前说过,预测的confidence是指某个grid是否有物体,每个grid会有两个默认boxes,x,y,w,h就是在这个默认boxes进行微调,使得预测的box和真实box更加接近。下面分析一下损失函数。
目标检测系列:yolov1解析
λcoord\lambda_{coord},λnoobj\lambda_{noobj}是两个系数,这是作者自己根据经验自己定义的,默认boxes有很多,但是和真实box相交的只占小部分,这是目标检测很严重的一个问题,成为正负样例不均衡,有很多论文就是针对这个问题提出的,这两个系数就是用来平衡误差的惩罚项。SS是指grid的个数,BB是每个grid推荐的boxes的个数。1i,jobj1^{obj}_{i,j}是指有物体的confidence,1i,jnoobj1^{noobj}_{i,j}是指没有物体的confidence。
整个损失函数分为五个部分:

1.计算有物体中心位置的误差,(x,y)是confidence=1,即有物体的grid相对于左上角的偏移。
目标检测系列:yolov1解析
2. 计算confidence=1的grid,w,h的误差
目标检测系列:yolov1解析
3. 这是计算真实box中心所在grid的confidence的误差
目标检测系列:yolov1解析
4. 计算没有物体的grid的confidence误差
目标检测系列:yolov1解析
5. 计算有物体的grid的类别误差
目标检测系列:yolov1解析