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

本文详细记录了在Windows环境下配置与使用SSD模型的过程,包括搭建环境、数据准备、模型训练与目标检测等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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的常识,多少也算有点用处。
<think>好的,我需要回答用户关于如何使用Caffe框架在SSD模型上训练自定义数据集的问题。首先,我得回忆一下SSD模型和Caffe框架的基本知识。SSD(Single Shot MultiBox Detector)是一种目标检测模型,它通过单次前向传播即可预测多个边界框和类别概率,效率较高。Caffe是一个流行的深度学习框架,适合图像处理任务。 接下来,用户的需求是训练自定义数据集,所以我需要列出具体的步骤。首先,用户需要准备数据,包括标注和格式转换。常见的标注格式是VOC或COCO,但Caffe SSD可能使用LMDB格式。因此,可能需要将标注转换为VOC格式,再使用Caffe提供的脚本转换为LMDB。这部分需要详细说明,可能涉及数据目录的结构,比如Annotations、ImageSets、JPEGImages等文件夹。 然后是修改模型配置文件。SSD的配置文件通常包括网络结构定义和训练参数。用户需要根据自己数据集的类别数调整参数,比如num_classes,以及数据层的路径。这一步可能需要用户编辑prototxt文件,比如修改solver.prototxt中的学习率、迭代次数等。 接下来是准备标签映射文件,即labelmap.prototxt,其中列出所有类别标签,包括背景。需要提醒用户确保类别ID从1开始,因为0通常保留给背景。 然后是编译Caffe和SSD的支持。用户可能需要从GitHub克隆SSD的Caffe分支,并按照说明编译。这里可能需要安装依赖项,比如CUDA、OpenCV等,并执行make命令。如果用户的环境配置有问题,可能会遇到困难,但问题中可能不需要详细的环境配置步骤,除非用户后续提问。 启动训练时,使用caffe train命令指定solver文件。需要提醒用户检查路径是否正确,以及GPU是否可用。如果训练过程中出现错误,可能需要检查数据路径、标签文件格式是否正确。 评估和测试部分需要用户使用测试集评估模型,并可能进行可视化。这里可以提到使用Python脚本加载模型,进行推理,并绘制检测框。 最后,生成相关问题,需要考虑用户可能遇到的后续问题,比如数据增强、多GPU训练、模型部署等。同时,根据用户提供的引用链接,可能需要引用相关的GitHub资源,比如预训练模型集合或手写识别系统,但需要确保引用与内容相关。 在组织回答时,要结构清晰,分步骤说明,并使用代码块展示关键命令或脚本修改。同时,注意使用中文,并正确应用LaTeX格式,比如变量用$符号包裹。需要检查是否有遗漏的步骤,例如数据预处理、调整锚框大小等,但根据时间和复杂性,可能先提供主要步骤,相关问题可涵盖更详细的问题。 最后,确保引用正确,用户提供的引用链接中,引用[1]是关于CV预训练模型的,可能在提供预训练模型部分提到;引用[3]中的GitHub链接可能与工具或示例代码相关,但需要合理引用。需要确认引用的相关性,避免无关引用。</think>以下是使用Caffe框架在SSD模型上训练自定义数据集的步骤详解: --- ### **1. 数据准备** - **标注格式**:将标注转换为PASCAL VOC格式(包含XML文件)或COCO格式,建议使用$labelImg$等工具标注[^1] - **目录结构**: ```bash custom_dataset/ ├── Annotations/ # 存放XML标注文件 ├── ImageSets/ # 包含train.txt, val.txt等文件,列出图像名称 └── JPEGImages/ # 存放原始图像 ``` - **转换为LMDB**:使用Caffe SSD提供的脚本转换数据为LMDB格式: ```bash python data/VOC0712/create_list.py python data/VOC0712/create_data.py ``` --- ### **2. 修改模型配置文件** - **调整类别数**:在$SSD\_prototxt$文件中修改`num_classes`参数,例如目标类别数为$N$时设为$N+1$(包含背景类)[^2] - **修改路径**:在`train.prototxt`和`test.prototxt`中更新数据层路径: ```protobuf data_param { source: "examples/custom_dataset/lmdb/train_lmdb" batch_size: 32 } ``` --- ### **3. 准备标签映射文件** 创建`labelmap.prototxt`文件定义类别标签: ```protobuf item { name: "background" label: 0 } item { name: "cat" label: 1 } item { name: "dog" label: 2 } ``` --- ### **4. 编译Caffe-SSD** 克隆SSD分支并编译: ```bash git clone https://github.com/weiliu89/caffe.git cd caffe git checkout ssd make -j8 ``` --- ### **5. 启动训练** 执行训练命令(指定预训练模型): ```bash ./build/tools/caffe train \ --solver=models/custom_ssd/solver.prototxt \ --weights=models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel \ --gpu=0 ``` --- ### **6. 评估与测试** 使用`test.prototxt`评估模型精度: ```bash python examples/ssd/score_ssd_pascal.py ``` --- ### **关键代码示例(solver.prototxt)** ```protobuf base_lr: 0.001 lr_policy: "multistep" gamma: 0.1 stepvalue: 30000, 50000 max_iter: 60000 snapshot: 5000 snapshot_prefix: "models/custom_ssd/ssd_model" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值