MFB论文笔记(1)——论文复现之论文实验部分摘要及特征提取

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

还是接着上次笔记的内容,这次是关于实验部分的。

实验

终于到了吃瓜群众喜闻乐见的评测环节,先总结一下:

这个环节要用到的数据就是VQA数据集。作者最先做的就是在MFB基础结构上做ablation analysis(用来验证某个部分是不是真的是像自己说的那样有效果,先把这个部分移除掉然后放回去,作对比实验,具体的看下面的参考里面的ablation study的解释)。作者后来会提供详细的分析来说明为什么MFB是最好的。最后会先择对MFB模块最优的超参数并用co-attention(最后就变成了MFB+CoAtt)训练整个模型来和其他最好的模型来对比,数据集都是VQA数据集。

数据集

用的是VQA数据集(注意,是1.0版的),这个数据集含有大概200,000张从MS-COCO数据集里面挑出来的图片,每张图片对应3个问题,每个问题对应10个答案。这个数据集被分成了3个部分:train(8万张图片和24.8万条问题),val(4万张图片和12.2万条问题),test(8万张图片和24.4万条问题)。test里面还有大概25%的部分被单独分出,并被命名为test-dev。评估性能的任务有两种(这是1.0版的情况,2.0只有OE):开放性回答(Open-Ended, OE)和多选(Multiple-Choices, MC)。作者用了Antol提供的工具来在这两项任务上评估模型的性能。

实验设置

作者在VQA数据集上面跑的时候用了Adam solver,并设置 β 1 = 0.9 , β 2 = 0.99 β 1 = 0.9 , β 2 = 0.99 β 1 = 0.9 , β 2 = 0.99 β1=0.9,β2=0.99β1=0.9,β2=0.99\beta_1 = 0.9, \beta_2 = 0.99 。学习率设置成了0.0007,每40000次迭代用0.5为exponential rate进行decay。训练要进行100,000次迭代(如果用大型的Visual Genome数据集的话就要200,000次)。

上面就是部分和论文内容相关的了(贫僧只摘录了部分内容,其实感觉不是很必要继续看,先按着项目主页复现了再回来看也不迟,所以这里只是略微提一下比较重要的地方),而下面的内容是和工程相关的东西。


首先,这篇论文使用Python 2.7的,所以在配置环境的时候一定要用2.7,否则就要重新编译caffe/配置(所以最好用虚拟环境来配置,随时可以改)。

在开始使用作者上传到github的工程之前先看看vqa-mcb工程,因为这个mfb建立在mcb上面的,所以要先做了mcb工程里面提到的条件,并要preprocess一下图片库(就是从vqa下载的那总共30g左右的图片库,看下图)。

在这里插入图片描述

这些文件要下载好上传到服务器(或者在服务器上直接进行下载)并解压到特定文件夹(自己决定放在哪里吧,这步还不需要将图片放在指定的位置)。

建议先下载好上图中的所有文件(就是real image类的所有文件),因为等等要用到。

mcb相关配置

mcb提供的caffe编译(直接跳过,没必要做)

注意,这部分没必要做,如果对mcb感兴趣的话那么再回来看这部分也行。

作者用的caffe的下载链接(直接用git clone https://github.com/akirafukui/caffe/下载到服务器目录上吧)。

在开始编译之前建议先创建一个新的环境。记得编译前要先安装相关的库,直接在caffe/python运行for req in $(cat requirements.txt); do pip install $req; done就可以了。

配置编译caffe的MakefileMakefile.config之前已经讲过了,其实这里方法也差不多,不懂的话看下这两个文件里面的注释也可以明白要怎么改,所以就不重复了,直接提几个遇到的小坑。

第一个小坑,可能是因为他们团队在实现mcb的时候fork的caffe版本太古老(他们大概是在16年做的这个实验),所以不支持cudnn7或者更加新的版本的cudnn。因此在编译的时候会遇到error: too few arguments to function ‘cudnnStatus_t cudnnSetConvolution2dDescriptor(cudnnConvolutionDescriptor_t, int, int, int, int, int, int, cudnnConvolutionMode_t, cudnnDataType_t)’ pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION));这样的错误,解决方法可以看这个页面下的回答,重点是下图中给出的方案。

在这里插入图片描述

其实这个人的意思就是用最新版本caffe的caffe/include/caffe/util/cudnn.hpp文件内容替换掉现在要编译的caffe的cudnn.hpp的内容,这样就可以兼容最新的cudnn了。

第二个小坑就是sudo make pycaffe时遇到了fatal error: pyconfig.h: No such file or directory,具体的可以看这个页面,处理方式:

在这里插入图片描述

就是在你的Makefile.config里面的PYTHON_INCLUDE里面添加上/usr/include/python2.7来绕过这个错误。

编译完成之后记得添加PYTHONPATH,和之前caffe差不多,不过注意每次只能够有一个PYTHONPATH,所以如果~/.bashrc之前已经添加了其他caffe的PYTHONPATH的话就要先暂时注释掉,然后再添加,并source ~/.bashrc更新一下。

注意,这部分没必要做,下面才是正文,如果对mcb感兴趣的话那么再回来看这部分也行。

特征提取步骤(正文)

其实这里才是正文,上面的编译不是必须做的。首先还是先下载好mcb项目,这里要用到的部分是preprocess文件夹里面的内容。首先要下载训练好了的ResNet - 152模型(可以直接从这里下载到,不过因为是onedrive的,所以可能要自带轻♂功,如果没轻♂功的话贫僧同时也上传到了csdn的下载中心,可以用1积分下载。话说下载中心貌似不能设置0积分?最低貌似只能设置1。也可以直接发邮件给贫僧,贫僧看到了的话就会邮件或者用什么奇♂怪的方法发过去),然后放在preprocess文件夹下或者别的什么地方,然后修改文件夹下面的config.py(具体看下面)。

然后就是确保上面下载的VQA数据集里的图片放在了名为images文件夹的(就是把解压出来的文件夹放在images文件夹下,如下图),记住这个images文件夹的路径,或者复制路径就行,等下修改config.py的时候要用。

在这里插入图片描述

最后编辑config.py,把里面的的相关的内容编辑下:

GPU_ID = 5 
# 上面这行如果你只有单个显卡的话等号右边的5应该改成0

# True: resizes images to 448x448. False: resizes images to 224x224
USE_LARGE_INPUT_IMAGES = True

# True: flips images horizontally
FLIP_IMAGE = False

# These are in the repo 这些文件在repo中有,所以不用改
RESNET_LARGE_PROTOTXT_PATH = "./ResNet-152-448-deploy.prototxt"
RESNET_PROTOTXT_PATH = "./ResNet-152-deploy.prototxt"
RESNET_MEAN_PATH = "./ResNet_mean.binaryproto"

# Download caffemodel from https://github.com/KaimingHe/deep-residual-networks
RESNET_CAFFEMODEL_PATH = "/data3/seth/ResNet-152-model.caffemodel"
# 要改成上面下载下来的RESNET模型的路径,如果处在同一个目录的话(例如这篇博客里面就是这么做的)直接填'./ResNet-152-model.caffemodel'就可以了

# 改成VQA数据集的图片放的位置
COCO_IMAGE_PATH = "/data2/daylen/coco/images/"
# 改成你想要preprocess输出的文件保存的路径,例如'./vqa_test_pool5/',注意,原来文件中的所有“res5c”要替换成“pool5”
OUTPUT_PATH = "/data2/seth/vqa_test_pool5/"
OUTPUT_PREFIX = "resnet_pool5_bgrms_large/"

# Which layer to extract and the size of the layer下面要这样
EXTRACT_LAYER = "pool5"
# 下面主要是要改维度,改成下面这个样子,不然到时候喂不进MFB模型
EXTRACT_LAYER_SIZE = (2048)

然后就可以python extract_resnet.py跑代码了。提取图片特征就完成了(要跑很长时间,贫僧用了单张gtx1080ti跑,跑了6小时还没跑完,所以要慢慢等。如果有多张显卡的话可以改代码然后让代码并行跑,就不用train、val、test一个个跑了,这样会快很多)。

跑完之后基本上就完成了特征提取了,就可以开始复现MFB了。

猜你喜欢

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