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

prerequesties 预备知识/前提条件

下载和配置了最新SSD代码

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

编译caffe

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

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

准备自己的数据集

做成VOC2007格式的:

  1. JPEGImages/*.png
  2. ImageSets/Main/*.txt
  3. Annotations/*.xml

这3个目录

生成训练用的lmdb数据

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

1.复制原有脚本文件

  1. cd ~/work/ssd
  2. cp -R data/VOC0712 data/traffic_sign

2.修改data/traffic_sign/create_list.sh

  1. #!/bin/bash
  2. #root_dir=$HOME/data/VOCdevkit/
  3. root_dir=$HOME/data/
  4. sub_dir=ImageSets/Main
  5. bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" #当前文件所在目录
  6. for dataset in train test
  7. do
  8. dst_file=$bash_dir/$dataset.txt
  9. if [ -f $dst_file ]
  10. then
  11. rm -f $dst_file
  12. fi
  13. for name in traffic_sign
  14. do
  15. if [[ $dataset == "test" && $name == "VOC2012" ]]
  16. then
  17. continue
  18. fi
  19. echo "Create list for $name $dataset..."
  20. dataset_file=$root_dir/$name/$sub_dir/$dataset.txt
  21. img_file=$bash_dir/$dataset"_img.txt"
  22. cp $dataset_file $img_file
  23. sed -i "s/^/$name\/JPEGImages\//g" $img_file #在行首插入目录名
  24. sed -i "s/$/.png/g" $img_file #在行尾追加.png后缀
  25. label_file=$bash_dir/$dataset"_label.txt"
  26. cp $dataset_file $label_file
  27. sed -i "s/^/$name\/Annotations\//g" $label_file #在行首插入目录名
  28. sed -i "s/$/.xml/g" $label_file #在行尾追加.xml后缀
  29. paste -d' ' $img_file $label_file >> $dst_file #img_file和label文件的对应行拼接
  30. rm -f $label_file
  31. rm -f $img_file
  32. done
  33. # Generate image name and size infomation.
  34. if [ $dataset == "test" ]
  35. then
  36. $bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
  37. fi
  38. # Shuffle train file.
  39. if [ $dataset == "train" ]
  40. then
  41. rand_file=$dst_file.random
  42. cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
  43. mv $rand_file $dst_file
  44. fi
  45. done

3.修改data/traffic_sign/create_data.sh

  1. #!/bin/bash
  2. cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
  3. root_dir=$cur_dir/../..
  4. cd $root_dir
  5. redo=1
  6. data_root_dir="$HOME/data"
  7. #dataset_name="VOC0712"
  8. dataset_name="traffic_sign"
  9. mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
  10. anno_type="detection"
  11. db="lmdb"
  12. min_dim=0
  13. max_dim=0
  14. width=0
  15. height=0
  16. extra_cmd="--encode-type=png --encoded"
  17. if [ $redo ]
  18. then
  19. extra_cmd="$extra_cmd --redo"
  20. fi
  21. for subset in test train
  22. do
  23. 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
  24. done

4.修改data/traffic_sign/labelmap_voc.prototxt

  1. item {
  2. name: "none_of_the_above"
  3. label: 0
  4. display_name: "background"
  5. }
  6. item {
  7. name: "sign"
  8. label: 1
  9. display_name: "sign"
  10. }

5.生成数据

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

执行训练

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

1.复制原有训练脚本

  1. cd ~/work/ssd
  2. cd examples/ssd
  3. cp ssd_pascal.py ssd_traffic.py

2.修改训练脚本

编辑ssd_traffic.py内容,修改:

  • 数据集指向

    train_datatest_data , 指向examples中你的数据,例如:
  1. train_data = "examples/traffic_sign/traffic_sign_train_lmdb"
  2. 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",以此类推

  • 迭代次数
  1. solver_param = {
  2. ...
  3. 'stepvalue': [50000, 60000, 70000],
  4. 'max_iter': 70000,
  5. 'snapshot': 10000,
  6. }
  • 各种VOC0712换成自己数据集的名字(我的是traffic_sign)
  1. model_name = "VGG_traffic_sign_{}".format(job_name)
  2. save_dir = "models/VGGNet/traffic_sign/{}".format(job_name)
  3. snapshot_dir =
  4. job_dir =
  5. name_size_file =
  6. label_map_file =
  • batch_size

    比如6G显存的970显卡,跑不起来SSD。修改:
  1. batch_size = 16 # 32->16
  2. accum_batch_size = 16 # 32->16

此时显存占用为4975MiB

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

  • base_lr

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

3.执行训练

  1. cd ~/work/ssd #务必到ssd的根目录执行
  2. python examples/ssd/ssd_traffic.py
  3. ## reference
  4. https://my.oschina.net/u/1046919/blog/777470

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

  1. 目标检测算法SSD在window环境下GPU配置训练自己的数据集

    由于最近想试一下牛掰的目标检测算法SSD.于是乎,自己做了几千张数据(实际只有几百张,利用数据扩充算法比如镜像,噪声,切割,旋转等扩充到了几千张,其实还是很不够).于是在网上找了相关的介绍,自己处理数 ...

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

    深度学习 目标检测算法 SSD 论文简介 一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf  Slides:http://w ...

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

    物体检测算法 SSD 的训练和测试 GitHub:https://github.com/stoneyang/caffe_ssd Paper: https://arxiv.org/abs/1512.02 ...

  4. 增量学习不只有finetune,三星AI提出增量式少样本目标检测算法ONCE | CVPR 2020

    论文提出增量式少样本目标检测算法ONCE,与主流的少样本目标检测算法不太一样,目前很多性能高的方法大都基于比对的方式进行有目标的检测,并且需要大量的数据进行模型训练再应用到新类中,要检测所有的类别则需 ...

  5. 基于深度学习的目标检测算法:SSD——常见的目标检测算法

    from:https://blog.csdn.net/u013989576/article/details/73439202 问题引入: 目前,常见的目标检测算法,如Faster R-CNN,存在着速 ...

  6. 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)

    不多说,直接上干货! 本文一系列目标检测算法:RCNN, Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码. •   RCNN RCN ...

  7. 目标检测算法的总结(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、FNP、ALEXnet、RetianNet、VGG Net-16)

    目标检测解决的是计算机视觉任务的基本问题:即What objects are where?图像中有什么目标,在哪里?这意味着,我们不仅要用算法判断图片中是不是要检测的目标, 还要在图片中标记出它的位置 ...

  8. 如何使用 pytorch 实现 SSD 目标检测算法

    前言 SSD 的全称是 Single Shot MultiBox Detector,它和 YOLO 一样,是 One-Stage 目标检测算法中的一种.由于是单阶段的算法,不需要产生所谓的候选区域,所 ...

  9. (七)目标检测算法之SSD

    系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...

随机推荐

  1. JDK源码笔记--Object

    public final native Class<?> getClass(); public native int hashCode(); public boolean equals(O ...

  2. SpringCloud Netflix Eureka(服务注册/发现)

    ⒈Eureka是什么? Eureka是Netflix的一个子模块,也是核心模块之一,Eureka是一个基于REST的服务,用于定位服务以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务架构来 ...

  3. Python笔记 【无序】 【五】

    描述符 将某种特殊类型的类[只要实现了以下或其中一个]的实例指派给另一个类的属性 1.__get__(self,instance,owner)//访问属性,返回属性的值 2.__set__(self, ...

  4. bootstrap模态框显示时被遮罩层遮住了

    <style>.modal-backdrop{z-index:0;}</style>

  5. MySQL登录报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    [root@pisphkdcbsql01 mysql3307]# /opt/mysql3307/bin/mysql -upisp -ppisp@ mysql: [Warning] Using a pa ...

  6. 创建一个yum源,rpm安装二进制包

    作者:邓聪聪 安装mariadb vi /etc/yum.repos.d/mariadb.repo [mariadb]name=mariadbbaseurl=http://mirrors.neusof ...

  7. 出现警告“user1 不在 sudoers 文件中。此事将被报告。”

    linux中不是每个用户都有sudo权限. 在/etc/下有个文件sudoers 由此文件可知只有用户为sudo这个组的成员之后才能执行sudo命令 此时,我们查看用户user1的属性: 由此看出us ...

  8. 解决:fatal error LNK1104: 无法打开文件“libc.lib”

    今天使用VS2017编译比较老的VC++项目,出现了[fatal error LNK1104: 无法打开文件“libc.lib”]的链接器问题,解决方法如下: 项目->属性中->配置属性- ...

  9. 029_mac下nginx管理

    一. brew info nginx #查看nginx信息 nginx: stable 1.13.12 (bottled), HEAD Docroot is: /usr/local/var/www T ...

  10. vscode 的使用笔记

    1.使用vscode 的终端命令 ctrl + ~  打开 vs 的终端 这是使用windows 自带的shell终端, 使用git.bash的shell  在设置里面,找到 terminal.int ...