自己之前用的模型在准确性以及实时性方面没有达到一个很好的均衡,在大佬同学的介绍下,开始转向Retinanet。

1.运行环境

运行环境:Windows10操作系统,python3.6(通过anaconda安装),tensorflow1.10,keras2.2.4。

2.数据预览

主要参考github上一篇介绍文档:https://github.com/fizyr/keras-retinanet,建议对说明文档多看几遍。retinanet模型训练的数据是按照VOC2007格式进行。首先看一下最后数据集文件夹以及数据格式预览:(.record和.pbtxt文件可以忽略,这是Google tensorflow API训练模型时用到的文件,与retinanet无关。)

其中:.csv文件是由voc2csv.py产生,generator_voc.py用来产生ImageSets中的文件。

Annotation文件夹如下:

Annotation文件里时格式为.xml的标注文件,注意文件名字以及文件数量和JPEGImages文件夹里的图片保持一致。 ImageSet文件夹下有一个Main文件夹,里面有四个文件:

Main文件夹需要自己创建,剩余的四个txt文件由代码自动生成。

3.数据制作

在数据制作时,特别感谢这两篇博客的作者:

https://blog.csdn.net/u012426298/article/details/80450537

https://blog.csdn.net/u012426298/article/details/80334292

3.1制作数据前提:JPEGImages文件夹里自己训练的图片,对图片进行标注的.xml文件夹Annotations。

3.2有了这两个文件,用generator_voc.py去产生ImageSets中的文件,在windows下,可以到文件下,按Shift+右键,然后打开Powershell直接运行命令:(个人感觉比cmd命令行简单一些):

python generator_voc.py

generator_voc.py代码如下(参考上面博客链接):

import os
import random  trainval_percent = 0.9  #训练数据和交叉验证数据占的比例,自己根据实际调节
train_percent = 0.8     #训练数据占trainval的比例,即用来训练的数据
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('ImageSets/Main/trainval.txt', 'w')  #需要提前建立Main文件
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/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()

运行完之后,ImageSets/Main文件下就会产生四个txt文件。(后续训练时,我也没看到这四个文件在哪里体现,囧)

3.3利用voc_csv.py产生.csv文件,同样在Powershell里:

python voc_csv.py

voc_csv.py代码如下:

# -*- coding:utf-8 -*-import csv
import os
import glob
import sysclass PascalVOC2CSV(object):def __init__(self,xml=[], ann_path='./annotations.csv',classes_path='./classes.csv'):''':param xml: 所有Pascal VOC的xml文件路径组成的列表:param ann_path: ann_path:param classes_path: classes_path'''self.xml = xmlself.ann_path = ann_pathself.classes_path=classes_pathself.label=[]self.annotations=[]self.data_transfer()self.write_file()def data_transfer(self):for num, xml_file in enumerate(self.xml):try:# print(xml_file)# 进度输出sys.stdout.write('\r>> Converting image %d/%d' % (num + 1, len(self.xml)))sys.stdout.flush()with open(xml_file, 'r') as fp:for p in fp:if '<filename>' in p:self.filen_ame = p.split('>')[1].split('<')[0]if '<object>' in p:# 类别d = [next(fp).split('>')[1].split('<')[0] for _ in range(9)]self.supercategory = d[0]if self.supercategory not in self.label:self.label.append(self.supercategory)# 边界框x1 = int(d[-4]);y1 = int(d[-3]);x2 = int(d[-2]);y2 = int(d[-1])self.annotations.append([os.path.join('JPEGImages',self.filen_ame),x1,y1,x2,y2,self.supercategory])except:continuesys.stdout.write('\n')sys.stdout.flush()def write_file(self,):with open(self.ann_path, 'w', newline='') as fp:csv_writer = csv.writer(fp, dialect='excel')csv_writer.writerows(self.annotations)class_name=sorted(self.label)class_=[]for num,name in enumerate(class_name):class_.append([name,num])with open(self.classes_path, 'w', newline='') as fp:csv_writer = csv.writer(fp, dialect='excel')csv_writer.writerows(class_)xml_file = glob.glob('./Annotations/*.xml')PascalVOC2CSV(xml_file)

运行完之后,就会产生两个.csv文件,annotations.csv文件用notepad打开,格式如下:

红线部分就是图片的名字,黄色部分就是标记的类别,中间四个数字是标记框的位置。 到这里本该结束了,但是我在后续训练时遇到一个问题,就是模型报错:找不到JPEGImages/........(....点表示上面红线部分的名字)。原因是这里没有加上图片的后缀名.jpg,所以模型从这里读取红色部分时,对应不上JPEGImages文件夹下的图片(图片都带有后缀名)。所以我在这里对代码进行了修改,就是把 52行的

self.annotations.append([os.path.join('JPEGImages',self.filen_ame),x1,y1,x2,y2,self.supercategory])

修改为:

self.annotations.append([os.path.join('JPEGImages',self.filen_ame+'.jpg'),x1,y1,x2,y2,self.supercategory])

这样生成的annotation.csv文件中就包含了后缀名。感觉原作者没有修改也产生了后缀名,不知道怎么回事。

4.检测产生的数据是否合格

至此,Retinanet数据集的制作算是初步完成了。为了检测生成的数据是否合格,github上的作者给出了一个debug.py 进行检测,检测方式也很简单,同样在当前目录下打开powershell,运行:

python keras_retinanet/bin/debug.py csv csv/annotations.csv csv/classes.csv

上述代码运行的前提是:你要从github上把retinanet代码clone下来,并且对keras_retinanet进行了正确的安装以及编译。安装以及编译github说明文档有详细介绍,我也会在接下来文章中进行解释。

下面来看一下运行之后出的一个错误:

第一个错误是自己写的路径有问题,第二个问题就是我上面提到的,显示未找到JPEGImages,不过这里是因为后缀名变成了*****.jpg.jpg,几万个annotations里大概有十几个出现了这样问题。这个时候,就需要把文件名字复制出来,一个一个去annotations.csv文件里搜索修改后缀名。(还是建议用notepad打开csv文件,方便搜索以及及时修改)

最后,如果数据完全没问题,debug.py运行一段时间后,会弹出你的第一张训练图片,关掉这张图片,会继续按顺序弹出第二张,说明数据制作大功告成,关掉powershell即可。

5.特别感谢:

https://github.com/fizyr/keras-retinanet

https://blog.csdn.net/u012426298/article/details/80334292

https://blog.csdn.net/u012426298/article/details/80450537

Retinanet训练自己的数据(1):数据准备相关推荐

  1. Fast RCNN 训练自己数据集 (2修改数据读取接口)

    Fast RCNN 训练自己数据集 (2修改数据读取接口) Fast RCNN训练自己的数据集 (2修改读写接口) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.co ...

  2. Caffe上用SSD训练和测试自己的数据

        学习caffe第一天,用SSD上上手. 我的根目录$caffe_root为/home/gpu/ljy/caffe    一.运行SSD示例代码    1.到https://github.com ...

  3. caffe安装,编译(包括CUDA和cuDNN的安装),并训练,测试自己的数据(caffe使用教程)

    caffe是一个非常清晰且高效的深度学习框架,目前有着不少的用户,也渐渐的形成了自己的社区,社区上可以讨论相关的问题. 我从开始看深度学习的相关内容到能够用caffe训练测试自己的数据,看了不少网站, ...

  4. FCN训练不收敛的原因分析和最详细的FCN训练与测试自己的数据程序配置

    在2015年发表于计算机视觉顶会CVPR上的Fully Convolutional Networks for Semantic Segmentation 论文(下文中简称FCN)开创了图像语义分割的新 ...

  5. 训练自己的点云数据进行3D目标检测

    目录 前言 一.准备工作 1.pcdet整体架构 2.pcdet数据流 3.kitti_dataset.py理解 二.自定义数据集类的编写(参考kitti_dataset.py进行修改) 三.修改ev ...

  6. deep-hight-relolution-net.pytorch训练自己的关键点检测数据步骤

    数据集准备 标注转为coco格式 部署源码(https://github.com/HuangJunJie2017/UDP-Pose/tree/master/deep-high-resolution-n ...

  7. PyTorch主要组成模块 | 数据读入 | 数据预处理 | 模型构建 | 模型初始化 | 损失函数 | 优化器 | 训练与评估

    文章目录 一.深度学习任务框架 二.数据读入 三.数据预处理模块-transforms 1.数据预处理transforms模块机制 2.二十二种transforms数据预处理方法 1.裁剪 2. 翻转 ...

  8. ICML2020:预训练的GAN在有限数据下的生成器

    生成对抗网络可以生成高度逼真的图像,通常与真实图像是无法区分的.这样生成的大多数图像都没有包含在训练数据集中,说明用GAN生成的数据对增强数据集的能力很强.尽管在数据有限的情况下这种情况特别重要,但是 ...

  9. 实战CenterNet,训练猫脸关键点检测数据集并测试

    实战CenterNet,训练猫脸关键点检测数据集并测试 一.本机配置 二.环境搭建 三.数据准备 四.开始训练 五.测试 六.references 这里主要记录一下,调试CenterNet用来训练猫脸 ...

  10. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...

    1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...

最新文章

  1. linux /etc/fstab文件参数求解释
  2. 人脸对齐--Dense Face Alignment
  3. 试卷批分pascal程序
  4. svg圆弧进度条demo
  5. android 360状态栏显示,如何从Android应用程序显示360全景(How to display a 360 panorama from android application)...
  6. 适用于python机器学习与实践的twenty_newsgroups.py文件内容
  7. Windows Server Containers 支持 Windows 开发者使用 Docker
  8. @Autowired和@Resource
  9. java des 加密 字符串_Java使用DES加密字符串
  10. 揭露一种通过网络实施ATM诈骗的手段!
  11. Python注释和声明
  12. rabbitmq的发布订阅
  13. 使用systemtap调试Linux内核
  14. 烤箱定时器不走怎么办_走夜路害怕怎么办?带上这6大辟邪文玩在也不害怕
  15. 项目中的门禁管理者贾维斯———关于 Shiro 框架的 基本使用和基础配置,以及工作流程的生动解释
  16. 赢在微创新_小米用互联网颠覆中国市场的内幕与方法
  17. 计算机培训后的感言,计算机中级培训感言
  18. Ubuntu 16.04 显示器分辨率低
  19. oracle允许远程访问
  20. C语言海鲜拼盘-01

热门文章

  1. Android 图片控件ImageView
  2. linux bam文件格式,pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)...
  3. Kaggle数据集之电信客户流失数据分析(一)
  4. html中怎么让div撑开,html中子div用了浮动怎样让父div的大小自动撑开(清除浮动)...
  5. 笔试题--移动手机号短号
  6. 戴维解惑——用iTestin云测做测试怎样拿大奖
  7. 使用BDE数据库引擎的应用软件出现Insufficient disk space的解决方法
  8. java微信支付 需要证书吗_java引用微信支付的p12证书文件
  9. [ArcGIS] 中文经纬度标注如何替换成英文的字母标注
  10. 数据链路层的子层MAC层(图文详解)