这是去年10月份,自己看的第一篇关于VQA的论文,由于课程内容需要,对论文内容理解得还算深入,并在github上找了一些代码来实验。下面直接开始~
1. 实验目的
完成一项视觉问答(VQA)的任务,即给定一张图像,和一个问题,构建一个网络模型使之能够根据图像内容回答问题。
2. 实验环境
处理器:Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz;
GPU:GeForce GTX 1070Ti,版本456.71,NVIDIA CUDA 11.1.96 driver;
Python 3.9.7;
程序所需依赖包在附件代码的requirements.txt文件中。
3. 实验方法
本实验主要完成了对文献[1]的复现,该文献提出了堆叠注意力网络SANs,SANs模型是使用注意力机制完成VQA任务的经典模型。
SANs模型使用问题的语义表达搜索图像中与问题相关的区域来预测答案。图像的全局特征通常包含大量冗余的、与问题无关的特征,使用图像的全局特征来预测问题的答案反而会使准确率下降,因此就引入了注意力机制,希望模型只注意到图像中与问题相关的局部区域,再使用局部的图像特征进行预测;根据图像回答问题通常是一个多步推理的过程,因此这里使用了多层的注意力以模拟多步推理的过程,越高的注意力层主要到的区域与问题的相关性越高。如图3.1所示,输入问题是“What are sitting in the basket on a bicycle?”,注意力层可视化效果中的明亮区域就是注意到的图像区域,在第一个注意力层中,模型注意到了三个区域,而第二个注意力层,模型锁定了一个目标区域,并根据这个目标区域进行答案预测。
图3.1 训练好的多层注意力可视化
一个SANs模型主要包含三个组成部分:一个用于提取高层图像特征的CNN,一个用于提取问题的语义特征的LSTM,一个用于定位目标图像区域和实现多步推理堆叠注意力网络,如图3.2所示。SANs首先使用问题特征查询第一个视觉注意力层中的图像区域,然后将问题向量和检索到的图像特征组合成一个细化的查询向量,在第二个注意力层中再次查询图像区域。越高层的注意力能提供更清晰的注意力分布,与答案相关性更高。
图3.2 SANs结构图