SSD+caffe︱Single Shot MultiBox Detector 目标检测+fine-tuning(二)

承接上一篇SSD介绍:SSD+caffe︱Single Shot MultiBox Detector 目标检测(一)
如果自己要训练SSD模型呢,关键的就是LMDB格式生成,从官方教程weiliu89/caffe来看,寥寥几行code,但是前面的数据整理真实要了老命。
教程其实就是一种fine-tuning,在VGG基础上进行训练SSD框架。


一般SSD的数据来源,看到好多人都在用这款框架进行数据标注:BBox-Label-Tool 也有人在这基础上进行简单修改,详见博客:SSD框架训练自己的数据集 ,或者用OpenCV重写:深度学习ssd配置并在VGG模型上训练自己的数据
还有一些自己开发的小工具:图像标注VS2013项目

.


0 官方教程训练过程:

(1)下载VGGNet.caffemodel, fully convolutional reduced (atrous) VGGNet
(2)下载VOC2007 and VOC2012两个数据集,放在/caffe/data目录下
(3)创建LMDB文件:

./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
  • 1
  • 2
  • 1
  • 2

(4)训练

python examples/ssd/ssd_pascal.py
  • 1
  • 1

以上是官方教程常规训练步骤,并不难。但是自己训练时候的数据处理,比较麻烦。

.


1 数据集准备与形成

1.1 所需准备文件介绍

其中训练所需的文件夹包括三大类:
这里写图片描述
dataset (数据集目录)

  • Annotations

    *.xml (标注的物体信息文件)

  • Images

    *.jpg (图片集)

  • ImageSets
    保存格式为文件名,不带扩展名
    训练集: train.txt
    训练验证集: trainval.txt
    测试集: test.txt
    验证集: val.txt

1.2 训练文件介绍

(1) create_list.sh:用于生成三类文件列表
- test_name_size:测试集图像大小
- test:测试集图像-标签一一对应
- trainval:训练集图像-标签一一对应

这是将数据集做成方便之后生成lmdb的路径信息文件,注意将其中的root_dir和第二个for循环中的变量改为自己的路径就好。
图像-标签一一对应:

Images/000112.png Labels/000112.xml
Images/001365.png Labels/001365.xml
  • 1
  • 2
  • 1
  • 2

同时注意名称的一致。

000800 1241 376
006206 1242 375
  • 1
  • 2
  • 1
  • 2

test_name_size里面,000800就是图片名称,1241*376就是图片尺寸,高 长

(2)create_data.sh:
生成LMDB文件,以上的create_list准备好之后即可

(3)labelmap_voc.prototxt:
目标检测的标签文件
该文件主要记录需要训练识别的n种对象的信息,第一类是background,是不变的,对于Pascal VOC数据集来说,需要识别20种对象,所以后面还有20个label。与传统的机器学习不太一样的是,以前需要输入正负样本,在caffe种,不管是faster rcnn还是ssd,都是只用对训练图像将识别对象的坐标信息标注即可,除了标注信息以外的部分都会当做background去处理。
.


2 数据集生成方案

训练的数据集三种方案:

  • 第一:保持原来的文件目录结构及文件名不变, 只替换里面的数据,通用。
  • 第二:重新新建一个与之前类似的目录结构,改成自己命名的文件夹,第二种方法,有一定的风险性,需要修改程序里涉及数据路径的代码。
  • 第三:txt格式数据变成LMDB,参考github:https://github.com/jinfagang/kitti-ssd
  • 第三种是直接用txt格式保存,就可以生成LMDB的办法,我觉得这个比较好,但是笔者最终没有实验成功…譬如:
class_index xmin ymin xmax ymax
  • 1
  • 1

第一种方案里面的一些小技巧:
(1)还有将txt变成xml格式的小工具:见博客将数据集做成VOC2007格式用于Faster-RCNN训练
(2)将BBox-Label-Tool下的txt格式保存的bounding box信息转换成VOC数据格式下以xml方式表示:,见博客:SSD框架训练自己的数据集
(3)将csv变成xml文件类型
luuuyi/umdfaces2VOC2007

2.1 训练流程

本节参考:SSD框架训练自己的数据集
- 第一步:create_list.sh:生成test_name_size.txt、test.txt、trainval.txt
- 第二步:修改labelmap_voc.prototxt,标签文件,同时需要注意标签文件必须多一个background的标签,作为编号0
- 第三步:create_data.sh:生成LMDB
- 第四步:修改ssd_pascal.py:

主要修改点:(1)train_data和test_data修改成指向自己的数据集LMDBtrain_data = "examples/indoor/indoor_trainval_lmdb"test_data = "examples/indoor/indoor_test_lmdb"2) num_test_image该变量修改成自己数据集中测试数据的数量
(3)num_classes 该变量修改成自己数据集中 标签类别数量数 + 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 第五步训练:
    python examples/ssd/ssd_pascal.py

2.2 训练脚本内容存储

会在相应的路径下生成jobs文件夹,其中包含了这一次训练的脚本文件,并且会记录caffe执行只一次训练的日志信息。
参考:Ubuntu上用caffe的SSD方法训练Pascal VOC数据集

jobs文件夹下有:
.log文件:运行记录,时间,迭代次数等信息;
.caffemodel文件,权重文件
deploy.prototxt、train_val.prototxt等
.


参考:
深度学习ssd配置并在VGG模型上训练自己的数据
SSD 安装、训练
Ubuntu上用caffe的SSD方法训练umdfaces数据集
重点参考:
使用faster rcnn训练umdfaces数据集
将数据集做成VOC2007格式用于Faster-RCNN训练
Caffe-SSD 训练自己的数据集教程

SSD框架训练自己的数据集

.


报错一:

cudasucess(10vs0)
  • 1
  • 1

解决:修改pythonssd_pascal.py文件gpus=’0,1,2,3’,如果有一块GPU,则删除123,有两块则删除23

.

延伸一:大致的运算效率

K80-单GPU-一天可以迭代1w+次
6天将近7w次
每1w次迭代之后会计算一个mAP
(数据来源:Ubuntu上用caffe的SSD方法训练umdfaces数据集)

TX.P,笔者自己训练,大概的运算效率是5千/小时(运行官方教程时)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

把图片存成视频 python

tips: 1.保存的图片大小一定要一样 2.图像做好是标准的视频格式大小 3.图片要和视频size一样大小 代码如下 # -*- coding:utf8 -*- import os import cv2 import numpy as np import cv2.cv as cv path /home/m/mycode/cv filelist os.listdir(path) total_num len(f…

sdut 双向队列(STL)

deque<ll>q;//定义一个双向队列q&#xff0c;类型为long long q.push_front(a);//将a从队首插入队列 q.push_back(a);//将a从队尾插入队列 q.pop_front();//队首弹掉一个元素 q.pop_back();//队尾弹出一个元素 aq.front();//返回队首元素 aq.back();//返回队尾元素 aq.si…

给文件重命名

# -*- coding:utf8 -*-import osclass BatchRename():批量重命名文件夹中的图片文件def __init__(self):self.path home/l/imagedef rename(self):filelist os.listdir(self.path)total_num len(filelist)i 0for item in filelist:if item.endswith(.jpg):src os.path.joi…

pip install scikit-image on windows 失败 解决方案

到官网下载包 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-image 我们下载 scikit_image‑0.13.0‑cp35‑cp35m‑win_amd64.whl 也可到我的CNDS下载 安装时会出现一下错误 scikit_image-0.13.0-cp34-none-win_amd64.whl is not a supported wheel on this platform…

sdut 数据结构实验之排序三:bucket sort

一开始这种做法超时&#xff1a; #include<stdio.h>int b[5000000],a[5000000],n,ans; void merge_sort(int *a,int *b,int x,int y) {if(y-x>1){int mx(y-x)/2;//中间点的坐标int px,qm,ix;merge_sort(a,b,x,m);merge_sort(a,b,m,y);while(p<m||q<y){if(q>…

Caffe训练源码基本流程

苏的专栏 致力于学习计算机视觉、模式识别、机器学习、深度学习相关技术&#xff1a;&#xff1a;&#xff1a;&#xff1a;希望结识更多同道中人。 QQ&#xff1a;2816568984 微信&#xff1a;Suc1011 目录视图 摘要视图 订阅 【活动】2017 CSDN博客专栏评选 【评论送书】…

fatal error: GL/glew.h: 没有那个文件或目录

搜索libglew的版本 #apt-cache search glew libglew-dbg - OpenGL Extension Wrangler (debugging symbols) libglew-dev - OpenGL Extension Wrangler - development environment libglew1.13 - OpenGL Extension Wrangler - runtime environment libglewmx-dbg - OpenGL E…

运行cudasift

文件中有cmakelist.txt 运行命令 cmake . 就会生成makefile type: make 出现错误&#xff1a; /usr/bin/ld: 找不到 -lopencv_dep_cudart 在cmake 时候用一下指令&#xff1a; cmake -D CUDA_USE_STATIC_CUDA_RUNTIMEOFF . make的时候可能会出现以下错误 make[2]: …

电脑DNS修复

首先在dos窗口下输入以下命令&#xff1a; ipconfig/displaydns 可以看到当前的缓存的所有DNS记录&#xff1a; 然后&#xff1a; ipconfig/flushdns 刷新当前的DNS

数据结构实验之排序七:选课名单(卡内存的一道题。。坑)

RE。。。 带更正 #include<iostream> #include<algorithm> using namespace std; #include<cstdio> #include<cstring> struct people {char name[100];int sum_class;int cl[2005]; }a[40000],b[40000]; int cmp(people a,people b) {char t[100],l[…

/usr/bin/ld: 找不到 -lopencv_dep_cudart

make出现/usr/bin/ld: 找不到 -lopencv_dep_cudart错误时候 我们在cmake时候加上参数 cmake -D CUDA_USE_STATIC_CUDA_RUNTIMEOFF .

ubuntu16.04下安装opencv3.2版本

1、下载OpenCV的源码 OpenCV官网上有linux版本的源码包可以下载&#xff0c;不过最好是从git上下载&#xff0c;这样可以保证下载得到的是最新的代码&#xff1a;1 wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.2.0.zip 2 unzip opencv.zip 2、编译安装…

数据结构实验之栈六:下一较大值(二)

#include <bits/stdc.h> #include <iostream> using namespace std; struct node {int data;int next;//记录下一个元素死亡值int pos;//用来记录每个元素的位置*/ } a[100001],val[100000]; int main() {int t;while(~scanf("%d",&t)){int l0;while…

双系统安装ubuntu后没有windows启动项

打开terminal&#xff0c;sudo update-grub 如果看到windows的选项的话&#xff0c;下次重启就有了

ubunut安装分区建议

如果50g安装ubuntu 分为4个区 / :根目录区相当于windows 的C盘 我建议分20G swap:交换空间我建议分2G boot:我建议分200M home:把剩下的都分给home目录。

strchr函数的用法

【FROM MSDN && 百科】 原型&#xff1a; char *strchr(const char *s,char c); #include<string.h> 查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针&#xff0c;如果s中不存在c则返回NULL。 //#define FIRST_DEMO #define SECOND_DEMO #ifdef F…

Cross-Scale Cost Aggregation for Stereo Matching

摘要&#xff1a; 人类处理立体通信跨越多个尺度。然而&#xff0c;这种生物灵感就是忽略了最先进的成本汇总方法密集的立体声通信。在本文中&#xff0c;一个通用的提出跨规模成本汇总框架允许成本汇总中的多尺度互动。我们首先从统一优化中重新构建成本汇总透视和显示不同的…

strchr与strstr函数

在C语言中 strchr 和 strstr函数都被包含在<string.h>头文件中&#xff0c;也就是要调用它们时要在程序前面包含<string.h>头文件&#xff0c;也就是写这个语句&#xff1a;#include<string.h> strchr函数原型&#xff1a;char * strchr(char * str, int ch)…

Python-OpenCV设置摄像头分辨率

最近玩OpenCV用到一个双目摄像头&#xff0c;需要调整分辨率为1280480&#xff0c;研究了一下官方API&#xff0c;找到了设置方法&#xff0c;记录一下&#xff0c;以防忘记 import cv2 cap cv2.VideoCapture(0) cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,1280) ca…

C/C++中字符串与数字相互转换

数字转字符串&#xff1a; 用C的streanstream: #include <sstream> #Include <string> string num2str(double i) { stringstream ss; ss << i; return ss.str(); } 字符串转数字&#xff1a; int str2num(string s) { int num; stringstream ss(s); ss>&…