在Ubuntu16.04上配置环境并运行Neural Baby Talk库的NOC部分代码的具体步骤

1. 前言

笔者最近需要做Novel image Captioning(NOC)的任务,在github上找了找发现了Neural-Baby-Talk这个库。在代码库的README中,只有怎么用dockerfile配置的步骤,由于笔者没有弄懂怎么在课程服务器上使用dockerfile,服务器也没有开放使用dockerfile配置镜像的功能,所以干脆照着dockerfile和README手动配置。

接下来笔者会分享在 Ubuntu16.04+python3.6+torch0.4 上配置Neural-Baby-Talk库的Novel image Captioning任务的具体步骤。 由于课程任务只要求实现NOC,所以笔者并没有配置这个库运行Standard Image Captioning任务或Robust Image Captioning任务的相关环境。 不过按照笔者配置环境时的经验,其余两个任务的配置过程应该与NOC很相似,感兴趣的朋友可以参照我这篇博文进行尝试。

2. 提示

2.1 关于服务器操作

笔者是在vscode上连接了远程服务器来进行服务器操作的,优点是方便进行文件查看和代码修改,感兴趣的朋友可以搜索相关教程,配置过程很简单。

不过在新拉取的实例上,使用远程服务器需要先安装ssh,指令如下

apt-get install openssh-server

如果出现无法连接ssh的情况,可以参考这篇博文(11条消息) SSH登陆报错解决方案:Permission denied, please try again._Python少年班的博客-CSDN博客

2.2 关于文件下载

该代码库需要下载很多大文件到服务器才能运行,笔者列出三种使用过的方式,大家可以自行选择下载速度较快的一种:

  1. 服务器上直接使用 wget(如果该方法下载速度可观,那就不需要考虑其他下载方式)
  2. 本地下载/本地迅雷下载(COCO数据集等大文件使用迅雷下载会很快),然后 scp 指令上传到服务器上(比较慢)
  3. 服务器上使用 mwget(需要自行安装,下载某些文件时综合时间比2还要快)

3. 配置步骤

3.1 基于Dockerfile文件配置环境

如果能够直接使用Dockerfile文件配置环境,请跳过该步骤。

环境的配置主要基于代码库中的Dockerfile文件,所以需要先查看一下里面的内容。

image-20220607150053752

以上为Dockerfile文件的前34行,第一行的From命令是拉取dockerhub里的镜像,第二行的Copy命令是复制相关文件到指定目录,后面的Run命令是创建实例后需要输入的bash指令,ENV命令是需要配置的环境变量。Dockerfile文件后面还有其他内容,留在后面再讲解。

3.1.1 拉取实例

根据Dockerfile文件第一行,在dockerhub中拉取相关镜像。docker指令如下(这是笔者的课程服务器可选的功能,如果无法拉取实例的读者只能考虑自行解决):

docker pull docker.io/pytorch/pytorch:0.4-cuda9-cudnn7-devel

3.1.2 运行配置代码

第9-18行

打开实例后,在bash命令行照着Dockerfile的第9-18行运行指令。直接复制粘贴运行即可。

需要注意的是,虽然原作者是在python2.7上运行的代码,但是笔者是在python3.6上复现的代码,因为如果在python2.7上复现,由于python2和python3的差异,在后续安装相关库时比较麻烦,所以笔者没有使用python2.7复现。也就是说其实不需要再下载python2.7,直接使用实例自带的python3.6即可:)

第20行

首先安装vim编辑器,因为之后需要修改系统文件,命令如下

apt-get install vim

打开 /etc/profile

vim /etc/profile

在文件末尾添加一行代码

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ 

保存并退出后,在命令行source一下

source /etc/profile
第21行

复制粘贴运行即可

第23-32行

在使用pip指令前,先为pip指令配置清华源,命令如下

#先更新pip版本  
pip install pip -U  
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

如果无法更新版本,且报错如下

image-20220607160649557

可以先用临时源更新pip

pip install pip -U -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

然后再设置清华源或其他源

第23-29行的代码可以直接复制粘贴运行

需要注意的是 tensorflowtorchtext需要下载指定版本,否则不兼容当前torch版本,命令如下:

pip install tensorflow-gpu==1.12  
pip install torchtext==0.2.3

剩余代码直接复制粘贴运行。

Dockerfile内的其余代码基本都是下载一些训练或测试时需要使用的文件,在之后我会配合./data/README文件讲解,先不作考虑。

3.2 代码库下载

在完成上述步骤后,先将Neural-baby-talk的相关代码下载并上传到服务器上。

值得注意的是,下载后得到的文件路径中的NeuralBabyTalk/tools/coco-caption文件夹是空的,因为该文件夹是原作者fork的coco-caption,需要另行下载。将代码库上传到服务器后,解压Neural-baby-talk.zip。然后,先删除里面的./tools/coco-caption文件夹,然后再将coco-caption解压到./tools路径下,并将解压后得到的文件夹重命名为coco-caption。

3.3 下载NOC所需文件

注意:关于下载方式,看一下#2.2 关于文件下载

该步骤主要基于./data/README文件和Dockerfile文件,如果是做Standard Image Captioning任务或Robust Image Captioning任务的也可以参考该步骤并作出适当调整。

README文件或Dockerfile文件里已有的下载链接笔者不会重复贴出,请读者自行点击文件里已有的链接。如果有无法下载的可以联系笔者,笔者会考虑在后续贴上可用的下载链接。

首先查看./data/README文件。

image-20220607163851361

3.3.1 关于COCO数据集

先到官网下载COCO数据集,注意下载 train2014 和 val2014,不需要test2014。解压时,不需要解压到指定文件夹,自己选个合适的地方就行,注意要将解压后得到的train2014文件夹和val2014文件夹放到同一文件夹下。

3.3.2 预训练权重

这个文件的解压路径在Dockerfile里有说明,需要自己创建文件夹./data/imagenet_weights/,并解压到该路径下。

3.3.3 NOC-COCO的要求

查看./data/README文件,可以发现需要先完成COCO里的三个步骤

image-20220607170335134

3.3.3.1 COCO
Karapathy’s split
  • 下载caption_datasets.zip文件,并将解压后得到的dataset_coco.json复制到 ./data/coco中
annotations
  • 下载annotations_trainval2014.zip,将它放到./data/coco/ 并进行解压
standford core nlp tools
  • 该文件的解压路径在Dockerfile文件里有说明,需要下载stanford-corenlp-full-2017-06-09 文件到./prepro并解压。

  • 按照Dockerfile里的指令,需要运行以下命令

    cd /workspace/neuralbabytalk/tools/coco-caption && \  
    sh get_stanford_models.sh
    

    如果运行命令时,里面的wget指令下载速度过慢,可以考虑复制sh文件里的下载链接到本机下载后再上传,并注释掉sh文件里的相关代码

3.3.3.2 NOC-COCO

完成COCO的三个步骤后,可以做NOC-COCO步骤了

预处理数据

在Neural-baby-talk路径,用./data/README里提供的命令来预处理数据

python prepro/prepro_dic_coco.py --input_json data/coco/dataset_coco.json --split noc --output_dic_json data/noc_coco/dic_coco.json --output_cap_json data/noc_coco/cap_coco.json
下载coco_detection.h5.tar.gz

下载coco_detection.h5.tar.gz文件,并解压到./data/coco

3.3.4 预训练模型

在README文件(不是./data/README)里可以下载NOC的预训练模型来检测test过程的代码是否可以运行。

文件的解压路径在Dockerfile里有说明,下载后将文件解压到./save里

值得一提的是,这个预训练模型在测试集上的的效果很差。

3.3.5 下载NOC split文件

该步骤没有写在./data/README文件和Dockerfile文件里!!!

需要先下载 Lisa Anne 等人提供的 NOC 数据集的划分annotation_DCC.zip文件,官方下载地址如下DCC - Google 云端硬盘,如果有下载慢的,可以考虑在我提供的百度网盘下载。

下载好文件后,在./data/中创建文件夹 coco_noc,并将annotation_DCC.zip解压到该文件夹下,将解压后得到的文件夹重命名为 annotations

3.4 代码调整

需要注意的是,由于源代码是在python2.7运行而笔者是在python3.6上运行,因此需要修改少量代码

3.4.1 main.py文件里的代码

284行

infos = pickle.load(f)

改为

infos = pickle.load(f,encoding='iso-8859-1')
293行

with open(os.path.join(opt.start_from, 'histories_'+opt.id+'.pkl')) as f:

改为

with open(os.path.join(opt.start_from, 'histories_'+opt.id+'.pkl'),'rb') as f:
294行

histories = pickle.load(f)

改为

histories = pickle.load(f,encoding='iso-8859-1')

3.4.2 ./tools/coco-caption/pycocoevalcap/cider/cider_scorer.py文件里的代码

197行-200行

取消以下代码的注释(这个改动不是由于python版本问题,后面会讲)

docFreq = {}  
docFreq['df'] = self.document_frequency  
docFreq['ref_len'] = len(self.crefs)  
pickle.dump(docFreq, open('noc_test_freq.p', 'w'))

并将200行的代码改为如下

pickle.dump(docFreq, open('noc_test_freq.p', 'wb'))
205行

将以下代码

docFreq = pickle.load(open(os.path.join('tools/coco-caption/data', \  
                                                        df_mode + '.p'), 'r'))

改为

docFreq = pickle.load(open(os.path.join('/root/NeuralBabyTalk-master', \  
                                                        df_mode + '.p'), 'rb'),encoding='iso-8859-1')

3.5 测试评估

接下来先进行测试评估,来检验代码是否可运行,以下为README文件里NOC任务用于训练和测试的样例代码。

image-20220607174618864

修改./cfgs/noc_coco_res101.yml的内容

首先更改 ./cfgs/noc_coco_res101.yml 的内容,将以下路径修改为你的实际路径

image-20220607174725669
input-jsoninput_dic是 #3.3.3.2 预处理数据 步骤所得到的文件,存放在./data/noc_coco/里面
image_path是COCO数据集中的train2014和val2014的解压路径
proposal_h5是之前下载得到的h5文件的解压路径
data_path是代码库中的./data文件夹的路径

例如笔者的实际路径如下

image-20220607175042531

其次(划重点!!!),更改./tools/sentence_gen_tools/coco_eval.py内代码

第一次运行代码时,需要先将第52行的df的值从“noc_test_freq”修改为 “corpus”。这是为了得到Cider的评分,如果读者不需要这个评分,可以直接将该行注释掉,并跳过该步骤

image-20220607212757915

在./tools/pycider/README(如下)里有说明,当该值设置为 “corpus” 以外的值时,需要先提供存储文档频率的文件。而笔者在之前的步骤中取消了一部分代码的注释,就是为了在将该值设置为corpus时,能够自动生成一个存储文档频率的文件,该文件可用于 “noc_test_freq”。通过这一次运行,可以生成这个存储文档频率的文件,在之后的代码运行中,就可以将 df的值重新设置为 “noc_test_freq”。

image-20220607175553247

值得注意的是,笔者将第49行和51行注释掉了,因为在笔者做课程任务时并不需要Bleu和Rouge这两种评价指标,所以也没有测试相关代码能否实际运行。

然后运行测试评估代码

python main.py --path_opt cfgs/noc_coco_res101.yml --batch_size 20 --cuda True --num_workers 20 --max_epoch 30 --inference_only True --beam_size 3 --start_from save/noc_coco_nbt_1024

第一次运行时,会下载一个 glove.6B.zip 文件到 ./.vector_cache中,如果在之后运行代码的过程中,出现类似zipfile.BadZipFile: File is not a zip file的报错,可能是该文件损坏,将该文件删除,重新下载即可。(实际上笔者在训练的过程中多次遇到这个报错,可能是因为服务器断连等原因造成了该文件的频繁损坏,可以考虑在第一次下载后就将该文件备份,毕竟下载速度确实有点慢)

成功把结果跑出来了(如下图),可以看到四个指标的得分都很低。

image-20220608155628644

注意在代码可以成功运行后,将上面的提到的df的值改回“noc_test_freq”

3.6 训练

尝试训练,运行代码

python main.py --path_opt cfgs/noc_coco_res101.yml --batch_size 20 --cuda True --num_workers 20 --max_epoch 30

在经过第18个epoch后,模型的评估效果如下,效果还不错

image-20220608155604768

更改模型的部分超参数和结构,可以通过修改以上训练代码以及./cfgs/noc_coco_res101.yml内的相关内容来实现

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值