1. 背景
準備參加一個challenger的比賽,需要實現圖像標注(Visual-to-Language)功能----就是給你個圖片,讓你實現看圖說話。
然后意外發現了一個庫NeuralTalk2,這個是斯坦福李飛飛的課程:CS231n: Convolutional Neural Networks for Visual Recognition的講師Andrej Karpathy團隊實現的。
于是興致勃勃的clone代碼準備學習下,結果折騰了一下午才弄好,安裝各種依賴包期間遇到了不少的坑--想想就是心累。為了避免其他同學也遇到類似的情況,這里簡單整理下。
關于圖像標注的技術細節和相關推導公式,我這里就不展開了,我這篇Blog只是記錄NeuralTalk2的安裝使用過程中遇到的幾個小坑,僅作記錄,方便以后回溯。
2. 基本信息
2.1 NeuralTalk2官網
http://cs.stanford.edu/people/karpathy/deepimagesent/
2.2 NeuralTalk2論文
Deep Visual-Semantic Alignments for Generating Image Descriptions
2.3 Github地址
https://github.com/karpathy/neuraltalk2
neuraltalk2是早期neuraltalk版本的升級版本,neuraltalk作為第一個版本已經不維護了,但是代碼還在,本文介紹的都是基于neuraltalk2的。請知。
3. 安裝步驟
說明:以下步驟是基于mac環境的
3.1 下載neuraltalk2源碼
git clone https://github.com/karpathy/neuraltalk2
3.2 安裝Torch
Torch官網在這里
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch; bash install-deps;
./install.sh
# On Linux with bash
source ~/.bashrc
# On Linux with zsh
source ~/.zshrc
# On OSX or in Linux with none of the above.
source ~/.profile
3.3 安裝lua相關一些依賴包
對,沒錯,這個庫是python+lua實現的。lua的包管理器是luarocks
.
luarocks install nn
luarocks install nngraph
luarocks install image
3.4 安裝CJson
3.4.1 下載CJson :
https://www.kyne.com.au/~mark/software/lua-cjson.php
3.4.2 解壓 + 編譯
tar -xzvf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0
luarocks make
3.5 安裝loadcaffe
brew install protobuf
sudo ~/torch/install/bin/luarocks install loadcaffe
3.6 安裝hdf5
這個步驟,當時忘記了,是應該luarocks安裝還是pip安裝,還是brew安裝。反正我自己是3個都安裝了,所以忘記真正需要的是哪個,簡單點就都安裝。或者我有空再研究下。
luarocks install hdf5
sudo pip install h5py
brew install hdf5
4 運行
當你一切安裝好之后,大功告成,就可以運行這個庫了,代碼很簡單,一句話:
th eval.lua -model model_id1-501-1448236541.t7_cpu.t7 -image_folder ./images/ -gpuid -1
./images/ 是我自己建立的本地需要測試的圖片路徑
5 遇到的問題
5.1 unable to locate HDF5 header file at hdf5.h
/home/dmt/torch/install/share/lua/5.1/trepl/init.lua:384: /home/dmt/torch/install/share/lua/5.1/trepl/init.lua:384: /home/dmt/torch/install/share/lua/5.1/hdf5/ffi.lua:42: Error: unable to locate HDF5 header file at hdf5.h
stack traceback:
[C]: in function 'error'
/home/dmt/torch/install/share/lua/5.1/trepl/init.lua:384: in function 'require'
eval.lua:8: in main chunk
[C]: in function 'dofile'
.../dmt/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:145: in main chunk
[C]: at 0x00406670
原因:
hdf5安裝之后,路徑沒有找到。
解決方案:
既然找不到,那么需要我們將hdf5的path寫清楚。
那這個東西在哪里呢?路徑如下:
/Users/你的電腦的用戶名/torch/install/share/lua/5.1/hdf5/config.lua
點進去編輯內容:
hdf5._config = {
HDF5_INCLUDE_PATH = "/usr/local/Cellar/hdf5/你自己的hdf5版本號/include",
HDF5_LIBRARIES = "/usr/local/lib/libhdf5.dylib;/usr/lib/libpthread.dylib;/usr/lib/libz.dylib;/usr/lib/libdl.dylib;/usr/lib/libm.dylib"
}
方案來源:
https://github.com/karpathy/neuraltalk2/issues/123
5.2 unknown Torch class <torch.CudaTensor>
/home/.../torch/install/bin/luajit: /home/.../torch/install/share/lua/5.1/torch/File.lua:343: unknown Torch class <torch.CudaTensor>
stack traceback:
[C]: in function 'error'
/home/ptcuser/torch/install/share/lua/5.1/torch/File.lua:343: in function 'readObject'
/home/ptcuser/torch/install/share/lua/5.1/torch/File.lua:369: in function 'readObject'
/home/ptcuser/torch/install/share/lua/5.1/nn/Module.lua:158: in function 'read'
/home/ptcuser/torch/install/share/lua/5.1/torch/File.lua:351: in function 'readObject'
/home/ptcuser/torch/install/share/lua/5.1/torch/File.lua:369: in function 'readObject'
/home/ptcuser/torch/install/share/lua/5.1/torch/File.lua:369: in function 'readObject'
/home/ptcuser/torch/install/share/lua/5.1/torch/File.lua:409: in function 'load'
videocaptioning.lua:74: in main chunk
[C]: in function 'dofile'
...user/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:145: in main chunk
[C]: at 0x00406670
原因:
NeuralTalk2這個庫可以跑在GPU上,也可以跑在CPU上,因為目前僅以學習為主,且僅在本地的電腦上運行,所以需要跑CPU。
NeuralTalk2有現成的已經訓練過的model,但需要下載對正確的model。
出現這個問題是因為在本地CPU上跑了GPU所需要的model
解決方案:
安裝真正的需求下載CPU版本的model.
http://cs.stanford.edu/people/karpathy/neuraltalk2/checkpoint_v1.zip #帶gpu的模型
http://cs.stanford.edu/people/karpathy/neuraltalk2/checkpoint_v1_cpu.zip 非gpu模型
方案來源:
https://github.com/karpathy/neuraltalk2/issues/129
5.3 cannot open eval.lua: No such file or directory
/Users/username/torch/install/bin/luajit: cannot open eval.lua: No such file or directory
stack traceback:
[C]: in function 'dofile'
...username/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:145: in main chunk
[C]: at 0x010a015f1
原因:
這個是犯了個很基本的錯誤,因為前面各種包,各種安裝之后,一會修改這個,一會修改那個,導致當前路徑不對了。
就是當我們第四點運行提到的代碼,跑的時候
th eval.lua -model ...
需要在neuraltalk2的代碼路徑下。
5.4 libjpeg package not found, please install libjpeg
warning: <libjpeg> could not be loaded (is it installed?)
/Users/xxx/torch/install/bin/luajit: ...xxx/torch/install/share/lua/5.1/dok/inline.lua:738: <image.loadJPG> libjpeg package not found, please install libjpeg
stack traceback:
[C]: in function 'error'
...xxx/torch/install/share/lua/5.1/dok/inline.lua:738: in function 'error'
...xxx/torch/install/share/lua/5.1/image/init.lua:232: in function 'loader'
...xxx/torch/install/share/lua/5.1/image/init.lua:388: in function 'load'
./misc/DataLoaderRaw.lua:82: in function 'getBatch'
eval.lua:116: in function 'eval_split'
eval.lua:173: in main chunk
[C]: in function 'dofile'
...ness/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:150: in main chunk
[C]: at 0x010e5fe9f0
同類問題:
libpng package not found, please install libpng
原因:
- 這個出現看起來很簡單,沒有安裝libjpeg,然后看上去我們安裝一下jpeg就好了。
brew install jpeg
- 然后再嘗試一下?
- 叮!!!d=====( ̄▽ ̄*)b : 發現還是報同樣的錯誤。
- 然后stackoverflow上查了一下,有人告訴我luarocks需要重新install一下image,且必須按照順序。
于是執行:
brew install jpeg
luarocks install image
- 然后再嘗試一下?
- 叮!!!d=====( ̄▽ ̄*)b : 發現還是報同樣的錯誤。
- 于是繼續google,終于找到了如下的思路: 就是我們在第四步執行了
luarocks install image
luarocks install image
就是這里已經提醒我了,我們可以看到有警告:
ld: warning: ignoring file /Library/Frameworks//libjpeg.framework/libjpeg
告訴我們libjpeg路徑沖突了,/Library/Frameworks/
路徑下的libjpeg和homebrew下的有沖突
解決方案:
刪除/Library/Frameworks//libjpeg.framework/libjpeg
同理libpng也一并刪除掉就好了。
這個問題,很多人可能在執行到第四步:
luarocks install image
重新安裝的時候,就可以解決了。
但我自己遇到的更為復雜,所以一步步直到走到刪除/Library/Frameworks/
下的文件這條方案才徹底解決。
5.5 expected near '_close' at line 1436
/Users/chengpoleness/torch/install/bin/luajit: ...xxx/torch/install/share/lua/5.1/trepl/init.lua:389: ...xxx/torch/install/share/lua/5.1/trepl/init.lua:389: ...s/xxx/torch/install/share/lua/5.1/hdf5/ffi.lua:56: ')' expected near '_close' at line 1436
stack traceback:
[C]: in function 'error'
...xxx/torch/install/share/lua/5.1/trepl/init.lua:389: in function 'require'
eval.lua:8: in main chunk
[C]: in function 'dofile'
...ness/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:150: in main chunk
[C]: at 0x010d15a9f0
解決方案:
進入:/Users/你的用戶名/torch/install/share/lua/5.1/hdf5/ffi.lua
修改代碼local process = io.popen("gcc -E " .. headerPath)
:
-- https://github.com/deepmind/torch-hdf5/issues/83#issuecomment-254427843
-- local process = io.popen("gcc -E " .. headerPath) -- TODO pass -I
local process = io.popen("gcc -D '_Nullable=' -E " .. headerPath) -- TODO pass -I.
解決來源:
https://github.com/deepmind/torch-hdf5/issues/83#issuecomment-254427843
6 總結
平時使用或者學習庫的時候,基本是看下作者的readMe.md, 然后明確接口和運行方式,基本是分分鐘就可以搞定的事情。
但是今天想玩一下NeuralTalk2, 萬萬沒想到,一路上遇到了這么多波折,而且關鍵的關鍵是,這里面的很多問題,我都不是第一次遇到,都是別人已經在幾年前遇到過的。
所以很感慨:
為什么很多問題,需要大家不斷的填坑,填坑,填坑呢?
開源作者是不是可以開發一些腳本避免大家在啟動階段遇到這么多坑呢?
是不是有更好的方式可以讓開發者使用起來更優雅一些呢?