GANimation: One-Shot Anatomically Consistent Facial Animation源代码Debug——持续更新中...

在复现或者是说尝试运行代码的过程中,遇到了相当多的问题,并且都没有找到直接对应的解决方法,因此准备撰写一下在过程中遇到的问题,以及对应的解决方法,供大家参考,由于目前还在持续尝试中,因此先罗列出自己遇到的问题,后续找到解决方法后会更新文章。

相信搜到这篇文章的读者应该都多多少少看过GANimation这篇论文,具体就不介绍他的内容了。可以自己去看论文或者是看看讲述论文的网址例如这篇:

论文阅读:GANimation: Anatomically-aware Facial Animation from a Single Image-CSDN博客文章浏览阅读8.1k次,点赞10次,收藏31次。转载请注明本文出处,谢谢。论文链接:GANimation: Anatomically-aware Facial Animation from a Single Image 我们首先来看一下它的效果图。这张图是从左边的输入图像生成笑的表情。这里有一个可以调节的参数α,用于调节表情的变化程度。所以说他生成的表情不是离散的。像之前的一些方法只能生成离散数量的表情种类,这些表..._ganimation: anatomically-aware facial animation from a single imagehttps://blog.csdn.net/tobale/article/details/83587140

0.源代码地址

先把源代码地址放上,

GitHub - albertpumarola/GANimation: GANimation: Anatomically-aware Facial Animation from a Single Image (ECCV'18 Oral) [PyTorch]icon-default.png?t=N7T8https://github.com/albertpumarola/GANimation

1.训练问题

1.1.EmotioNet数据集问题

GANimation论文中说他们的模型是利用EmotioNet的数据集实现的,但是EmotioNet的数据集我到目前为止也给数据集团队发过邮件,找不到任何申请方式,但是在github上找到了一个项目是提供了30个epoch的GANimation预训练模型,而且还提供了一个剪裁好的数据集Celeba十分nice

GitHub - vipermu/ganimation: Pytorch implementation of GANimation with pretrained weights.icon-default.png?t=N7T8https://github.com/vipermu/ganimation

2.代码问题

这部分问题,先讲述一下因为我在前面代码中插入了很多注释,可能行数有点问题,可以参看函数名称来找到对应的问题

2.1.'ascii' codec can't decode byte 0xe1 in position 0

完整的报错信息:

File "/root/autodl-fs/AU_detection/GANimation-master/data/dataset_aus.py", line 103, in _read_conds
    return pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 0: ordinal not in range(128)

找了很多方法,最后可以参看stackoverflow中这个问题:

Pickle incompatibility of numpy arrays between Python 2 and 3 - Stack Overflowicon-default.png?t=N7T8https://stackoverflow.com/questions/11305790/pickle-incompatibility-of-numpy-arrays-between-python-2-and-3也就是说这个问题的产生应该是由于python2和python3中numpy数组的pickle不兼容性导致的,可能ganimation当时团队的运行环境应该是py2.x但是现在不都是py3.x了,就会产生这个问题,具体的修改方式:

在dataset_aus.py中Line 100 _read_conds这个函数修改为:

def _read_conds(self, file_path):
    with open(file_path, 'rb') as f:
    return pickle.load(f, encoding='latin1') #修改为这个而不是原来的encoding方式
    #return pickle.load(f)

2.2 invalid index of a 0-dim tensor

完整的报错信息:

File "/root/autodl-fs/AU_detection/GANimation-master/models/ganimation.py", line 401, in get_current_errors
    ('g_m1_s', self._loss_g_mask_1_smooth.data[0]),
IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python or `tensor.item<T>()` in C++ to convert a 0-dim tensor to a number

 这部分可以将ganimation.py中Line 383 get_current_errors函数的修改成这样,

    def get_current_errors(self):
        '''获取目前的损失误差'''
        loss_dict = OrderedDict([('g_fake', self._loss_g_fake.data[0]),
                                 ('g_cond', self._loss_g_cond.data[0]),
                                 ('g_mskd_fake', self._loss_g_masked_fake.data),
                                 #('g_mskd_fake', self._loss_g_masked_fake.data[0]),
                                 ('g_mskd_cond', self._loss_g_masked_cond.data),
                                 #('g_mskd_cond', self._loss_g_masked_cond.data[0]),
                                 ('g_cyc', self._loss_g_cyc.data),
                                 #('g_cyc', self._loss_g_cyc.data[0]),
                                 ('g_rgb', self._loss_rec_real_img_rgb.data[0]),
                                 ('g_rgb_un', self._loss_g_unmasked_rgb.data[0]),
                                 ('g_rgb_s', self._loss_g_fake_imgs_smooth.data[0]),
                                 ('g_m1', self._loss_g_mask_1.data),
                                 #('g_m1', self._loss_g_mask_1.data[0]),
                                 ('g_m2', self._loss_g_mask_2.data),
                                 #('g_m2', self._loss_g_mask_2.data[0]),
                                 ('g_m1_s', self._loss_g_mask_1_smooth.data),
                                 #('g_m1_s', self._loss_g_mask_1_smooth.data[0]),
                                 ('g_m2_s', self._loss_g_mask_2_smooth.data),
                                 #('g_m2_s', self._loss_g_mask_2_smooth.data[0]),
                                 ('g_idt', self._loss_g_idt.data[0]),
                                 ('d_real', self._loss_d_real.data),
                                 #('d_real', self._loss_d_real.data[0]),
                                 ('d_cond', self._loss_d_cond.data),
                                 #('d_cond', self._loss_d_cond.data[0]),
                                 ('d_fake', self._loss_d_fake.data),
                                 #('d_fake', self._loss_d_fake.data[0]),
                                 ('d_gp', self._loss_d_gp.data)])
                                 #('d_gp', self._loss_d_gp.data[0])])

        return loss_dict

2.3 Cannot handle this data type

完整的报错信息:

  File "/root/autodl-fs/AU_detection/GANimation-master/utils/tb_visualizer.py", line 39, in display_current_results
    self._writer.add_image(sum_name, image_numpy, it)
  File "/root/miniconda3/lib/python3.8/site-packages/tensorboardX/writer.py", line 667, in add_image
    image(tag, img_tensor, dataformats=dataformats), global_step, walltime)
  File "/root/miniconda3/lib/python3.8/site-packages/tensorboardX/summary.py", line 288, in image
    image = make_image(tensor, rescale=rescale)
  File "/root/miniconda3/lib/python3.8/site-packages/tensorboardX/summary.py", line 328, in make_image
    image = Image.fromarray(tensor)
  File "/root/miniconda3/lib/python3.8/site-packages/PIL/Image.py", line 2830, in fromarray
    raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e
TypeError: Cannot handle this data type: (1, 1, 480), |u1

这部分是由于pytorch版本的问题,用目前版本的pytorch会有这样的问题,可以按如下方式修改tb_visualizer.py中line 24 display_current_results函数:

def display_current_results(self, visuals, it, is_train, save_visuals=False):
    for label, image_numpy in visuals.items():
        sum_name = '{}/{}'.format('Train' if is_train else 'Test', label)
        #self._writer.add_image(sum_name, image_numpy, it)
        self._writer.add_image(sum_name, np.transpose(image_numpy,(2,0,1)), it)
        if save_visuals:
            util.save_image(image_numpy,
                            os.path.join(self._opt.checkpoints_dir, self._opt.name,
                            'event_imgs', sum_name, '%08d.png' % it))
    self._writer.export_scalars_to_json(self._tb_path)

2.4 no attribute 'iteritems', 'iterkeys'

完整的报错信息:

File "train.py", line 151, in _display_visualizer_val
    for k, v in errors.iteritems():
AttributeError: 'collections.OrderedDict' object has no attribute 'iteritems'

iterkeys也是这个问题:

这部分问题也是由于python2.x和python3.x中写法不同的问题,python3中没有iteritems/iterkeys这个对象了,去掉iter前缀即可

具体的修改方式train.py line131 _display_visualizer_val函数中:

for k in val_errors.keys():
#for k in val_errors.iterkeys(): 这是原始的
    val_errors[k] /= self._opt.num_iters_validate 

对应的,iteritems也这样修改

train.py我遇到的所有问题就是这些了

先写这几个问题,后续的问题再更新...

欢迎来找我讨论有关GANimation的问题!

  • 33
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值