淘先锋技术网

首页 1 2 3 4 5 6 7

本次实验利用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

修改Makefile.config的相关配置

//Step1: 取消CPU的注释 8
CPU-ONLY := 

//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版安装

开源网址:https://github.com/weiliu89/caffe/tree/ssd

1. 拷贝Makefile.config

2. fix hdf5 naming problem

https://gist.github.com/wangruohui/679b05fcd1466bb0937f

==report problem:==

==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-rc3
/usr/bin/ld: cannot find -lopenblas
collect2: error: ld returned  exit status
Makefile:: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed
make: *** [.build_release/lib/libcaffe.so-rc3] Error 


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

安装openblas

#如果有sudo权限:

sudo apt-get install libopenblas-base
#否则 

github下载源码
make -j 

安装成功后,继续在终端输入安装目录:
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-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++版本太低的原因,只需要升级到以上就可以了。详情参见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数据集。如下图所示。

  # Download the data.  
  cd $HOME/data  
  wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-tar  
  wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-tar  
  wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-tar  
  # Extract the data.  
  tar -xvf VOCtrainval_11-May-tar  
  tar -xvf VOCtrainval_06-Nov-tar  
  tar -xvf VOCtest_06-Nov-tar 

最后解压后生成如下图所示的文件结构,在生成VOCdevkit以
及下面的两个VOC2007和VOC2013文件夹。
这里写图片描述

Step2:生成LMDB file

  cd $CAFFE_ROOT  
  # Create the trainval.txt, test.txt, and test_name_size.txt in data/VOC0712/  
  ./data/VOC0712/create_list.sh  
  # You can modify the parameters in create_data.sh if needed.  
  # It will create lmdb files for trainval and test with encoded original image:  
  #   - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb  
  #   - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb  
  # and make soft links at examples/VOC0712/  
  ./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 运行测试

经过上述准备后就可以进行测试了,我们用作者已经训练好的模型,加上作者写的脚本。

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

但是我们准备的模型和文件夹名字可能不同,所以需要在score_ssd_pascal.py做相应的更改。具体请详情看脚本。如下所示就是运行的结果。

  I1214 ::  solver.cpp:] Solver scaffolding done.  
  I1214 ::  caffe.cpp:] Finetuning from models/VGGNet/VOC0712Plus/SSD_300x300_ft/VGG_VOC0712Plus_SSD_300x300_ft_iter_160000.caffemodel  
  I1214 ::  net.cpp:] Ignoring source layer mbox_loss  
  I1214 ::  caffe.cpp:] Starting Optimization  
  I1214 ::  solver.cpp:] Solving VGG_VOC0712Plus_SSD_300x300_ft_train  
  I1214 ::  solver.cpp:] Learning Rate Policy: multistep  
  I1214 ::  solver.cpp:] Iteration , loss =   
  I1214 ::  solver.cpp:] Iteration , Testing net (#0)  
  I1214 ::  net.cpp:] Ignoring source layer mbox_loss  
 I1214 ::  solver.cpp:]     Test net output #0: detection_eval = 0.822876  
 I1214 ::  solver.cpp:] Optimization Done.  
 I1214 ::  caffe.cpp:] Optimization Done.  

2.4 常见错误

这里总结了几个常见的错误。下面blog总结得比较好。
http://blog.csdn.net/u013250416/article/details/78676784

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.  [lisiqi@l22-240-142 caffe]$ sh create_lmdbdata_scenetext.sh   
2.  Traceback (most recent call last):  
    File "/data/home/lisiqi/my_SSD/caffe/scripts/create_annoset.py", line , in <module>  
      from caffe.proto import caffe_pb2  
  ImportError: No module named caffe.proto  
  Traceback (most recent call last):  
    File "/data/home/lisiqi/my_SSD/caffe/scripts/create_annoset.py", line , in <module>  
      from caffe.proto import caffe_pb2  
  ImportError: No module named caffe.proto 


可能原因:这种情况一般是没有把caffe中的和python相关的
内容的路径添加到python的编译路径中。解决办法:将Python路径添加到~/.bashrc中,或者在source一下。

参考文献

[1] 源码地址在github:https://github.com/weiliu89/caffe/tree/ssd

[2] 常见问题连接:http://blog.csdn.net/u013250416/article/details/78676784


<网页blog已经上线,一大波干货即将来袭:https://faiculty.com/>