caffe train mobilenet ssd


原文链接: 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
    

    创建数据集软链接:

    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
    

把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.protxtsovler_test.protxt文件,
默认使用example目录下的训练模型和测试模型;

如果需要指定GPU和初始化权重,可以修改目录下的train.shtest.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.prototxtMobileNetSSD_deploy.caffemodel 拷贝到Tengine平台的models目录下,此时运行mobilenet_ssd/MSSD用的就是新训练好的模型啦!

`