YOLO3个人训练过程1 .得到真实标签2 .得到预测标签3 .计算损失函数训练预测过程
培训过程
yolo3模型框架中的其他博客有很多可供参考,但在此不解析网络,感兴趣的人请参考以下链接:
3359 gitee.com/cungudafa/keras-yolo3/
33559 www.paddle paddle.org.cn/tutorials/project detail/1096708 # anchor-32
众所周知,训练需要真实标签和预测结果之间的计算误差,但当我第一次理解yolo3时,很难知道这种单阶段检测网络模型的输出结果的含义与真实标签的匹配和计算方法。 我查了很多CSDN大佬的博客,终于明白了意思。 这里衷心推荐喷浆。 我没有使用过这个框架,但是说明的部分真的很详细。 那么,话多了,接下来开始流程。
另外一方面,真实标签1. 将真实图像划区域这里输入图像格式默认为[416、416],如果首先将3232像素分割为一个区域,则原始图像为[13、13],同样将. 88像素分割为一个区域后,原始图像为[550],因此对原图进行简单分类后,可以得到3种不同尺度的图像。 分别为13、13、26、26、52、52
2. 生成锚框这里以比例(13,13 )的图像为例,其他比例的操作也相同,共有1313个区域,以各个区域为中心制作3种锚定框。 最终得到13133的不同锚定框,覆盖图像的不同区域。 此时锚框的位置和大小是固定的,以区域的左上角为中心,通过k聚类得到的anchor组包含了各尺度中锚框的大小。 现在解释锚箱的意思,我理解的是预测物体的候选区。
3. 对锚框进行标注我们的实际图像选区有标签,现在就很有用。 在每个实际选区中,找到了相应的锚定框,以使相交比(IOU )在所有锚定框中最大化。 标记为objectness=1,作为正例。 如果IOU大于预定阈值且不是最大锚框,则剩馀锚框中的IOU标记为objectness=-1,并且不参与loss的计算。 剩下的锚框标记为objectness=0,作为反例。
4. 计算锚框偏置的位置和大小以及所属类别前面提到的锚箱位置是固定的,但是固定的锚箱很难直接与我们的实际选择相匹配。 因此,需要微调IOU的最大锚定框,即objectness=1的锚定框,而不需要计算剩下的锚定框。 调整中心点的位置和宽度的高度。 锚框位置信息将中心点的x、y坐标及锚框的宽度和高度分别用Cx、Cy、Cw、Ch表示。 微调后的位置信息用Px、Py、Pw、Ph表示。 两者之间的微调公式如下。
CXsigmoid(tx )=Px
cysigmoid(ty )=Py
CWe^(tw )=Pw
che^(th )=Ph
其中,tx、ty、tw、th是微调参数,在微调后的位置与实框的信息Bx、By、Bw、Bh相等的情况下,加入上式,记载所得到的微调参数。 t*x、t*y、t*w、t*h,一共四维。 这提供了一组位置标签信息,还需要类别信息。 YOLO3是单标签分类。 因此,我们在样本类别中采用了one-hot独热代码。 这里比较简单,说明很少。 如果有80种类型,则需要80维才能保存类别信息。 因此,对于1313的图像,有13133个锚定框,共有13133 ((1)4) 80 ),)对象ness t * x,t*y,t*w,t*h 至此,yolo3的真正标签的生成完成了。
二、预测标签1. 通过yolo3得到输出结果分析
本文不解析网络,图片引用请参考logo。 yolo3得到的结果同样分为3个尺度y1(1313255 )、y2 ) 2626255 )、y3 ) 5252255 )。 你不觉得应对了上面的地块吗? 那是正确的。 这是有意的。 这是为了使网络中得到的特征地图能够与图像划分的区域一一对应。 但是,我们发现最终输出的深度是255。 这应该如何与标签信息相对应呢?
图中全是胶水飞来的,可能无法应对数值,但基本没问题。 浆料nb,百度nb。 从图中可以看出,255=3(580 ),3表示三个锚定框,5=1) 4表示是否包括一个物体的置信度,4表示锚定框的位置精细调整信息。 80代表总共80个班。 one-hot代码占80维。 这样就可以将标签和预测结果对应起来。
3 .计算损失函数的训练首先,让我们考虑一下如何使标签和预测结果一一对应。
由于标签预测objectnessconfidencet*x、t*y、t*w、t*htx、ty、tw、th实类预测类有三组对应的标签和预测结果,因此分别创建相应的损耗函数。表征是否包含目标物体的损失函数
loss _ obj=sigmoid _ cross _ entropy _ with _ logits (对象ness,confidence )
表征物体位置的损失函数loss_x = sigmoid_cross_entropy_with_logits(t*x, tx)
loss_y = sigmoid_cross_entropy_with_logits(t*y, ty)
loss_w = sigmoid_cross_entropy_with_logits(t*w, tw)
loss_h = sigmoid_cross_entropy_with_logits(t*h, th)
loss_location = loss_x + loss_y + loss_w + loss_h
表征物体类别的损失函数
loss_class = sigmoid_cross_entropy_with_logits(pred, label)
loss_all = loss_obj + loss_location + loss_class
这样就可以训练了。 预测过程
预测过程的难点就是如何把网络输出结果和我们想要的目标框联系起来。
首先我们知道了网络输出的是13×13×255。同理还有26和52尺度的。这里以13举例。
1.输出结果重构。将输出结果重构成13×13×3×(1+4+80)方便后续操作。这样所有锚框的预测信息(confidence+4个位置信息+类别),一共13×13×3个。如果算上26和52尺度的话,一共有13×13×3+26×26×3+52×52×3=10647个框的信息。
2.计算每一个锚框对应的得分。得分反应的是分类的可信度。锚框的得分计算公式如下
Pobj为是否包含物体的概率,Pclassification为分类概率(softmax),相乘得到的是不同分类的可信度。这样将所有的锚框都计算出对应的分类可信度。
3.过滤无效和多余锚框。当得分小于某一阈值时,即被为无效锚框,当然这个值可以自定义在0-1之间调整。在剩余的锚框中仍存在多个锚框对应同个物体的现象,其实我们只需要对贴合目标的那一个输出结果就够了,因此采用非极大值抑制(non-maximum suppression, nms)来过滤多余锚框。基本思想是,如果有多个预测框都对应同一个物体,则只选出得分最高的那个预测框,剩下的预测框被丢弃掉。
如何判断两个预测框对应的是同一个物体呢,标准该怎么设置?
如果两个预测框的类别一样,而且他们的位置重合度比较大,则可以认为他们是在预测同一个目标。非极大值抑制的做法是,选出某个类别得分最高的预测框,然后看哪些预测框跟它的IOU大于阈值,就把这些预测框给丢弃掉。这里IOU的阈值是超参数,需要提前设置,YOLO-V3模型里面设置的是0.5。
nms的过程举个例子说明
比如在上面的程序中,boxes里面一共对应11个预测框,scores给出了它们预测"人"这一类别的得分。nms得到最终选矿的过程如下。
创建选中列表,keep_list = []对得分进行排序,remain_list = [ 3, 5, 10, 2, 9, 0, 1, 6, 4, 7, 8],选出boxes[3],此时keep_list为空,不需要计算IoU,直接将其放入keep_list,keep_list = [3], remain_list=[5, 10, 2, 9, 0, 1, 6, 4, 7, 8]选出boxes[5],此时keep_list中已经存在boxes[3],计算出IoU(boxes[3], boxes[5]) = 0.0,显然小于阈值,则keep_list=[3, 5], remain_list = [10, 2, 9, 0, 1, 6, 4, 7, 8]选出boxes[10],此时keep_list=[3, 5],计算IoU(boxes[3], boxes[10])=0.0268,IoU(boxes[5], boxes[10])=0.0268 = 0.24,都小于阈值,则keep_list = [3, 5, 10],remain_list=[2, 9, 0, 1, 6, 4, 7, 8]选出boxes[2],此时keep_list = [3, 5, 10],计算IoU(boxes[3], boxes[2]) = 0.88,超过了阈值,直接将boxes[2]丢弃,keep_list=[3, 5, 10],remain_list=[9, 0, 1, 6, 4, 7, 8]选出boxes[9],此时keep_list = [3, 5, 10],计算IoU(boxes[3], boxes[9]) = 0.0577,IoU(boxes[5], boxes[9]) = 0.205,IoU(boxes[10], boxes[9]) = 0.88,超过了阈值,将boxes[9]丢弃掉。keep_list=[3, 5, 10],remain_list=[0, 1, 6, 4, 7, 8]重复上述Step6直到remain_list为空。上述nms部分来源于https://www.paddlepaddle.org.cn/tutorials/projectdetail/1096708#anchor-32