SSD训练自己数据遇到的问题

1在windows上面训练和测试ssd的方法很少,而且配置也相当之麻烦,搞了几天才调试成功。现在写一下过程分享到博客上,顺便也可以作为今后再次安装的参考。我的配置环境:

windows: 10 
gpu: Titan X 
cuda: 8.0 
caffe: caffe-ssd-microsoft 
python: 2.7.13
Caffe-SSD的编译与配置

编译这部分不打算详细展开,网上有很多教程,CPU的较多,下面会给出好用的参考教程。这里推荐一下caffe-ssd-microsoft版本而不是caffe-windows加上caffe-ssd的修改版(网上一些教程是这么改的),两个方法都可以,我这里采用的就是单用caffe-ssd-microsoft的版本。

caffe-ssd-microsoft下载:

https://github.com/conner99/caffe
配置的参考博客链接:

http://blog.csdn.net/buaalei/article/details/54668507
http://www.jianshu.com/p/9a84cc434e05
这两个可以配合着看,尤其GPU部分推荐看第二个博客。反正我前前后后不停地编译不停地改。

配置caffe-ssd-microsoft

编译libcaffe模块

这个就参考上面给的博客就可以了,我就遇到下面几个问题: 
1. 添加3rdparty的hungarian.h和cpp 
在这里找这个两个文件,链接:http://pan.baidu.com/s/1mhYuf7y 密码:3jp2 
2. 注释掉 detection_output_layer.hpp和detection_output_layer.cu和detection_output_layer.cpp有关regex 的引用和语句 
3. C/C++ –> 常规 里的将警告提示为错误修改 为 否

编译caffe模块

libcaffe编译成功后,再进行caffe的编译,注意点就是要添加opencv的引用目录和库目录。这个不难。

编译pycaffe模块

这个可选,如果想用python接口的话这个是必须编译的,注意的是首先要配置好下面两个库的引用和库目录 
1. python库目录 
2. opencv库目录 
之后进行google的protobuf的配置,这个不配置会报错的。

配置protobuf

配置参考:

http://www.jianshu.com/p/0c563b2c0fdb
选择python2的环境
下载protobuf.3.0.0: 
下载链接:

https://github.com/google/protobuf/releases/tag/v3.0.0
下载两个包:protobuf-python-3.0.0.zip 以及 protoc-3.0.0-win32.zip 
protobuf-python-3.0.0为protobuf的安装包 
protoc-3.0.0-win32包含protobuf的编译器protoc的win32版本,用以编译*.proto文件。

下载后将protoc-3.0.0-win32\bin\protoc.exe 复制到protobuf-3.0.0\src\ 
用cmd进入到protoc-3.0.0\python目录,运行 python setup.py build,生成大量*.py,如下命令

    python setup.py build
1
然后再分别写入下面两个命令就可以了。

    python setup.py test
    python setup.py intall
1
2
最后在python环境下,import caffe不报错就表明安装成功。显示如下: 


然后再进行编译pycaffe,编译成功后将Build/x64/Release/pycaffe下的caffe文件夹拷贝到Anancoda下面的Lib\site-packages下即可(因为我装的是Anancoda,其他的也可以找到对应的包目录)。

编译get_image_size和convert_annoset模块

跟前面类似,都是配置好opencv的引用就可以了,目的是为了之后VOC数据的训练准备用的工具。由于我都是单项目启动的,所以都是一个一个配置。 
注意事项:

NuGet包里面的opencv默认是2.4.10,以及支持的python都是2.7版本的,如果是opencv3以上的,需要将NuGet包里对应的opencv卸载,重新搜素Opencv3进行配置。python的话最好是用python2,如果没有可以安装MiniAnaconda进行双环境配置,其实Ananconda也可以实现两个环境。
附送一个python2和python3环境可以切换的安装方法,是基于Ananconda的

http://blog.csdn.net/infin1te/article/details/50445217
至此前期的配置和准备都已经完成,下一部分是开始SSD的训练和检测部分。

GPU编译的一些问题

CPU照着之前给的教程能很顺利的通过编译,但是GPU我遇到了一些没有过的问题,有下面几个: 
1.caffe.TransformationsParameters has no filed named “distort_param”。 
 
发现在caffe_pd_h中,对比原Caffe-ssd分支项目中,确实没有两组参数DistortionParamter和ExpansionParameter。我的解决方法就是从caffe-ssd/src/proto中的caffe.pb.cc复制过去,然后会报错:

解决方法: 就是将报错的文件都从原ssd文件中赋值过去。这样就能编译通过了。

还有一种解决方法就是按照前面的第二个博客链接(Caffe-Windows+SSD)的方法进行,但是会有其他的一些问题。

2.cudnn路径没配置好导致的错误,在CommonSettings.props中,如果已经将cudnn的include和lib都已经合在Cuda中,则去掉Cudnn的路径;另一种方法就是写入正确的Cudnn路径。参考博客:

http://blog.csdn.net/zb1165048017/article/details/51549105
3.错误:error MSB4062:未能从程序集 C:\NuGetPackages\gflags.2.1.2.1 ….coapp.NuGetNativeMSBuildTask.dll 加载任务NuGetPackageOverlay…. 如下: 
 
解决方法:进入到对应的glog.0.3.3.0/build/native,打开glog.targets,到末尾注释掉这个有关的UsingTask和相应的ProtertyGroup下的内容: 


这三个问题解决后,GPU版本的libcaffe就编译成功了 


SSD(single-shot-multibox)模型的训练和检测

这一部分的参考教程不多,这是其中一个:

http://blog.csdn.net/muwu5635/article/details/60874721
训练部分

VOC0712的lmdb数据准备

下载地址:

http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar 
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar 
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
在data\VOC0712下按照上述的顺序依次解压VOC文件,得到当前目录下的VOC2007和VOC2012两个文件夹。

get_image_size.bat

从data\VOC0712下复制get_image_size.bat到caffe-ssd-microsoft根目录下,这里要修改对应的caffe的路径名称: 


修改后,运行后得到生成test_name_size.txt文件。下面这个结果就是运行成功的结果: 


create_data.bat

接着同样复制data/VOC0712下的create_data.bat文件到caffe的根目录,修改正确的路径,执行后得到lmdb的数据。下面这幅图就是生成成功的结果: 


训练

这里有两种方法,一个用python接口调用VOC0712下ssd_pascal.py和score_ssd_pascal.py来生成相应的训练和测试网络文件,及是否采用GPU计算等参数的设置。另一个就是类似常用windows下实现minst的方法直接调用caffe.exe或者bat文件调用。不过都要准备两个东西:训练的prototxt和一个预训练的VGGNet的网络。 
 
其中SSD_300x300包含:deploy.prototxt、solver.prototxt、train.prototxt和test.prototxt。 
下载地址:

https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6
下载后将网络模型放在下面的目录下:

caffe-ssd-microsoft/models/VGGNet/VOC0712/
然后同样在caffe目录下新建一个ssd_pascal.bat文件,内容如下:

Build\x64\Release\caffe.exe train --solver
=models\VGGNet\VOC0712\SSD_300x300\solver.prototxt -weights
=model\VGGNet\VOC0712\VGG_ILSVRC_16_layers_fc_reduced.caffemodel
1
2
3
记得修改train和test两个prototxt里面的source路径。

运行后会报错,如下错误 
Check failed: a<=b(0 vs -1.19209-007)

sgd_solver.cpp:106] Iteration 13100,lr = 0.001
math_functions.cpp:250] Check failed: a <= b <0 vs -1.19209e-007>
*** Check failure stack trace ***.
1
2
3
解决方法是找到对应的cpp,注释掉下面的语句: 


之后就没问题问题了,开始训练: 


GPU下的训练

将solver.prototxt里面的模式改成GPU,同样的运行ssd_pascal.bat就可以了。但是当时遇到了一个问题,训练过程中损失函数loss=1.#QNAN,这明显是错误的结果: 


但是这个问题无法定位,所以最后采取的方法就是从作者的ssd文件中将layer相关的都替换了,但是又出现了新的问题: 
caffe.pb.h中提示错误:error: expected an identifier. 
这个错误是由于当时没在bbox_util.cu中注释掉thrust相关的内容导致。

//#include "thrust/functional.h"
//#include "thrust/sort.h"
.....
//thrust::sort_by_key(&confidence[0],&confidence[0]+num_remain,&idx[0],
//thrurst::greater<Dtype>());*/
1
2
3
4
5
这个问题是由于前面的编译没注意导致的。最后编译成功后,训练时的正确结果是: 
 
我设置的最大轮数是60000次,不过也要几个小时。

检测部分

检测有两种方法,一种用python接口,另一种就是工程下面的ssd_detect项目。前面训练好的模型会保存在以下位置:

models\VGGNet\VOC0712\SSD_300x300
第一种方法,因为前面已经编译了pycaffe模块很简单,打开jupyter notebook,进入到examples文件夹下,打开ssd_detect.ipynb,一路运行下去就可以了,最后的结果如下 


第二种方法,需要对源文件做一点修改,分为下面两个步骤

编译ssd_detect模块

找到ssd_detect.cpp,添加如下显示检测结果的代码:

 
修改完后进行编译,得到exe文件。

ssd_detect.bat

跟前面的bat文件路径一致,添加如下内容

.\Build\x64\Release\ssd_detect.exe models\VGGNet\VOC0712\SSD_300x300\deploy.prototxt
models\VGGNet\VOC0712\SSD_300x300\VGG_VOC0712
_SSD_300x300_iter_60000.model 
models\VGGNet\VOC012\SSD_300x300\test.txt
–file_type image 
confidence_threshold 0.5 
pause
这里要注意的是修改deploy.prototxt里面的output_directory路径,同时test.txt存的是检测图片的路径。

检测结果

最后会在cmd中显示目标的位置和confidence,并显示目标框。 
 
如果是多张图片,就在test.txt里面依次写入图片路径即可,同样每一幅图片的结果都会显示出来 


总结

整个过程真的很折磨,很多头疼的问题,总之还是觉得不要在windows下跑比较好,坑太多,ubuntu下更加友好。不过在整个过程中也算可以知道该如何准备数据和识别,以及了解一些Caffe的常识,多少也算有点用处。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSD(Single Shot MultiBox Detector)是一种基于深度学习的目标检测算法,它可以在一张图像中同时检测出多个不同类别的物体。但是,SSD目标检测也会遇到一些问题,下面介绍几个常见的问题及解决方法: 1. 物体尺度问题SSD在检测物体时,需要对物体进行不同尺度的检测,但是如果物体的尺度非常小或非常大,就会导致检测精度下降。解决方法是使用多个不同尺度的特征图进行检测,同时设计不同尺度的锚点框(anchor box)来匹配不同尺度的物体。 2. 物体遮挡问题:当物体被其他物体遮挡时,SSD会出现漏检或误检的情况。解决方法是使用多层次的特征图进行检测,同时使用非极大值抑制(NMS)算法来过滤掉重复的检测结果。 3. 类别不平衡问题:在实际场景中,不同类别的物体数量可能差异很大,这会导致SSD对于数量较少的类别的检测精度较低。解决方法是使用类别平衡的损失函数,或者使用难例挖掘(hard example mining)的方法来增加模型对于难以检测的物体的学习能力。 4. 数据问题SSD的检测精度很大程度上取决于训练数据集的质量和数量。如果数据集不够全面、准确,或者样本数量不足,就会影响SSD的检测效果。解决方法是使用更多的数据进行训练,或者使用数据增强(data augmentation)的方法来增加训练数据的数量和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值