了解&制作数据集の学习记录

制作自己の数据集(详细学习笔记)

文章目录

  • 制作自己の数据集(详细学习笔记)
  • 前言
  • 一、下载相关数据集,作为样板(参考)
    • xml格式:
    • YOLO数据集txt标注格式:
  • 二、 windows下利用Anaconda安装LabelImg
  • 三,总结

前言

一、下载相关数据集,作为样板(参考)

目标检测领域常用的三个数据集PASCAL VOC、ImageNet、COCO.
我用的是voc2007.
Pascal VOC网址:http://host.robots.ox.ac.uk/pascal/VOC/

VOC数据集在类别上可以分为4大类,20小类。
了解&制作数据集の学习记录_第1张图片
数据集下载后解压得到一个名为VOCdevkit的文件夹,该文件夹结构如下:
了解&制作数据集の学习记录_第2张图片
简单介绍一下这五个文件夹的作用
1.Annotations:此文件中放置的是图像对应的标注文件,即,xml文件。
xml主要介绍了对应图片的基本信息,如来自那个文件夹、文件名、来源、图像尺寸以及图像中包含哪些目标以及目标的信息等等

xml格式:

了解&制作数据集の学习记录_第3张图片

下面展示一些 对应码片

import copy
from lxml.etree import Element, SubElement, tostring, ElementTree
import cv2
 
# 修改为你自己的路径
template_file = 'G:\\dataset\\WJ-data\\anno.xml'
target_dir = 'G:\\dataset\\WJ-data\\Annotations\\'
image_dir = 'G:\\dataset\\train\\'  # 图片文件夹
train_file = 'G:\\dataset\\train.txt'  # 存储了图片信息的txt文件
 
with open(train_file) as f:
    trainfiles = f.readlines()  # 标注数据 格式(filename label x_min y_min x_max y_max)
 
file_names = []
tree = ElementTree()
 
for line in trainfiles:
    trainFile = line.split()
    file_name = trainFile[0]
    print(file_name)
 
    # 如果没有重复,则顺利进行。这给的数据集一张图片的多个框没有写在一起。
    if file_name not in file_names:
        file_names.append(file_name)
        lable = trainFile[1]
        xmin = trainFile[2]
        ymin = trainFile[3]
        xmax = trainFile[4]
        ymax = trainFile[5]
 
        tree.parse(template_file)
        root = tree.getroot()
        root.find('filename').text = file_name
 
        # size
        sz = root.find('size')
        im = cv2.imread(image_dir + file_name)#读取图片信息
 
        sz.find('height').text = str(im.shape[0])
        sz.find('width').text = str(im.shape[1])
        sz.find('depth').text = str(im.shape[2])
 
        # object 因为我的数据集都只有一个框
        obj = root.find('object')
 
        obj.find('name').text = lable
        bb = obj.find('bndbox')
        bb.find('xmin').text = xmin
        bb.find('ymin').text = ymin
        bb.find('xmax').text = xmax
        bb.find('ymax').text = ymax
        # 如果重复,则需要添加object框
    else:
        lable = trainFile[1]
        xmin = trainFile[2]
        ymin = trainFile[3]
        xmax = trainFile[4]
        ymax = trainFile[5]
 
        xml_file = file_name.replace('jpg', 'xml')
        tree.parse(target_dir + xml_file)#如果已经重复
        root = tree.getroot()
 
        obj_ori = root.find('object')
 
        obj = copy.deepcopy(obj_ori)  # 注意这里深拷贝
 
        obj.find('name').text = lable
        bb = obj.find('bndbox')
        bb.find('xmin').text = xmin
        bb.find('ymin').text = ymin
        bb.find('xmax').text = xmax
        bb.find('ymax').text = ymax
        root.append(obj)
 
    xml_file = file_name.replace('jpg', 'xml')
    tree.write(target_dir + xml_file, encoding='utf-8')

YOLO数据集txt标注格式:

0 0.160938 0.541667 0.120312 0.386111

分别指所标注内容的类别、归一化后的中心点x坐标,归一化后的中心点y坐标,归一化后的目标框宽度w,归一化后的目标况高度h(此处归一化指的是除以图片宽和高)

2.ImageSets文件夹中是标注类别的每个文件列表信息,此文件中会有你划分的训练集图片和测试集图片的名称列表。
包含三个子文件夹:
Layout:存放train,valid,test和train+valid数据集的文件名
Segmentation:存放分割所用train,valid,test和train+valid数据集的文件名
Main:存放各个类别所在图片的文件名,比如cow_val,表示valid数据集中,包含有cow类别目标的图片名称。

3.JPEGImages中存放的是所有的原始图片,为.JPEG格式。

4.SegmentationCllass存放所有分割图像的标注。

5.SegmentationObject存放分割图像的标注文件。

二、 windows下利用Anaconda安装LabelImg

Step1:
打开Anaconda Prompt,新建环境:
conda create --name=labelImg python=3.7

Step2:
激活环境
conda activate labelImg

Step3:
pip install pyqt5

Step4:
pip install labelImg

环境安装完成以后,下次使用在Anaconda Prompt里使用“activate labelImg” 激活环境,输入labelImg即可,用的时候不要关闭Anaconda Prompt。

了解&制作数据集の学习记录_第4张图片
最后在保存文件的路径下生成.xml文件和PASCAL VOC所用格式相同。

三,总结

了解&制作数据集の学习记录_第5张图片
按照要求将自己做的图片放入对应文件夹,然后放入代码进行训练。

如果自己的图片的名称是很乱的,进行“改名”
代码附上:

import os
path = r"E:\团队\voc\JPEGImages"
filelist = os.listdir(path) # 该文件夹下所有的文件(包括文件夹)
count = 0
for file in filelist:
    print(file)
for file in filelist:   # 遍历所有文件
    Olddir=os.path.join(path,file)   # 原来的文件路径
    if os.path.isdir(Olddir):   # 如果是文件夹则跳过
        continue
    filename=os.path.splitext(file)[0]   # 文件名
    filetype=".jpg"   # 文件扩展名
    Newdir=os.path.join(path, str(count).zfill(5)+filetype)  # 用字符串函数zfill 以0补全所需位数
    os.rename(Olddir, Newdir)# 重命名
    count+=1

count=0 :表示从0开始写名字
zfill(5):表示有几位数字
了解&制作数据集の学习记录_第6张图片

你可能感兴趣的