yolov1目标检测原理探究
本篇主要记录一下学习目标检测的原理到yolov1的原理,是理解之后版本的基础。参考:同济子豪兄
一、目标检测
如图,目标检测包括了分类以及各类别目标的定位
分割(segmentation)包括了语义分割和实例分割,前者对像素进行按类别分割,后者是把同一类别的不同实例作分割。
1. one-stage / two-stage detector
两阶段检测模型就是先从图像提取若干候选框,再逐一地对这些候选框进行分类、甄别等任务,最后得出结果;与此相对,单阶段检测模型直接把全图喂给算法,然后出结果,是一个统一的端到端(end to end)的过程。yolo是典型的单阶段模型。一般而言,前者比较准确而速度相对慢,后者可能效果差一些,但是速度快,yolo尤以快速闻名(yolov1时对小目标,密集目标的检测效果相对差一些,经过发展,目前的效果已经非常不错)。
两阶段检测模型的典型RCNN,发展到Fast-RCNN最主要的改变是首先不作候选框的提取,先把整张图喂给卷积层,提取出一个共同的特征,然后在重复之前RCNN的操作。这能够一定程度上提高速度。
然而两阶段检测模型不仅有耗时的问题,另一方面,由于网络的操作对象是单个的候选框而不是整张图,那对整体性的把握就会存在一定问题。会丢失一些重要信息。而yolo则在这一方面由于单阶段会表现得更好。
二、yolo-v1
1. 预测阶段
预测阶段不用对参数进行反馈,只有前向推断。
图片最后标注部分和原论文上的是等价的,可以先对原来7x7x1024的向量作一个打平操作,然后经过全连接层降维,最后再reshape成7x7x30的向量。
在预测阶段yolo是一个“黑箱子”,输入是一个448x448x3(RGB三维彩色图片),输出是一个7x7x30的张量。只需要解析这个张量就能获得目标检测的结果。
如图,yolo把图像划分成SxS的网格(yolov1中s是7),每个小网格会给出2个预测框(bounding box中心点在这个grid cell【网格】里就行),这个预测框就包括了x,y,w,h的信息,x,y是中心点坐标,w,h是预测框宽高。以及一个包含了它是不是一个物体的置信度。然后每一个网格会给出一个它是某个类别的概率(生成下面的彩色图),把两者相乘就可以得到最后的预测结果。
然后回到之前最后输出是一个7x7x30的张量,这个张量的意义就是下图,一共7x7的网格,每个网格2个预测框,然后每个预测框都有(x, y, w, h, con)五个参数,每个网格有它 20 类目标的概率
需要注意的是,每一个网格只能有一个有效的目标概率(选取最高的),因此每一个小网格都只能预测一个类别,这也是yolov1为什么对小物体或者密集物体的检测效果不好的原因。
在把预测框的置信度和每个网格对于物体的概率结合起来就会得到第二张图,颜色以及粗细代表了置信度以及类别。然后再结果一些列操作得到最终的预测结果(图三)
2. 预测阶段-后处理
对于yolo来说,后处理就是把前面生成的98(49x2)个预测框所得到的20维的全概率,作处理,删去重复的,无用的,置信度低的。最终得到预测结果。
2.1 置信度过滤
首先给一个置信度阈值,小于这个阈值的认为不是该类别,并且将概率置零,然后按照概率大小重新排序,然后再对排序后的进行NMS(非极大值抑制)
2.2 非极大值抑制
拿最大值和后面比他小的挨个比较,如果IOU(交并比)大于某个值,则认为这两个预测框所框住的是同一物体,则把低概率的过滤掉。如果IOU比较小,则认为是不同的物体,仍然保留。这样一遍过后,再对概率第二高,第三高的以此类推,作同样操作。
需要注意的是,NMS只在预测阶段,在训练阶段是不需要这一步的。在训练阶段需要考虑每一个预测框,不能随便置零。
3. 训练阶段-反向传播
目标检测问题是典型的监督学习,训练阶段会给出label,以便网络的权重进行微调,而下图中的绿框被称为ground truth,即标准答案。
应该由每一个grid cell的两个bounding box(预测框)中的一个去拟合这个事先给的绿框。并且这个grid cell输出的类别也应该是ground truth的类别。两个预测框哪个应该去拟合ground truth呢?应该让那个和ground truthIOU更大的去拟合ground truth。而如果某个grid cell的两个预测框与目标ground truth都没有重合,那这两个框都会被舍弃,置信度也会被降低。
下图是yolo的损失函数:
在提到yolo的时候,我们经常说,物体的中心点在哪,就应该由哪个grid cell的预测框给框出来,这里指的是训练阶段。在已知ground truth时,应该由位于ground truth中心点的那个grid cell的两个预测框之一去作拟合。