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

本文主要是介绍在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内的相关内容来实现

这篇关于在Ubuntu16.04上配置环境并运行Neural Baby Talk库的NOC部分代码的具体步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829683

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n