You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow目标检测API数据集类型及LabelImg标注数据转换问题

问题解答

一、Colab教程使用的标注格式说明

该教程使用的不属于COCO/YOLO/VOC三类公开标准数据集格式,是TensorFlow Object Detection API小样本训练场景下的自定义归一化边界框格式,具体规则如下:

  • 列表的每个元素对应1张图片的标注,为np.float32类型的数组
  • 单张图片的每个标注框包含4个值,格式为 [ymin, xmin, ymax, xmax],所有值均为0~1区间的归一化值,是相对于原图宽高的相对坐标
  • 若单张图包含多个标注目标,单个np数组内可插入多行框坐标数据即可

二、LabelImg标注转目标格式的实现方法

前置准备

LabelImg标注时选择保存为VOC XML格式,该格式直接存储像素级的边界框极值,转换逻辑更简单。

转换逻辑

  1. 遍历所有标注XML文件,逐个解析文件内容
  2. 读取对应原图的宽、高像素值
  3. 提取XML中存储的像素级标注坐标(xmin, ymin, xmax, ymax),分别做归一化处理:
    • ymin = 像素级ymin / 原图高度
    • xmin = 像素级xmin / 原图宽度
    • ymax = 像素级ymax / 原图高度
    • xmax = 像素级xmax / 原图宽度
  4. 将归一化后的坐标调整为[ymin, xmin, ymax, xmax]顺序,组装为np.float32数组
  5. 所有图片对应的数组合并为一个列表,即为要求的gt_boxes

示例转换代码

import os
import numpy as np
import xml.etree.ElementTree as ET

# 替换为你自己的LabelImg标注XML文件夹路径
xml_dir = "./labelimg_annotations"
gt_boxes = []

for xml_file in os.listdir(xml_dir):
    if not xml_file.endswith(".xml"):
        continue
    tree = ET.parse(os.path.join(xml_dir, xml_file))
    root = tree.getroot()
    # 读取原图宽高
    size = root.find("size")
    width = int(size.find("width").text)
    height = int(size.find("height").text)
    # 收集当前图片的所有标注框
    boxes = []
    for obj in root.iter("object"):
        bndbox = obj.find("bndbox")
        xmin = int(bndbox.find("xmin").text) / width
        ymin = int(bndbox.find("ymin").text) / height
        xmax = int(bndbox.find("xmax").text) / width
        ymax = int(bndbox.find("ymax").text) / height
        boxes.append([ymin, xmin, ymax, xmax])
    # 转为np数组加入结果列表
    gt_boxes.append(np.array(boxes, dtype=np.float32))

注意事项

  • 若单张图只有1个标注目标,生成的数组形状和教程示例完全一致,可直接代入使用
  • 坐标顺序不要调整错误,否则会出现框定位完全偏移的问题
  • 确保XML文件和原图的对应关系一致,不要出现标注文件和图片数量、名称不匹配的情况

内容的提问来源于stack exchange,提问作者littlec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:27:02