将数据集制作成VOC数据集格式的实例


Posted in Python onFebruary 17, 2020

在做目标检测任务时,若使用Github已复现的论文时,需首先将自己的数据集转化为VOC数据集的格式,因为论文作者使用的是公开数据集VOC 2007、VOC2012、COCO等类型数据集做方法验证与比对。

一、VOC数据集格式

--VOCdevkit2007

--VOC2007

--Annotations (xml格式的文件)

--000001.xml

--ImageSets

--Layout

--Main

--train.txt

--test.txt

--val.txt

--trainval.txt

--Segmentation

--JPEGImages (训练集和测试集图片)

--000001.jpg

--results

二、转换过程步骤

1. 使用标注工具标注图片目标检测框,生成JSON格式的标注文件(本人使用此生成类型的标注工具,也可使用(LabelImg等标注工具);

2. 批量修改图片和标注文件名称,从000001.jpg、000001.json标号开始;

#coding='utf-8'
import os
import numpy as np
 
def imgs_rename(imgs_path):
  imgs_labels_name = np.array(os.listdir(imgs_path)).reshape(-1,2)
  # 从 000001开始
  i = 1
  for img_label_name in imgs_labels_name:
    if img_label_name[0].endswith('.jpg'):
      # 修改图片名称
      img_old_name = os.path.join(os.path.abspath(imgs_path), img_label_name[0])
      # 类别+图片编号  format(str(i),'0>3s') 填充对齐
      img_new_name = os.path.join(os.path.abspath(imgs_path), '00' + format(str(i),'0>4s') + '.jpg')
      os.rename(img_old_name, img_new_name)
      # 修改json文件名称
      label_old_name = os.path.join(os.path.abspath(imgs_path), img_label_name[1])
      label_new_name = os.path.join(os.path.abspath(imgs_path), '00' + format(str(i), '0>4s') + '.json')
      os.rename(label_old_name, label_new_name)
      i = i + 1
 
if __name__=='__main__':
  # 读取json文件的路径
  root = "read_file_path"
 
  imgs_rename(root)

3. 提取图片和标注文件到不同文件夹下,并将读取的标注框转化为txt文件格式(本人的图片和JSON文件在同一目录下生成);

import json
import os
import numpy as np
import cv2
 
#读取json格式文件,返回坐标
def read_json(file_name):
  file = open(file_name,'r',encoding='utf-8')
  set = json.load(file)
  # print("读取完整信息:",set)
  coord = set['objects'][0]['seg'] # 只读取第一个标注的车牌
  return coord
 
def save_imgs(imgs_jsons_files, imgs_path):
  # 提取图片文件夹中的jpg文件名称
  for idx in range(len(imgs_jsons_list)):
    if imgs_jsons_list[idx][-3:]=='jpg':
      img_name = imgs_jsons_list[idx]
      read_img_path = os.path.join(imgs_jsons_files, img_name)
      img = cv2.imread(read_img_path)
      save_img_path = os.path.join(imgs_path, img_name)
      cv2.imwrite(save_img_path, img)
 
def save_labels(imgs_jsons_files, labels_path):
  # 提取图片文件夹中的json文件名称
  for idx in range(len(imgs_jsons_list)):
    if imgs_jsons_list[idx][-4:] == 'json':
      json_name = imgs_jsons_list[idx]
 
      # 操作每一个json文件,读取并保存坐标
      json_path = os.path.join(imgs_jsons_files, json_name)
      json_coord = read_json(json_path)
      if len(json_coord) > 8:
        print("标注坐标多于四个点的文件名称:", json_name)
 
      # 提取左上和右下坐标
      roi_coord = []
      for idx in range(len(json_coord)):
        if idx == 0 or idx == 1 or idx == 4 or idx == 5:
          roi_coord.extend([json_coord[idx]])
      # 保存roi坐标到txt文件中
      label_path = labels_path + json_name[:6] + '.txt'
      np.savetxt(label_path, roi_coord)
 
if __name__=='__main__':
  print("loading......")
  # 读取jpg json文件的路径
  imgs_jsons_files = "Jpg_json_file_path"
 
  # 保存读取的真实标签路径
  labels_path = "save_labels_path"
  if not os.path.exists(labels_path):
    os.mkdir(labels_path)
  # 保存读取的图片
  imgs_path = "sabe_imgs_path"
  if not os.path.exists(imgs_path):
    os.mkdir(imgs_path)
 
  imgs_jsons_list = os.listdir(imgs_jsons_files)
 
  save_imgs(imgs_jsons_files, imgs_path)
  save_labels(imgs_jsons_files, labels_path)
  print("done!!!")

4. 转化标注框txt格式为xml格式;

# encoding = utf-8
import os
import numpy as np
import codecs
import cv2
 
def read_txt(label_path):
  file = open(label_path,'r',encoding='utf-8')
  label_lines = file.readlines()
  label = []
  for line in label_lines:
    one_line = float(line.strip().split('\n')[0])
    label.extend([one_line])
  return np.array(label,dtype=np.float64)
 
def covert_xml(label,xml_path, img_name, img_path):
  # 获得图片信息
  img = cv2.imread(img_path)
  height, width, depth = img.shape
  x_min,y_min,x_max,y_max = label
 
  xml = codecs.open(xml_path, 'w', encoding='utf-8')
  xml.write('<annotation>\n')
  xml.write('\t<folder>' + 'VOC2007' + '</folder>\n')
  xml.write('\t<filename>' + img_name + '</filename>\n')
  xml.write('\t<source>\n')
  xml.write('\t\t<database>The VOC 2007 Database</database>\n')
  xml.write('\t\t<annotation>Pascal VOC2007</annotation>\n')
  xml.write('\t\t<image>flickr</image>\n')
  xml.write('\t\t<flickrid>NULL</flickrid>\n')
  xml.write('\t</source>\n')
  xml.write('\t<owner>\n')
  xml.write('\t\t<flickrid>NULL</flickrid>\n')
  xml.write('\t\t<name>faster</name>\n')
  xml.write('\t</owner>\n')
  xml.write('\t<size>\n')
  xml.write('\t\t<width>' + str(width) + '</width>\n')
  xml.write('\t\t<height>' + str(height) + '</height>\n')
  xml.write('\t\t<depth>' + str(depth) + '</depth>\n')
  xml.write('\t</size>\n')
  xml.write('\t\t<segmented>0</segmented>\n')
  xml.write('\t<object>\n')
  xml.write('\t\t<name>plate</name>\n')
  xml.write('\t\t<pose>Unspecified</pose>\n')
  xml.write('\t\t<truncated>0</truncated>\n')
  xml.write('\t\t<difficult>0</difficult>\n')
  xml.write('\t\t<bndbox>\n')
  xml.write('\t\t\t<xmin>' + str(x_min) + '</xmin>\n')
  xml.write('\t\t\t<ymin>' + str(y_min) + '</ymin>\n')
  xml.write('\t\t\t<xmax>' + str(x_max) + '</xmax>\n')
  xml.write('\t\t\t<ymax>' + str(y_max) + '</ymax>\n')
  xml.write('\t\t</bndbox>\n')
  xml.write('\t</object>\n')
  xml.write('</annotation>')
 
if __name__=='__main__':
  labels_file_path = "D:/Code_py/VOC2007/labels/"
  imgs_file_path = "D:/Code_Py/VOC2007/imgs/"
 
  xmls_file_path = "D:/Code_py/VOC2007/xmls/"
  if not os.path.exists(xmls_file_path):
    os.mkdir(xmls_file_path)
 
  labels_name = os.listdir(labels_file_path)
  for label_name in labels_name:
    label_path = os.path.join(labels_file_path, label_name)
    label = read_txt(label_path)
 
    xml_name = label_name[:6]+'.xml'
    xml_path = os.path.join(xmls_file_path, xml_name)
 
    img_name = label_name[:6]+'.jpg'
    img_path = os.path.join(imgs_file_path, img_name)
 
    covert_xml(label, xml_path, img_name, img_path)

5. 切分数据集为训练集、验证集和测试集,仅保存图片的名称到txt问价下即可;

import os
import numpy as np
 
if __name__=='__main__':
  root = "save_path"
  train = open(root+"train.txt", 'w', encoding='utf-8')
  train_val = open(root+"trainval.txt", 'w', encoding='utf-8')
  test = open(root+"test.txt", 'w', encoding='utf-8')
  val = open(root+"val.txt", 'w', encoding='utf-8')
 
  imgs_path = os.path.join(root, "imgs")
 
  imgs_name = os.listdir(imgs_path)
 
  # 首先切分训练验证集和测试集
  train_val_img_info = []
  for img_name in imgs_name:
    x = np.random.uniform(0,1)
    img_info = str(img_name).strip().split('.')[0]
    # 随机选取1/2比例的数据为测试集
    if x>0.5:
      train_val_img_info.append(img_info)
      train_val.writelines(img_info)
    else:
      test.writelines(img_info+'\n')
 
  # 然后切分训练验证集为训练集和验证集
  for img_name in train_val_img_info:
    x = np.random.uniform(0,1)
    if x>0.5:
      train.writelines(img_name+'\n')
    else:
      val.writelines(img_name+'\n')

以上这篇将数据集制作成VOC数据集格式的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用于检查英文字母大写的isupper()方法
May 19 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
python 生成器协程运算实例
Sep 04 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
python排序函数sort()与sorted()的区别
Sep 18 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
Apr 25 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 Python
python实现IOU计算案例
Apr 12 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 #Python
开启Django博客的RSS功能的实现方法
Feb 17 #Python
Python3打包exe代码2种方法实例解析
Feb 17 #Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 #Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 #Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 #Python
基于python3的socket聊天编程
Feb 17 #Python
You might like
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
使用grappelli为django admin后台添加模板
2014/11/18 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
TensorFlow如何实现反向传播
2018/02/06 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
python支持多继承吗
2020/06/19 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
PHP面试题及答案二
2015/05/23 面试题
学习决心书范文
2014/03/11 职场文书
体育运动口号
2014/06/09 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
灵山大佛导游词
2015/02/04 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL