【SSD】用caffe-ssd框架MobileNet网络训练自己的数据集




前言

上一篇博客写了用作者提供的VGG网络完整走完一遍流程后,马上开始尝试用MobileNet训练。

还有两个问题待解决:

1.均值问题。【2017.11.20 解决此问题】

2.无法用MobileNet提供的caffemodel做finetune。 【2017.11.3解决此问题】

【2017.11.03更新】成功转换成ncnn格式。

一、数据集收集、整理

参考:http://blog.csdn.net/renhanchi/article/details/78411095

用的到的东西如图:


二、下载MobileNet相关文件

https://github.com/chuanqi305/MobileNet-SSD

路径自己看着弄。


三、生成train.prototxt、test.prototxt、deploy.prototxt

这里哦,我需要提前说点事儿。

1. 默认有一个MobileNet_deploy.prototxt,没有batch_norm层。可以跟官网提供的caffemodel一起用。

2. template里面有四个文件。两个deploy,一个train,一个test。

    经验证,train和test跟一会我们自己生成的网络结构一致。

    但我们不用template目录中的东西,因为后面几层num_output需要自己手动改。麻烦!

作者提供了两个工具用于生成prototxt文件。一个是gen.py一个是gen_model.sh。

我倾向用后者,操作简单点。

运行命令:

[python] view plain copy
print ?
  1. sh gen_model.sh 7  
sh gen_model.sh 7

后面接的数字是类别数+1。

生成的文件在example目录下。


这里有一点哦,如果你的数据集里面不完全是RGB三通道的。

那么你要修改train.prototxt和test.prototxt文件:

[python] view plain copy
print ?
  1. transform_param {  
  2.     scale: 0.007843  
  3.     force_color: true  ###添加  
  4.     mean_value: 127.5  
  5.     mean_value: 127.5  
  6.     mean_value: 127.5  
transform_param { 
scale: 0.007843
force_color: true ###添加
mean_value: 127.5
mean_value: 127.5
mean_value: 127.5

具体报错内容可以看我上一篇博客 http://blog.csdn.net/renhanchi/article/details/78411095

然后再分别修改文件中source和label_map_file的路径,尽量用绝对路径。


四、修改solver.prototxt文件

我直接拿来solver_train.prototxt用的,路径改好,尽量用绝对路径。其他参数自己看着改吧。

这里说一下坑了半天的一个问题吧。

一开始为了排错,我习惯性设置test_initialization为true。

然后就一直提示Couldn’t find ant detections。

但是训练阶段没问题的。

后来明白问题所在,因为我没有finetune,所以一开始val阶段并不能检测到任何东西。

将test_initialization 设置为false后,先训练一段时间后再val,就不会提示找不到东西了。


五、训练脚本

[python] view plain copy
print ?
  1. #!/bin/sh  
  2.   
  3. /home/hans/caffe-ssd/build/tools/caffe train \  
  4. –solver=”/home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/doc/solver_train.prototxt \  
  5. -gpu 6 2>&1 | tee /home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/MobileNet-SSD.log  
#!/bin/sh

/home/hans/caffe-ssd/build/tools/caffe train \
--solver="/home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/doc/solver_train.prototxt \
-gpu 6 2>&1 | tee /home/hans/data/ImageNet/Detection/cup/MobileNet-SSD/MobileNet-SSD.log


根据下面2017.11.03更新的内容可以看出,训练结束后,要通过作者提供的工具将bn层和conv层参数merge到一起,以加快计算速度。

修改merge_bn.py中路径和文件名。

新生成的模型应该会比原始模型稍微小一点。

六、训练输出可视化(2017.11.02)

参考: http://blog.csdn.net/renhanchi/article/details/78411095


七、测试模型效果(2017.11.03)

参考:http://blog.csdn.net/renhanchi/article/details/78411095



后记

为什么一用pre_trained model做finetune就报错!!!!!说conv0输入数量不对(1 vs.  2)。应该是1,结果传入2个???我各种对比检查了train.prototxt和test.prototxt文件,然并卵!!!!


——-【2017.11.3解决不能finetune的问题】——-

终于找到原因!

我把现在能做finetune的模型和deploy文件放出来。

https://pan.baidu.com/s/1eS4aPGI

github上作者放出两个caffemodel,一个是训练时候的,这个模型bn层和cnov层参数是分开的。一个是deploy的,这个模型将bn层和conv层参数merge到一起了。

作者的原话是merge后的模型速度会快一点。


——-【2017.11.3成功转换成ncnn格式】———

https://github.com/arlose/ncnn-mobilenet-ssd

.param文件建议就用上面作者提供的吧。如果是自己训练的数据的话,把类别数改一下就好了,一共要改八处。

自己转换过来的有两个问题,

一是缺少头两层Input和Split,这个问题要修改deploy.prototxt文件开头为:

[python] view plain copy
print ?
  1. layer {  
  2.   name: ”data”  
  3.   type: ”Input”  
  4.   top: ”data”  
  5.   input_param { shape: { dim: 1 dim: 3 dim: 300 dim: 300 } }  
  6. }  
layer { 
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 3 dim: 300 dim: 300 } }
}

二是后面几层的处理像素变成了600*600。

.bin 文件一定要用经过merge.py处理过的caffemodel转换!


——-【2017.11.16更新】———

晕了我之前一直在用6月刚发布的ncnn,

这两天移植工作交给我才发现官方的ncnn已经加入ssd的支持。

并且还加入的模型压缩,虽然只是从计算位数上做的压缩,并且对效果会有折扣,但也是很实用的。


——-【2017.11.20更新】———

自带make_mean.sh并不能求均值,发现有两个转lmdb工具,一个带annotation,一个不带。

ssd用的带annotation工具中detection方法转换的。

我就用老方法求了均值,使用build/tools/convert_imageset 和 build/tools/compute_iamge_mean

shell脚本代码:

先把图片转换成普通lmdb格式

[python] view plain copy
print ?
  1. #!/bin/sh  
  2. set -e  
  3.   
  4. size=300  
  5.   
  6. TOOLS=/home/hans/caffe/build/tools  
  7. cur_dir=(cd&nbsp; (cd&nbsp; ( dirname {BASH_SOURCE[<span class="number">0</span><span>]}&nbsp;)&nbsp;&amp;&amp;&nbsp;pwd&nbsp;)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>DATA_ROOT=<span class="string">" {BASH_SOURCE[<span class="number">0</span><span>]}&nbsp;)&nbsp;&amp;&amp;&nbsp;pwd&nbsp;)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>DATA_ROOT=<span class="string">" {cur_dir}/data/”  
  8. FILE_PATH={cur_dir}/doc"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>echo&nbsp;<span class="string">"Creating&nbsp;train&nbsp;lmdb..."</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>GLOG_logtostderr=<span class="number">1</span><span>&nbsp; {cur_dir}/doc"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>echo&nbsp;<span class="string">"Creating&nbsp;train&nbsp;lmdb..."</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>GLOG_logtostderr=<span class="number">1</span><span>&nbsp; TOOLS/convert_imageset \  
  9.     –resize_height=size&nbsp;\&amp;amp;amp;amp;nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;--resize_width= size&nbsp;\&amp;amp;amp;amp;nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;--resize_width= size \  
  10.     –shuffle=false \  
  11.     DATA_ROOT&nbsp;\&amp;amp;amp;amp;nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; DATA_ROOT&nbsp;\&amp;amp;amp;amp;nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; FILE_PATH/train.txt \  
  12.     $FILE_PATH/train_lmdb_mean  
#!/bin/sh 
set -e

size=300

TOOLS=/home/hans/caffe/build/tools
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )

DATA_ROOT="${cur_dir}/data/"
FILE_PATH="${cur_dir}/doc"

echo "Creating train lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$size \
--resize_width=$size \
--shuffle=false \
$DATA_ROOT \
$FILE_PATH/train.txt \
$FILE_PATH/train_lmdb_mean


计算均值,并将输出保存到mean.txt中

[python] view plain copy
print ?
  1. #!/bin/sh  
  2.   
  3. TOOLS=/home/hans/caffe/build/tools  
  4.   
  5. $TOOLS/compute_image_mean doc/train_lmdb_mean doc/mean.binaryproto 2>&1 | tee doc/mean.txt  
  6.   
  7. echo ”Done.”  

                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,这里简单介绍一下如何使用caffe-ssd训练模型进行目标检测。 caffe-ssd是基于caffe框架实现的单阶段目标检测算法,使用预训练模型可以加快模型训练的速度,同时也可以提高模型的检测精度。下面是使用预训练模型做目标检测的步骤: 1. 下载预训练模型 caffe-ssd官方提供了一些预训练模型,可以在这里下载:https://github.com/weiliu89/caffe/tree/ssd#models。选择适合自己数据集的模型进行下载。 2. 准备数据集 准备自己的数据集,包括训练集、验证集和测试集。数据集需要满足SSD数据格式要求,即每个样本需要有对应的标注文件,标注文件格式为:类别id、xmin、ymin、xmax、ymax(例如:0 0.1 0.2 0.3 0.4,表示类别为0,左上角坐标为(0.1, 0.2),右下角坐标为(0.3, 0.4))。 3. 修改配置文件 修改caffe-ssd的配置文件,将模型路径、数据路径、类别数等参数配置正确。其中,模型路径需要指定为下载的预训练模型路径。 4. 训练模型 使用修改后的配置文件训练模型。训练过程中可以调整学习率、迭代次数等参数,以达到更好的效果。 5. 测试模型 使用测试集对训练好的模型进行测试,并计算模型在测试集上的精度和召回率等指标。 以上就是使用caffe-ssd训练模型做目标检测的基本步骤。需要注意的是,使用预训练模型虽然可以加速模型训练过程,但是如果数据集和预训练模型的差异较大,仍然需要进行微调。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值