本篇是 Build Your Own Face Detection Model 的第五节。
再次地,由于这是一个 CenterFace/Centernet 速成指南,我对原有的损失函数进行了简化。原版实现在这里。
具体而言,我用MSE
取代了论文中的交叉熵损失,并改进了原代码中的RegLoss
的实现。
RegLoss
指回归损失。最早出现在Cornernet
的代码中,Centernet
沿用了这个命名。
RegLoss
用在对偏移量,宽高,人脸关键点的回归上,内部使用了SmoothL1Loss
,也即是论文中提到的公式。
在models
中创建一个loss.py
,写入以下代码。
import torch.nn as nn
class RegLoss(nn.Module):
"""Regression loss for CenterFace, especially
for offset, size and landmarks
"""
def __init__(self):
super().__init__()
self.loss = nn.SmoothL1Loss(reduction='sum')
def forward(self, pred, gt):
mask = gt > 0
pred = pred[mask]
gt = gt[mask]
loss = self.loss(pred, gt)
loss = loss / (mask.float().sum() + 1e-4)
return loss
无论是offset
,size
还是landmarks
,它们的groundtruth
都是很稀疏的,所以我们需要取出有值的那些点,只对那些点进行损失计算。由于这些真值点都是大于0的数,所以可以上面前三行代码取得。
愿凡有所得,皆得自利利他。