Yolov5_face源码阅读
Dadaload
作用:一次提供一个Batch的imgs,targets。
targets [N, 16]
,N表示此Batch中包含的所有人脸数目,维度16构成如下图,黄色表示此人脸所在图像在batch中的id(索引),绿色表示类别id(只有人脸这一类,所以都是0),红色表示人脸框box所在的位置,构成xywh(左上角坐标,框的宽高,值范围0~1,相对于图像大小),紫色表示人脸的5
个landmark关键点坐标x1,y1,x2,y2,x3,y3,x4,y4,x5,y5(值范围0~1,相对于图像大小)。
Model
作用:1. 输入一个batch的imgs,输出pred。
2. 将anchor由相对于原图的大小转为相对于每层输出特征的大小。
假设输入imgs的h, w均为800,那么pred的构成为:
pred[0] [B, 3, 100, 100, 16]
pred[1] [B, 3, 50, 50, 16]
pred[2] [B, 3, 25, 25, 16]
其中维度16的构成如下图,蓝色表示有目标的置信度,绿色表示是人脸的置信度,其余和targets同样颜色的含义是一样的。可以看出,pred维度16的顺序和targets不一样,其实pred维度16中的顺序是由定义loss的时候决定的,完全可以更改这个顺序。
Loss
作用:输入targets([N, 16]
),pred (3*[B,3,H,W,16]
),计算分类损失classes loss,obj损失objectness loss,以及定位损失location loss。
-
匹配正样本
由于输出特征层一个位置有3个anchor,先repeat targets 3次,再加上anchor id信息,新的targets维度为[3, N, 17]
,如下图所示。
然后将根据4.4匹配正样本介绍,判断targets中box的宽ww,高与anchor的宽高比是否在0.25~4
之间,图中的1
表示匹配成功,0
表示未匹配成功。
取出targets中匹配成功的样本(假设总共有M
个成功匹配的样本),匹配成功的targets
的维度为[M, 17]
。 -
扩充正样本
yolov5之前都是仅将gt box中心落入的grid作为正样本,为了扩充正样本的数量,yolov5根据gt box中心坐标位于grid的不同象限进行不同的扩充,具体可参考4.4匹配正样本。代码的做法是,首先判断targets中box的左上角坐标位于的象限(比如红框中的1,1,0,0则表示该box的左上角位于grid的第2象限,因此位于该grid上,左的两个grid为可扩充的正样本),得到可扩展的mask(维度[5,M]
)。
然后将匹配成功的targets复制5
次,并将可扩展mask作用在它上面,即可得到扩展后的targets
,其维度为[K,17]
,K
表示扩展后的正样本数目。
-
计算损失函数
box回归损失
将偏移矩阵[[0,0], [0.5, 0], [0, 0.5], [-0.5, 0], [0, -0.5]]复制M
份,并将可扩展mask作用在它上面,即可得到扩展正样本x,y的偏移量。
将偏移量(深绿色)作用到扩展后的targets的维度17中的x,y上,即做差,并向下取整,可得到扩展后的grid的左上角坐标(深紫色)。
再用扩展后的targets中的x,y 与 扩展后的grid左上角坐标做差,得出targets中的x,y与扩展后的grid左上角坐标的偏移量(蓝色)。虽然深绿色和蓝色表示的向量都叫偏移量,但它们不是一回事,深绿色中的值只可能是0,-0.5,0.5,但蓝色中的值范围为-0.5~1.5
,这个范围也是yolov5为了消除grid敏感度做的调整(yolo系列之前回归范围一般是0~1)。
根据扩展的grid的左上角坐标(深紫色表示的向量),扩展后的targets中的image id, anchor id,对pred进行索引,得到K*16
的向量。下图表示当image_id=0, anchor_id=1, x=50,y=50时,对pred[0](输出第一层)进行索引,得到一个1*16
的向量(黄色立方体).
用索引后的pred的x,y回归参数(浅蓝色),以及wh回归参数(浅红色)经过下图中的公式处理得到pred_box,然后对pred_box和gt_box做CIOU计算定位损失。gt_box中蓝色部分表示gt_box x,y 相对于grid左上角坐标的偏移量,淡紫色表示扩展后的targets中的w,h。
obj置信度损失
将pred_box和gt_box计算的iou作为obj置信度(将其还原到pred维度上,位于下图中绿色长方体上的黄色立方体,绿色长方体其余位置值为0),计算其与索引后的pred的obj置信度参数(位于下图中红色长方体)的BCE。
分类损失
由于只有face这一类,obj置信度损失可以表示分类损失了。