前言
损失函数是一项工作里很重要的部分,它意在每个训练阶段告诉模型有多“犯傻”、离“正确答案”还有多远,然后基于损失反向传播回去使得各模型参数获得相应的梯度,于是模型就知道该如何纠正错误(当然,还要结合优化算法,由于不在本文内容之中,这里就不给它出场的机会了)。正是这样经历一系列迭代训练后,模型最终才能学习成长为“三好学生”。
上一期CW已向大家介绍了DEKR的标签分配方法,那么本期就接着来看看损失函数的设计吧!
目录
i, 分类损失
ii. 回归损失
分类损失
分类指的是区分每个位置是否是关键点(COCO中有17类)和虚拟中心点(代表人的中心点,具体意义可以回顾上期内容),对于COCO数据集来说,这里就会设置18个类别(17类+虚拟中心点1类)。类别对应到通道这个维度,于是,网络的输出是17张关键点热度图+1张虚拟中心点热度图,标签也是一样的形式,loss 使用的是加权的 L2 损失函数:
其中,H,C 分别代表预测的关键点和虚拟中心点热度图,带 的是对应的标签,它们相减是 element-wise 的形式。
代表掩膜(mask),用于为正负样本分配不同的权重:正样本1,负样本0.1(注意不是0)。
的 shape 和
一致,比如:
则有17个通道,每个通道对应一类关键点,而
当然就只有1个通道了。 于是,
就是 element-wise product,每个元素一对一相乘。
回归损失
网络回归的是虚拟中心点到关键点位置的 offset maps,对于COCO数据集来说,这个输出通道则为17x2=34,对应17类关键点的 x,y 坐标,标签也是同样的形式,虚拟中心点邻域的位置是正样本,loss 使用归一化的 Smooth-L1 损失:
其中, C 代表正样本位置集合, 代表网络预测的offset map,带
表示对应的标签,
代表人物面积,实际是根据人物中关键点在 x, y 方向的最远距离
来计算的:
,
的 shape 和
是一致的,这里的所有操作也是 element-wise 的。
最终的 loss 计算如下:
其中是分类和回归损失的 trade-off,默认设为0.03。
这部分内容没有太多可言,loss 也很常规,对于正样本不熟悉的可以再回顾下前一期的内容。
可以思考下的是,为何 heatmap (分类)部分要使用 L2 Loss? Cross Entropy,Focal Loss 会怎样呢?