只说结论
yolo1 将一张图片分割为S*S个单元格,每个单元格输出(Bx5+C)个值。
解释:
B:每个单元格将会预测B个边框。(就是圈B个框框)
5:每个圈出来的框框有5个参数 ,其中前四个是相对于单元格的比例(就是0到1之间的数)。c代表该单元格的置信度。用该单元格含有目标的概率与准确度的乘积表示。
C: one-hot编码的属于C个类别的预测值。
所有单元格的就是S*S(Bx5+C)个值
非极大值抑制算法(non maximum suppression, NMS)
这个算法不单单是针对Yolo算法的,而是所有的检测算法中都会用到。NMS算法主要解决的是一个目标被多次检测的问题,如图11中人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框。
首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU(个人理解为重合区域比例),如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。Yolo预测过程也需要用到NMS算法。
滑动窗口与CNN
滑动窗口
介绍
采用滑动窗口的目标检测算法思路非常简单,它将检测问题转化为了图像分类问题。其基本原理就是采用不同大小和比例(宽高比)的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类,这样就可以实现对整张图片的检测了
缺点
但是这个方法有致命的缺点,就是你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长。这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。
CNN
可以使用CNN实现更高效的滑动窗口方法
一种全卷积的方法,简单来说就是网络中用卷积层代替了全连接层
输入图片大小是16x16,经过一系列卷积操作,提取了2x2的特征图,但是这个2x2的图上每个元素都是和原图是一一对应的,如图上蓝色的格子对应蓝色的区域,这不就是相当于在原图上做大小为14x14的窗口滑动,且步长为2,共产生4个子区域。
之所CNN可以实现这样的效果是因为卷积操作的特性,就是图片的空间位置信息的不变性,尽管卷积过程中图片大小减少,但是位置对应关系还是保存的。
缺点
尽管可以减少滑动窗口的计算量,但是只是针对一个固定大小与步长的窗口
yolo如何做的
思想
直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图。可以认为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标。
具体点的
具体来说,Yolo的CNN网络将输入的图片分割成S*S个单元格,然后每个单元格负责去检测那些中心点落在该格子内的目标
每个单元格会预测 B个边界框(bounding box)以及边界框的置信度(confidence score)
置信度
所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。
含有目标的可能性大小
记为 ,当该边界框是背景时(即不包含目标),此时 。而当该边界框包含目标时,
边界框的准确度
可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 。
因此置信度可以定义为
输出解释
边界框的大小与位置可以用4个值来表征: ,其中 是边界框的中心坐标,而 和 是边界框的宽与高
还有一点要注意,中心坐标的预测值 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 和 预测值是相对于整个图片的宽与高的比例,这样4个元素的大小应该在 范围。
总输出
一部分
每个边界框的预测值实际上包含5个元素: ,其中前4个表征边界框的大小与位置,而最后一个值是置信度。
另一部分(分类问题)
每一个单元格其还要给出预测出 个类别概率值,但yolo1每个单元格只预测一个类别。后来的版本会有改进,暂时不提。
所以
一个单元格会有个值
总的S*S个会有 个值