将数据集制作成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 14 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
django-rest-swagger的优化使用方法
Aug 29 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
python集成开发环境配置(pycharm)
Feb 14 Python
django 扩展user用户字段inlines方式
Mar 30 Python
tensorflow常用函数API介绍
Apr 19 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
php写app用的框架整理
2019/09/29 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
python迭代器实例简析
2014/09/25 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python发展史及网络爬虫
2019/06/19 Python
Django实现基于类的分页功能
2019/10/31 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
机电专业体育教师求职信
2013/09/21 职场文书
工程专业毕业生自荐信范文
2013/12/25 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
信仰心得体会
2014/09/05 职场文书
迎国庆演讲稿
2014/09/15 职场文书
个人自我剖析材料
2014/09/30 职场文书
六查六看心得体会
2014/10/14 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
公司员工辞职信范文
2015/05/12 职场文书
六五普法学习心得体会
2016/01/21 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
正则表达式基础与常用验证表达式
2022/06/16 Javascript