SSD(Single Shot MultiBox Detector):ubuntu16安装及训练自己的数据集(VOC2007格式)过程记录

安装SSD

# SSD代码clone到 caffe-ssd文件夹下
git clone --recursive https://github.com/weiliu89/caffe.git caffe-ssd
cd caffe-ssd
# 选择ssd分支
git checkout ssd

编译caffe

对于一个新的ubuntu系统,编译caffe需要安装相应依赖库,如果你成功编译过caffe和faster rcnn,就不需要再安装,这里略过。 关于编译caffe和faster rcnn的详细过程参见我之前博客《Ubuntu16:cmake生成Makefile编译caffe过程(OpenBLAS/CPU+GPU)》《cuda8+cuDNN Faster R-CNN安装塈运行demo》

$cd caffe-ssd
#如果没有cmake,要安装cmake
#$sudo apt-get install cmake
mkdir build && cd build
# 执行cmake生成Makefile
#编译CPU版本
#cmake -DCPU_ONLY=ON -DBLAS=Open .
#编译GPU版本
$cmake -DBLAS=Open -DCUDA_NVCC_FLAGS=--Wno-deprecated-gpu-targets ..
$make -j 8

下载预训练模型

下载预训练模型VGG_ILSVRC_16_layers_fc_reduced.caffemodel,放在 ./models/VGGNet/路径

下载地址 https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6

训练数据准备

我的训练数据集是按VOC2007格式生成的,为了最少修改ssd的代码,我的做法是用我自己的VOC2007数据集替换SSD训练用的VOC2007和VOC2012数据集。 在$home下创建一个data文件

cd ~
mkdir data
mkdir data/VOCdevkit
mkdir data/VOCdevkit/VOC2007

将自己的数据集复制在 VOC2007

ll VOC2007 drwxrwxr-x 6 guyadong guyadong 4096 4月 14 09:19 ./ drwxr-xr-x 3 guyadong guyadong 4096 4月 14 09:01 ../ drwxrwxr-x 2 guyadong guyadong 3846144 4月 13 17:14 Annotations/ drwxrwxr-x 3 guyadong guyadong 4096 4月 13 17:14 ImageSets/ drwxrwxr-x 2 guyadong guyadong 3809280 4月 13 17:14 JPEGImages/

在examples文件夹下创建VOC2007文件夹

cd caffe-ssd
mkdir examples/VOC2007

(请注意VOC2007这个名字,你可以不使用这个名字,但如果你要使用别的名字,请注意本文后面所有涉及VOC2007的地方都必须换成同样的名字)

修改lmdb生成脚本

复制data/VOC0712文件为VOC2007

 cd caffe-ssd/data
 cp -r VOC0712 VOC2007

修改caffe-ssd/data/VOC2007/create_list.sh如下 create_list.sh

#!/bin/bash

root_dir=$HOME/data/VOCdevkit/
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in trainval test
do
  dst_file=$bash_dir/$dataset.txt
  if [ -f $dst_file ]
  then
    rm -f $dst_file
  fi
  for name in VOC2007
  do
    #if [[ $dataset == "test" && $name == "VOC2012" ]]
    #then
    #  continue
    #fi
    echo "Create list for $name $dataset..."
    dataset_file=$root_dir/$name/$sub_dir/$dataset.txt

    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

下图是create_list.sh修改后版本与原版本的比对

修改caffe-ssd/data/VOC2007/create_data.sh如下: create_data.sh

cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..

cd $root_dir

redo=1
data_root_dir="$HOME/data/VOCdevkit"
dataset_name="VOC2007"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
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 $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name
done

下图是create_data.sh修改后版本与原版本的比对

labelmap_voc.prototxt用于定义标签(label),所以还要 根据你的目标检测要求修改caffe-ssd/data/VOC2007/labelmap_voc.prototxt,比如我的项目中是检测人脸,我的labelmap_voc.prototxt定义如下(label 0固定定义为背景): labelmap_voc.prototxt

item {
  name: "none_of_the_above"
  label: 0
  display_name: "background"
}
item {
  name: "face"
  label: 1
  display_name: "face"
}

修改训练脚本

用vim或gedit等文本编辑器打开 caffe-ssd/examples/ssd/ssd_pascal.py,将代码中所有的VOC0712替换为VOC2007,并保存文件, 找到num_classes = 21这一行,将数字改为1 + 类别数

找到num_test_image = 4952 将数字改为你测试集(test.txt)的数量

另外, 如果你只有一个GPU, 需要修改ssd_pascal.py ,找到gpus = "0,1,2,3”这一行改为 gpus = "0”,如果有两块GPU,则改为gpus = "0,1”,依此类推。

修改测试脚本

打开caffe-ssd/examples/ssd/ssd_pascal_webcam.py 将代码中所有的VOC0712替换为VOC2007 找到num_classes = 21这一行,将数字改为1 + 类别数

执行训练代码

修改完成后开始运行训练代码

python ./examples/ssd/ssd_pascal.py 

out of memory

训练过程可能比较漫长,如果训练过程出现out of memory错误,说明你的显卡显存不够,可以调整ssd_pascal.py中的来解决:找到batch_size = 32这一行,减少这个数字试试。 比如我的显卡GTX1060显存是6G,改为batch_size = 8才能进行训练。

#参考资料 《SSD安装及训练自己的数据集》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

基于网页的图像标注工具——imglab

【导读】imglab是一种基于Web的工具,用于标记可用于训练dlib或其他对象检测器的对象的图像。

1913
来自专栏ACM小冰成长之路

HDU-5984-Pocky

ACM模版 描述 ? 题解 这场比赛的期望概率成分好高,挺不顺手。 不过这个题的代码倒是很简单,强势猜公式推结论。 image.png 代码 #include ...

2069
来自专栏wOw的Android小站

[Tensorflow] Faster R-CNN 和自定义 VOC 数据集

看了pascal_voc.py代码,可以把代码的jpg拼接改成png,这样可以不做上一步.

3561
来自专栏Deep learning进阶路

caffe随记(八)---使用caffe训练FCN的pascalcontext-fcn32s模型(pascal-context数据集)

本篇讨论利用caffe进行FCN训练(采用的是pascal-context数据集) 1、下载FCN的框架 https://github.com/shelham...

4090
来自专栏ATYUN订阅号

Deepmind的星际争霸2强化学习教程(1):建立环境与训练模型

去年,DeepMind开源将星际争霸II的强化学习环境公之于众,很多人都为之兴奋。 https://deepmind.com/blog/deepmind-and...

3218
来自专栏思考的代码世界

Python网络数据采集之图像识别与文字处理|第10天

将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现 OCR 的底层库并不多,目前很多库都是使...

3778
来自专栏一个会写诗的程序员的博客

编程语言关系图谱 谁的影响力更大(图)

当前哪门语言衍生出的族群最大?本文作者依据Haskell上的统计数据,结合两种算法(Force Atlas + Force Atlas 2 + Fructerm...

771
来自专栏Y大宽

多序列比对,进化树分析,保守性,密码子偏好性分(1)

打开https://www.ncbi.nlm.nih.gov/protein,输入BopA,search

1462
来自专栏MixLab科技+设计实验室

以图搜图技术栈

先看个案例: ? 这是什么动画 https://whatanime.ga/ 一个用于通过动画截图找出处的搜索引擎。可以找到跟动画截图相似的动画片截图,并找到动画...

4378
来自专栏人工智能

基于自制数据集的MobileNet-SSD模型训练

“本文主要内容:基于自制的仿VOC数据集,利用caffe框架下的MobileNet-SSD模型训练。” 本文的base是https://github.com/c...

1.4K9

扫码关注云+社区