这篇文章主要参考博客Yolo标准数据集格式转Voc数据集中的代码,对原博客代码进行一定修改、添加注释,此外还在后面添加了我自己写的一段关于对转换后的标注文件进行整理的脚本代码。

Yolo标注的格式与VOC格式不同之处在于:

(1)Yolo格式下的每张图片的所有包含的目标的标注信息,都统一以txt文件的形式储存。一张图片对应一个与其相同名称的txt文件。在txt文件中,每一行对应图片中一个目标的信息,用一个数字指代种类编号,剩下四个数字代表坐标信息。

VOC格式则是每张图片对应一个与其相同名称的xml格式文件。

(2)Yolo格式的数据集,是将训练数据和验证(测试)数据分成两个文件夹,例如训练数据文件夹下包括:训练图片文件夹、训练图片对应的标注文件(txt格式)的文件夹。

VOC格式则是将所有图片(无论是训练图片还是测试图片)都放在一个文件夹下、将所有标注文件(无论是训练的还是测试的)也都放在一个文件夹下,最后用两个txt格式的文件来指定那些是训练数据,哪些是测试数据:例如,train.txt中将所有训练数据(训练图片的名称,去掉.jpg后缀)按每行对应一个的方式储存,test.txt则将所有测试数据的名称(去掉后缀)储存起来。

由此,我们在将Yolo格式的数据集转换成voc格式的数据集时,主要有两部分工作:

(1)将所有的txt标注文件转化成xml标注文件。(2)将yolo数据集的整理形式转化成voc的整理形式:包括将分成train和val(test)两个部分的图片、标注文件合到一起,同时将所有训练集数据名称(去掉后缀)写入到train.txt、将所有测试集数据名称(去掉后缀)写入到test.txt。

以上介绍的转换工作对应的代码均在下面列出。

1.将txt标注文件批量转换成xml标注文件

import xml.dom.minidom
import glob
from PIL import Image
from math import ceil
import shutilyolo_file = r'/home/dwt/DataSets/MSAR/MSAR-1.0/val/yolo_labels'#yolo格式下的存放txt标注文件的文件夹
turn_xml_file = r'/home/dwt/DataSets/MSAR/MSAR-1.0/val/voc_labels'#转换后储存xml的文件夹地址
img_file = r'/home/dwt/DataSets/MSAR/MSAR-1.0/val/images'#存放图片的文件夹labels = ['船只', '油罐','飞机', '桥梁']
src_img_dir = img_file
src_txt_dir = yolo_file
src_xml_dir = turn_xml_file #转换后储存xml的文件夹地址img_Lists = glob.glob(src_img_dir + '/*.jpg')
img_basenames = []
for item in img_Lists:img_basenames.append(os.path.basename(item))#os.path.basename返回path最后的文件名img_names = []
for item in img_basenames:temp1, temp2 = os.path.splitext(item) #os.path.splitext(“文件路径”)    分离文件名与扩展名img_names.append(temp1)total_num = len(img_names) #统计当前总共要转换的图片标注数量
count = 0 #技术变量
for img in img_names: #这里的img是不加后缀的图片名称,如:'GF3_SAY_FSI_002732_E122.3_N29.9_20170215_L1A_HH_L10002188179__1__4320___10368'count +=1if count % 1000 == 0:print("当前转换进度{}/{}".format(count,total_num))im = Image.open((src_img_dir + '/' + img + '.jpg'))width, height = im.size#打开yolo格式下的txt文件gt = open(src_txt_dir + '/' + img + '.txt').read().splitlines()if gt:# 将主干部分写入xml文件中xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')xml_file.write('<annotation>\n')xml_file.write('    <folder>VOC2007</folder>\n')xml_file.write('    <filename>' + str(img) + '.jpg' + '</filename>\n')xml_file.write('    <size>\n')xml_file.write('        <width>' + str(width) + '</width>\n')xml_file.write('        <height>' + str(height) + '</height>\n')xml_file.write('        <depth>3</depth>\n')xml_file.write('    </size>\n')# write the region of image on xml filefor img_each_label in gt:spt = img_each_label.split(' ')  # 这里如果txt里面是以逗号‘,’隔开的,那么就改为spt = img_each_label.split(',')。xml_file.write('    <object>\n')xml_file.write('        <name>' + str(labels[int(spt[0])]) + '</name>\n')xml_file.write('        <pose>Unspecified</pose>\n')xml_file.write('        <truncated>0</truncated>\n')xml_file.write('        <difficult>0</difficult>\n')xml_file.write('        <bndbox>\n')center_x = round(float(spt[1].strip()) * width)center_y = round(float(spt[2].strip()) * height)bbox_width = round(float(spt[3].strip()) * width)bbox_height = round(float(spt[4].strip()) * height)xmin = str(int(center_x - bbox_width / 2))ymin = str(int(center_y - bbox_height / 2))xmax = str(int(center_x + bbox_width / 2))ymax = str(int(center_y + bbox_height / 2))xml_file.write('            <xmin>' + xmin + '</xmin>\n')xml_file.write('            <ymin>' + ymin + '</ymin>\n')xml_file.write('            <xmax>' + xmax + '</xmax>\n')xml_file.write('            <ymax>' + ymax + '</ymax>\n')xml_file.write('        </bndbox>\n')xml_file.write('    </object>\n')xml_file.write('</annotation>')else:# 将主干部分写入xml文件中xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')xml_file.write('<annotation>\n')xml_file.write('    <folder>VOC2007</folder>\n')xml_file.write('    <filename>' + str(img) + '.jpg' + '</filename>\n')xml_file.write('    <size>\n')xml_file.write('        <width>' + str(width) + '</width>\n')xml_file.write('        <height>' + str(height) + '</height>\n')xml_file.write('        <depth>3</depth>\n')xml_file.write('    </size>\n')xml_file.write('</annotation>')

2. 将所有训练集、测试集数据名称(去掉后缀)分别写入到train.txt、test.txt

#将转换后的xml文件按train 和test 归类到train.txt和test.txt中
path = r'/home/dwt/DataSets/MSAR/MSAR-1.0'
xml_Lists = glob.glob(src_xml_dir + '/*.xml')xml_basenames = []
for item in xml_Lists:xml_basenames.append(os.path.basename(item))xml_names = [] #这里是将xml文件去掉.xml后缀储存到的列表中
for item in xml_basenames:temp1, temp2 = os.path.splitext(item)  # os.path.splitext(“文件路径”)    分离文件名与扩展名xml_names.append(temp1)txt_file = open((path + '/val.txt'),'w')
for item in xml_names:txt_file.write(str(item)+'\n')

3.将分成train和val(test)两个部分的图片、标注文件和到一起(分别将yolo下的训练部分和测试部分的数据复制到同一文件夹下)

#复制train和val下的文件到一个文件夹中
base_src = r'/home/dwt/DataSets/MSAR/MSAR-1.0/val/images'#要复制的文件所在的文件夹
base_dst = r'/home/dwt/MyCode/pycharm_projects/YOLOX_offical/datasets/VOCdevkit/VOC2011/JPEGImages'#将文件复制到的目标文件夹
list_src = glob.glob(base_src + '/*.jpg')#复制的所有文件list_src_basenames = []
for item in list_src:list_src_basenames.append(os.path.basename(item))total_num = len(list_src_basenames)
c = 0
for item in list_src_basenames:c += 1if c % 1000 == 0:print('当前已复制{}/{}'.format(c,total_num))shutil.copyfile(os.path.join(base_src,item),os.path.join(base_dst,item))

4.当训练集数据过多,我们还可以再用下面的代码,来从已有的训练集中随机抽取一部分数据进行训练,来加快训练速度。

由于VOC格式的标注中是将训练集、测试集数据混在一起存放,通过train.txt文件来指定那些数据是训练集数据,所以要实现随机抽取部分数据进行训练可以通过在原train.txt文件中随机抽取一部分写入新的train.txt,实现代码如下:

#由于数据量过大,计划将数据集的训练集部分抽出一部分来训练,减少训练花费时间
import randomtrain_txt = r'/home/dwt/MyCode/pycharm_projects/YOLOX_offical/datasets/VOCdevkit/VOC2011/ImageSets/Main/train.txt'#原先分好的储存训练集信息的train.txt
train_sample_txt = r'/home/dwt/MyCode/pycharm_projects/YOLOX_offical/datasets/VOCdevkit/VOC2011/ImageSets/Main/train_sample.txt'sample_ratio = 0.1 #指定抽取的数据占原来数据的比例train_data_list = []
train_file = open(train_txt)
for line in train_file.readlines():train_data_list.append(line)total_num = len(train_data_list)
total_id_list = range(total_num)
train_sample_num = int(total_num * sample_ratio)sample_id_list = random.sample(total_id_list,train_sample_num)train_sample_file = open(train_sample_txt,'w')
for i in total_id_list:if i in sample_id_list:name = train_data_list[i]train_sample_file.write(name)train_sample_file.close()

将Yolo格式标注文件转换为VOC格式相关推荐

  1. 将VOC格式标注文件转换为Yolo格式

    这篇文章主要参考博客中的代码,对原博客VOC格式数据集转yolo格式代码进行一定修改.添加注释,此外还在后面添加了我自己写的一段关于对转换后的图片和标注文件进行整理的脚本代码. 关于数据集在Yolo格 ...

  2. msg文件转成html文件,如何将MSG格式的文件转换为PDF格式文件?

    三.如何将MSG格式的文件转换为PDF格式的文件? 想要随时查看MSG格式文件的话,格式转换就成为了理想的途径,下面将教大家将MSG格式的文件转换为PDF格式文件三种方式,一起去学习一下吧. 1.借助 ...

  3. 使用jsmpegjs前,先把利用 ffmpeg 将 MP4 格式的文件转换为 ts 格式

    利用 ffmpeg 将 MP4 格式的文件转换为 TS 格式 ffmpeg官网:http://ffmpeg.org/download.html ffmpeg下载地址: https://github.c ...

  4. xml格式标注文件转csv格式

    将xml格式的标注文件转为csv格式 方便后续转为tfrecord格式供tensorflow使用 注意,该代码仅使用矩形框标注方法 import os import glob import panda ...

  5. Visdrone2019数据集.txt标签文件转换为voc格式.XML标签文件

    最近有同学问是否有Visdrone数据集的xml文件,由于本人之前训练数据的时候没有保存xml文件,所以无法共享. 为了解决这个问题,重新写了转换代码并贴出,供大家共同学习使用.(文末附上数据下载网盘 ...

  6. RLE格式标注文件转为PNG格式(Run Length Encode)

    一.什么是 RLE 格式 在机器视觉领域的深度学习中,每个数据集都有一份标注好的数据用于训练神经网络. 为了节省空间,很多数据集的标注文件使用RLE的格式,比如 kaggle 挑战赛的 Airbus ...

  7. 使用Python把flv格式的文件转换为mp3格式

    目的:想把喜欢视频转换为音频,在手机上听 以下的是转换的关键代码,首先要确保moviepy库是安装成功了. import moviepy.editor as mpif __name__ == &quo ...

  8. C#实现csv文件or xls文件转换为txt格式文件的源码

    在做C#对接PLC数据写入.采集时,项目有一个环节需要把 csv或xls格式的文件转换为txt格式的文件. 以下是核心源码,未做包装. 聪明的你可以把它写成winform, 但请不要以此为任何商业目的 ...

  9. 把LabelImg标注的YOLO格式标签转化为VOC格式标签 和 把VOC格式标签转化为YOLO格式标签

    把LabelImg标注的YOLO格式标签转化为VOC格式标签 和 把VOC格式标签转化为YOLO格式标签 文章目录: 1 用LabelImgvoc和yolo标注标签格式说明 1.1 LabelImg标 ...

最新文章

  1. mysql 查询表总行数字段_mysql中怎么查询表中的字段个数
  2. svmtrain和svmpredict简介(转)
  3. oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志
  4. c++将引用作为函数的参数---6
  5. jdk switch 枚举_JDK 12开关表达式遇到意外的枚举值
  6. Logistics模型预测银行贷款违约
  7. MySql关键字-保留字
  8. python-ImageDraw
  9. 下载eclipse太慢怎么办?
  10. 中国建设工程造价管理系统 http://zaojiasys.jianshe99.com/cecaopsys/
  11. 纯前端支持拼音搜索功能
  12. 为什么阿里,腾讯,百度和京东都是在开曼岛注册的?
  13. jvm调优二:jvm内存模型剖析和参数设置
  14. 个人申请微信支付接口教程(免签约支付)
  15. 如何修复png图片?简单的方法
  16. WebRTC之服务器搭建
  17. css中文字体乱码解决方案:
  18. 国内外云主机服务对比
  19. Direct3D 9.0 SDK 文档(中文版)
  20. Windows/Windows下堪称神器的软件集合

热门文章

  1. Android之BMI体脂计算器
  2. NAS Ubuntu all in one软硬件方案
  3. PowerPro 超级大PK 之挑战群魔系列:
  4. java设计程序实验报告,实验报告一
  5. 服务器Linux系统安全升级
  6. 数据链路层的封装-HDLC协议
  7. 芯片底部焊接不良失效分析
  8. PaddleSpeech 流式语音识别系统 PP-ASR
  9. 定时使用Tushare下载日线交易数据到Sqlite3数据库
  10. Frame::Frame(1)