Ubuntu上配置SSD-caffe+运行demo+训练测试自己的数据集

来源:互联网 发布:2017淘宝规则 编辑:程序博客网 时间:2024/05/21 09:59

注意:首先要配置好环境,包括Ubuntu16.04+cuda8.0+cuDNN5.1+caffe+anaconda2+opencv3,并保证caffe编译通过。可参考我之前的博客进行安装编译。

一、安装SSD(caffe)

在想要安装ssd代码的目录下终端输入( 我这里是 ~/learning/):

git clone https://github.com/weiliu89/caffe.gitcd caffegit checkout ssd (出现“分支”则说明copy-check成功)

为避免与系统的caffe混淆,这里将ssd的caffe文件夹更名为ssd-caffe,后面的操作都是在ssd-caffe目录下进行的。

二、配置SSD(caffe)

终端输入:

cd ~/learning/ssd-caffecp 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 OpenBlasBLAS := atlas# BLAS := open

终端输入:

cd ~/learning/ssd-caffemkdir buildcd buildcmake ..(cmake和..中间有一个空格)make all -j8("‐j8"是使用 CPU 的多核进行编译,可以极大地加速编译的速度)make installmake 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 ~/datawget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

解压这三个文件,终端输入:

cd /home/**(您服务器的名字)/datatar -xvf VOCtrainval_11-May-2012.tartar -xvf VOCtrainval_06-Nov-2007.tartar -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-caffepython 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/VOCdevkitljytestVOC(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.pycaffe_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版本的测试

同最上面

阅读全文
0 0
原创粉丝点击