MFB论文笔记(2)——论文复现之MFB_baseline模型的训练

版权声明:本文为博主原创文章,如未特别声明,均默认使用CC BY-SA 3.0许可。 https://blog.csdn.net/Geek_of_CSDN/article/details/82872724

Visual Genome处理(可跳过)

其实这个步骤不是必须做的,但是属于预处理步骤,所以还是写上来比较好。在用到Visual Genome来训练的时候才需要做这个部分,所以可以先跳过再回来看看。

因为mcb项目已经比较老了,所以项目那里的说明基本上不能够直接用,除非你打算安装旧版本的Visual Genome Python Driver。这里我决定直接用新版本的,因为旧版本和新版本其实没有大的变化,只是api的名字变了而已,只需要改一点东西就可以直接用了。

首先需要下载Visual Genome Python Driver并进行安装,直接git clone https://github.com/ranjaykrishna/visual_genome_python_driver下载整个repo,然后cd进去,pip install .(记得先切换到为这个项目创建的虚拟环境)来进行安装就可以调用Visual Genome Python Driver了。

在安装好Visual Genome Python Driver之后就需要更新下原本mcb项目里面用来预处理的脚本vg_preprocessing.py了,大概改成这样就行(留意贫僧写了要改的地方就行):

import numpy as np
from visual_genome import local	# 这里要改下
import re
import pdb
import json


# True: Augments the genome dataset by converting literal number answers to numerical form (i.e. 'one' --> '1')
# For the challenge submission, we set this as False
AUGMENT = False

# Path to genome data 这里记得改成你存放的visual genome的图片的位置
DATA_PATH = 'genome'

# List of words to prune
ELIMINATE = ['on', 'the', 'a', 'in', 'inside', 'at', 'it', 'is', 'with', 'near', 'behind', 
             'front', 'of', 'next', 'to']


QAs = local.get_all_qas(DATA_PATH)	# 改这里
image_data = local.get_all_image_data(DATA_PATH)	# 改这里

# 后面还是一样,所以就省略了

改完之后基本上就是上面这样子。

记得要下载visual genome的图片,下载v1.0的就行了,分为part 1和part 2,总共15G左右,同时还要下载image meta data和question answers(看下图)。

在这里插入图片描述

上面下载的东西解压并且放在同一个文件夹下面,这个文件夹的路径就是上面填的DATA_PATH路径。搞定了之后python vg_preprocessing.py就可以了。

正文:MFB模型(mfb_baseline)的训练

以下内容与repo中的mfb_baseline的运行相关:

其实比较麻烦的部分也就是用resnet进行特征提取的部分,现在提取好了就基本上没什么问题了。现在需要修改一下config.py里面的内容。

# 上面的一堆内容因为不需要改所以忽略掉

# vqa tools - get from https://github.com/VT-vision-lab/VQA
# 首先要改的就是下面这两个,下载VQA(https://github.com/GT-Vision-Lab/VQA)工具之后将下面的两个路径改成VQA工具存放的路径就可以了
VQA_TOOLS_PATH = '/home/yuz/data/VQA/PythonHelperTools'
VQA_EVAL_TOOLS_PATH = '/home/yuz/data/VQA/PythonEvaluationTools'

# location of the data
# 改成VQA数据集存放的路径
VQA_PREFIX = '/home/yuz/data/VQA'

# 这里就不用改,最好是按照这里的写法来放数据,对照着放就行了,genome那部分可以先跳过
feat = 'pool5'
DATA_PATHS = {
	'train': {
		'ques_file': VQA_PREFIX + '/Questions/OpenEnded_mscoco_train2014_questions.json',
		'ans_file': VQA_PREFIX + '/Annotations/mscoco_train2014_annotations.json',
		'features_prefix': VQA_PREFIX + '/Features/ms_coco/resnet_%s_bgrms_large/train2014/COCO_train2014_'%feat
	},
	'val': {
		'ques_file': VQA_PREFIX + '/Questions/OpenEnded_mscoco_val2014_questions.json',
		'ans_file': VQA_PREFIX + '/Annotations/mscoco_val2014_annotations.json',
		'features_prefix': VQA_PREFIX + '/Features/ms_coco/resnet_%s_bgrms_large/val2014/COCO_val2014_'%feat
	},
	'test-dev': {
		'ques_file': VQA_PREFIX + '/Questions/OpenEnded_mscoco_test-dev2015_questions.json',
		'features_prefix': VQA_PREFIX + '/Features/ms_coco/resnet_%s_bgrms_large/test2015/COCO_test2015_'%feat
	},
	'test': {
		'ques_file': VQA_PREFIX + '/Questions/OpenEnded_mscoco_test2015_questions.json',
		'features_prefix': VQA_PREFIX + '/Features/ms_coco/resnet_%s_bgrms_large/test2015/COCO_test2015_'%feat
	},
	'genome': {
		'genome_file': VQA_PREFIX + '/Questions/OpenEnded_genome_train_questions.json',
		'features_prefix': VQA_PREFIX + '/Features/genome/feat_resnet-152/resnet_%s_bgrms_large/'%feat
	}
}

一个个对照着放好数据之后就可以开始复现了,只需要python train*就可以了。先做点别的事情吧,这个可能要跑8小时以上。

注意,上面跑python train*的时候要看下train*里面的代码,如果是这部分代码运行的话,那么就是在val集上跑的:

#for val set. the accuracy will be computed and ploted        
test_loss, acc_overall, acc_per_ques, acc_per_ans = exec_validation(config.TEST_GPU_ID, 'val', model_name, it=it, folder=folder)

这是给开发者调试用的,真正的生成测试用json文件的代码是被注释的这部分:

''' 
# for test-dev /test set. the json file will be generated under the <folder> file
exec_validation(config.TEST_GPU_ID, 'test-dev', model_name, it=it, folder=folder)
caffe.set_device(config.TRAIN_GPU_ID)
''' 

把这部分注释去掉,然后把上面那个在val上跑的代码注释掉再跑。跑完之后会生成json文件,这是对test问题给出的回答,是要用来上传到服务器上面验证模型的accuracy的。

要上传到服务器上要在Challenge页面(如果是在其他数据集上,即不是oe-real上跑的话,就要看这个地方,有详细介绍要去哪里上传)注册个账号,然后在Participate这里上传对应的json文件(记得先打包成result.zip再上传,不然会提醒“非法文件类型”)。

在这里插入图片描述

然后在下面填资料、介绍什么的,最后submit就可以了(注意,一天只能submit一次,总共只能submit5次),然后就会在服务器上面跑,最后给你结果:

在这里插入图片描述

选Download output from scoring就可以看到结果了。

P.S. 上面说的“总共只能上传5次,每天只能上传1次”指的是“test”对应的json文件,因为相当于是提交最终结果所以不能多次上传(防止参赛者针对“test”测试集调参)。如果想要上传多次来验证自己模型的话就上传到“test-dev”那里,上传次数基本上是没限制的(还是有次数限制,但是基本上是不可能用得完的),不过注意,这样就要上传在对应数据集“test-dev”生成的json文件,而不是上传“test”上跑的json文件。

补充

其实其余的模型也就差不多是这样训练的,只是coatt+glove+mfb那部分可能因为spacy的embedding layer的dimension变了(变成384),所以如果安装了最新版本的spacy的话要踩一些坑,但是基本上百度/GG都可以查到,所以这里就不细说了(如果要用最新版spacy的话,基本上就是要将vqa_data_layer.pyvqa_data_layer_kld.py下面的GLOVE_EMBEDDING_SIZE = 300改成GLOVE_EMBEDDING_SIZE = 384),或者直接用作者训练时用到的spacy版本来复现。详细的每个模型对应的结果可以在论文的experiment那里看到,就是那个大表格里面。

如果在运行spacy.load('en', vectors='en_glove_cc_300_1m_vectors')遇到了OSError: [E050] Can't find model 'en'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.错误的时候,就要先在终端运行python -m spacy download en,来下载好模型,这样就可以解决这个问题(如果想下载别的预先训练好了的GloVe模型的话就spacy download xxxxxx就是模型名字,例如spacy download en_vectors_web_lg)。

猜你喜欢

转载自blog.csdn.net/Geek_of_CSDN/article/details/82872724