将数据集制作成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生成指定长度的随机数密码
Jan 23 Python
Python的类实例属性访问规则探讨
Jan 30 Python
Python实现简单的可逆加密程序实例
Mar 05 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
python的Tqdm模块的使用
Jan 10 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python写文件时覆盖原来的实例方法
Jul 22 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
Pytest allure 命令行参数的使用
Apr 18 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
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
smarty缓存用法分析
2014/12/16 PHP
PHP实现合并discuz用户
2015/08/05 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
JavaScript触发器详解
2007/03/10 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
javascript常用的方法整理
2015/08/20 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
python flask中静态文件的管理方法
2018/03/20 Python
PyQt5每天必学之布局管理
2018/04/19 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
Python如何实现单例模式
2016/06/03 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
开学典礼决心书
2014/03/11 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
邀请函模板
2015/02/02 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
Java 写一个简单的图书管理系统
2022/04/26 Java/Android