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( '\r>> 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( '\n')
  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制作完毕。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM