Skip to content
This repository has been archived by the owner on Oct 19, 2022. It is now read-only.

Latest commit

 

History

History
44 lines (29 loc) · 1.5 KB

File metadata and controls

44 lines (29 loc) · 1.5 KB

损失函数

本篇是 Build Your Own Face Detection Model 的第五节。

1 >> 开始之前

再次地,由于这是一个 CenterFace/Centernet 速成指南,我对原有的损失函数进行了简化。原版实现在这里

具体而言,我用MSE取代了论文中的交叉熵损失,并改进了原代码中的RegLoss的实现。

2 >> 实现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

无论是offsetsize还是landmarks,它们的groundtruth都是很稀疏的,所以我们需要取出有值的那些点,只对那些点进行损失计算。由于这些真值点都是大于0的数,所以可以上面前三行代码取得。

3 >>

愿凡有所得,皆得自利利他。