自定义数据集训练SSD-MobileNet模型

自定义数据集训练SSD-MobileNet模型

准备工作
caffe-ssd 模型编译成功,且在python下可以运行。

github 地址: https://github.com/weiliu89/caffe
github下载地址:https://github.com/chuanqi305/MobileNet-SSD
caffe下载后,进入ssd分支再编译。

git checkout ssd
  1. 制作自己的数据集
  2. 在MobileNet-SSD模型中生成对应的网络结构
  3. 更改网络结构的路径信息
  4. 数据训练

在caffe/data/VOC2017中,create_list.sh和create_data.sh脚本负责将VOC数据转换为LMDB数据格式。

  1. 更改create_list.sh里的路径信息
#!/bin/bash

root_dir=$HOME  ##该目录为caffe的根目录
sub_dir=ImageSets/Main				#存放训练数据,测试数据的 .txt文件的路径。
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in trainval test   ##trainval 和test为 sub_dir目录下的两个名称
do
  dst_file=$bash_dir/$dataset.txt
  if [ -f $dst_file ]
  then
    rm -f $dst_file
  fi
  for name in pcdata ###自己创建个文件夹 名称为这个 这个文件夹下有ImageSets/Main,Annotations里存放xml,JPEGImages存放图片
  do
    if [[ $dataset == "test" && $name == "VOC2012" ]]
    then
      continue
    fi
    echo "Create list for $name $dataset..."
    dataset_file=$root_dir/$name/$sub_dir/$dataset.txt   ###为了不改太多内容,将pcdata文件夹放在caffe的根目录下,即home下。

    img_file=$bash_dir/$dataset"_img.txt"
    cp $dataset_file $img_file
    sed -i "s/^/$name\/JPEGImages\//g" $img_file
    sed -i "s/$/.jpg/g" $img_file

    label_file=$bash_dir/$dataset"_label.txt"
    cp $dataset_file $label_file
    sed -i "s/^/$name\/Annotations\//g" $label_file
    sed -i "s/$/.xml/g" $label_file

    paste -d' ' $img_file $label_file >> $dst_file

    rm -f $label_file
    rm -f $img_file
  done

  # Generate image name and size infomation.
  if [ $dataset == "test" ]
  then
    $bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt" #如果脚本放在别处,需要更改。
  fi

  # Shuffle trainval file.
  if [ $dataset == "trainval" ]
  then
    rand_file=$dst_file.random
    cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
    mv $rand_file $dst_file
  fi
done

更改完在data文件夹下,运行create_list.sh。

(base) jdmking@jdmking-GL553VD:~/caffe/data/VOC0712$ sh create_list.sh 

运行后在该文件夹下生成三个.txt文件

在这里插入图片描述在这里插入图片描述
还有test_name_size.txt文件。

  1. 配置create_data.sh脚本
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir="$HOME/caffe"  ##caffe目录

cd $root_dir

redo=1
data_root_dir="$HOME"  ###caffe的根目录
dataset_name="pcdata"  ###文件夹名称
mapfile="/home/jdmking/$dataset_name/labelmap_voc.prototxt"  ###这里写的是绝对路径,这里把labelmap_voc.prototxt放在pcdata文件夹下
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=0
height=0

extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
then
  extra_cmd="$extra_cmd --redo"
fi
for subset in test trainval
do
  python $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir /home/jdmking/caffe/examples/MobileNet-SSD/$subset.txt /home/jdmking/pcdata/$db/$dataset_name"_"$subset"_"$db /home/jdmking/caffe/examples/$dataset_name
done
#####$subset.txt为上面生成的.txt文件,在配置create_list时,把create_list和create_data脚本放在了MobileNet-SSD目录下,
#####所以生成的.txt文件在MobileNet-SSD文件夹下。
###### /home/jdmking/pcdata/$db/$dataset_name"_"$subset"_"$db 为生成db文件的路径。
  1. SSD-MobileNet中生成网络结构
~/caffe/examples/MobileNet-SSD$ sh gen_model.sh 2

生成example文件夹,在该文件夹下更改MobileNetSSD_train.prototxt和MobileNetSSD_test.prototxt

data_param {
    source: "trainval_lmdb/" ###更改路径为trainval_lmdb存放的路径
    batch_size: 24     ###如果CPU,得将batch_size改小。
    backend: LMDB
  }
label_map_file: "labelmap.prototxt" ###更改路径
 data_param {
    source: "test_lmdb"   ##更改路径为test_lmdb存放的路径,test_lmdb和trainval_lmdb为目录,里面有两个db文件
    batch_size: 8
    backend: LMDB

label_map_file: "labelmap.prototxt" ###更改路径

在MobileNet-SSD下,配置solver_train.prototxt数据

~/caffe/examples/MobileNet-SSD$ vim solver_train.prototxt 
train_net: "example/MobileNetSSD_train.prototxt"
test_net: "example/MobileNetSSD_test.prototxt"
test_iter: 673  ##预测阶段的迭代次数
test_interval: 10000 ##训练时,每迭代10000步,进行一次预测。
base_lr: 0.0005  ##基础学习速率
display: 10  ##经过10次迭代后,一次log
max_iter: 120000 ##迭代最大步数
lr_policy: "multistep" 
gamma: 0.5   ##学习速率衰减情况
weight_decay: 0.00005
snapshot: 1000 ##每1000次打印一次快照
snapshot_prefix: "snapshot/mobilenet" ##存放路径
solver_mode: CPU ##选择
debug_info: false
snapshot_after_train: true
test_initialization: false
average_loss: 10
stepvalue: 20000
stepvalue: 40000
iter_size: 1
type: "RMSProp"
eval_type: "detection"
ap_version: "11point"

在/caffe/examples/MobileNet-SSD/中,配置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   ##如果是CPU, 这块删掉

训练:::

~/caffe/examples/MobileNet-SSD$ sh train.sh
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__JDM__

希望能得到您的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值