注意:首先要配置好环境,包括Ubuntu16.04+cuda8.0+cuDNN5.1+caffe+anaconda2+opencv3,并保证caffe编译通过。可参考我之前的博客进行安装编译。
一、安装SSD(caffe)
在想要安装ssd代码的目录下终端输入( 我这里是 ~/learning/):
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd (出现“分支”则说明copy-check成功)
为避免与系统的caffe混淆,这里将ssd的caffe文件夹更名为ssd-caffe,后面的操作都是在ssd-caffe目录下进行的。
二、配置SSD(caffe)
终端输入:
cd ~/learning/ssd-caffe
cp Makefile.config.example Makefile.config
打开Makefile.config,修改并保存退出。(因为我前面已经配置过caffe了,这里直接把自己配置过的caffe中的Makefile.config文件中修改的部分粘贴过来即可。)
需要额外更改的一处是:BLAS库的类型需要从SSD默认的OpenBlas更改为ATLAS:
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
# BLAS := open
终端输入:
cd ~/learning/ssd-caffe
mkdir build
cd build
cmake ..(cmake和..中间有一个空格)
make all -j8("‐j8"是使用 CPU 的多核进行编译,可以极大地加速编译的速度)
make install
make runtest(这一步不是必须的)
make pycaffe(编译pycaffe)
三、下载数据文件
1、 预训练模型下载
下载地址:链接:http://pan.baidu.com/s/1slpaEO9 密码:loxo
下载地址2:https://pan.baidu.com/s/1boPmTbT
在ssd-caffe/models文件夹下新建文件夹,命名为VGGNet,将刚刚下载下来的文件放入这个VGGNet文件夹当中。
2、下载VOC2007和VOC2012数据集
在主文件夹下(即 ~/)新建文件夹,命名为data
终端输入:
cd ~/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
解压这三个文件,终端输入:
cd /home/**(您服务器的名字)/data
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar(请严格按照这个顺序解压)
这里因为网络的问题,一般下得很慢,可以在百度云网盘中下载:
链接:http://pan.baidu.com/s/1c1AwrRy 密码:ly70
这些是VOC的训练集,方便大家自己去亲手操作训练。
四、生成LMDB文件
终端输入:
cd ~/learning/ssd-caffe
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
若data不是放在~目录下,则要进入create_list.sh和create_data.sh文件修改相应的路径。
在运行第三步时如果出现no module named caffe或者是no module named caffe-proto,则在终端输入:
export PYTHONPATH=$PYTHONPATH:/home/**(您服务器的名字)/ssd-caffe/python
这里是把ssd代码的caffe的python模块接入PYTHONPATH,配置的是ssd的caffe和python的接口。每次运行代码前最好都操作一遍。
然后再次运行第三步。
这里我加入ssd-caffe路径后,问题并没有解决。在这里记录后续的解决方案。
在终端输入
$python
<<import caffe发现报错No module named caffe。
解决方法:
sudo gedit ~/.bashrc
在文件下方写入export PYTHONPATH=~/caffe/python:$PYTHONPATH
上述语句中 “~” 号表示caffe所在的根目录。这是把系统caffe的python模块接入PYTHONPATH。
关闭文件,在终端写入下面语句,使环境变量生效:source ~/.bashrc
然后再在python里import caffe,发现错误变成No module named _caffe。
因此重新编译一次caffe,在caffe目录下,终端输入:make clean && make all -j8 && make pycaffe
然后再import caffe,发现错误变成No module named google.protobuf.internal。
因此,在anaconda2中安装protobuf最新版本,在终端中进入anaconda2,在其中运行:conda install protobuf
然后再import caffe,就没有问题了。
至此,问题完美解决。LMDB文件生成成功。
五、运行demo
1、下载官方的模型和网络文件
环境部署成功之后就开始demo的演示了,这里跳过自己训练的环节,直接用官方的模型和网络文件来先演示下demo,因此需要先下载作者已经训练好的模型。下载的官方模型文件夹名称为VOC0712,放入ssd-caffe/models/VGGNet/目录下,如下图所示。
2、演示demo
先推荐一个博客,可以参考这个博客进行demo演示: SSD: Single Shot MultiBox Detector检测单张图片
有多个demo,这里简单记录一些。
(1)演示detection的训练结果,包括5000多张图片。要先改里面的gpu个数,输出是分数。终端输入:
python examples/ssd/score_ssd_pascal.py(演示detection的训练结果,数值在0.718左右)
(2)演示单张图片的测试结果,python版本。点开examples/ssd/ssd_detect.ipynb,复制并保存为ssd_detect.py,然后修改里面的路径(包括$caffe_root和测试图片的路径),并在最后加上plt.show(),然后终端输入:
python examples/ssd/ssd_detect.py
(3)网络摄像头识别效果,需要接入摄像头才可以。终端输入:
python examples/ssd/ssd_pascal_webcam.py
(4)输出图片/视频的标注: 运行 examples/ssd/plot_detections.py,cpp版本。
ssd的C++检测图片程序是ssd_detect.cpp,我们在配置caffe阶段make all的时候,已经从ssd_detect.cpp生成了可执行的二进制文件,也就是ssd的C++接口程序,路径就在caffe/build/examples/ssd/ssd_detect.bin。
- 首先,终端输入:
$ cd ssd-caffe
$ build/examples/ssd/ssd_detect.bin #弹出ssd_detect.bin运行方法说明
ssd_detect.bin: Do detection using SSD mode.
Usage:
ssd_detect [FLAGS] model_file weights_file list_file
Flags from examples/ssd/ssd_detect.cpp:
-confidence_threshold (Only store detections with score higher than the
threshold.) type: double default: 0.01
-file_type (The file type in the list_file. Currently support image and
video.) type: string default: "image"
-mean_file (The mean file used to subtract from the input image.)
type: string default: ""
-mean_value (If specified, can be one value or can be same as image
channels - would subtract from the corresponding channel). Separated by
','.Either mean_file or mean_value should be provided, not both.)
type: string default: "104,117,123"
-out_file (If provided, store the detection results in the out_file.)
type: string default: ""
可以看到,该程序需要三个必选参数以及一些可选参数,必选参数是model_file–检测模型描述文件,weights_file–网络权值文件,list_file–待检测文件(格式为txt,里面列出检测图片/视频的路径)。可选参数包括阈值、文件格式、均值文件、图片均值、输出文件这些,都有解释,一看就懂。
运行一个命令试试:
$ cd ssd-caffe
$ 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 examples/images/test.txt
其中test.txt内容为
examples/images/cat.jpg
examples/images/fish-bike.jpg
examples/images/cropped_panda.jpg
“examples/images/cat.jpg”,是待检测图片的路径,可以写多行。
运行成功将得到图片的检测结果,类似:examples/images/cat.jpg 8 0.999853 163 38 350 358
把0.5分以上的检测结果保存到 example/images/result.txt中:
examples/images/cat.jpg 8 0.999429 169 26 347 356
examples/images/fish-bike.jpg 2 0.717551 52 81 448 307
examples/images/fish-bike.jpg 15 0.99994 204 3 344 170
examples/images/cropped_panda.jpg 12 0.975958 0 1 95 97
examples/images/cat.jpg 8 0.999429 169 26 347 356
- 将检测结果可视化为带框图片
也就是运行examples/ssd/plot_detections.py文件。打开这个py文件,找一下接口部分:
if name == “main“:
parser = argparse.ArgumentParser(
description = “Plot the detection results output by ssd_detect.”)
parser.add_argument(“resultfile”,
help = “A file which contains all the detection results.”)
parser.add_argument(“imgdir”,
help = “A directory which contains the images.”)
parser.add_argument(“–labelmap-file”, default=”“,
help = “A file which contains the LabelMap.”)
parser.add_argument(“–visualize-threshold”, default=0.01, type=float,
help = “Display detections with score higher than the threshold.”)
parser.add_argument(“–save-dir”, default=”“,
help = “A directory which saves the image with detection results.”)
parser.add_argument(“–display-classes”, default=None,
help = “If provided, only display specified class. Separate by ‘,’”)
可以看到,包含2个必选参数和4个可选参数。必选参数是检测结果文件txt、原始图片文件夹;可选参数有labelmap.prototxt、筛选阈值、保存路径、特定的类别(比如只显示汽车的检测结果)。
因此终端输入:
$ python examples/ssd/plot_detections.py examples/images/result.txt /home/yanting/learning/ssd-caffe --labelmap-file data/VOC0712/labelmap_voc.prototxt --save-dir examples/
因为txt中已经有了图片路径,/home/yanting/learning/ssd-caffe 这里写绝对路径。
然后就在examples文件夹下找到了三张图片,已经画好框,大功告成。
错误一:ImportError: No module named model_libs (或者 _caffe、caffe.proto)
原因及解决方法:环境变量中python路径没有设置正确,要将PYTHONPATH设置为SSD中caffe目录下的python,修改“~./bashrc”文件,加上python路径,并source一下即可解决。
命令行echo $PYTHONPATH
查看路径是否已更改为ssd-caffe的python路径。
演示(1)时遇到报错,如下所示:
百思不得其解。出错的原因总结起来有三类:
a.可能是网络结构配置有问题,如在修改网络时输出有两个bottom, 可能只写了一个。
b.是在保存caffemodels的时候出错
c.gpu内存不足
六、训练测试演示
1、 训练
打开ssd-caffe/examples/ssd/ssd_pascal.py这个文件,找到gpus=’0,1,2,3’这一行,如果您的服务器有一块显卡,则将123删去,如果有两个显卡,则删去23,以此类推。如果您服务器没有gpu支持,则注销以下几行,程序会以cpu形式训练。(这个是解决问题cudasuccess(10vs0)的方法)
#if num_gpus >0:
# batch_size_per_device =int(math.ceil(float(batch_size) / num_gpus))
#iter_size =int(math.ceil(float(accum_batch_size) / (batch_size_per_device * num_gpus)))
# solver_mode =P.Solver.GPU
# device_id =int(gpulist[0])
保存后终端运行:
cd ~/learning/ssd-caffe
python examples/ssd/ssd_pascal.py #训练
如果出现问题cudasuccess(2vs0)则说明您的显卡计算量有限,再次打开caffe/examples/ssd/ssd_pascal.py这个文件,找到batch_size =32这一行,修改数字32,可以修改为16,或者8,甚至为4(相信大家这个修改可以理解,我就不作说明了),保存后再次终端运行 python examples/ssd/ssd_pascal.py
错误:训练时出现 Check fialed: error == cudaSuccess(2 vs. 0)out of memory
原因及解决方法:GPU显存被程序占用或者之前的进程没有正常结束,占用着GPU显存,使得用GPU训练时显存不足,用nvidia-smi命令查看占用显存的进程PID,用kill -9 [PID]强制杀死进程。
2、 测试
重复第五部分的演示demo步骤即可。
七、训练和测试自己的数据集
未完待续。。
https://www.cnblogs.com/EstherLjy/p/6863890.html这里写链接内容
1.生成训练和测试数据
我们自己的数据基本是jpeg或者其他图片格式的,而caffe输入的一般是LMDB的数据,所以我们要进行转换。我们转换的方法是
A.将图像用工具进行标注(工具这里先不介绍),得到txt标注文件
B.将txt文件和图片转换成VOC格式(用脚本)
C.将VOC格式转换为LMDB格式,利用SSD示例代码提供的转换脚本。
(1) 在
cafferoot/data/VOCdevkit目录下创建ljytest目录,该目录中存放自己转换完成的VOC数据集;(2)
CAFFE_ROOT/examples目录下创建ljy_test目录;
(3) $CAFFE_ROOT/data目录下创建ljy_test目录,同时将data/VOC0712下的create_list.sh,create_data.sh,labelmap_voc.prototxt
这三个文件copy到ljy_test目录下,分别重命名为create_list_ljy_test.sh,create_data_ljy_test.sh, labelmap_ljy_test.prototxt
(4) 对上面新生成的两个create文件进行修改,主要修改是将VOC0712相关的信息替换成ljy_test
修改后的两个文件分别如下:
然后修改labelmap_indoor.prototxt,将该文件中的类别修改成和自己的数据集相匹配,注意需要保留一个label 0 , background类别
完成上面步骤的修改后,可以开始LMDB数据数据的制作,在$CAFFE_ROOT目录下分别运行:
./data/ljy_test/create_list_indoor.sh
./data/ljy_test/create_data_indoor.sh
命令执行完毕后,可以在$CAFFE_ROOT/examples/ljy_test目录下查看转换完成的LMDB数据数据。
2.训练
A.将预训练好的模型放在$CAFFE_ROOT/models/VGGNet下(我们这里在运行SSD示例代码的4已经放过了,可以省略)
B.将 cafferoot/examples/ssd/ssdpascal.py拷贝到自己的文件夹 caffe_root/examples/ljy_test/下,并重命名为ssd_pascal_ljy.py
C.修改ssd_pascal_ljy.py为自己的各个路径,其中要在$caffe_root/models/VGGNet/下建立ljy_test文件夹,修改如下:
D.执行训练代码。在$caffe_root下打开命令行,并输入
python examples/ljy_test/ssd_pascal_ljy.py
等待训练就可以了…
有可能遇到loss=nan的情况,这个待议,正常情况下是下面酱紫的:
3.测试
A.c++版本的测试
跟上面ssd示例测试的差不多,改一下路径即可
B.python版本的测试
同最上面