YOLOv8处理数据集:xml文件转txt文件,有些值大于1,如何处理?

YOLOv8处理数据集:xml文件转txt文件,有些值大于1,如何处理?

在这里插入图片描述

上图是xml标注文件,可以看到x轴坐标超出810这个边界了。YOLOv8要求归一化后的结果范围是[0,1],这种情况将会直接影响归一化的结果,使结果大于1

采用的处理方式比较简单,就是判断:如果xmax>width或ymax>height,那么将xmax=width,ymax=height。这样处理以后就不会出现归一化越界问题了。

整理不易,关注和收藏后拿走!
欢迎专注我的公众号:AdaCoding 和 Github:AdaCoding123
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是代码,注释已经写好了: ```python import os import xml.etree.ElementTree as ET def convert_annotations(xml_dir, txt_dir): """ 将目标检测数据集XML格式标注文件换为YOLOv5读取的TXT格式标注文件 :param xml_dir: 存放XML标注文件的目录 :param txt_dir: 存放TXT标注文件的目录 :return: None """ if not os.path.exists(txt_dir): os.makedirs(txt_dir) for xml_file in os.listdir(xml_dir): # 解析XML文件 tree = ET.parse(os.path.join(xml_dir, xml_file)) root = tree.getroot() # 获取图片宽度和高度 size = root.find('size') width = float(size.find('width').text) height = float(size.find('height').text) # 遍历每个object标签,获取类别和坐标信息,并将其换为YOLOv5的格式 for obj in root.iter('object'): cls_name = obj.find('name').text cls_id = 0 # 此处的类别id为0,如果有多类别需要修改 bndbox = obj.find('bndbox') xmin = float(bndbox.find('xmin').text) ymin = float(bndbox.find('ymin').text) xmax = float(bndbox.find('xmax').text) ymax = float(bndbox.find('ymax').text) # 计算中心点坐标和宽高 x_center = (xmin + xmax) / (2 * width) y_center = (ymin + ymax) / (2 * height) box_width = (xmax - xmin) / width box_height = (ymax - ymin) / height # 将换后的标注信息写入TXT文件 txt_file = os.path.splitext(xml_file)[0] + '.txt' with open(os.path.join(txt_dir, txt_file), 'a') as f: f.write(f"{cls_id} {x_center} {y_center} {box_width} {box_height}\n") ``` 说明: 1. `xml_dir`:存放XML格式标注文件的目录; 2. `txt_dir`:存放TXT格式标注文件的目录; 3. `if not os.path.exists(txt_dir): os.makedirs(txt_dir)`:如果TXT目录不存在,则创建; 4. `for xml_file in os.listdir(xml_dir)): `:遍历XML格式标注文件目录下的所有文件; 5. `tree = ET.parse(os.path.join(xml_dir, xml_file))`:解析XML格式标注文件; 6. `root = tree.getroot()`:获取XML文件的根节点; 7. `size = root.find('size')`:获取图片的宽度和高度; 8. `width = float(size.find('width').text)`:获取图片的宽度; 9. `height = float(size.find('height').text)`:获取图片的高度; 10. `for obj in root.iter('object'):`:遍历XML文件中的所有`object`标签; 11. `cls_name = obj.find('name').text`:获取类别名称; 12. `cls_id = 0`:此处的类别id为0,如果有多类别需要修改; 13. `bndbox = obj.find('bndbox')`:获取目标框的坐标信息; 14. `xmin = float(bndbox.find('xmin').text)`:获取目标框左上角点的横坐标; 15. `ymin = float(bndbox.find('ymin').text)`:获取目标框左上角点的纵坐标; 16. `xmax = float(bndbox.find('xmax').text)`:获取目标框右下角点的横坐标; 17. `ymax = float(bndbox.find('ymax').text)`:获取目标框右下角点的纵坐标; 18. `x_center = (xmin + xmax) / (2 * width)`:计算目标框中心点的横坐标; 19. `y_center = (ymin + ymax) / (2 * height)`:计算目标框中心点的纵坐标; 20. `box_width = (xmax - xmin) / width`:计算目标框的宽度; 21. `box_height = (ymax - ymin) / height`:计算目标框的高度; 22. `txt_file = os.path.splitext(xml_file)[0] + '.txt'`:生成TXT文件文件名; 23. `with open(os.path.join(txt_dir, txt_file), 'a') as f:`:打开TXT文件,追加写入标注信息; 24. `f.write(f"{cls_id} {x_center} {y_center} {box_width} {box_height}\n")`:将标注信息写入TXT文件,格式为`类别id 中心点横坐标 中心点纵坐标 目标框宽度 目标框高度`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值