VQA 2.0数据集的学习和使用过程

12 篇文章 0 订阅
6 篇文章 1 订阅


前言

该文章记录本人第一次对VQA 2.0数据集进行研究的全过程。

该过程中,感谢 某博主 的指点,帮了我不少。非常感激!

什么是VQA

           VQA任务就是给定一张图片和一个问题,模型要根据给定的输入来进行回答。

很明显,VQA任务的输入有两个(image和question),对于如何提取image的feature,这里就不在赘述, 可以使用CNN提取特征的方式,CNN可以选择Resnet、VGG等骨干网络(去除pooling和fc层)。

对于如何提取question的特征,一般的做法是,由于question本身是文字,需要转换为对应的向量形式,因为模型是不认识文字的,所以要先将每个词转换为与之对应的向量,简单的做法是使用one-hot编码,当然这里你首先是需要建立一个词典(包含你任务中所有可能出现的单词)one-hot编码例如:

    初始有一个词典:['a','is','he','boy','she','dog','school','man','woman','king','queen']

那出现的单词可以用one-hot编码来表示这个单词,如’he’->[0,0,1,0,0,0,0,0,0,0,0],很明显的缺点就是当dictionary很大时,one-hot编码会特别稀疏,

这时候一般使用其它的编码方式,比如说你可以使用预训练的glove向量

当我们将单词转换为对应的向量后,此时我们要整句话对应的向量送往RNN中来提取对应的文本特征,RNN我们一般是会选择LSTM或者GRU(需要讲解LSTM和GRU的我们可以下次再说)。

得到image和question的feature后,就可以通过模型去训练,训练的方式可以使用多标签分类的形式,所以它的损失也就是一个多标签损失,也就可以使用交叉熵损失


以上内容来自 博主博文 ,该博文也值得一看


一、下载原始数据集VQA 2.0

下载数据的链接:https://visualqa.org/download.html

数据集主要是有三部分:

(1)VQA Annotations:

    Training:4437570

    Validation:2143540

以上数据的下载链接:https://visualqa.org/download.html

(2)VQA Input Questions:

    Training:443757

    Validation:214354

    Testing:447793

(3)trainval_annotation和trainval_question:

另外,为了方便大家训练整个trainval split并生成result.json文件,以上传到vqa2.0在线评估服务器

前辈 合并了用于 train and validation splits的question和annotation json文件,

下载链接如下:

trainval_annotation.json

trainval_question.json

(4)VQA Input Images:

    Training:82783

    Validation:40504

    Testing:81434

    也就是说,每张图片会有5个左右的问题,每个问题会有10个左右的回答。

对于数据集的分析,看参考该博文

二、下载预处理后的数据

1.下载预训练的glove词向量

wget -P data http://nlp.stanford.edu/data/glove.6B.zip
unzip data/glove.6B.zip -d data/glove
rm data/glove.6B.zip

得到4种维度的词向量(例如50d文件,就是每个单词对应的50维度的向量)
在这里插入图片描述
后续可以根据自己的需求进行选择使用。
作用:对于先将自己任务中所有可能出现的单词,通过词向量转换为对应的向量,方便之后送往RNN中提取文本特征,因为你不可能直接将单词送往RNN中,注:可以自己训练出词向量,如果不使用别人预训练好的词向量的话。

2.下载annotation 和 question

# Questions
wget -P data https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Questions_Train_mscoco.zip
unzip data/v2_Questions_Train_mscoco.zip -d data
rm data/v2_Questions_Train_mscoco.zip
 
wget -P data https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Questions_Val_mscoco.zip
unzip data/v2_Questions_Val_mscoco.zip -d data
rm data/v2_Questions_Val_mscoco.zip
 
wget -P data https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Questions_Test_mscoco.zip
unzip data/v2_Questions_Test_mscoco.zip -d data
rm data/v2_Questions_Test_mscoco.zip
 
# Annotations
wget -P data https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Annotations_Train_mscoco.zip
unzip data/v2_Annotations_Train_mscoco.zip -d data
rm data/v2_Annotations_Train_mscoco.zip
 
wget -P data https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Annotations_Val_mscoco.zip
unzip data/v2_Annotations_Val_mscoco.zip -d data
rm data/v2_Annotations_Val_mscoco.zip

得到6个json文件
在这里插入图片描述
如果想了解json文件中数据结构格式,可查看 该博文

3.下载预训练的image feature

参考链接: https://github.com/peteanderson80/bottom-up-attention#training

# Image Features    # resnet101_faster_rcnn_genome
wget -P data https://imagecaption.blob.core.windows.net/imagecaption/trainval.zip
wget -P data https://imagecaption.blob.core.windows.net/imagecaption/test2014.zip
wget -P data https://imagecaption.blob.core.windows.net/imagecaption/test2015.zip
unzip data/trainval.zip -d data
unzip data/test2014.zip -d data
unzip data/test2015.zip -d data
rm data/trainval.zip
rm data/test2014.zip
rm data/test2015.zip

这里直接使用的是预训练的feature,就不再需要自己将image送往CNN中来提取特征,预训练是使用Resnet101为骨干网络,使用faster-RCNN的方式在genome上进行预训练提取的特征。
得到的文件:
在这里插入图片描述

三、准备工作

所使用的代码在tool文件夹中

1.建立字典和使用预训练的glove向量(create_dictionary.py)

首先要建立一个字典,字典包含所有出现的单词,并将其转换为对应的glove词向量,通过加载question文件,取出所关注的“question”部分,再取出“question(str)”(这里有点绕,仔细看question的数据结构就可以理解,就是一层一层的去取我们所需要的部分),就获得了所有的问题,有了所有的问题,就可以取出其中的单词,然后将大写转小写等等操作,再去掉重复的单词,就得到了该任务所有可能出现的单词。

dataroot = '../data' if args.task == 'vqa' else 'data/flickr30k'
dictionary_path = os.path.join(dataroot, 'dictionary.pkl')
d = create_dictionary(dataroot, args.task)      # data,vqa      
# <dataset.Dictionary object at 0x00000217857C7C70>
d.dump_to_file(dictionary_path)     # 字典,包含所有单词
d = Dictionary.load_from_file(dictionary_path)

这样会创建一个词典,同时可以通过词典来进行查找“单词到索引(word2idx)”和“索引到单词(idx2word)”:

print(d.idx2word)           # 所有单词  ['what', 'is', 'this',..., 'pegasus', 'bebe']
print(len(d.idx2word))      # 共有19901个单词
print(d.word2idx)               # {'what': 0, 'is': 1, 'this': 2,...,'pegasus': 19899, 'bebe': 19900}

光得到词典还不行,我们最终需要丢进模型中训练的一定是tensor或者说是向量形式的,文字肯定是不行的,所以需要转换为对应的词向量,其实就是为了进行word embedding做准备:

# 使用glove
 glove_file = '../data/glove/glove.6B.%dd.txt' % emb_dim        # 加载预训练好的data/glove/glove.6B.300d.txt
weights, word2emb = create_glove_embedding_init(d.idx2word, glove_file)
np.save(os.path.join(dataroot, 'glove6b_init_%dd.npy' % emb_dim), weights)

weights就是我们最后得到的预训练好的词典向量,我们有19901个单词,每个单词转换为300维的向量,所以weights.shape为[19901,300]:

2.annotation的处理(compute_softscore.py)

四、model篇

    等待更新...

五、train篇

    等待更新...

总结

本人初学VQA,有任何说错的地方,敬请各位伙伴指出和说明

VQA 相关github代码的使用:KaihuaTang/VQA2.0-Recent-Approachs-2018.pytorch

1. dataset的下载和路径处理
将数据集放在/data/路径下
或者更改config.py中dataset的path
并且更改config.py中output_size=36
2. 数据的预处理
preprocess_features.py
preprocess_vocab.py

python preprocess-images.py
python preprocess-vocab.py

3. train
命令行:

python train.py --trainval

4. test
命令行:

python train.py --test --resume=./logs/model.pth
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VQA(Visual Question Answering)是指通过计算机视觉和自然语言处理技术,让计算机能够回答与图像相关的自然语言问题。在VQA研究中,数据集是非常重要的,下面介绍几个经典的VQA数据集: 1. VQA v1和VQA v2 VQA v1和VQA v2是VQA领域最早和最重要的两个数据集。它们包含了超过200,000张图像和超过1,000,000个与图像相关的问题和答案。这些问题涉及到图像中的对象、场景、属性等各方面,答案可以是单词、短语或句子。VQA v2相比于VQA v1,增加了一些挑战性的问题,例如需要推理或者需要多步骤计算。 2. COCO-QA COCO-QA是基于COCO(Common Objects in Context)数据集构建的VQA数据集,包含了超过120,000张图像和超过750,000个与图像相关的问题和答案。与VQA数据集不同的是,COCO-QA的问题和答案都是多项选择的形式,其中一个正确,其余的错误。 3. Visual7W Visual7W是一个涉及到7个“W”(Who、What、Where、When、Why、How和Which)的VQA数据集,包含了超过47,000张图像和超过300,000个与图像相关的问题和答案。这些问题涉及到图像中的对象、场景、动作等各方面。 4. GQA GQA(Visual Genome Question Answering)是一个基于Visual Genome数据集构建的VQA数据集,包含了超过22,000张图像和超过1,000,000个与图像相关的问题和答案。GQA中的问题具有更高的复杂性,需要对图像中的物体属性、关系、逻辑推理等方面进行推理。 以上是几个经典的VQA数据集,它们都为VQA领域的研究提供了丰富的数据资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值