1. 程式人生 > >[目標檢測|SSD實踐一]caffe-ssd基線

[目標檢測|SSD實踐一]caffe-ssd基線

本次實驗利用caffe-ssd跑出了基線,主要從以下幾個方向總結。
- caffe-ssd的編譯
- caffe-ssd demo演示
- 自建資料集的資料準備
- fineTuning
- 測試分析

一、caffe基線實驗

1.1 CPU版安裝


// 依照 caffe - cpu 的安裝裝好依賴包,比如Python什麼的
// 參照 caffe - cpu部落格


https://github.com/weiliu89/caffe/tree/ssd

caffe - cpu 安裝

首先依照 caffe - cpu 的安裝裝好依賴包,比如Python什麼的。

生成Makefile.config

cp Makefile.config.example Makefile.config

修改Makefile.config的相關配置

//Step1: 取消CPU的註釋 8
CPU-ONLY := 1

//Step2: 取消BLAS的 47行
# BLAS := open
BLAS := atlas

BLAS是一個矩陣相乘的庫
BLAS (Basic Linear Algebra Subprograms)

Caffe推薦的BLAS(Basic Linear Algebra  
Subprograms)有三個選擇ATLAS,Intel
MKL,OpenBLAS。其中ATLAS是caffe是預設選擇開源免費,如果沒有安裝CUDA的不太推薦使用,因為CPU多執行緒的支援不太好;Intel
MKL是商業庫要收費,我沒有試過但caffe的作者安裝的是這個庫,估計效果應該是最好的;
OpenBLAS開源免費,支援CPU多執行緒,我安裝的就是這個。

//安裝ATLS
sudo apt-get install libatlas-base-dev // 安裝OpenBLAS sudo apt-get install libopenblas-base

編譯caffe - ssd

// Step:1 make -j8
make -j8

// Step:2 Make sure to include $CAFFE_ROOT/python to your PYTHONPATH.

vim ~/.bashrc
export PYTHONPATH: " /your caffe root/python/ "
source ~/.bashrc

// Step3: make py
make
py // Step4: make test make test -j8 // if you faile make clean and compile again

1.2 GPU版安裝

1. 拷貝Makefile.config

cp Makefile.config.example Makefile.config

2. fix hdf5 naming problem

==report problem:==

./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory

==Append== /usr/include/hdf5/serial/ to INCLUDE_DIRS at line 85 in Makefile.config.

--- INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
+++ INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

Modify hdf5_hl and hdf5 to hdf5_serial_hl and hdf5_serial at line 173 in Makefile

--- LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
+++ LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

3. 接著編譯

make -j8
# Make sure to include $CAFFE_ROOT/python to your PYTHONPATH.

# 這裡報錯:找不到openblas的庫,所以需要自己安裝
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
/usr/bin/ld: cannot find -lopenblas
collect2: error: ld returned 1 exit status
Makefile:568: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1


make py
make test -j8
# (Optional)
make runtest -j8

安裝openblas

#如果有sudo許可權:

sudo apt-get install libopenblas-base
#否則 

github下載原始碼
make -j 8

安裝成功後,繼續在終端輸入安裝目錄:
make install PREFIX=your_directory

根據具體的安裝路徑設定:
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib

4. 測試

==錯誤1==

進入caffe/python路徑

進入Python,import caffe

可能會出現如下錯誤:

ImportError: /home/chenguang/soft/anaconda2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by caffe/_caffe.so)

這個錯誤是因為缺少libgcc。

所以可以用conda安裝libgcc

conda install libgcc

==錯誤2==

編譯完pycaffe後。


import caffe

ImportError: /caffe-ssd/python/caffe/../../build/lib/libcaffe.so.1.0.0-rc3 undefined symbol: ZN5cv6image....

這個原因是anaconda環境的問題,詳情參見anaconda 安裝caffe,刪除anaconda,用預設的Python進行編譯。

猜想是由於anaconda opencv安裝的問題。先編譯caffe後安裝opencv。

==錯誤3==

編譯make all時發生如下錯誤。

‘type name’ declared as function returning an array

這是由於gcc版本和g++版本太低的原因,只需要升級到5以上就可以了。詳情參見gcc和g++的版本升級。

2. caffe-ssd demo演示

在github上,作者給出了ssd在Pascal VOC上的資料準備方法、訓練和測評方法。這裡我們也按照這個思路進行詳盡闡述。

2.1 資料集分析

在進行資料準備之前,我們先分析一下Pascal VOC資料集,以便之後分析得到整理資料的工作。個人認為這一部分還是非常重要的。

VOC資料是一個比較詳盡的資料集,現在主要是分為兩個部分,一個是VOC2007,一個是VOC2012。這個資料集能幹什麼呢?這個資料集能做影象分類、定位與檢測、影象語義分割。下面我們以VOC2012為例,分析一下這個資料集。如下圖所示是資料集的檔案結構。

這裡寫圖片描述

Annotation:

顧名思義,就是標註的意思。這個資料夾裡面儲存了該資料集所有影象的標註資訊。如下圖所示是每個影象的標註資訊。

1.  <annotation>  
2.      <folder>VOC2012</folder>  
3.      <filename>2007_000027.jpg</filename>  
4.      <source>  
5.          <database>The VOC2007 Database</database>  
6.          <annotation>PASCAL VOC2007</annotation>  
7.          <image>flickr</image>  
8.      </source>  
9.      <size>  
10.         <width>486</width>  
11.         <height>500</height>        # 影象大小
12.         <depth>3</depth>  
13.     </size>  
14.     <segmented>0</segmented>  
15.     <object>  
16.         <name>person</name>  
17.         <pose>Unspecified</pose>  
18.         <truncated>0</truncated>  
19.         <difficult>0</difficult>  
20.    # 一個 bounding box的位置,而且object是人
21.         <bndbox>  
22.             <xmin>174</xmin>  
23.             <ymin>101</ymin>  
24.             <xmax>349</xmax>      
25.             <ymax>351</ymax>   
26.         </bndbox>  
27.         <part>  
28.             <name>head</name>  
29.             <bndbox>  
30.                 <xmin>169</xmin>  
31.                 <ymin>104</ymin>  
32.                 <xmax>209</xmax>  
33.                 <ymax>146</ymax>  
34.             </bndbox>  
35.         </part>  

ImageSets:

這個檔案裡主要按照用途(影象分類、目標檢測、姿態估計、影象語義分割)進行分類,每個裡面內容主要是按照檔名對資料集進行劃分成訓練集和訓練集。存為了txt文字格式。

這裡寫圖片描述

2.2 資料準備

Step1:首先按照作者的提示,download資料集。如下圖所示。

1.  # Download the data.  
2.  cd $HOME/data  
3.  wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar  
4.  wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar  
5.  wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar  
6.  # Extract the data.  
7.  tar -xvf VOCtrainval_11-May-2012.tar  
8.  tar -xvf VOCtrainval_06-Nov-2007.tar  
9.  tar -xvf VOCtest_06-Nov-2007.tar 

最後解壓後生成如下圖所示的檔案結構,在生成VOCdevkit以
及下面的兩個VOC2007和VOC2013資料夾。
這裡寫圖片描述

Step2:生成LMDB file

1.  cd $CAFFE_ROOT  
2.  # Create the trainval.txt, test.txt, and test_name_size.txt in data/VOC0712/  
3.  ./data/VOC0712/create_list.sh  
4.  # You can modify the parameters in create_data.sh if needed.  
5.  # It will create lmdb files for trainval and test with encoded original image:  
6.  #   - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb  
7.  #   - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb  
8.  # and make soft links at examples/VOC0712/  
9.  ./data/VOC0712/create_data.sh  

執行如上程式碼,將在VOCdevkit中生成LMDB file,一個是test文
件,一個是train。

這裡寫圖片描述

Step3:訓練模型下載

因為時間和機器有限,我們直接可以執行demo,看看效果(我們自己訓練的效果也不一定有人家在coco+Pascal VOC上訓練得好)。在github上有資料集,下載07++12+coco: SSD300*, SSD512*.下載好後存放在model下。

1.  models/VGGNet  

具體結構如下所示。

這裡寫圖片描述

2.3 執行測試

經過上述準備後就可以進行測試了,我們用作者已經訓練好的模型,加上作者寫的指令碼。

1.  # If you would like to test a model you trained, you can do:  
2.  python examples/ssd/score_ssd_pascal.py  

但是我們準備的模型和資料夾名字可能不同,所以需要在score_ssd_pascal.py做相應的更改。具體請詳情看指令碼。如下所示就是執行的結果。

1.  I1214 11:23:19.188825 54587 solver.cpp:75] Solver scaffolding done.  
2.  I1214 11:23:19.192239 54587 caffe.cpp:155] Finetuning from models/VGGNet/VOC0712Plus/SSD_300x300_ft/VGG_VOC0712Plus_SSD_300x300_ft_iter_160000.caffemodel  
3.  I1214 11:23:20.062537 54587 net.cpp:761] Ignoring source layer mbox_loss  
4.  I1214 11:23:20.068641 54587 caffe.cpp:251] Starting Optimization  
5.  I1214 11:23:20.068656 54587 solver.cpp:294] Solving VGG_VOC0712Plus_SSD_300x300_ft_train  
6.  I1214 11:23:20.068661 54587 solver.cpp:295] Learning Rate Policy: multistep  
7.  I1214 11:23:20.175591 54587 solver.cpp:332] Iteration 0, loss = 4.1508  
8.  I1214 11:23:20.175637 54587 solver.cpp:433] Iteration 0, Testing net (#0)  
9.  I1214 11:23:20.200440 54587 net.cpp:693] Ignoring source layer mbox_loss  
10. I1214 11:25:45.889575 54587 solver.cpp:546]     Test net output #0: detection_eval = 0.822876  
11. I1214 11:25:45.889817 54587 solver.cpp:337] Optimization Done.  
12. I1214 11:25:45.889824 54587 caffe.cpp:254] Optimization Done.  

2.4 常見錯誤

2.4.1 記憶體溢位

check failed: error == cudaSuccess (2 vs. 0) out of memory

1.  F1214 20:57:45.526288 27356 parallel.cpp:85] Check failed: error == cudaSuccess (2 vs. 0)  out of memory  
2.  *** Check failure stack trace: ***  
3.      @     0x7fcf2dcb05cd  google::LogMessage::Fail()  
4.      @     0x7fcf2dcb2433  google::LogMessage::SendToLog()  
5.      @     0x7fcf2dcb015b  google::LogMessage::Flush()  
6.      @     0x7fcf2dcb2e1e  google::LogMessageFatal::~LogMessageFatal()  
7.      @     0x7fcf2e58d3b5  caffe::GPUParams<>::GPUParams()  
8.      @     0x7fcf2e58e109  caffe::P2PSync<>::P2PSync()  
9.      @           0x40ab33  train()  
10.     @           0x407350  main  
11.     @     0x7fcf2cc19830  __libc_start_main  
12.     @           0x407b79  _start  
13.     @              (nil)  (unknown)  
14. Aborted (core dumped)

這是由於GPU視訊記憶體不夠導致的,有幾個解決方案。

  • 如果是現在有程式在跑而佔用了記憶體,可以殺程序
  • 更改配置檔案的batch_size和accum_batch_size
1.   #Divide the mini-batch to different GPUs.    
2.  #batch_size = 32    
3.  #accum_batch_size = 32    
4.  batch_size = 8    
5.  accum_batch_size = 8    
6.  iter_size = accum_batch_size / batch_size    
7.  solver_mode = P.Solver.CPU    
8.  device_id = 0  

2.4.2 caffe 路徑編譯

1.  [[email protected] caffe]$ sh create_lmdbdata_scenetext.sh   
2.  Traceback (most recent call last):  
3.    File "/data/home/lisiqi/my_SSD/caffe/scripts/create_annoset.py", line 7, in <module>  
4.      from caffe.proto import caffe_pb2  
5.  ImportError: No module named caffe.proto  
6.  Traceback (most recent call last):  
7.    File "/data/home/lisiqi/my_SSD/caffe/scripts/create_annoset.py", line 7, in <module>  
8.      from caffe.proto import caffe_pb2  
9.  ImportError: No module named caffe.proto 

可能原因:這種情況一般是沒有把caffe中的和python相關的
內容的路徑新增到python的編譯路徑中。解決辦法:將Python路徑新增到~/.bashrc中,或者在source一下。

參考文獻