YOLO格式数据集和VOC格式数据集互转(txt&xml)
2023-09-11 14:22:57 时间
前言
在使用labelimg进行数据标注时可以将结果保存为yolo格式或者voc格式,但是发现要是想用labelimg打开yolo识别后的txt就不行了,在训练ai的时候我们可以用已经有的结果识别一遍图片,然后再进行查漏补缺,这样子效率会更高,这里出一个YOLO的txt与voc的xml相互转换源代码
一、voc转yolo(xml转txt)
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
def convert(size, box):
x_center = (box[0] + box[1]) / 2.0
y_center = (box[2] + box[3]) / 2.0
x = x_center / size[0]
y = y_center / size[1]
w = (box[1] - box[0]) / size[0]
h = (box[3] - box[2]) / size[1]
return (x, y, w, h)
def convert_annotation(xml_files_path, save_txt_files_path, classes):
xml_files = os.listdir(xml_files_path)
print(xml_files)
for xml_name in xml_files:
print(xml_name)
xml_file = os.path.join(xml_files_path, xml_name)
out_txt_path = os.path.join(save_txt_files_path, xml_name.split('.')[0] + '.txt')
out_txt_f = open(out_txt_path, 'w')
tree = ET.parse(xml_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))
# b=(xmin, xmax, ymin, ymax)
print(w, h, b)
bb = convert((w, h), b)
out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
if __name__ == "__main__":
# 把voc的xml标签文件转化为yolo的txt标签文件
# 1、类别
classes1 = ['1','4']
# 2、voc格式的xml标签文件路径
xml_files1 = r'xml2'
# 3、转化为yolo格式的txt标签文件存储路径
save_txt_files1 = r'txt3'
convert_annotation(xml_files1, save_txt_files1, classes1)
将以上代码拷贝到一个py文件里,修改xml_files1与save_txt_files1为自己文件所在的相对路径,修改classes为自己标注的类别,cmd切换到当前py文件路径下,python ***.py 即可。
二、yolo转voc(txt转xml)
与上面代码一样,这里需要修改如下四条为自己对应的路径与类别
- voc_annotations = r'1010-01xml'
- yolo_txt = r'1010-01txt'
- img_path = r'1010-01photo'
- labels = ['1','4'] # label for datasets
import os
import glob
from PIL import Image
voc_annotations = r'1010-01xml'
yolo_txt = r'1010-01txt'
img_path = r'1010-01photo'
labels = ['1','4'] # label for datasets
# 图像存储位置
src_img_dir = img_path # 添加你的路径
# 图像的txt文件存放位置
src_txt_dir = yolo_txt
src_xml_dir = voc_annotations
img_Lists = glob.glob(src_img_dir + '/*.jpg')
img_basenames = []
for item in img_Lists:
img_basenames.append(os.path.basename(item))
img_names = []
for item in img_basenames:
temp1, temp2 = os.path.splitext(item)
img_names.append(temp1)
for img in img_names:
im = Image.open((src_img_dir + '/' + img + '.jpg'))
width, height = im.size
# 打开txt文件
gt = open(src_txt_dir + '/' + img + '.txt').read().splitlines()
print(gt)
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 file
for img_each_label in gt:
spt = img_each_label.split(' ') # 这里如果txt里面是以逗号‘,’隔开的,那么就改为spt = img_each_label.split(',')。
print(f'spt:{spt}')
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>')
相关文章
- 使用&#x3000;等空格实现最小成本中文对齐
- [Angular & Unit Testing] Automatic change detection
- [Angular 2] ElementRef, @ViewChild & Renderer
- 【IOS-COCOS2D-X 游戏开发之九】COCOS2DX利用CCSAXPARSER解析XML数据&CCMUTABLEDICTIONARY使用与注意!
- Linux基础之vi&vim基础篇
- [RxJS] AuditTime & throttleTime
- PG&GP · 特性分析 · 外部数据导入接口实现分析
- select * from table where 1<>1
- 华为OD机试 - 最短木板长度(Java & JS & Python)
- List & Label Professional Reporting Edition 28
- DL之pix2pix:基于food_resized数据集利用TF框架的pix2pix模型实现Auto Color黑白图像上色/老照片上色/黑白变彩色技术—训练&测试过程全记录
- ML之PDP:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用DT决策树&RF随机森林+PDP部分依赖图可视化实现模型可解释性之详细攻略
- ML之LiR&Lasso:基于datasets糖尿病数据集利用LiR和Lasso算法进行(9→1)回归预测(三维图散点图可视化)
- Windows:利用各种小工具查看自己电脑上的CPU&GPU型号、个数、详细参数等不同方法的详细攻略
- 【大数据&AI人工智能】图文详解 ChatGPT、文心一言等大模型背后的 Transformer 算法原理
- 【大数据&人工智能AI2.0】GPT-4 office 全家桶发布,打工人凛冬将至 :Microsoft 365 Copilot (副驾驶)简介
- 【大数据&AI人工智能】意识是什么? AI 怎样才算是拥有了意识?
- 【大数据&AI人工智能】每天都在改变世界!这绝对是 AI 史上最疯狂的一周
- Property Trees & DispalyItem
- 话题讨论&征文--谈论大数据时我们在谈什么 获奖名单发布
- access数据库:怎么直接从access里把数据里同样的文字替换成空字符""
- 智能威胁分析之图数据构建——关联数据为环境数据图:如资产、资产脆弱性、文件信息、用户信息、IT系统架构信息等 行为数据图:如网络侧检测告警、终端侧检测告警、文件分析日志、应用日志、蜜罐日志、沙箱日志等 情报数据图:各类外部威胁情报 知识数据图:各类知识库(如ATT&CK,CAPEC,CWE)等
- 377. Combination Sum IV——DP本质:针对结果的迭代,dp[ans] <= dp[ans-i] & dp[i] 找三者关系 思考问题的维度+1,除了数据集迭代还有考虑结果
- 目标检测算法——行人检测&人群计数数据集汇总(附下载链接)
- Keras之DNN:基于Keras(sigmoid+linear+mse+predict)利用DNN实现回归预测——DIY多分类数据集&预测新数据点
- 【Web开发】Vue2.0数据去重&Element-UI单选框
- 【大数据实时数据同步】OGG异构多路映射同步原表&审计表&只存删除数据表实现方案(二)