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.py
和vqa_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 xxx
,xxx
就是模型名字,例如spacy download en_vectors_web_lg
)。