【学习周报】

学习目标:

  • HMN结果分析

学习内容:

  1. 将HMN项目中的视频信息保存
  2. 将视频信息与MSRVTT数据集进行对比分析
  3. 结论

学习时间:

  • 10,7 ~ 10.13

学习笔记:

1. 将HMN项目中的视频信息保存

继上周工作,通过调试代码成功输出了HMN项目的predition以及groundtruth,但还没有找到视频的vid,这周在上周工作内容基础上再对代码进行调试,将视频的vid信息也保存在json文件中,代码如下:

def language_eval(sample_seqs, groundtruth_seqs, vids_list, is_last_epoch, path_join):
    assert len(sample_seqs) == len(groundtruth_seqs), 'length of sampled seqs is different from that of groundtruth seqs!'

    path_dirname = os.path.join(os.path.dirname(path_join), os.path.splitext(os.path.basename(path_join))[0])
    dirname = os.path.dirname(path_dirname)
    if not os.path.exists(dirname):
        os.makedirs(dirname)
        # ERROR log_dir_and_base_name

    print('data loading...........................\t', path_dirname)
    with open(path_dirname + 'sample_seqs.json', 'a+') as f:
        json.dump(sample_seqs, f)
    with open(path_dirname + "groundtruth_seqs.json", 'a+') as f:
        json.dump(groundtruth_seqs, f)
    with open(path_dirname + "vids_list.json", 'a+') as f:
        json.dump(vids_list, f)
    print('data loading finished..................\t', path_dirname)
    references, predictions = OrderedDict(), OrderedDict()
    for i in range(len(groundtruth_seqs)):
        references[i] = [groundtruth_seqs[i][j] for j in range(len(groundtruth_seqs[i]))]
    for i in range(len(sample_seqs)):
        predictions[i] = [sample_seqs[i]]
    predictions = {i: predictions[i] for i in range(len(sample_seqs))}
    references = {i: references[i] for i in range(len(groundtruth_seqs))}

    avg_bleu_score, bleu_score = Bleu(4).compute_score(references, predictions)
    print('avg_bleu_score == ', avg_bleu_score)
    avg_cider_score, cider_score = Cider().compute_score(references, predictions)
    print('avg_cider_score == ', avg_cider_score)
    avg_meteor_score, meteor_score = Meteor().compute_score(references, predictions)
    print('avg_meteor_score == ', avg_meteor_score)
    avg_rouge_score, rouge_score = Rouge().compute_score(references, predictions)
    print('avg_rouge_score == ', avg_rouge_score)

    return {'BLEU': avg_bleu_score, 'CIDEr': avg_cider_score, 'METEOR': avg_meteor_score, 'ROUGE': avg_rouge_score}

代码经过调试,最终在相应的log目录下生成了四种文件,分别是:

  1. 用来记录项目运行过程的log文件
  2. 用来保存测试集视频预测结果的sample文件
  3. 用来保存测试集视频实际结果的groundtruth文件
  4. 用来保存测试集视频编号的vid文件

【学习周报】_第1张图片
为了方便进一步与MVR-VTT数据集的original video进行对比,需要将三个json文件的信息进行汇总,方法是分别打开这三个json文件并读取数据,再按照顺序依次将文件内容写入新的info文件中。

最终保存的结果如下:

  • 其中,vid代表视频的id号;
  • pred代表视频的prediction caption;
  • gt代表视频的groundtruth caption。

将视频信息与MSRVTT数据集进行对比分析

首先需要下载MSR-VTT数据集,然后根据info文件中的vid,就可以找到对应的original video,经过随机抽查采样发现每一个vid对应的groundtruth caption也对应了视频的内容,下一步就是通过将所有的测试样例与数据集进行对比分析模型预测结果不准确的原因。

以vid6532为例:
【学习周报】_第2张图片
其预测结果为:a boy is jumping on a trampoline
通过vid查看数据集中的视频内容:
【学习周报】_第3张图片
【学习周报】_第4张图片
【学习周报】_第5张图片
【学习周报】_第6张图片
发现视频内容与预测结果十分符合,再查看其groundtruth,也验证了预测结果的准确性:

‘a boy does a few flips on a trampoline’,
‘a boy does flips on a trampoline’,
‘a boy does several backflips on a trampoline’,
‘a boy is jumping inside a trampoline’,
’a boy is jumping on a trampoline’,
‘a boy jumping on a trampoline and doing flips’, ‘a boy jumping on a trampoline’…

结论

在对MSR-VTT数据集中的视频进行查看分析后,发现模型最容易出现的错误有以下几种:

  1. 人物的性别、年龄、发色、衣服颜色等属性
  2. 视频中对象的数量,往往会将多个人参与的活动识别为一个人参与
  3. 当视频内容为教某人做某事时,往往识别为某人在做某事
  4. 对于一些特定场景的识别效果差,比如某个tv show、某个办公室等
  5. 人物的情绪状态、所说的语种、所处职业等信息容易被忽略掉,在预测结果中无法体现
  6. 对于电影、游戏等画中画的场景,容易混淆现实与虚拟
  7. 有时会把视频的BGM当做视频中的人在说话(实际上没有)
  8. 对于视频中对象的描述不够具体,比如卡车、拖车、跑车等均以car来描述,政治家如美国总统obama、trump以及明星如Taylor Swift、Leonardo DiCaprio等均以 people、person来描述,游戏如GTA、Minecraft等均以video game来描述
  9. 对视频中人物的谈话内容识别效果较差,尤其是当视频的groundtruth caption与人物的谈话内容相关联时。

你可能感兴趣的:(深度学习)