caffe train mobilenet ssd
训练MobileNet-SSD
安装Caffe_ssd并用自己的数据训练MobileNetSSD模型 - 幽冥之花的博客 - CSDN博客
训练
下载MobileNet-SSD源码:
直接用git克隆仓库到examples目录下
cd $CAFFE_ROOT/examples git clone https://github.com/chuanqi305/MobileNet-SSD.git
- 或者到我的网盘上下载并解压到caffe的examples目录下:blog-share/mobilenet_ssd/MobileNet-SSD.zip | 百度网盘
创建数据集软链接:
export TRAINVAL_LMDB=$HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb/ export TEST_LMDB=$HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb/ cd $CAFFE_ROOT/examples/MobileNet-SSD ln -s $TRAINVAL_LMDB ./trainval_lmdb ln -s $TEST_LMDB ./test_lmdb
- 或者到我的网盘上下载并解压到caffe的examples目录下:blog-share/mobilenet_ssd/MobileNet-SSD.zip | 百度网盘
把VOC的标签映射文件复制过来:
cp $CAFFE_ROOT/data/VOC0712/labelmap_voc.prototxt $CAFFE_ROOT/examples/MobileNet-SSD/labelmap.prototxt
生成模型文件:
./gen_model.sh 21
这里21指的是VOC的21个类别(含负样本),生成的模型文件默认放置在example
目录下;
如果需要修改训练参数和测试参数,可以分别修改目录下的solver_train.protxt
和sovler_test.protxt
文件,
默认使用example
目录下的训练模型和测试模型;
如果需要指定GPU和初始化权重,可以修改目录下的train.sh
或test.sh
文件,以train.sh
为例:
#!/bin/sh
if ! test -f example/MobileNetSSD_train.prototxt ;then
echo "error: example/MobileNetSSD_train.prototxt does not exist."
echo "please use the gen_model.sh to generate your own model."
exit 1
fi
mkdir -p snapshot
../../build/tools/caffe train -solver="solver_train.prototxt" \
-weights="mobilenet_iter_73000.caffemodel" \
-gpu 0
weights
参数指定初始化的权重文件,这里用了chuanqi305预训练迭代了73000次的模型;gpu
参数指定使用的gpu,多个gpu可以用逗号隔开;
除此之外,如果需要继续之前中断的训练,还可以指定snapshot
参数,
比如我想从最近的快照继续训练,可以这样修改train.sh
——
#!/bin/sh
latest=$(ls -t snapshot/*.caffemodel | head -n 1)
if ! test -f example/MobileNetSSD_train.prototxt ;then
echo "error: example/MobileNetSSD_train.prototxt does not exist."
echo "please use the gen_model.sh to generate your own model."
exit 1
fi
mkdir -p snapshot
../../build/tools/caffe train -solver="solver_train.prototxt" \
-snapshot=$latest \
-gpu 0
[](https://hey-yahei.cn/2018/08/21/mssd-try1/index.html#%E9%83%A8%E7%BD%B2 "部署")部署
合并BN层:
训练后会在snapshot
目录下产生一个相应的caffemodel
文件;
按实际情况修改merge_bn.py
文件并执行:
[ 1] import numpy as np
[ 2] import sys,os
[ 3] caffe_root = '/your/caffe/root/path/'
[ 4] sys.path.insert(0, caffe_root + 'python')
[ 5] import caffe
[ 6]
[ 7] train_proto = 'example/MobileNetSSD_train.prototxt' # 训练时所用的模型文件
[ 8] train_model = 'mobilenet_iter_73000.caffemodel' # 训练后产生的caffemodel文件
[ 9]
[10] deploy_proto = 'example/MobileNetSSD_deploy.prototxt' # 部署时所要用的模型文件(去掉BN层)
[11] save_model = 'MobileNetSSD_deploy.caffemodel' # 最终生成的caffemodel文件(合并BN层参数)
生成的合并BN层后的caffemodel就在MobileNet-SSD项目的根目录下;
编辑example/MobileNetSSD_deploy.prototxt
修改输入层,即把
input: "data"
input_shape {
dim: 1
dim: 3
dim: 300
dim: 300
}
改为
layer {
name: "input"
type: "Input"
top: "data"
input_param {
shape {
dim: 1
dim: 3
dim: 300
dim: 300
}
}
}
把 example/MobileNetSSD_deploy.prototxt
和 MobileNetSSD_deploy.caffemodel
拷贝到Tengine平台的models
目录下,此时运行mobilenet_ssd/MSSD
用的就是新训练好的模型啦!