LabelImg与COCO数据集:标注格式转换与使用方法

LabelImg与COCO数据集:标注格式转换与使用方法

【免费下载链接】labelImg 🎉 超级实用!LabelImg,图像标注神器,现在加入Label Studio社区,享受多模态数据标注新体验!🚀 简单易用,支持XML、YOLO和CreateML格式,适用于ImageNet等项目。不再单独维护,立即尝试Label Studio,安装一键到位,更灵活,功能更强大!👇 安装即刻开始:pip3 install labelImg,或访问 获取源码构建。一起探索数据标注的新边界!👨‍💻👩‍💻【此简介由AI生成】 【免费下载链接】labelImg 项目地址: https://gitcode.com/gh_mirrors/la/labelImg

你是否在目标检测项目中遇到过标注格式不兼容的问题?比如用LabelImg标注的XML文件无法直接用于COCO数据集训练?本文将详细介绍如何解决这一痛点,通过三步实现LabelImg标注格式到COCO格式的转换,并提供完整的使用指南。读完本文你将学会:LabelImg标注文件结构解析、格式转换工具使用方法、COCO数据集整合技巧。

LabelImg标注格式解析

LabelImg是一款轻量级图像标注工具(Image Annotation Tool),支持Pascal VOC XML、YOLO和CreateML三种格式。其核心标注逻辑通过libs/labelFile.py实现,主要包含以下关键方法:

  • save_pascal_voc_format: 生成Pascal VOC XML格式文件
  • save_yolo_format: 生成YOLO txt格式文件
  • save_create_ml_format: 生成Apple CreateML格式文件

LabelImg工作界面

XML格式标注文件包含图像尺寸、目标类别和边界框坐标等信息,典型结构如下:

<annotation>
  <size>
    <width>800</width>
    <height>600</height>
    <depth>3</depth>
  </size>
  <object>
    <name>cat</name>
    <bndbox>
      <xmin>100</xmin>
      <ymin>80</ymin>
      <xmax>300</xmax>
      <ymax>250</ymax>
    </bndbox>
  </object>
</annotation>

COCO数据集格式规范

COCO(Common Objects in Context)数据集是目标检测领域的重要基准,其标注格式采用JSON格式,主要包含以下结构:

{
  "images": [{"id": 1, "width": 800, "height": 600, "file_name": "image1.jpg"}],
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 1,
      "bbox": [100, 80, 200, 170],
      "area": 34000,
      "iscrowd": 0
    }
  ],
  "categories": [{"id": 1, "name": "cat"}]
}

COCO格式与LabelImg默认输出的XML格式有三个主要区别:

  1. 坐标表示:COCO使用(x, y, width, height),XML使用(xmin, ymin, xmax, ymax)
  2. 数据组织:COCO采用单一JSON文件存储所有标注,XML为每张图像单独文件
  3. 元数据要求:COCO需要图像ID、标注ID等额外元数据

格式转换工具使用指南

LabelImg项目提供了tools/label_to_csv.py工具,可作为格式转换的基础。虽然该工具主要输出CSV格式,但通过以下步骤可间接实现COCO格式转换:

第一步:准备标注文件和类别定义

确保已完成以下准备工作:

  • 使用LabelImg标注图像并保存为XML格式
  • 类别定义文件位于data/predefined_classes.txt,每行一个类别名称
  • 安装必要依赖:pip install pandas

第二步:XML转CSV

运行label_to_csv.py工具将XML格式转换为CSV中间格式:

python tools/label_to_csv.py \
  -p "local" \
  -l "标注文件目录" \
  -m "xml" \
  -o "labels.csv" \
  -c "data/predefined_classes.txt"

参数说明:

  • -p: 路径前缀(本地转换可设为"local")
  • -l: 标注文件所在目录
  • -m: 输入格式("xml"或"txt")
  • -o: 输出CSV文件名
  • -c: 类别定义文件路径

转换后CSV文件结构如下(部分列):

数据集划分图像路径类别x_miny_minx_maxy_max
trainimage1.jpgcat0.1250.1330.3750.417

第三步:CSV转COCO JSON

使用以下Python代码将CSV文件转换为COCO格式JSON(需自行实现或使用第三方库):

import pandas as pd
import json
import os

def csv_to_coco(csv_path, img_dir, output_json):
    df = pd.read_csv(csv_path, header=None)
    images = []
    annotations = []
    categories = sorted(list(df[2].unique()))
    
    # 类别映射
    cat_id = {name: i+1 for i, name in enumerate(categories)}
    
    # 处理图像
    img_ids = {}
    for idx, img_path in enumerate(df[1].unique()):
        img_id = idx + 1
        img_ids[img_path] = img_id
        img = {
            "id": img_id,
            "file_name": os.path.basename(img_path),
            "width": 800,  # 需从图像文件读取实际尺寸
            "height": 600
        }
        images.append(img)
    
    # 处理标注
    for idx, row in df.iterrows():
        ann = {
            "id": idx + 1,
            "image_id": img_ids[row[1]],
            "category_id": cat_id[row[2]],
            "bbox": [row[3], row[4], row[6]-row[3], row[7]-row[4]],
            "area": (row[6]-row[3])*(row[7]-row[4]),
            "iscrowd": 0
        }
        annotations.append(ann)
    
    # 构建COCO格式字典
    coco = {
        "images": images,
        "annotations": annotations,
        "categories": [{"id": i, "name": name} for name, i in cat_id.items()]
    }
    
    with open(output_json, "w") as f:
        json.dump(coco, f)

# 使用示例
csv_to_coco("labels.csv", "图像目录", "coco_annotations.json")

COCO数据集整合与使用

数据集目录结构

转换完成后,建议采用以下COCO数据集标准目录结构组织文件:

coco_dataset/
├── annotations/
│   └── instances_train2025.json
├── train2025/
│   ├── image1.jpg
│   └── image2.jpg
└── val2025/
    ├── image3.jpg
    └── image4.jpg

在主流框架中使用

PyTorch使用示例
from torchvision.datasets import CocoDetection
from torchvision.transforms import ToTensor

dataset = CocoDetection(
    root="coco_dataset/train2025",
    annFile="coco_dataset/annotations/instances_train2025.json",
    transform=ToTensor()
)

# 获取样本
img, targets = dataset[0]
print(f"图像尺寸: {img.shape}")
print(f"目标数量: {len(targets)}")
TensorFlow使用示例
import tensorflow as tf
from tensorflow.keras.utils import get_file

# 加载COCO数据集
data = tf.data.Dataset.list_files("coco_dataset/train2025/*.jpg")
# 解析标注(需自行实现解析函数)
dataset = data.map(parse_coco_annotation)

常见问题解决

坐标归一化问题

LabelImg XML格式使用绝对坐标,而YOLO格式使用相对坐标。转换时需注意坐标转换公式:

# XML到YOLO格式转换
x_center = (xmin + xmax) / (2 * image_width)
y_center = (ymin + ymax) / (2 * image_height)
width = (xmax - xmin) / image_width
height = (ymax - ymin) / image_height

中文路径问题

如遇中文路径导致的文件读取错误,可修改libs/ustr.py确保UTF-8编码支持:

def ustr(x):
    """Convert x to unicode string"""
    if isinstance(x, bytes):
        return x.decode('utf-8', errors='ignore')
    return str(x)

大量图像处理

处理超过1000张图像时,建议使用批处理方式:

# 分割标注文件到多个目录
split -l 1000 annotations.csv batch_
# 批量处理
for file in batch_*; do
  python tools/label_to_csv.py -l $file -m xml -o ${file%.csv}_out.csv
done

总结与扩展

本文介绍了LabelImg标注格式与COCO数据集的转换方法,通过XML→CSV→COCO JSON的间接转换路径,解决了格式不兼容问题。核心工具是项目内置的tools/label_to_csv.py,结合自定义脚本可实现完整转换流程。

对于需要频繁进行格式转换的用户,建议基于本文方法开发专用的XML→COCO转换工具,并提交PR到LabelImg项目。此外,LabelImg已加入Label Studio社区,未来可能提供更直接的COCO格式支持,可关注项目更新。

通过合理使用LabelImg和COCO数据集,你可以更高效地开展目标检测模型训练工作。如有任何问题,可参考项目官方文档README.rst或提交issue获取帮助。

【免费下载链接】labelImg 🎉 超级实用!LabelImg,图像标注神器,现在加入Label Studio社区,享受多模态数据标注新体验!🚀 简单易用,支持XML、YOLO和CreateML格式,适用于ImageNet等项目。不再单独维护,立即尝试Label Studio,安装一键到位,更灵活,功能更强大!👇 安装即刻开始:pip3 install labelImg,或访问 获取源码构建。一起探索数据标注的新边界!👨‍💻👩‍💻【此简介由AI生成】 【免费下载链接】labelImg 项目地址: https://gitcode.com/gh_mirrors/la/labelImg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值