图片描述(image cpationing) 源码实现——让计算机用简短的句子描述一张图片
自动生成图片描述:NeuralTalk2
一、基本信息
NeuralTalk2是斯坦福计算机视觉人工智能实验室的一个项目,利用循环神经网络(RNN)和卷积神经网络(CNN)来描述图片内容,NeuralTalk2 比第一版训练速度更快(使用了GPU),并且具有更好的性能表现。
本篇博客注重该项目的源码实现部分,论文解读部分后续会上传。下面是该项目是一些资源连接
官网
http://cs.stanford.edu/people/karpathy/deepimagesent/
论文
Deep Visual-Semantic Alignments for Generating Image Descriptions
Github源码
https://github.com/karpathy/neuraltalk2
二、源码实现
1.环境及配置要求(建议)
- Linux系统(我用的是Ubuntu 16.04-LTS)
- GPU图形处理器(我的是GTX-980Ti,如果没有,也可以运行cpu版代码)
- python(2或3都可以,我用的是3)
- CUDA和cuDNN_v5.1(如果是其他版本的,可以看后文的cudnn多版本共存部分)
- ...(剩余环境依赖在后面需要用到的时候慢慢装)
2.安装依赖和各种包
由于测试代码部分由lua脚本语言写成,所以我们需要安装Torch,在Ubuntu下,利用如下指令完成Torch的安装
$ curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
$ git clone https://github.com/torch/distro.git ~/torch --recursive
$ cd ~/torch;
$ ./install.sh # and enter "yes" at the end to modify your bashrc
$ source ~/.bashrc #如果你用的是zsh,就输入source ~/.zshrc,ubuntu默认为bash
想要了解有关Torch的跟多信息,可以点击http://torch.ch/查看相应安装文档。
Torch安装好以后会自带LuaRocks,我们需要用它来安装一些必要的包:
$ luarocks install nn
$ luarocks install nngraph
$ luarocks install image
接着,因为我们要加载和保存json文件,所以我们还需要cjson库,安装方法如下
$ git clone https://github.com/mpx/lua-cjson.git
$ cd lua-cjson
$ luarocks make
其他安装方法可以查看官方安装文档:https://www.kyne.com.au/~mark/software/lua-cjson-manual.html
由于NeuralTalk2默认是采用GPU实现的,所以必须确保你的系统上已经正确安装了对应GPU的NVIDIA驱动,以及CUDA开发者工具包和cuDNN(建议版本CUDA7.5或CUDA8、cuDNNv5.1,安装方法可以看这篇文章的CUDA安装部分:http://blog.csdn.net/ksws0292756/article/details/79179286)
注意,如果你之前已经安装了NVIDIA和CUDA,但是你的cuDNN版本不是v5.1,而是更高版本时(我预装版本是v6.0),就需要再去下载cuDNNv5.1,下载地址是:https://developer.nvidia.com/rdp/cudnn-download#a-collapseTwo(下载需要登录nvidia帐号)
下载好以后,有两种方法,一种是删掉原先的cuDNN版本,重新安装cuDNNv5.1版本,另一种是添加新的环境变量,使两种版本共存,操作如下:
方法一:删除原来版本
$ sudo rm -f /usr/local/cuda/lib64/libcudnn* #强制删除libcudnn相关文件
$ sudo rm -f /usr/local/cuda/include/cudnn.h #/强制删除cudnn头文件
#注意,上面的两处删除路径是cuda的默认路径,具体删除时根据你自己的路径来删除
$ cd /Downloads/cuda #将下载的cuDNN解压,得到名为cuda的文件夹,进入
#添加cudnn到cudn库
$ sudo cp include/cudnn.h /usr/local/cuda/include/
$ sudo cp lib64/libcudnn* /usr/local/cuda/lib64/
#修改添加到cuda库的cudnn权限
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
方法二:与原来版本共存
#分别在lib64和include文件夹下面建立一个空文件夹,假设取名cudnn_v5.1
$ cd /usr/local/cuda/lib64
$ sudo mkdir cudnn_v5.1
$ cd /usr/local/cuda/include
$ sudo mkdir cudnn_v5.1
#然后进入到cudnn_v5.1解压出的cuda文件夹内,将相关库文件拷贝至刚才创建的文件夹
#添加cudnn到cudn库
$ sudo cp include/cudnn.h /usr/local/cuda/include/cudnn_v5.1
$ sudo cp lib64/libcudnn* /usr/local/cuda/lib64/cudnn_v5.1
#修改添加到cuda库的cudnn权限
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
接着,打开bashrc文件,添加环境变量
$ gedit ~/.bashrc # 如果你用的是zsh,就改成~/.zshrc
在文件中加上下面一行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64/cudnn_v5.1
安装完驱动和CUDA工具包等以后,再安装下面的cutorch包和cunn包:
$ luarocks install cutorch
$ luarocks install cunn
接着,安装cudnn.torch,在安装cudnn.torch之前,先确认你的电脑已经进行了如下配置
- 安装了v5.1版本的cuDNN
- 安装了7.0以上版本的CUDA
- 将放到了环境变量所包含的路径当中($LD_LIBRARY_PATH) ,具体方法参见安装cuDNN的教程
然后,输入下面的指令建立Torch链接:
$ git clone https://github.com/soumith/cudnn.torch.git
$ cd cudnn.torch
$ luarocks make cudnn-scm-1.rockspec
为了能够训练你自己的模型,你还需要安装loadcaffe:
$ sudo apt-get install libprotobuf-dev protobuf-compiler
$ CC=gcc-5 CXX=g++-5 luarocks install loadcaffe
#如果你的系统不是Ubuntu16.04,则只需要luarocks install loadcaffe即可
由于需要使用hdf5文件来存储预处理数据,所以还需要安装torch-hdf5 和 h5py,
安装torch-hdf5
$ sudo apt-get install libhdf5-serial-dev hdf5-tools
$ git clone https://github.com/deepmind/torch-hdf5
$ cd torch-hdf5
$ luarocks make hdf5-0-0.rockspec LIBHDF5_LIBDIR="/usr/lib/x86_64-linux-gnu/"
安装h5py
对于Anaconda/MiniConda,可以使用
$ conda install h5py
对于Canopy,可以使用
$ enpkg h5py
也可以使用pip安装
$ pip install h5py
以上就安装完了所有的依赖,如果在上面的安装步骤中都没有出错的话,基本上就可以将代码成功的跑起来了(作者吐槽:依赖确实很多,但是这也是没办法的事情)
3.测试运行
为了能快速看到代码运行的结果,我们这里就直接使用作者已经训练好的模型(如果自己训练,大概需要2~3天的时间),点击下面的链接下载:cs.stanford.edu/people/karpathy/neuraltalk2/checkpoint_v1.zip
下载好以后,解压到neuraltalk2项目文件夹里面(也可以解压到别处,只是解压到这里比较方便),然后,运行下面的指令:
$ th eval.lua -model /path/to/model -image_folder /path/to/image/directory -num_images 10
这里-model
后面的路径代表模型路径(可以是相对路径,也可以是绝对路径),-image_folder
后面的路径是你想要测试的图片的文件夹路径,-image_folder
后面的数字代表图片的数量,如果想要测试所有图片,就输入-1
具体用法如下:
$ cd ~/Works/NeuralTalk2/neuraltalk2 #进入到neuraltalk2项目文件夹,具体路径看你自己的存放位置
$ th eval.lua -model model_id1-501-1448236541.t7 -image_folder ~/Works/NeuralTalk2/pics -num_images 4
$ python -m http.server #如果你使用的是python2,则用`python -m SimpleHTTPServer`指令启动服务器
最后,在你的浏览器中访问localhost:8000
就可以看到程序的运行结果啦,下面是我的运行结果:
如果你想训练自己的神经网络模型,可以参考github源码上面的介绍,在这里就不多说明了。