yolo训练
yolo损失函数
首先解释损失函数中的意义:
是一个矩阵,只有0和1两个值,在这个矩阵中和分别代表
所以每个cell会预测个bbox,其中与truth标签框IOU最大的bbox会被标注成1
另一方面,公式(4)中的和的含义相反,两者理论上是互斥的
公式(5)中的代表第个cell中有没有物体中心点,有物体中心点则为1,没有则为0(没有物体中心点的cell这一项为0,不要计算类别损失)
注意:
总的来说,就是公式(1),(2),(3)中都包含,所以这三项只有和真实标签IOU最大的那个bbox才计算损失,其他bbox不计算这三项损失(或者是真实标签中心点所在的cell中IOU最大的bbox,不是全部cell中IOU最大的bbox,这个地方不确定,还要看一下源代码才能清楚)
公式(4)包含,代表对其他不存在对象的bbox计算损失
公式(5)包含,代表不包含物体中心点的cell不计算类别损失
生成训练的标签:
xml文件不能直接用,要把真实框从xml文件中提取出来,把真实框变成和网络输出大小一样的标签。生成样本标签和网络输出的形状大小是一样的7*7*30或(h*w*c),其中30维通道的生成方式如下:
1.20维的类别概率
根据标签框得到框中心坐标,中心坐标在哪个grid(即cell)中,那么,那个grid对应的类别概率的维度填写1,其他维度填写0(代码上,可以初始化都是0,然后进行判断,把中心所在的grid的类别变成1)
注意:一个grid只预测一个目标,所以类别概率一定只有1维是1,其他维度都是0,定义为,代表在cell存在物体(物体中心点)的情况下,属于第类的概率,作者是这么人为设定的,没有什么道理可讲。
2.标签的2个bbox生成
bbox是在训练过程中动态生成的,根据网络输出的bbox和实际的bbox之间的IOU来确定将实际的bbox填写到哪个bbox中
具体来说,在网络输出的bbox与真实标签的IOU最大的位置上填入真实标签的x,y,h,w,置信度confidence=1,,作者人为定义的,只能说作者牛逼
在较小的IOU的bbox2位置上填写网络输出的bbox2的x,y,h,w,置信度confidence=0
根据上述过程生成的置信度confidence,在损失函数中表现为公式(3)的,公式(4)中。
3.没有物体的grid
对于没有包含真实目标框中心的grid,其所有bbox的confidence=0,真实标签bbox坐标为网络输出的bbox坐标。没有物体的grid应该只在公式(4)中计算损失,因为只有公式(4)中的不为0(在第i个cell的第j个bbox中没有物体时为1)。而在其他几个损失函数中,因为和在没有物体的grid中均为0,所以不计算损失。
yolo预测过程
yolo预测过程是通过计算得分score和使用NMS非极大值抑制来选择使用哪个bbox,步骤如下:
1.先计算得分score,,就是网络预测的第个类别概率,confdence就是置信度,每个cell有2个bbox,每个bbox可以预测20个类别,所以一共有7*7*2*20=1960种得分情况,每个bbox有20种得分情况。又因为有98个bbox,每种类别有98中得分情况
2.NMS非极大值抑制
(1)先设置一个阈值,将小于阈值的score=0
(2)遍历每一个类别,找到这个类别得分最高的bbox添加到输出列表,然后计算其他bbox和这个bbox的IOU,将IOU大于阈值的score=0,然后再在剩下的bbox中选择得分最高的bbox添加到输出列表,重复删除IOU高的bbox,直到剩下的bbox的score全部为0,然后遍历下一个类别
(3)得到的输出列表里的所有bbox为输出
yolov2中的anchor机制
anchor是预先设定的先验框,分别计算网络输出的bbox和真实框相对于anchor的偏差,然后对比这两个偏差计算损失。详情请看:【论文理解】理解yolov3的anchor、置信度和类别概率_DLUT_yan的博客-CSDN博客_yolo置信度
1.这里的,,,是预测框的x坐标,y坐标,宽w和高h相对于网络预测图的大小的,,,将这四个值除以网络输出大小,在乘以原图的高宽,才能得到预测的坐标
2.图中的,,,是网络一个cell的一个bbox输出,经过归一化sigmoid函数得到,代表预测bbox的x坐标相对于这个cell左上角坐标的偏移量,同理,这样就可以保证预测框bbox的中心坐标落在这个cell内。
3.计算误差的时候是将真实框进行计算得到真实框相对于cell和anchor的偏差,,,,然后根据,,,和,,,计算误差