在网络最后的输出中,对于每个grid cell(网格单元)产生3个bounding box,每个bounding box的输出有三类参数:一个是对象的box参数,一共是四个值,即box的中心点坐标(x,y)和box的宽和高(w,h);一个是置信度,这是个区间在[0,1]之间的值;最后一个是一组条件类别概率,都是区间在[0,1]之间的值,代表概率。
假如一个图片被分割成S?S个grid cell,我们有B个anchor box,也就是说每个grid cell有B个bounding box, 每个bounding box内有4个位置参数,1个置信度,classes个类别概率,那么最终的输出维数是:S?S?[B?(4+1+classes)]。
下面分别具体介绍这三个参数的意义。
YOLO3中grid cell理解。
yolo3中的grid cell 的数量根据三种预测尺度分别为13x13,26x26,52x52(输入图像为416x416),每个grid cell根据3个anchor预测三个bbox, 每个bbox可以是不同的类。
随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO2已经开始采用 K-means聚类 得到先验框的尺寸,YOLO3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。
在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的13x13特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。
中等的26x26特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。
较大的52x52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格:
anchor的本质是什么,本质是SPP(spatial pyramid pooling)思想的逆向。而SPP本身是做什么的呢,就是将不同尺寸的输入resize成为相同尺寸的输出。所以SPP的逆向就是,将相同尺寸的输出,倒推得到不同尺寸的输入。
接下来是anchor的窗口尺寸,这个不难理解,三个面积尺寸(128×128,256×256,512×512),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1)(1:1,1:2,2:1).这样一来,我们得到了一共9种面积尺寸各异的anchor。示意图如下:
1. anchor box
1.1 对anchor box的理解
anchor box其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而实现多尺度学习的目的。
量化anchor box
要在模型中使用这些形状,总不能告诉模型有个形状是瘦高的,还有一个是矮胖的,我们需要量化这些形状。YOLO的做法是想办法找出分别代表这些形状的宽和高,有了宽和高,尺寸比例即形状不就有了。YOLO作者的办法是使用k-means算法在训练集中所有样本的ground truth box中聚类出具有代表性形状的宽和高,作者将这种方法称作维度聚类(dimension cluster)。细心的读者可能会提出这个问题:到底找出几个anchor box算是最佳的具有代表性的形状。YOLO作者方法是做实验,聚类出多个数量不同anchor box组,分别应用到模型中,最终找出最优的在模型的复杂度和高召回率(high recall)之间折中的那组anchor box。作者在COCO数据集中使用了9个anchor box.
怎么在实际的模型中加入anchor box的先验经验呢?
最终负责预测grid cell中对象的box的最小单元是bounding box,那我们可以让一个grid cell输出(预测)多个bounding box,然后每个bounding box负责预测不同的形状不就行了?比如前面例子中的3个不同形状的anchor box,我们的一个grid cell会输出3个参数相同的bounding box,第一个bounding box负责预测的形状与anchor box 1类似的box,其他两个bounding box依次类推。**作者在YOLOv3中取消了v2之前每个grid cell只负责预测一个对象的限制,也就是说grid cell中的三个bounding box都可以预测对象,当然他们应该对应不同的ground truth。**那么如何在训练中确定哪个bounding box负责某个ground truth呢?方法是求出每个grid cell中每个anchor box与ground truth box的IOU(交并比),IOU最大的anchor box对应的bounding box就负责预测该ground truth,也就是对应的对象,后面还会提到负责预测的问题。
怎么告诉模型第一个bounding box负责预测的形状与anchor box 1类似,第二个bounding box负责预测的形状与anchor box 2类似?
YOLO的做法是不让bounding box直接预测实际box的宽和高(w,h),而是将预测的宽和高分别与anchor box的宽和高绑定,这样不管一开始bounding box输出的(w,h)是怎样的,经过转化后都是与anchor box的宽和高相关,这样经过很多次惩罚训练后,每个bounding box就知道自己该负责怎样形状的box预测了。这个绑定的关系是什么?就涉及到了anchor box的计算。
1.2 anchor box的计算
前提需要知道,
cx?和cy?的坐标是(0,0) (0,1),(0,2),(0,3)…(0,13)
(1,0),(1,1),(1,2),(1,3)…(1,13)等等
bouding box的输出应当为:txt和ty以及tw?和th?
而真实的预测box应当是:bxbx?和byby?(中心坐标)以及bwbw?和bhbh?(宽高)
还有就是cx?和cy的每一个都是1,也就是说,每个格子grid cell是以1为一个范围,每个grid cell的大小实际是1?1
刚才说的绑定的关系是什么?就是下面这个公式:
其中,aw?和ah?为anchor box的宽和高,
tw?和th?为bounding box直接预测出的宽和高,
bw?和bh?为转换后预测的实际宽和高,
这也就是最终预测中输出的宽和高。你可能会想,这个公式这么麻烦,为什么不能用bw=aw?tw?, bh=ah?th?这样的公式,我的理解是上面的公式虽然计算起来比较麻烦,但是在误差函数求导后还带有tw?和th参数,而且也好求导(此观点只是个人推测,需要进一步查证)。
既然提到了最终预测的宽和高公式,那我们也就直接带出最终预测输出的box中心坐标(bx,by)的计算公式:
前面提到过box中心坐标总是落在相应的grid cell中的,所以bounding box直接预测出的txt和ty?也是相对grid cell来说的,要想转换成最终输出的绝对坐标,需要下面的转换公式:
bx=σ(tx)+cx by?=σ(ty?)+cy
其中,σ(tx)为sigmoid函数,
cx?和cy?分别为grid cell方格左上角点相对整张图片的坐标。
这个公式tx,ty为何要sigmoid一下啊?
作者使用这样的转换公式主要是因为在训练时如果没有将tx?和ty?压缩到(0,1)区间内的话,模型在训练前期很难收敛。
另外:用sigmoid将tx?和ty?压缩到[0,1]区间內,可以有效的确保目标中心处于执行预测的网格单元中,防止偏移过多。
举个例子,我们刚刚都知道了网络不会预测边界框中心的确切坐标而是预测与预测目标的grid cell左上角相关的偏移tx和ty?。如13?13的feature map中,某个目标的中心点预测为(0.4,0.7)【都小于1】,它的cx?和cy?即中心落入的grid cell坐标是(6,6),则该物体的在feature map中的中心实际坐标显然是(6.4,6.7).这种情况没毛病,但若tx?和ty?大于1,比如(1.2,0.7)则该物体在feature map的的中心实际坐标是(7.2,6.7),注意这时候该物体中心在这个物体所属grid cell外面了,但(6,6)这个grid cell却检测出我们这个单元格内含有目标的中心(yolo是采取物体中心归哪个grid cell整个物体就归哪个grid celll了),这样就矛盾了,因为左上角为(6,6)的grid cell负责预测这个物体,这个物体中心必须出现在这个grid cell中而不能出现在它旁边网格中,一旦tx?和 ty?算出来大于1就会引起矛盾,因而必须归一化。
最终可以得出实际输出的box参数公式如下,这个也是在推理时将输出转换为最终推理结果的公式:
其中,
cx和cy?是网格grid cell的左上角坐标是:(0,0) (0,1),(0,2),(0,3)…(0,13)
(1,0),(1,1),(1,2),(1,3)…(1,13)等等
bouding box的输出应当为:tx?和ty?以及tw?和th?
而真实的预测box应当是:bx?和by?以及bw和bh?
bx?和by以及bw?和bh?:预测出来的box的中心坐标和宽高
下图中的pw?实际上就是上面的aw?,ph?实际上就是上面的ah
训练
关于box参数的转换还有一点值得一提,作者在训练中并不是将tx、ty、tw和th转换为bx、by、bw?和bh后与ground truth box的对应参数求误差,而是使用上述公式的逆运算将ground truth box的参数转换为与tx、ty、tw?和th对应的gx、gy、gw和gh?,然后再计算误差。
2. 置信度(confidence)
还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。
置信度是每个bounding box输出的其中一个重要参数,作者对他的作用定义有两重:
**一重是:**代表当前box是否有对象的概率Pr(Object),注意,是对象,不是某个类别的对象,也就是说它用来说明当前box内只是个背景(backgroud)还是有某个物体(对象);
**另一重:**表示当前的box有对象时,它自己预测的box与物体真实的box可能的IOU的值,注意,这里所说的物体真实的box实际是不存在的,这只是模型表达自己框出了物体的自信程度。
以上所述,也就不难理解作者为什么将其称之为置信度了,因为不管哪重含义,都表示一种自信程度:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了:
参考:
https://blog.csdn.net/qq_38784454/article/details/103063876
https://blog.csdn.net/weixin_43384257/article/details/100974776