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格式,该格式直接存储像素级的边界框极值,转换逻辑更简单。
转换逻辑
- 遍历所有标注XML文件,逐个解析文件内容
- 读取对应原图的宽、高像素值
- 提取XML中存储的像素级标注坐标
(xmin, ymin, xmax, ymax),分别做归一化处理:- ymin = 像素级ymin / 原图高度
- xmin = 像素级xmin / 原图宽度
- ymax = 像素级ymax / 原图高度
- xmax = 像素级xmax / 原图宽度
- 将归一化后的坐标调整为
[ymin, xmin, ymax, xmax]顺序,组装为np.float32数组 - 所有图片对应的数组合并为一个列表,即为要求的
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
相关产品推荐
相关产品推荐

