VQA(图像问答)数据集结构及大致内容

这篇文章只讲下VQA的文件结构和文件内容,官方工具的用法及一些小技巧。

VQA数据集概况

其实VQA有很多种数据集,比较常用的有VQA v1.0、 VQA v2.0、Visual7W等。这篇文章中使用的数据集主要是VQA v1.0(其实和2.0差不多,读取方式没变,只是优化了内容,让模型更加不容易通过蒙来答对问题)。

直接开始吧。

VQA V1.0结构及内容概要

VQA v1.0的数据集内容如下1

VQA(图像问答)数据集结构及大致内容_第1张图片

VQA的结构:

VQA(图像问答)数据集结构及大致内容_第2张图片

以上图片截图自VQA官网

总之就是每张图片对应3个以上的问题(平均5.4个),每个问题对应10个正确答案和3个可能是正确的答案。

VQA文件结构

VQA文件主要分为图片、Questions和Annotations,test数据集没有Annotations文件。文件格式为json。

VQA(图像问答)数据集结构及大致内容_第3张图片

截图自官网

用到的数据主要是上图中框出来的部分(至少要下载框中的文件,旁边的Tools可以下可以不下,但是建议下载)。有些图片是单通道的(即黑白图片),这点可能在编写预处理程序的时候需要注意下。数据分为train、val、test、test-dev(test和test-dev的区别是:最后需要生成答案上传到服务器,test-dev可以上传9999次,每天最多上传10次,test总共只能上传5次,每天只能上传1次),各个集合的问题和答案(test不公布答案)分别存放在单独的json文件中。

VQA(图像问答)数据集结构及大致内容_第4张图片

大概就是上图的样子,通常只用“OpenEnded”部分(2.0版本VQA只有OpenEnded部分,没有MultipleChoice,所以接下来只讲OpenEnded部分)。“Annotations”就是答案,要搭配train和val的questions文件使用。

文件内容结构

Questions

train、val、test、test-dev的JSON文件内容结构都是一样的,这里就拿train的内容为例。

OpenEnded_mscoco_train2014_questions.json的内容结构如下:

info
  |-description
  |-url
  |-version
  |-year
  |-contributor
  |-date_created
task_type
data_type
license
  |-url
  |-name
data_subtype
questions(最重要的部分)
  注意,questions下的内容为list
  list中保存着多个“图片id-问题-问题id”组成的dict类型数据
  以下key为每条dict类型数据中的keys
  |-question(问题内容)
  |-image_id(图片id)
  |-question_id(问题id,用来查找对应的答案)

注意,JSON读取出来的内容是字典格式,所以可以用Python内置的.keys()来显示Key:

VQA(图像问答)数据集结构及大致内容_第5张图片

Annotations

mscoco_train2014_annotations.json内容结构如下:

info
  |-description
  |-url
  |-version
  |-year
  |-contributor
  |-date_created
data_type
license
data_type
license
  |-url
  |-name
annotations(类似上面的questions的内容)
  |-question_type
  |-multiple_choice_answer
  |-answers
  |-image_id
  |-answer_type
  |-question_id

使用官方工具来搜索问题对应的答案

因为原文件中图片id、问题、问题答案之间的关系不是一一对应关系,所以官方提供了工具来读取原文件内容。工具下载页面为:工具的GitHub页面。因为工具是用Python 2编写的,所以如果需要用Python 3的话就要用Python内置的工具2to3来进行转换,具体操作就是2to3 -w 脚本名。转换之后可能需要改动一些细节才能成功使用。用到的脚本为PythonHelperTools/vqaTools/vqa.py,其他的可用可不用。

具体用法:

from vqa import VQA

train_a_json = '到答案JSON文件的路径'
train_q_json = '到问题JSON文件的路径'

train_vqa = VQA(train_a_json, train_q_json)

# 获取问题ID
train_question_ids = train_vqa.getQuesIds()
# 获取图片ID
train_image_ids = train_vqa.getImgIds()

# 通过train_vqa.qa获取问题对应的所有答案及图片ID
print(train_vqa.qa[train_question_ids[0]])

更多用法请参考VQA官方工具的GitHub页面。

参考

VQA官网
VQA官方工具的GitHub页面


  1. 资料来自VQA官网 ↩︎

你可能感兴趣的:(学习笔记,机器学习,VQA,机器学习,人工智能,python,深度学习)