hans

hans

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


前言#

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

还有两个问题待解决:

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

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

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

一、数据集收集、整理#

参考: 【SSD】用 caffe-ssd 框架自带 VGG 网络训练自己的数据集

用的到的东西如图:

1668713770093.jpg

二、下载 MobileNet 相关文件#

路径自己看着弄。

三、生成 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。

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

运行命令:

sh gen_model.sh 7

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

生成的文件在 example 目录下。

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

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

transform_param {
    scale: 0.007843
    force_color: true  ###添加
    mean_value: 127.5
    mean_value: 127.5
    mean_value: 127.5

具体报错内容可以看我上一篇博客 【SSD】用 caffe-ssd 框架自带 VGG 网络训练自己的数据集

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

四、修改 solver.prototxt 文件#

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

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

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

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

但是训练阶段没问题的。

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

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

五、训练脚本#

#!/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)#

参考: 【SSD】用 caffe-ssd 框架自带 VGG 网络训练自己的数据集

七、测试模型效果(2017.11.03)#

参考: 【SSD】用 caffe-ssd 框架自带 VGG 网络训练自己的数据集

后记#

为什么一用 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/16dw-dJ779By9AWdiSOxSuQ

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 文件开头为:

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 格式

#!/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 中

#!/bin/sh

TOOLS=/home/hans/caffe/build/tools

$TOOLS/compute_image_mean doc/train_lmdb_mean doc/mean.binaryproto 2>&1 | tee doc/mean.txt

echo "Done."
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。