論文地址:https://arxiv.org/abs/1801.02765,發表於 AAAI2018
Github地址:https://github.com/MhLiao/TextBoxes_plusplus.git
對於閱讀這篇文章的讀者來說,對於 TextBoxes++論文本身應該已經不陌生。它是 TextBoxes 的一個擴展,TextBoxes 只可以檢測水平方向的文本,而 TextBoxes++可以檢測任意角度的文本,而且訪方法也是基於 SSD 改造實現的。TextBoxes++的具體實現細節我可能另外會寫一篇自己的解讀文章(只是可能),這裏主要是記錄一下如果把這個項目跑起來。
1.我的環境
系統:Ubuntu 16.4
CUDA:CUDA 8.0,cudnn v5.1
GPU: NVIDIA GeForce RTX 2080 Ti
應該有不少人是在 ubuntu 14.04上編譯的訪項目,我本來還擔心 ubuntu 16.04會不會有問題,結果還是可以跑的。問題有不少,但是貌似都不是系統版本的問題。因爲主要是自己搭環境,所以也沒用到 docker 。
2. CUDA和 cudnn
因爲作者在說明文檔裏面明確地說要 cuda8.0, cudnn v5.1(cudnn 6 and cudnn 7 my fail),雖然我自己已經裝了 cuda 10.0了,現在得再裝個 cuda 8.0,外加 cudnn v5.1。
2.1 cuda 8.0
直接在官網(https://developer.nvidia.com/cuda-80-ga2-download-archive)上,按照自身系統的配置,填入相應信息進行下載,我下載的本地安裝包runfile(local)。
下載完成後,運行安裝文件將 cuda 安裝到指定目錄即可。
$ sh cuda_8.0.61_375.26_linux-run
......此外省略 N 多行......
這裏要特別注意的是當問到你是否需要安裝 NVIDIA 顯卡驅動一步的時候你要根據你的實際情況來選擇。像我在我之前已經裝好顯卡驅動,所以這裏我明確地給了個 no。
我將cuda 8.0安裝在了/usr/local/cuda-8.0文件夾下面。
2.2 cudnn v5.1
依然是從 nvidia 的官網上(https://developer.nvidia.com/rdp/cudnn-archive)下載 cudnn v.5.1,應該是要註冊賬號纔行。
版本一大堆,選擇自己需要的即可,毫無疑問我應該選 cuDNN v5.1 for CUDA 8.0。下載之後怎麼安裝,nvidia官方也很人性話地給出了說明,請見頁面:https://docs.nvidia.com/deeplearning/sdk/cudnn-install/。
我解壓後基本照抄上面的命令就行了,只是注意將目標cuda目錄換成了我新裝好的/usr/local/cuda-8.0。
3. OpenCV 的問題
作者給出的版本要求是 opencv 3.0,一開始我以爲只能裝 opencv 3.0.x。因爲我係統裏面裝的是 opencv 3.4.0,我一開始不想再折騰一遍 opencv,我就抱着試試看的心態直接用我已經裝好的 opencv 3.4.0 去編譯caffe,然後在 cmake 的時候直接報了下面這個錯誤:
-- CUDA detected: 8.0
-- Found cuDNN: ver. 5.1.10 found (include: /usr/local/cuda-8.0/include, library: /usr/local/cuda-8.0/lib64/libcudnn.so)
-- Added CUDA NVCC flags for: sm_75
CMake Error at /usr/local/share/OpenCV/OpenCVConfig.cmake:108 (message):
OpenCV static library was compiled with CUDA 10.0 support. Please, use the
same version or rebuild OpenCV with CUDA 8.0
Call Stack (most recent call first):
cmake/Dependencies.cmake:72 (find_package)
CMakeLists.txt:43 (include)
意思就是說你 CUDA雖然用的是8.0,但是你 Opencv 靜態庫確是基於 CUDA 10.0環境編譯的。確實我之前裝 opencv 3.4.x 的時候是用的 cuda 10.0。爲此,我不得不基於 CUDA 8.0環境又重新編譯了 OpenCV。好了,下面就是我在在 ubuntu 16.04上編譯 opencv 3.4.0的一般過程。
#安裝依賴包
sudo apt-get update
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
sudo apt-get install build-essential
sudo apt-get install cmake cmake-gui git libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev # 處理圖像所需的包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev # 處理視頻所需的包
sudo apt-get install libatlas-base-dev gfortran # 優化opencv功能
sudo apt-get install ffmpeg
#下載源碼包並解壓
https://github.com/opencv/opencv/archive/3.4.0.zip
unzip opencv-3.4.0.zip
#cmake 進行編譯安裝
cd opencv-3.4.0
mkdir build #新建編譯目錄
cd build
cmake ../ CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/opt/opencv-3.4.0 #指定安裝目錄
make -j8 #編譯
make install #安裝
ok 了!
4. 開始編譯 textboxes_plusplus 的 caffe
好了,現在只剩下編譯項目自帶的 caffe 了。
git clone https://github.com/LeftThink/TextBoxes_plusplus.git #克隆項目到本地
cd TextBoxes_plusplus #進入目錄
mdkri build #創建 build 目錄,等下要在這裏進行 cmake
cd build
cmake .. #開始 cmake,生成編譯所需文件
make -j8 #開始編譯
..........
(Use -Wno-deprecated-gpu-targets to suppress warning).
Scanning dependencies of target opencv_cudafilters
[ 27%] Building CXX object modules/cudafilters/CMakeFiles/opencv_cudafilters.dir/src/filtering.cpp.o
[ 27%] Linking CXX shared library ../../lib/libopencv_cudafilters.so
[ 27%] Built target opencv_cudafilters
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2
喲,報錯了!opencv 的錯!恍然大悟,我cmake 的時候沒有指定剛剛用 cuda 8.0重新編譯好的 opencv路徑,因爲我沒有設置安裝在默認路徑下面,指定好路徑再來cmake一次。
cmake -DOpenCV_DIR=/opt/opencv-3.4.0/share/OpenCV .. #指定好 opencv 再 cmake
make -j8 #再 make
.....編譯成功了.....
5. 準備數據
這是要準備好訓練用的 lmdb 數據。
6. 開始訓練
在開始訓練前注意修改 examples/text/modelConfig.py 文件,填寫了你準備好的訓練和測試數據lmdb 文件的路徑(目錄),如圖:
作者提供了預訓練模型,我下載了預訓練模型,放置於 models目錄下。
然後就可以跑跑看了!
python examples/text/train.py
...... ok ......