首页 > 其他分享 >VOC标签格式转yolo格式并划分训练集和测试集

VOC标签格式转yolo格式并划分训练集和测试集

时间:2023-05-09 19:11:06浏览次数:48  
标签:yolov5 labels VOC yolo train path 格式 os dir

VOC标签格式转yolo格式并划分训练集和测试集

经常从网上获取一些目标检测的数据集资源标签的格式都是VOC(xml格式)的,而yolov5训练所需要的文件格式是yolo(txt格式)的,就需要对xml格式的标签文件转换为txt文件。同时训练自己的yolov5检测模型的时候,数据集需要划分为训练集和验证集。代码如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import random
from shutil import copyfile
 
classes = ["hat", "person"]
#classes=["ball"]
 
TRAIN_RATIO = 80
 
def clear_hidden_files(path):
    dir_list = os.listdir(path)
    for i in dir_list:
        abspath = os.path.join(os.path.abspath(path), i)
        if os.path.isfile(abspath):
            if i.startswith("._"):
                os.remove(abspath)
        else:
            clear_hidden_files(abspath)
 
def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)
 
def convert_annotation(image_id):
    in_file = open('VOCdevkit/VOC2007/Annotations/%s.xml' %image_id)
    out_file = open('VOCdevkit/VOC2007/YOLOLabels/%s.txt' %image_id, 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
 
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    in_file.close()
    out_file.close()
 
wd = os.getcwd()
wd = os.getcwd()
data_base_dir = os.path.join(wd, "VOCdevkit/")
if not os.path.isdir(data_base_dir):
    os.mkdir(data_base_dir)
work_sapce_dir = os.path.join(data_base_dir, "VOC2007/")
if not os.path.isdir(work_sapce_dir):
    os.mkdir(work_sapce_dir)
annotation_dir = os.path.join(work_sapce_dir, "Annotations/")
if not os.path.isdir(annotation_dir):
        os.mkdir(annotation_dir)
clear_hidden_files(annotation_dir)
image_dir = os.path.join(work_sapce_dir, "JPEGImages/")
if not os.path.isdir(image_dir):
        os.mkdir(image_dir)
clear_hidden_files(image_dir)
yolo_labels_dir = os.path.join(work_sapce_dir, "YOLOLabels/")
if not os.path.isdir(yolo_labels_dir):
        os.mkdir(yolo_labels_dir)
clear_hidden_files(yolo_labels_dir)
yolov5_images_dir = os.path.join(data_base_dir, "images/")
if not os.path.isdir(yolov5_images_dir):
        os.mkdir(yolov5_images_dir)
clear_hidden_files(yolov5_images_dir)
yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
if not os.path.isdir(yolov5_labels_dir):
        os.mkdir(yolov5_labels_dir)
clear_hidden_files(yolov5_labels_dir)
yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
if not os.path.isdir(yolov5_images_train_dir):
        os.mkdir(yolov5_images_train_dir)
clear_hidden_files(yolov5_images_train_dir)
yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
if not os.path.isdir(yolov5_images_test_dir):
        os.mkdir(yolov5_images_test_dir)
clear_hidden_files(yolov5_images_test_dir)
yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
if not os.path.isdir(yolov5_labels_train_dir):
        os.mkdir(yolov5_labels_train_dir)
clear_hidden_files(yolov5_labels_train_dir)
yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
if not os.path.isdir(yolov5_labels_test_dir):
        os.mkdir(yolov5_labels_test_dir)
clear_hidden_files(yolov5_labels_test_dir)
 
train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
train_file.close()
test_file.close()
train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')
list_imgs = os.listdir(image_dir) # list image files
prob = random.randint(1, 100)
print("Probability: %d" % prob)
for i in range(0,len(list_imgs)):
    path = os.path.join(image_dir,list_imgs[i])
    if os.path.isfile(path):
        image_path = image_dir + list_imgs[i]
        voc_path = list_imgs[i]
        (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
        (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
        annotation_name = nameWithoutExtention + '.xml'
        annotation_path = os.path.join(annotation_dir, annotation_name)
        label_name = nameWithoutExtention + '.txt'
        label_path = os.path.join(yolo_labels_dir, label_name)
    prob = random.randint(1, 100)
    print("Probability: %d" % prob)
    if(prob < TRAIN_RATIO): # train dataset
        if os.path.exists(annotation_path):
            train_file.write(image_path + '\n')
            convert_annotation(nameWithoutExtention) # convert label
            copyfile(image_path, yolov5_images_train_dir + voc_path)
            copyfile(label_path, yolov5_labels_train_dir + label_name)
    else: # test dataset
        if os.path.exists(annotation_path):
            test_file.write(image_path + '\n')
            convert_annotation(nameWithoutExtention) # convert label
            copyfile(image_path, yolov5_images_test_dir + voc_path)
            copyfile(label_path, yolov5_labels_test_dir + label_name)
train_file.close()
test_file.close()

说明:

(1)首先数据集的格式结构必须严格按照如图的样式来,因为代码已经将文件名写死了。

其中,Annotations里面存放着xml格式的标签文件,JPEGImages里面存放着照片数据文件。

(2)classes里面必须正确填写xml里面已经标注好的类,要不然生成的txt的文件是不对的。TRAIN_RATIO是训练集和验证集的比例,当等于80的时候,说明划分80%给训练集,20%给验证集。

(3) 新建.py文件,放在与VOCdevkit文件夹同级别的位置**,将上面代码粘贴进去,运行,得到如下的结果

在VOCdevkit目录下生成images和labels文件夹,文件夹下分别生成了train文件夹和val文件夹,里面分别保存着训练集的照片和txt格式的标签,还有验证集的照片和txt格式的标签。images文件夹和labels文件夹就是训练yolov5模型所需的训练集和验证集。在VOCdevkit/VOC2007目录下还生成了一个YOLOLabels文件夹,里面存放着所有的txt格式的标签文件。

标签:yolov5,labels,VOC,yolo,train,path,格式,os,dir
From: https://www.cnblogs.com/qqsj/p/17385990.html

相关文章

  • rocky linux:为新磁盘做分区/格式化/挂载(Rocky Linux 9.1)
    一,查看所有磁盘查看磁盘的分区[root@blog~]#fdisk-lDisk/dev/vda:50GiB,53687091200bytes,104857600sectorsUnits:sectorsof1*512=512bytesSectorsize(logical/physical):512bytes/512bytesI/Osize(minimum/optimal):512bytes/512bytesDi......
  • Oracle TO_CHAR(待格式化数据, 'FM99999990.00')
    作用:对数据进行格式化①其9代表:如果存在数字则显示数字,不存在则显示空格②其0代表:如果存在数字则显示数字,不存在则显示0,即占位符。③其FM代表:删除如果是因9带来的空格,则删除之......
  • 目前常用的在线格式化工具
    一、BeJson格式化工具网址:在线JSON校验格式化工具(BeJSON)优点:工具多缺点:广告多,界面设计较旧,拼凑的工具网站,界面风格差异较大不统一。    二、Robots2开发工具箱网址:Robots2开发工具网站优点:工具界面风格统一,界面整洁,有日常开发用到的工具和网站导航......
  • DVD转换RMVB格式的方法
    直接将DVD转换为RMVB的方法 一.安装mpeg2解码器: 因为转换软件“Helix_Producer_Plus_9.0.1”不能直接读取DVD专用的VOB文件,所以必须安装mpeg2专用解码器“ElecardMPEG2VideoDecoderV2.0e”,安装后就可以在“Helix_Producer_Plus_9.0.1”中调用VOB文件作为源文件了。 二.安装......
  • 一种基于虚拟摄像头、NDI、OBS以及yolo的多机视觉目标检测方案
    一种基于虚拟摄像头、NDI、OBS以及yolo的多机视觉目标检测方案绪论近来为了实现某种实时展示效果,笔者希望通过一套方案实现在两台主机上分别运行仿真平台以及视觉深度学习算法。透过对当下较为流行的几种方案的调研,笔者最后决定了采用OBS采集并透过NDI协议在局域网内进行广播,再......
  • [重读经典论文]YOLOX
    参考博客:YOLOX网络结构详解参考视频:YOLOX网络结构详解亮点:网络检测头部分,改成解耦的结构,将类别分数、边界框回归参数和objectness分别预测,提高网络收敛速度。使用Anchorfree对目标进行预测。正负样本匹配策略SimOTA。(完)......
  • TCP系列01—概述及协议头格式
    目录 一、TCP简单介绍面向连接可靠性字节流式二、TCP的封装和协议头的格式三、TCP中的数据包窗口和滑窗一、TCP简单介绍connection-oriented)、可靠的(reliable)、字节流式(byte stream)传输协议, TCP的这三个特性该怎么理解呢?面向连接在应用TCP协议进行通信之前双方通常需要通......
  • 搞定endnotes期刊的参考文献格式
    我用的是EndnoteX9版本,且是Windows系统。具体分为以下四种情况:1.Endnote软件存在引用格式Endnote软件中就存在你所要投稿期刊的参考文献格式这个时候要注意,你可以去软件中直接查看是否有你的期刊格式,但是笔者建议你可以直接去Word中查看,毕竟你的主战场就在Word。......
  • 巧用Chrome格式化压缩后的js文件
    对于格式化的js文件,可以用chrome处理。打开chrome浏览器,按F12进入开发者工具界面,找到一个压缩js文件,如图: 在浏览器的底部(左边)的工具栏有一个"{}"样的图标 ,点击一下就可以了。 格式后: 格式化的js也可以左击保存:......
  • 挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)
    挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)本文档环境为centos7.9版本目录挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)一、NTFS-3G说明二、在线安装(有网络环境)三、离线安装(无网络环境)1单独下载软件包(gcc、ntfs-3g)2将下载的软件包传输目标虚拟机(......