movenet.pytorch
movenet.pytorch copied to clipboard
关于 reg loss
Hi fire717,感谢无私的分享。我看你在 dataset 中对 reg 不仅仅是在当前中心赋值,也在周围赋值,据你所说是为了加快收敛。但是在实际的 reg loss中,你只是用的当前中心的值,这是为什么呢?
代码如下:
def regsLoss(self, pred, target, cx0, cy0, kps_mask, batch_size, num_joints):
#[64, 14, 48, 48]
_dim0 = torch.arange(0,batch_size).long()
_dim1 = torch.zeros(batch_size).long()
loss = 0
for idx in range(num_joints):
gt_x = target[_dim0,_dim1+idx*2,cy0,cx0]
gt_y = target[_dim0,_dim1+idx*2+1,cy0,cx0]
pre_x = pred[_dim0,_dim1+idx*2,cy0,cx0]
pre_y = pred[_dim0,_dim1+idx*2+1,cy0,cx0]
loss+=self.l1(gt_x,pre_x,kps_mask[:,idx])
loss+=self.l1(gt_y,pre_y,kps_mask[:,idx])
return loss / num_joints
这是体现在制作reg标签的heatmap的地方的,取值的时候只能取一个值。 参考https://github.com/fire717/movenet.pytorch/issues/12 : https://github.com/fire717/movenet.pytorch/blob/bbc81408bd4da49789d912fd08635355fe123e60/lib/data/data_tools.py#L123-L136
这段数据集制作代码我看到了。在计算损失的时候,由于 cx 和 cy 是固定的,周围那一圈赋值的数据其实没有用到。我的理解没问题吧。
在训练的时候 你根据center取到的值不一定就是你标记的那一点的值,可能就是落在周围一圈,如果不对周围一圈赋值那么就取到0了,赋值了可以保证取到周围一圈也能继续训练。