如何将边界框标注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_idcategory_id:取第一步生成的类别映射中对应类别的idbbox: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
相关产品推荐
相关产品推荐

