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

如何将边界框标注CSV文件转换为COCO JSON格式

CSV边界框标注转COCO JSON实现方案

COCO JSON格式的检测标注核心包含3个必填字段:images、annotations、categories,你可以按照以下步骤转换:

步骤说明

  • 第一步:处理类别映射
    遍历CSV所有class字段去重,给每个类别分配唯一的数字id(COCO规范默认类别id从1开始,0保留为背景类)。
  • 第二步:生成images数组
    按image_id对CSV去重,每一个唯一的image_id对应images数组里的一个元素,字段直接映射即可:
    # 单张图片的结构示例
    {
      "id": int(image_id),
      "width": int(width),
      "height": int(height),
      "file_name": filename
    }
    
  • 第三步:生成annotations数组
    遍历CSV的每一行标注(每一行对应一个标注框),每个元素的字段按以下规则计算:
    • id:标注的唯一自增id,从1开始累加即可
    • image_id:直接取CSV里的image_id
    • category_id:取第一步生成的类别映射中对应类别的id
    • bbox:COCO的bbox格式为[左上角x坐标, 左上角y坐标, 框宽度, 框高度],对应你的CSV字段计算为[xmin, ymin, xmax - xmin, ymax - ymin]
    • area:标注框面积,计算为(xmax - xmin) * (ymax - ymin)
    • iscrowd:无对应字段的话默认填0即可
    • segmentation:仅做目标检测任务的话填空数组[]即可

完整Python示例代码

import pandas as pd
import json

def csv_to_coco(csv_path, output_json_path):
    # 如果你的CSV是制表符分隔,加参数 sep='\t'
    df = pd.read_csv(csv_path)
    
    # 1. 生成categories
    unique_classes = df['class'].unique().tolist()
    # 类别id从1开始,0保留为背景类
    cat2id = {cat: i+1 for i, cat in enumerate(unique_classes)}
    categories = [{"id": v, "name": k, "supercategory": "none"} for k, v in cat2id.items()]
    
    # 2. 生成images
    unique_images = df.drop_duplicates(subset=['image_id'])[['image_id', 'filename', 'width', 'height']]
    images = []
    for _, row in unique_images.iterrows():
        images.append({
            "id": int(row['image_id']),
            "width": int(row['width']),
            "height": int(row['height']),
            "file_name": row['filename']
        })
    
    # 3. 生成annotations
    annotations = []
    ann_id = 1
    for _, row in df.iterrows():
        xmin, ymin, xmax, ymax = row['xmin'], row['ymin'], row['xmax'], row['ymax']
        w = xmax - xmin
        h = ymax - ymin
        annotations.append({
            "id": ann_id,
            "image_id": int(row['image_id']),
            "category_id": cat2id[row['class']],
            "bbox": [xmin, ymin, w, h],
            "area": w * h,
            "iscrowd": 0,
            "segmentation": []
        })
        ann_id += 1
    
    # 组装成完整COCO结构
    coco_json = {
        "info": {},
        "licenses": [],
        "categories": categories,
        "images": images,
        "annotations": annotations
    }
    
    # 保存文件
    with open(output_json_path, 'w') as f:
        json.dump(coco_json, f, indent=2)

# 调用示例
# csv_to_coco("your_annotation.csv", "output_coco.json")

注意事项

  • 如果你的CSV里xmin/ymin/xmax/ymax是归一化后的相对坐标(取值范围0-1),需要先分别乘对应图片的width和height,转成绝对像素坐标再计算
  • 注意检查坐标是否存在越界的情况(比如xmax超过图片宽度、ymin小于0等),避免后续训练报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:27:01