将数据集制作成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读写文件操作示例程序
Dec 02 Python
python实现udp数据报传输的方法
Sep 26 Python
Python的面向对象思想分析
Jan 14 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
python非递归全排列实现方法
Apr 10 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
Python中对象的引用与复制代码示例
Dec 04 Python
Python实现批量压缩图片
Jan 25 Python
Python反射的用法实例分析
Feb 11 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python实现京东秒杀功能代码
May 16 Python
python,Java,JavaScript实现indexOf
Sep 09 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
openPNE常用方法分享
2011/11/29 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
jQuery.each使用详解
2015/07/07 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
python如何求解两数的最大公约数
2018/09/27 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
大学生军训自我鉴定
2014/02/12 职场文书
工商管理专业自荐信
2014/06/03 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python