YOLO v1测试阶段iou的理解
YOLO
YOLO(You Only Look Once)
文章开始请大家思考个问题,也是我读完yolo的相关资料心中怀有的两个问题
yolo训练阶段的iou也就是交并比是可以计算出来的,因为有具体的标记框。但是预测阶段的iou如何计算呢?很多文章只是简单的提到这个时候完全依赖模型的输出,或者一笔带过。如果没法计算iou,那30维向量(因为举例都是20分类,所以是30维,可以不是30维)就不对账了!在文章最后,我会写出我的理解,如果不对,也请指正。
1)结构
去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示。
图4 输入 -> 神经网络变换 -> 输出
因为只是一些常规的神经网络结构,所以,理解YOLO的设计的时候,重要的是理解输入和输出的映射关系.
2)输入和输出的映射关系
3)输入
参考图5,输入就是原始图像,唯一的要求是缩放到448448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。那么YOLO设计的尺寸就是448448。
4)输出
输出是一个 7730 的张量(tensor)。
4.1)7*7网格
根据YOLO的设计,输入图像被划分为 77 (**这里应该不只是77的其他大小的也可以**)的网格(grid),输出张量中的 77 就对应着输入图像的 77 网格。或者我们把 7730 的张量看作 7*7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。参考上面图5,比如输入图像左上角的网格对应到输出张量中左上角的向量。
要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理(我想这是因为在卷积的过程中局部感受野不只是针对grid里的像素做了卷积,对周边的像素同样做了卷积,最后生成的7730维向量应该与原本的7*7grid是相对位置的概念),最后编码到那个30维向量中。
4.2)30维向量
具体来看每个网格对应的30维向量中包含了哪些信息。
① 20个对象分类的概率
因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。可以记为 ,之所以写成条件概率,意思是如果该网格存在一个对象Object,那么它是的概率是。(记不清条件概率的同学可以参考一下 理解贝叶斯定理)
② 2个bounding box的位置
每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要8个数值来表示其位置。
③ 2个bounding box的置信度
bounding box的置信度 = 该bounding box内存在对象的概率 * 该bounding box与该对象实际bounding box的IOU
用公式来表示就是
是bounding box内存在对象的概率,区别于上面第①点的 。Pr(Object)并不管是哪个对象,它体现的是 有或没有 对象的概率。第①点中的意思是假设已经有一个对象在网格中了,这个对象具体是哪一个。
是 bounding box 与 对象真实bounding box 的IOU(Intersection over Union,交并比)。要注意的是,现在讨论的30维向量中的bounding box是YOLO网络的输出,也就是预测的bounding box。所以体现了预测的bounding box与真实bounding box的接近程度。
还要说明的是,虽然有时说"预测"的bounding box,但这个IOU是在训练阶段计算的。等到了测试阶段(Inference),这时并不知道真实对象在哪里,只能完全依赖于网络的输出,这时已经不需要(也无法)计算IOU了。(但是仔细一想,如果没法计算iou,那置信度怎么算出来呢,那去哪个框呢,nms去掉没用的框呢?经提问某位大神,给出的解答是预测阶段的iou就不是计算bounding box与实际box的iou了,应该是计算这个bounding box 与其他所有的box的iou)
这里推荐阅读一下yolo的代码,文章末尾我会贴上。
综合来说,一个bounding box的置信度Confidence意味着它 是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象 或者 即便有对象也存在较大的位置偏差。
简单解释一下IOU。下图来自Andrew Ng的深度学习课程,IOU=交集部分面积/并集部分面积,2个box完全重合时IOU=1,不相交时IOU=0。
总的来说,30维向量 = 20个对象的概率 + 2个bounding box * 4个坐标 + 2个bounding box的置信度。
主要是为了记录一下上边的那个预测阶段的iou是如何计算的。
其他的关于
1、什么叫做中心点所在的网格对预测该对象负责。
2、nms是什么
3、其他问题等等
推荐阅读另外一个大神的博客,写的非常好,我也基本是摘抄他的。
yolo v1深入理解https://www.jianshu.com/p/cad68ca85e27
yolo v1 TensorFlow2.0代码
https://github.com/hizhangp/yolo_tensorflow
以上如有侵权,请联系本人。