写在前面
最近学习了SSD目标检测算法,并对SSD进行配置和测试。有时间会对SSD算法进行具体介绍和分析,下面是配置和实验SSD时的记录和趟过的一些坑。
一 安装配置
1 下载源码。
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd
2 安装依赖,参考Caffe官网指导。
3 编译。
# 根据你的Caffe installation更改Makefile.config,需要特别注意CUDA_ARCH的配置,后面会讲到。
cp Makefile.config.example Makefile.config
make -j8
# Make sure to include $CAFFE_ROOT/python to your PYTHONPATH.
make py
make test -j8
# (Optional)
make runtest -j8
4 如果上述步骤一切顺利,恭喜,佩服你人品。由于操作系统版本、依赖库版本、显卡版本等差异,中间往往会遇到各种问题。其中我遇到的问题放在了问题汇总小结。
二 训练测试
1 下载Fully Convolutional Reduced VGGNet,解压到$CAFFE_ROOT/models/VGGNet/下。
2 下载VOC2007和VOC2012数据集。
# Download the data.
cd $HOME/data
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
# Extract the data.
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
3 创建LMDB文件。
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
4 训练
# It will create model definition files and save snapshot models in:
# - $CAFFE_ROOT/models/VGGNet/VOC0712/SSD_300x300/
# and job file, log file, and the python script in:
# - $CAFFE_ROOT/jobs/VGGNet/VOC0712/SSD_300x300/
# and save temporary evaluation results in:
# - $HOME/data/VOCdevkit/results/VOC2007/SSD_300x300/
# It should reach 77.* mAP at 120k iterations.
python examples/ssd/ssd_pascal.py
5 评估
# If you would like to test a model you trained, you can do:
python examples/ssd/score_ssd_pascal.py
# If you would like to attach a webcam to a model you trained, you can do:
python examples/ssd/ssd_pascal_webcam.py
6 如使用其他库训练,参照data/OTHERDATASET,推荐使用examples/ssd.ipynb来检查新训练库是否正确的配置。
三 进行检测
1 可以使用上述自己训练好的模型或者论文作者在这里给出的训练好的模型。examples/ssd_detect.ipynb或者examples/ssd/ssd_detect.cpp给出了如何使用SSD模型进行检测的细节。
./build/examples/ssd/ssd_detect.bin models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_120000.caffemodel IMG.LIST #检测例子,其他IMG.LIST给出了待检测图像或视频的列表。
2 examples/ssd/plot_detections.py给出了如何利用ssd_detect的输入绘制检测结果的细节。
四 问题汇总
1 编译过程遇到Check failed: error == cudaSuccess (10 vs. 0) invalid device function问题。原因多在于CUDA_ARCH的配置。Linux下使用lspci | grep VGA
查看显卡型号,从这里,找到对应自己显卡的计算能力然后对CUDA_ARCH进行配置,注释掉高于自己显卡计算能力的部分。
2 编译过程遇到json_parser_read.hpp:257:264: error: ‘type name’ declared as function returning an array escape问题。看有人说升级GCC到5.3以上,不要盲目试,看自己系统如果是Ubuntu 14或者之下,升级后还有很多依赖库不兼容,会很麻烦。正确的姿势是不动系统的编译环境,修改json_parser_read.hpp文件。
sudo vi /usr/include/boost/property_tree/detail/json_parser_read.hpp
将257行开始的escape代码段注释掉即可。
3 安装boost依赖失败(sudo apt-get install libboost-all-dev
),出现The following packages have unmet dependencies: libboost-all-dev : Depends: libboost-iostreams-dev but it is not going to be installed等错误。解决方法是用aptitude安装。
sudo aptitude install libboost-all-dev
4 运行example/ssd/ssd_pascal.py出现syncedmem.cpp:78 Check failed: error == cudaSuccess (8 vs. 0) out of memory问题。修改ssd_pascal.py中的gpus="0,1,2,3"为你GPU的数目。由于只有一块GPU,修改为gpus="0"。继续运行可能还会出现out of memory的错误,如果你的显卡内存比较小的话。修改ssd_pascal.py文件中的batch_size为更小的数目(原始值是32).
5 出现protobuf兼容等问题,下载protobuf,用系统编译器进行编译安装,然后用protoc命令重新生成caffe/.build_release/src/caffe/proto/中的caffe.pb.cc等文件。
6 和Anaconda一起使用。建议先make完成以后再安装Anaconda(安装过的话make之前先注释掉Anaconda的PATH)。然后使用conda install protobuf
安装protobuf依赖。
参考
[1] SSD开源项目
[2] syncedmem.cpp:78 Check failed: error == cudaSuccess (2 vs. 0) out of memory
[3] Caffe安装指导