zoukankan      html  css  js  c++  java
  • VOC2007数据集转换成CSV格式[

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

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

    利用Retinanet 训练自己的数据集 | keras retinanet - focal loss 网络训练过程中使用csv格式进行训练自己的数据

    一、csv数据准备(需要利用Pascal voc2007数据集形式来生成)

    在生成csv数据集时候,需要先将自己的数据做成VOC 2007形式,参考上篇博客:VOC2007数据集制作-进行自己数据集的训练,可用于目标检测、图像分隔等任务

    Pascal voc2007 数据集转换成csv数据集时候,将会使用voc2007数据集中三个文件JPEGImages,Annatations,ImageSets中Main文件夹生成,结果保存到csv文件夹下的annotations.csv,classes.csv。

    首先介绍本文使用的文件夹目录情况:

    1. 自己的voc2007数据集,用来生成csv数据集

    自己的VOC数据格式如下,图片的命名没有按照标准VOC2007重命名,因为在后面进行Retinanet训练时候,图片名字不影响。

    ├── Annotations
    ├── 0095.xml
    ├── 0096.xml
    ├── 0312.xml
    ├── 0313.xml
    ├── 0588.xml
    ├── 0589.xml
    ├── 0590.xml
    ├── 0800.xml
    ├── 0801.xml
    ├── 0802.xml
    ├── 0803.xml
    ├── 0804.xml
    └── 0805.xml
    ├── generate_Main_txt.py # generate_Main_txt是上文博客中生成ImageSets/Main中4个txt的函数。在本篇博客暂时用不到
    ├── ImageSets
    └── Main
    ├── test.txt
    ├── train.txt
    ├── trainval.txt
    └── val.txt
    ├── JPEGImages
    ├── 0095.png
    ├── 0096.png
    ├── 0312.png
    ├── 0313.png
    ├── 0588.png
    ├── 0589.png
    ├── 0590.png
    ├── 0800.png
    ├── 0801.png
    ├── 0802.png
    ├── 0803.png
    ├── 0804.png
    └── 0805.png
    └── pascal2csv.py
    
    4 directories, 32 files

    2.自己的csv数据集按如下格式存放

    ├── csv
    │   ├── Annotations  #上文步骤1中的自己的vOC2007数据集中的Annotations
    │   │   ├── 0095.xml
    │   │   ├── 0096.xml
    │   │   ├── 0312.xml
    │   │   ├── 0313.xml
    │   │   ├── 0588.xml
    │   │   ├── 0589.xml
    │   │   ├── 0590.xml
    │   │   ├── 0800.xml
    │   │   ├── 0801.xml
    │   │   ├── 0802.xml
    │   │   ├── 0803.xml
    │   │   ├── 0804.xml
    │   │   └── 0805.xml
    │   ├── annotations.csv #生成的CSV数据集中文件
    │   ├── classes.csv #生成的CSV数据集中文件
    │   ├── ImageSets  #上文步骤1中的自己的vOC2007数据集中的ImageSets
    │   │   └── Main
    │   │       ├── test.txt
    │   │       ├── train.txt
    │   │       ├── trainval.txt
    │   │       └── val.txt
    │   ├── JPEGImages  #上文步骤1中的自己的vOC2007数据集中的JPEGImages
    │   │   ├── 0095.png
    │   │   ├── 0096.png
    │   │   ├── 0312.png
    │   │   ├── 0313.png
    │   │   ├── 0588.png
    │   │   ├── 0589.png
    │   │   ├── 0590.png
    │   │   ├── 0800.png
    │   │   ├── 0801.png
    │   │   ├── 0802.png
    │   │   ├── 0803.png
    │   │   ├── 0804.png
    │   │   └── 0805.png
    │   └── pascal2csv.py #下文将要说的转换函数

    二、Pascal voc2007 数据集转换成csv数据转换函数

    直接上pascal2csv.py:

    1.  
      # -*- coding:utf-8 -*-
    2.  
       
    3.  
      import csv
    4.  
      import os
    5.  
      import glob
    6.  
      import sys
    7.  
       
    8.  
      class PascalVOC2CSV(object):
    9.  
      def __init__(self,xml=[], ann_path='./annotations.csv',classes_path='./classes.csv'):
    10.  
      '''
    11.  
      :param xml: 所有Pascal VOC的xml文件路径组成的列表
    12.  
      :param ann_path: ann_path
    13.  
      :param classes_path: classes_path
    14.  
      '''
    15.  
      self.xml = xml
    16.  
      self.ann_path = ann_path
    17.  
      self.classes_path=classes_path
    18.  
      self.label=[]
    19.  
      self.annotations=[]
    20.  
       
    21.  
      self.data_transfer()
    22.  
      self.write_file()
    23.  
       
    24.  
       
    25.  
      def data_transfer(self):
    26.  
      for num, xml_file in enumerate(self.xml):
    27.  
      try:
    28.  
      # print(xml_file)
    29.  
      # 进度输出
    30.  
      sys.stdout.write(' >> Converting image %d/%d' % (
    31.  
      num + 1, len(self.xml)))
    32.  
      sys.stdout.flush()
    33.  
       
    34.  
      with open(xml_file, 'r') as fp:
    35.  
      for p in fp:
    36.  
      if '<filename>' in p:
    37.  
      self.filen_ame = p.split('>')[1].split('<')[0]
    38.  
       
    39.  
      if '<object>' in p:
    40.  
      # 类别
    41.  
      d = [next(fp).split('>')[1].split('<')[0] for _ in range(9)]
    42.  
      self.supercategory = d[0]
    43.  
      if self.supercategory not in self.label:
    44.  
      self.label.append(self.supercategory)
    45.  
       
    46.  
      # 边界框
    47.  
      x1 = int(d[-4]);
    48.  
      y1 = int(d[-3]);
    49.  
      x2 = int(d[-2]);
    50.  
      y2 = int(d[-1])
    51.  
       
    52.  
      self.annotations.append([os.path.join('JPEGImages',self.filen_ame),x1,y1,x2,y2,self.supercategory])
    53.  
      except:
    54.  
      continue
    55.  
       
    56.  
      sys.stdout.write(' ')
    57.  
      sys.stdout.flush()
    58.  
       
    59.  
      def write_file(self,):
    60.  
      with open(self.ann_path, 'w', newline='') as fp:
    61.  
      csv_writer = csv.writer(fp, dialect='excel')
    62.  
      csv_writer.writerows(self.annotations)
    63.  
       
    64.  
      class_name=sorted(self.label)
    65.  
      class_=[]
    66.  
      for num,name in enumerate(class_name):
    67.  
      class_.append([name,num])
    68.  
      with open(self.classes_path, 'w', newline='') as fp:
    69.  
      csv_writer = csv.writer(fp, dialect='excel')
    70.  
      csv_writer.writerows(class_)
    71.  
       
    72.  
       
    73.  
      xml_file = glob.glob('./Annotations/*.xml')
    74.  
       
    75.  
      PascalVOC2CSV(xml_file)

    函数运行结束后,会在目录下生成classes.csv、annotations.csv.

    他们的格式大致如下:

    annotations.csv

    path/to/image.jpg,x1,y1,x2,y2,class_name
    
    /data/imgs/img_001.jpg,837,346,981,456,cow
    /data/imgs/img_002.jpg,215,312,279,391,cat # 02图片第一个对象
    /data/imgs/img_002.jpg,22,5,89,84,bird # 02图片第二个对象
    /data/imgs/img_003.jpg,,,,, # 背景图片,没有任何要检查的对象

    classes.csv

    class_name,id
    
    cow,0
    cat,1
    bird,2
    # 因为这里的背景对应的类别为 空 ,
    # 而mask RCNN 与 FCN(RFCN)都是使用0来表示背景,也就是google object detection中的检测框架,以及mask rcnn中第一种目标是从1开始标记的

    至此,自己数据集csv制作完毕。

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 7-1用宏求球的体积
    Java实现 蓝桥杯 算法提高 递推求值
    Java实现 蓝桥杯 算法提高 矩阵相乘
    当时忍住就好了——关键时刻忍得住,告别容易后悔的人生
    心若向阳,何惧忧伤——没有注定的不幸,只有死不放手的执着——人大部分的痛苦,都是不肯离场的结果
    你只需努力 剩下的交给时光(你不对自己狠,就别怪别人对你狠)
    事情已经到了这一步,要赌就只能全力以赴——红朝的那些事情(四三二)
    SlimFTPd, LFTP和FileZilla Client/Server
    Redis .NET开源组件Beetle.Redis
    .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式2
  • 原文地址:https://www.cnblogs.com/shuimuqingyang/p/14211213.html
Copyright © 2011-2022 走看看