前言:因为要依赖上一章SSD目标检测(1):图片+视频版物体定位(附源码)来训练预测自己的数据集,所以建立自己的数据集是一个复杂且避不开的步骤,以下给出了制作自己的数据集所要经过的简单步骤,而后也有更详细的说明奉上。

  1. VOC2007数据集简介;
  2. 规定文件夹名称,图片名称、格式;如何生成txt文件;
  3. 如何使用labelImg工具给图片上标签,并生成.xml文件;
  4. 最后如何将.xml文件生成SSD所需要的.tfrecords文件;

以下过程详细,如有不明请留言提醒,详细过程如下:

-----------------------------------------------------------------------------------------
本篇博客,我的数据集、代码存储在这里,有需要的同学自己下载。
-----------------------------------------------------------------------------------------

1、VOC2007数据集简介

知己知彼,方百战不殆。想制作自己的数据集当然要先了解SSD使用的数据集VOC2007长啥样。VOC2007下载链接 ,密码是:m5io。(VOC2007完整下载有3个压缩包+1个PDF,上面链接里只包含其中一个压缩包VOCtrainval_06-Nov-2007)。打开压缩包就如下图:

VOC2007详细介绍在这里,提供给大家有兴趣作了解。而制作自己的数据集只需用到前三个文件夹,所以请事先建好这三个文件夹放入同一文件夹内,同时ImageSets文件夹内包含Main文件夹

  • JPEGImages:用于存放训练、测试的图片(图片格式最好为.jpg)
  • Annotations:用于存放.xml格式的文件,也就是图片对应的标签,每个.xml文件都对应于JPEGImages文件夹的一张图片
  • ImageSets:内含Main文件夹,在…/ImageSets/Main文件夹下包含test.txt、train.txt、val.txt、trainval.txt四个文件,生成的方式第二步有详细说明

-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------

2、制作自己的数据集

第一步:下载图片,存入JPEGImages文件夹——你可以直接从各种渠道下载得到所需要的图片集,存入到JPEGImages文件夹下,命名格式统一为“00xxxx.jpg”,如下图:

-------------------------------------------------------------------------------------**----

第二步:使用labelImg工具给图片打标签——这是最重要的一步。如果你的python已经pip install lxml下载了lxml,就可以直接在我网盘下载labelImg工具windows版使用,密码:gyf3。
通过以上网盘下载得到工具文件后,打开…/data/predefined_classes.txt文件,可以发现这里都是图片标签——把你将要用到的标签都事先存入在这里,注意标签不能有中文。每次使用都把.exedata这两个文件拖到桌面上(如果直接在文件夹内运行.exe会报错不能运行),打开labelImg.exe文件,运行界面如下:就可以开始给图片打标签了

labelImg工具简单的使用步骤就是:

  1. 打开单个文件,或者打开一个图片文件夹
  2. 给目标物体建立box边框
  3. 对box边框内的物体贴上标签
  4. 把一张图片内所有目标物都打上各自标签后,再保存生成.xml文件,注意存入Annotations文件夹,文件名也要与当前图片保存一致
  5. 然后next下一张图片继续打标签,直到所有图片内物体都打上了标签,最后exit

-------------------------------------------------------------------------------------**----

第三步:生成Main文件夹下的.txt文件——在主目录下运行以下代码既可生成test.txt、train.txt、val.txt、trainval.txt四个文件,请注意每一个path地址是否正确(其实这四个txt文件在后续并没有什么用处)

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
# -*- 2018/07/18; 15:19
# -*- python3.5
import os
import random  trainval_percent = 0.7
train_percent = 0.8
xmlfilepath = 'Annotations/'
txtsavepath = 'ImageSets/Main'
total_xml = os.listdir(xmlfilepath)  num = len(total_xml)
list = range(num)
tv = int(num*trainval_percent)
tr = int(tv*train_percent)
trainval = random.sample(list,tv)
train = random.sample(trainval,tr)  ftrainval = open(txtsavepath+'/trainval.txt', 'w')
ftest = open(txtsavepath+'/test.txt', 'w')
ftrain = open(txtsavepath+'/train.txt', 'w')
fval = open(txtsavepath+'/val.txt', 'w')  for i in list:  name = total_xml[i][:-4]+'\n'  if i in trainval:  ftrainval.write(name)  if i in train:  ftrain.write(name)  else:  fval.write(name)  else:  ftest.write(name)  ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
print('Well Done!!!')

运行完成,得到如下文件:可以打开看一看,内容就是各个图片的索引,意味着哪些图片用做训练,哪些用做测试。

3、用.xml标签,生成.tfrecord文件

说明:SSD框架所用到的标签文件并不直接是.xml格式文件,而是.tfrecord文件,因为这一部分比较重要,代码先贴上——只为想研究如何生成.tfrecord文件的同学准备,想要了解 SSD目标检测(3):使用自己的数据集做识别(详细说明附源码),请继续点击,详细过程讲解+源码即刻奉上

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
# -*- 2018/07/17; 13:18
# -*- python3.5
"""
特别注意: 17行VOC_LABELS标签要修改,189行的path地址要正确
"""import os
import sys
import random
import numpy as np
import tensorflow as tf
import xml.etree.ElementTree as ET# 我的标签定义只有手表这一类,所以下面的VOC_LABELS要根据自己的图片标签而定,第一组'none': (0, 'Background')是不能删除的;
VOC_LABELS = {'none': (0, 'Background'),'watch': (1, 'watch')
}# 图片和标签存放的文件夹.
DIRECTORY_ANNOTATIONS = 'Annotations/'
DIRECTORY_IMAGES = 'JPEGImages/'# 随机种子.
RANDOM_SEED = 4242
SAMPLES_PER_FILES = 3  # 每个.tfrecords文件包含几个.xml样本def int64_feature(value):"""生成整数型,浮点型和字符串型的属性"""if not isinstance(value, list):value = [value]return tf.train.Feature(int64_list=tf.train.Int64List(value=value))def float_feature(value):if not isinstance(value, list):value = [value]return tf.train.Feature(float_list=tf.train.FloatList(value=value))def bytes_feature(value):if not isinstance(value, list):value = [value]return tf.train.Feature(bytes_list=tf.train.BytesList(value=value))def _process_image(directory, name):"""图片处理"""# Read the image file.filename = directory + DIRECTORY_IMAGES + name + '.jpg'image_data = tf.gfile.FastGFile(filename, 'rb').read()# Read the XML annotation file.filename = os.path.join(directory, DIRECTORY_ANNOTATIONS, name + '.xml')tree = ET.parse(filename)root = tree.getroot()# Image shape.size = root.find('size')shape = [int(size.find('height').text),int(size.find('width').text),int(size.find('depth').text)]# Find annotations.bboxes = []labels = []labels_text = []difficult = []truncated = []for obj in root.findall('object'):label = obj.find('name').textlabels.append(int(VOC_LABELS[label][0]))labels_text.append(label.encode('ascii'))  # 变为ascii格式if obj.find('difficult'):difficult.append(int(obj.find('difficult').text))else:difficult.append(0)if obj.find('truncated'):truncated.append(int(obj.find('truncated').text))else:truncated.append(0)bbox = obj.find('bndbox')a = float(bbox.find('ymin').text) / shape[0]b = float(bbox.find('xmin').text) / shape[1]a1 = float(bbox.find('ymax').text) / shape[0]b1 = float(bbox.find('xmax').text) / shape[1]a_e = a1 - ab_e = b1 - bif abs(a_e) < 1 and abs(b_e) < 1:bboxes.append((a, b, a1, b1))return image_data, shape, bboxes, labels, labels_text, difficult, truncateddef _convert_to_example(image_data, labels, labels_text, bboxes, shape,difficult, truncated):"""转化样例"""xmin = []ymin = []xmax = []ymax = []for b in bboxes:assert len(b) == 4# pylint: disable=expression-not-assigned[l.append(point) for l, point in zip([ymin, xmin, ymax, xmax], b)]# pylint: enable=expression-not-assignedimage_format = b'JPEG'example = tf.train.Example(features=tf.train.Features(feature={'image/height': int64_feature(shape[0]),'image/width': int64_feature(shape[1]),'image/channels': int64_feature(shape[2]),'image/shape': int64_feature(shape),'image/object/bbox/xmin': float_feature(xmin),'image/object/bbox/xmax': float_feature(xmax),'image/object/bbox/ymin': float_feature(ymin),'image/object/bbox/ymax': float_feature(ymax),'image/object/bbox/label': int64_feature(labels),'image/object/bbox/label_text': bytes_feature(labels_text),'image/object/bbox/difficult': int64_feature(difficult),'image/object/bbox/truncated': int64_feature(truncated),'image/format': bytes_feature(image_format),'image/encoded': bytes_feature(image_data)}))return exampledef _add_to_tfrecord(dataset_dir, name, tfrecord_writer):"""增加到tfrecord"""image_data, shape, bboxes, labels, labels_text, difficult, truncated = \_process_image(dataset_dir, name)example = _convert_to_example(image_data, labels, labels_text,bboxes, shape, difficult, truncated)tfrecord_writer.write(example.SerializeToString())def _get_output_filename(output_dir, name, idx):"""name为转化文件的前缀"""return '%s/%s_%03d.tfrecord' % (output_dir, name, idx)def run(dataset_dir, output_dir, name='voc_train', shuffling=False):if not tf.gfile.Exists(dataset_dir):tf.gfile.MakeDirs(dataset_dir)path = os.path.join(dataset_dir, DIRECTORY_ANNOTATIONS)filenames = sorted(os.listdir(path))if shuffling:random.seed(RANDOM_SEED)random.shuffle(filenames)i = 0fidx = 0while i < len(filenames):# Open new TFRecord file.tf_filename = _get_output_filename(output_dir, name, fidx)with tf.python_io.TFRecordWriter(tf_filename) as tfrecord_writer:j = 0while i < len(filenames) and j < SAMPLES_PER_FILES:sys.stdout.write(' Converting image %d/%d \n' % (i + 1, len(filenames)))  # 终端打印,类似printsys.stdout.flush()  # 缓冲filename = filenames[i]img_name = filename[:-4]_add_to_tfrecord(dataset_dir, img_name, tfrecord_writer)i += 1j += 1fidx += 1print('\nFinished converting the Pascal VOC dataset!')def main(_):# 原数据集路径,输出路径以及输出文件名,要根据自己实际做改动dataset_dir = "../VOC2007_test/"output_dir = "tfrecords_/"if not os.path.exists(output_dir):os.mkdir(output_dir)run(dataset_dir, output_dir)if __name__ == '__main__':tf.app.run()

得到的.tfrecords文件如下:

到这里,用于SSD的自己的数据集就建立完成了,主要需要的就是.tfrecords文件。下一章 SSD目标检测(3):使用自己的数据集做识别(详细说明附源码)介绍如何用自己的数据集开展训练预测

【SSD目标检测】2:如何制作自己的数据集相关推荐

  1. 睿智的目标检测23——Pytorch搭建SSD目标检测平台

    睿智的目标检测23--Pytorch搭建SSD目标检测平台 学习前言 什么是SSD目标检测算法 源码下载 SSD实现思路 一.预测部分 1.主干网络介绍 2.从特征获取预测结果 3.预测结果的解码 4 ...

  2. Pytorch搭建SSD目标检测平台

    学习前言 什么是SSD目标检测算法 源码下载 SSD实现思路 一.预测部分 1.主干网络介绍 2.从特征获取预测结果 3.预测结果的解码 4.在原图上进行绘制 二.训练部分 1.真实框的处理 2.利用 ...

  3. 基于Grad-CAM与KL损失的SSD目标检测算法

    基于Grad-CAM与KL损失的SSD目标检测算法 人工智能技术与咨询 来源:<电子学报>,作者侯庆山等 摘 要: 鉴于Single Shot Multibox Detector (SSD ...

  4. SSD目标检测的个人总结(1)—— 锚框的生成

    SSD目标检测的个人总结(1)-- 锚框的生成 前言 锚框 锚框的生成 锚框的绘制 前言 沐神的代码看了很久.B站上的视频也刷了很多遍,感叹下自己的基础确实不怎么扎实,锚框部分的底层代码几乎是一行行撸 ...

  5. 基于神经网络的目标检测论文之目标检测方法:改进的SSD目标检测算法

    4.2 改进的SSD 上一章我们了解到,物体识别检测算法是在传统CNN算法基础上加上目标区域建议策略和边框回归算法得到的.前辈们的工作主要体现在目标区域建议的改进策略上,从最开始的穷举建议框,到划分图 ...

  6. 【目标检测】SSD目标检测

    导语 PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题.这里,我们针对常见的机器学习任务,提供了不同的神经网络模型供大家学习和使用. ...

  7. 华为开源自研AI框架昇思MindSpore应用案例:SSD目标检测

    目录 一.环境准备 1.进入ModelArts官网 2.使用CodeLab体验Notebook实例 二.环境准备 三.数据准备与处理 数据采样 数据集创建 四.模型构建 五.损失函数 六.Metric ...

  8. 目标检测,目标识别的SAR数据集构建和标注

    目标检测,目标识别的SAR数据集构建和标注 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2 ...

  9. 深度学习目标检测---使用yolov5训练自己的数据集模型(Windows系统)

    目录 0    前言 1.从githab上克隆yolov5代码 1.1 yolov5网络project克隆 1.2 项目代码结构的整体介绍 1.3 深度学习环境的配置和安装yolov5所需要的库 2. ...

  10. 视频教程-Windows版YOLOv4目标检测实战:训练自己的数据集-计算机视觉

    Windows版YOLOv4目标检测实战:训练自己的数据集 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多 ...

最新文章

  1. u盘迷你linux,U盘上的迷你linux——BabyLinux
  2. FZU 1686 神龙的难题(DLX反复覆盖)
  3. STM32-RCC内部总线时钟设置程序详讲
  4. fastjson JSONObject.toJSONString 出现 $ref: $.的解决办法(重复引用)
  5. 数据库MySQL驱动5.1.22下载_mysql-connector-java-5.1.22下载
  6. Linux kernel 内核升级与降级实战
  7. 子域收集-fierce
  8. Java日志系统学习之log4j!
  9. 梦幻内存辅助制作教程
  10. flex blazeds java spring_flex+blazeds+java+spring后台消息推送
  11. 发送短信功能-联通接口
  12. Python缩进问题:IndentationError:expectedan indented block
  13. web防火墙和waf防火墙的区别和选择
  14. 深度相机 物体三维重建_基于深度相机的实时物体三维重建方法与流程
  15. php删除二维数组元素_php怎样删除二维数组中的元素
  16. 多线程-并发工具类之CyclicBarrier详解
  17. 8.1 Kotlin Sealed类
  18. PHP软件工程近三年的文献,软件工程论文参考文献
  19. Micro:bit篮球小游戏
  20. JavaSwimg jacob调用模板,斑马打印机打印条码

热门文章

  1. wamp 升php7,wamp升级php7
  2. 产权登记在未成年子女名下,离婚时应如何处理
  3. CSS实现兼容浏览器的文字阴影效果
  4. 题解 P2916 【[USACO08NOV]安慰奶牛Cheering up the Cow】
  5. 打不开网页服务器丢失,苹果浏览器safari打不开,丢失网络
  6. net start mysql启动常见问题
  7. JS HTML Web端使用MQTT通讯测试
  8. 有道云笔记linux使用教程,我是这么用有道云笔记的!
  9. 固定效应or随机效应?如何用matlab进行豪斯曼检验
  10. python樱花树代码_Python绘图案例:2020年新年画一棵樱花树(源代码)