目标检测算法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_data和test_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.执行训练
cd ~/work/ssd #务必到ssd的根目录执行
python examples/ssd/ssd_traffic.py
## reference
https://my.oschina.net/u/1046919/blog/777470
目标检测算法SSD之训练自己的数据集的更多相关文章
- 目标检测算法SSD在window环境下GPU配置训练自己的数据集
由于最近想试一下牛掰的目标检测算法SSD.于是乎,自己做了几千张数据(实际只有几百张,利用数据扩充算法比如镜像,噪声,切割,旋转等扩充到了几千张,其实还是很不够).于是在网上找了相关的介绍,自己处理数 ...
- 深度学习 目标检测算法 SSD 论文简介
深度学习 目标检测算法 SSD 论文简介 一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf Slides:http://w ...
- 物体检测算法 SSD 的训练和测试
物体检测算法 SSD 的训练和测试 GitHub:https://github.com/stoneyang/caffe_ssd Paper: https://arxiv.org/abs/1512.02 ...
- 增量学习不只有finetune,三星AI提出增量式少样本目标检测算法ONCE | CVPR 2020
论文提出增量式少样本目标检测算法ONCE,与主流的少样本目标检测算法不太一样,目前很多性能高的方法大都基于比对的方式进行有目标的检测,并且需要大量的数据进行模型训练再应用到新类中,要检测所有的类别则需 ...
- 基于深度学习的目标检测算法:SSD——常见的目标检测算法
from:https://blog.csdn.net/u013989576/article/details/73439202 问题引入: 目前,常见的目标检测算法,如Faster R-CNN,存在着速 ...
- 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)
不多说,直接上干货! 本文一系列目标检测算法:RCNN, Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码. • RCNN RCN ...
- 目标检测算法的总结(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、FNP、ALEXnet、RetianNet、VGG Net-16)
目标检测解决的是计算机视觉任务的基本问题:即What objects are where?图像中有什么目标,在哪里?这意味着,我们不仅要用算法判断图片中是不是要检测的目标, 还要在图片中标记出它的位置 ...
- 如何使用 pytorch 实现 SSD 目标检测算法
前言 SSD 的全称是 Single Shot MultiBox Detector,它和 YOLO 一样,是 One-Stage 目标检测算法中的一种.由于是单阶段的算法,不需要产生所谓的候选区域,所 ...
- (七)目标检测算法之SSD
系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...
随机推荐
- Mint-UI
Mint-UI是基于Vue.js的移动端组件库 Mint-UI是Vue组件库,是使用Vue技术封装出来的成套的组件,可以无缝地和Vue项目进行集成开发 Mint UI官网 不同版本的安装 导入有两种方 ...
- cartographer 安装
Debian 8 Jessie 一顿操作梦如虎,最后不知道咋装上的. 参考:https://www.jianshu.com/p/9922a51ce38f https://blog.csdn.net/p ...
- google 变量命名规则简要记录
1.文件命名规则 好的文件名命名可以很清晰的看出这个文件将要承载的内容,Google给出的规则为:文件名要全部小写, 可以包含下划线 (_) 或连字符 (-). 按项目约定来, 例如:cmd_save ...
- 2017-2018-2 20165231实验二《Java面向对象程序设计》实验报告
实验报告封面 课程:Java程序设计 班级:1652班 姓名:王杨鸿永 学号:20165231 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:13:45 - 15:25 实验序号:实验二 ...
- Mac 远程桌面 ubuntu16.04 unity
待解决问题: 使用 vnc 远程桌面 ubunt16.04的自带桌面 unity 尝试方法 : 查看了各种方法, 基本都是曲线救国, 安装 gnome 或者 xfce4等其他桌面系统, 而我只想用好看 ...
- hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...
- struts2框架之拦截器(参考第二天学习笔记)
拦截器 1. 什么是拦截器 1). 与JavaWeb中的Filter比较相似. 2). 拦截器只能拦截Action!!! 2. Struts中定义了很多拦截器,其中defaultStack中的拦截器会 ...
- 持续集成之②:整合jenkins与代码质量管理平台Sonar并实现构建失败邮件通知
持续集成之②:整合jenkins与代码质量管理平台Sonar并实现构建失败邮件通知 一:Sonar是什么?Sonar 是一个用于代码质量管理的开放平台,通过插件机制,Sonar 可以集成不同的测试工具 ...
- vue-cli(vue脚手架)超详细教程
都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到陌生,重要的是思路的变换,以前用jq随便拿全局变量和修改dom的锤子不能用了,vu ...
- python学习第9-10天,函数。
函数初识 为什么要使用函数? 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句. 函数的定义与 ...