LeiJiangJNU / DAMDNet

DAMDNet for 3D face alignment(ICCV2019 workshop) Paper:
https://arxiv.org/abs/1908.11821
Apache License 2.0
58 stars 17 forks source link

wing loss #9

Open hangon666 opened 4 years ago

hangon666 commented 4 years ago

请问在您计算wing loss的时候,作为ground truth的 68个3D人脸点是怎么得到的?

LeiJiangJNU commented 4 years ago

由于缺乏真实3D数据,在利用3DMM回归时的GT一般都是是利用先前方法回归出的3D系数重建三维人脸得到的。因此这个GT具有很多噪声,是一种假的GT。这是一个病态问题,但是目前所有基于这样的文章都能得出较好的结果,因此一定程度上也可以接受。

hangon666 commented 4 years ago

请问方便分享一下wing loss function部分的代码吗

LeiJiangJNU commented 4 years ago

你好。wing loss代码已经上传。

hangon666 commented 4 years ago

非常感谢,由于我是初学者,我在学习尝试自己训练时出现 loss 是nan的情况,请问可以帮我看一下代码哪里出错了吗,谢谢! ` def train(train_loader, model, criterion_wpdc, criterion_wing, optimizer_wpdc, optimizer_wing, epoch): batch_time = AverageMeter() data_time = AverageMeter() # 计算并存储平均值和当前值 losses = AverageMeter()

model.train()

end = time.time()
# loader is batch style
# for i, (input, target) in enumerate(train_loader):
# train_loader对应 输入图像input 以及 对应的62维ground truth     target
for i, (input, target) in enumerate(train_loader):
    target.requires_grad = False
    target = target.cuda(non_blocking=True)
    output = model(input)

    data_time.update(time.time() - end)

    #wpdc
    loss_wpdc = criterion_wpdc(output, target)
    optimizer_wpdc.zero_grad()
    loss_wpdc.backward(retain_graph=True)
    optimizer_wpdc.step()

    #wing
    loss_wing = criterion_wing(output, target)
    optimizer_wing.zero_grad()
    loss_wing.backward(retain_graph=True)
    optimizer_wing.step()

    losses = 0.5 * loss_wpdc + loss_wing

    # measure elapsed time
    batch_time.update(time.time() - end)
    end = time.time()

    # log
    if i % args.print_freq == 0:
        logging.info(f'Epoch: [{epoch}][{i}/{len(train_loader)}]\t'
                     f'LR: {lr:8f}\t'
                     f'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                     # f'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
                     f'Loss {losses.data.cpu().numpy():.4f} ')

`

LeiJiangJNU commented 4 years ago

你好。一般loss出现Nan可能是在计算loss的时候分母出现了0。你这个代码看不出问题。建议你先判断wingloss和wpdcloss哪个loss出现问题。然后调试程序去看loss计算中哪一步运算出现了0的可能。

LeiJiangJNU commented 4 years ago

你好。一般loss出现Nan可能是在计算loss的时候分母出现了0。你这个代码看不出问题。建议你先判断wingloss和wpdcloss哪个loss出现问题。然后调试程序去看loss计算中哪一步运算出现了0的可能。

你这个代码还有个问题,一般只对最后的总loss进行反传播。不会一次训练传播两次loss。

hangon666 commented 4 years ago

非常感谢,请问您最终的loss大概在多少,我观察到初始的wingloss大约在30左右,而wpdcloss大约只有0.2,请问在您训练时也是这样的情况吗

LeiJiangJNU commented 4 years ago

你好。wing loss大概在4到5,wpdc loss一般在0.02左右,能够达到比较好的效果