目标检测算法SSD之训练自己的数据集

目标检测算法SSD之训练自己的数据集

prerequesties 预备知识/前提条件

下载和配置了最新SSD代码

git clone https://github.com/weiliu89/caffe ~/work/ssd
cd $_
git checkout ssd

编译caffe

下载必要的模型(包括prototxt和caffemodel);

运行了evaluation和webcam的例子,会提示caffe的import报错。添加pycaffe路径到PYTHONPATH环境变量,或者写一个_init_paths.py来辅助引入都可以(推荐后者)。

准备自己的数据集

做成VOC2007格式的:

JPEGImages/*.png
ImageSets/Main/*.txt
Annotations/*.xml

这3个目录

生成训练用的lmdb数据

我这里数据集名叫traffic_sign,放在/home/chris/data/traffic_sign

1.复制原有脚本文件

cd ~/work/ssd
cp -R data/VOC0712 data/traffic_sign

2.修改data/traffic_sign/create_list.sh

#!/bin/bash

#root_dir=$HOME/data/VOCdevkit/
root_dir=$HOME/data/
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" #当前文件所在目录
for dataset in train test
do
  dst_file=$bash_dir/$dataset.txt
  if [ -f $dst_file ]
  then
    rm -f $dst_file
  fi
  for name in traffic_sign
  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/$/.png/g" $img_file     #在行尾追加.png后缀

    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   #在行尾追加.xml后缀

    paste -d' ' $img_file $label_file >> $dst_file  #img_file和label文件的对应行拼接

    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 train file.
  if [ $dataset == "train" ]
  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

3.修改data/traffic_sign/create_data.sh

#!/bin/bash

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

cd $root_dir

redo=1
data_root_dir="$HOME/data"
#dataset_name="VOC0712"
dataset_name="traffic_sign"
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=png --encoded"
if [ $redo ]
then
  extra_cmd="$extra_cmd --redo"
fi
for subset in test train
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

4.修改data/traffic_sign/labelmap_voc.prototxt

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

5.生成数据

# 确保你还是在ssd代码根目录,比如我是~/work/ssd
./data/traffic_sign/create_list.sh
./data/traffic_sign/create_data.sh

执行训练

依然需要修改ssd默认的训练脚本内容,来匹配自己的数据集。

1.复制原有训练脚本

cd ~/work/ssd
cd examples/ssd
cp ssd_pascal.py ssd_traffic.py

2.修改训练脚本

编辑ssd_traffic.py内容,修改:

  • 数据集指向
    train_datatest_data , 指向examples中你的数据,例如:

    train_data = "examples/traffic_sign/traffic_sign_train_lmdb"
    test_data = "examples/traffic_sign/trainffic_sign_test_lmdb"

    这里很奇怪,我的examples/traffic_sign/目录下确实有这两个lmdb的文件夹,是指向~/data/traffic_sign/lmdb/目录下的两个lmdb文件夹,但是训练时提示lmdb错误。

换成链接文件的源文件,也就是写绝对路径,就不报错了。

  • 测试图像数量

num_test_image 该变量修改成自己数据集中测试数据图片的数量

  • 类别数

num_classes 该变量修改成自己数据集中 标签类别数量数 + 1

  • gpu选项

gpus = "0,1,2,3" 电脑有几个gpu就写多少个,如果有一个就写gpus="0",两个就写gpus="0,1",以此类推

  • 迭代次数
solver_param = {
    ...
    'stepvalue': [50000, 60000, 70000],
    'max_iter': 70000,
    'snapshot': 10000,
}
  • 各种VOC0712换成自己数据集的名字(我的是traffic_sign)

    model_name = "VGG_traffic_sign_{}".format(job_name)
    save_dir = "models/VGGNet/traffic_sign/{}".format(job_name)
    snapshot_dir =
    job_dir =
    name_size_file =
    label_map_file = 
  • batch_size
    比如6G显存的970显卡,跑不起来SSD。修改:

    batch_size = 16   # 32->16
    accum_batch_size = 16  # 32->16

    此时显存占用为4975MiB

如果你显存很大,与其闲置不如使用它,调大batch_size即可

  • base_lr
    调整了batch_size或单纯因为数据集的原因,导致出现loss为nan的情况,考虑减小学习率,这里通过减小base_lr实现。

3.执行训练

```bash
cd ~/work/ssd #务必到ssd的根目录执行
python examples/ssd/ssd_traffic.py

reference

https://my.oschina.net/u/1046919/blog/777470

时间: 2024-07-31 08:24:05

目标检测算法SSD之训练自己的数据集的相关文章

深度学习 目标检测算法 SSD 论文简介

  深度学习 目标检测算法 SSD 论文简介    一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf  Slides:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf 二.代码训练测试: https://github.com/weiliu89/caffe/tree/ssd        一.论文算法大致流程: 1.类似"anchor"机制:  

物体检测算法 SSD 的训练和测试

物体检测算法 SSD 的训练和测试    GitHub:https://github.com/stoneyang/caffe_ssd  Paper: https://arxiv.org/abs/1512.02325    1. 安装 caffe_SSD: git clone https://github.com/weiliu89/caffe.git cd caffe git checkout ssd 2. 编译该 caffe 文件,在主目录下: # Modify Makefile.config

从零开始码一个皮卡丘检测器-CNN目标检测入门教程(上)

本文先为大家介绍目前流行的目标检测算法SSD (Single-Shot MultiBox Object Detection)和实验过程中的数据集.训练.测试过程及结果参见<从零开始码一个皮卡丘检测器-CNN目标检测入门教程(下)> 目标检测通俗的来说是为了找到图像或者视频里的所有目标物体.在下面这张图中,两狗一猫的位置,包括它们所属的类(狗/猫),需要被正确的检测到. 所以和图像分类不同的地方在于,目标检测需要找到尽量多的目标物体,而且要准确的定位物体的位置,一般用矩形框来表示. 在接下来的章

《中国人工智能学会通讯》——11.13 三维目标检测与模型重建一体化算法

11.13 三维目标检测与模型重建一体化算法 学界在三维目标检测识别和三维模型重建两个方向均开展了大量研究,现有三维目标识别算法大多采用基于模型的策略,需要预先得到感兴趣目标的三维模型[7] ,而现有三维模型重建算法均只应用于单个物体的点云,尚无法从多个包含背景的场景点云中重建出独立的三维物体.针对此,本文在假定目标在场景中存在移动的前提下,提出一种新的三维模型重建.目标检测及姿态估计一体化算法[8] .该算法可在无先验知识的情况下检测出场景中的未知目标,并从包含背景的点云中完成目标的三维模型重

一文读懂深度学习框架下的目标检测(附数据集)

从简单的图像分类到3D位置估算,在机器视觉领域里从来都不乏有趣的问题.其中我们最感兴趣的问题之一就是目标检测. 如同其他的机器视觉问题一样,目标检测目前为止还没有公认最好的解决方法.在了解目标检测之前,让我们先快速地了解一下这个领域里普遍存在的一些问题. 目标检测 vs 其他计算机视觉问题图像分类 在计算机视觉领域中,最为人所知的问题便是图像分类问题. 图像分类是把一幅图片分成多种类别中的一类.  ImageNet是在学术界使用的最受欢迎的数据集之一,它由数百万个已分类图像组成,部分数据用于Im

目标检测101:一文带你读懂深度学习框架下的目标检测

从简单的图像分类到3D位置估算,在机器视觉领域里从来都不乏有趣的问题.其中我们最感兴趣的问题之一就是目标检测. 如同其他的机器视觉问题一样,目标检测目前为止还没有公认最好的解决方法.在了解目标检测之前,让我们先快速地了解一下这个领域里普遍存在的一些问题. 目标检测 vs 其他计算机视觉问题图像分类 在计算机视觉领域中,最为人所知的问题便是图像分类问题. 图像分类是把一幅图片分成多种类别中的一类. ImageNet是在学术界使用的最受欢迎的数据集之一,它由数百万个已分类图像组成,部分数据用于Ima

复旦、清华和英特尔中国研究院ICCV新作:完全脱离预训练模型的目标检测方法

最近,由复旦大学.清华大学和英特尔中国研究院合作提出的一种新型的目标检测方法 (DSOD) 被国际计算机视觉顶级会议ICCV 2017接收.论文标题为:DSOD: Learning Deeply Supervised Object Detectors from Scratch. 论文地址:https://arxiv.org/abs/1708.01241.论文代码:https://github.com/szq0214/DSOD. 论文在Arxiv放出之后,在社交网络上引起广泛关注.本文对这个工作做

ILSVRC2016目标检测任务回顾——视频目标检测(VID)

雷锋网(公众号:雷锋网)按:本文作者王斌,中科院计算所前瞻研究实验室跨媒体计算组博士生,导师张勇东研究员.2016年在唐胜副研究员的带领下,作为计算所MCG-ICT-CAS团队核心主力队员(王斌.肖俊斌),参加了ImageNet大规模视觉识别挑战赛(ILSVRC)的视频目标检测(VID)任务并获得第三名.目标检测相关工作受邀在ECCV 2016 ImageNet和COCO竞赛联合工作组会议(ImageNet and COCO Visual Recognition Challenges Joint

看了这篇文章,了解深度卷积神经网络在目标检测中的进展

近些年来,深度卷积神经网络(DCNN)在图像分类和识别上取得了很显著的提高.回顾从 2014 到 2016 这两年多的时间,先后涌现出了 R-CNN,Fast R-CNN, Faster R-CNN, ION, HyperNet, SDP-CRC, YOLO,G-CNN, SSD 等越来越快速和准确的目标检测方法. 1. 基于 Region Proposal 的方法 该类方法的基本思想是:先得到候选区域再对候选区域进行分类和边框回归.  1.1 R-CNN[1] R-CNN 是较早地将 DCNN