1.YOLO v2/v3中anchor大小的确定(聚类方法)
1.按照欧氏距离,大盒子会比小盒子更容易产生大误差,所以采用自定义的距离公式来定义聚类中心(anchor)与标注框的距离:
到聚类中心的距离越小越好,但IOU值是越大越好,所以使用 1 - IOU,这样就保证距离越小,IOU值越大。
具体步骤:
1.使用的聚类原始数据是只有标注框的检测数据集,YOLOv2、v3都会生成一个包含标注框位置和类别的TXT文件,其中每行都 包含,即ground truth boxes相对于原图的坐标,是框的中心点,是框的宽和高,N是所有标注框的个数;
2.首先给定k个聚类中心点,这里的是anchor boxes的宽和高尺寸,由于anchor boxes位置不固定,所以没有(x,y)的坐标,只有宽和高;
3.计算每个标注框和每个聚类中心点的距离 d=1-IOU(标注框,聚类中心),计算时每个标注框的中心点都默认与聚类中心重合,这样才能计算IOU值,即。将标注框分配给“距离”最近的聚类中心;
4.所有标注框分配完毕以后,对每个簇重新计算聚类中心点,计算方式为,是第i个簇的标注框个数,就是求该簇中所有标注框的宽和高的平均值。
5.重复第3、4步,直到聚类中心改变量很小。
注意:
1.聚类中心个数(anchor个数)是人为指定的,yolov2作者是根据不同anchor个数时的效果来折中选取了聚类中心数;
2.随机初始化聚类中心,聚类效果会不稳定,需要一些方法来更好的确定初始聚类中心;
2.YOLO 训练和预测过程
2.1 训练
图像被分成SS个grid,每个网格中有B个anchor box(指每个网格中最多能检测出B类物体)。如果网格划分过多,每个网格内基本上只会出现一个物体的中心,1个anchor box就够用了。图中网格划分较大,假设每个grid中最多可能出现两类物体。所以每个grid中是两个anchor box,对应图中的28个输出。网络最终的输出是对应网格划分和输出数据维数,上图卷积神经网络的最终输出就应该是3328(33个grid,每个grid有2个anchor,1个anchor对应8个输出信息)。
Pc表示anchor中有物体的概率,bx和by是物体中心在grid中的位置坐标,以当前grid左上角为原点,归一化表示,范围在0-1之间。bh和bw表示bounding box的宽高,也是归一化表示,但是范围可以大于1,也就是包围盒可以超出当前grid。
我们拿到的训练样本是带有手工标注bouding box的图像,需要根据网格划分和bouding box的类别信息来生成对应的输出。还是以上图为例,需要检测的物体类别包括人、汽车和摩托车。找到图中所有标注出来的物体包围盒,发现只有一个包围盒,且包围盒的类别属于汽车。包围盒的中心位于第三行第二列的grid中,所以分配给这个grid。
这个grid中有两个anchor,分配给哪个anchor呢?前面已经利用K均值聚类,得到了预定的anchor个数和形状,anchor的中心默认在grid的中心。分别计算当前包围盒和anchor1、anchor2的IOU。汽车的包围盒与anchor2的IOU更高,所以指定anchor2的输出为(1,0.3,0.3,0.6,0.6,0,1,0)。1表示有物体的概率,0.3表示物体中心在方格中的横坐标(归一化表示),0.3表示物体中心在方格中的纵坐标(归一化表示),0.6表示包围盒宽度和grid宽度的比值,0.6表示包围盒高度和grid高度的比值。最后的0,1,0表示这个包围盒是汽车的包围盒(包围盒的类别信息)。又archor1没有包围盒与之匹配,输出为(0,?,?,?,?,?,?,?)。所以就得到这个grid的输出:anchor1+anchor2(8+8)。
因为只有一个包围盒,且已经分配给上述grid,剩余grid的输出就全是(0,?,?,?,?,?,?,?)2。得到了整个图像对应的最终输出33*16。
上述整个过程更像是对训练集中图像的预处理,得到每个图像的3316输出,用来训练YOLO的神经网络。
2.2 预测
训练好后将需要预测的图像输入,会得到一个333*8的输出。也就是每个grid中的2个anchor box都会有对应的输出。
通过设定的阈值来去除一部分Pc概率很低的包围盒,此时用的是每个包围盒自身的置信度Pc,或者说IOU预测值。
对剩余的预测框再按类别进行非极大抑制,注意此时用的不再是预测框的置信度,而是
用包围盒 j 的置信度乘以该包围盒中所有类别 i 的概率,按分类 i 进行根据score进行非极大抑制。
本人新兵,如有错误,欢迎指正!
参考:https://segmentfault.com/a/1190000016692873