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

解析COCO JSON标注文件报string indices must be integers错误如何解决

报错根因

该错误和你的文件名格式没有任何关系,不需要修改文件名,问题出在COCO JSON的遍历逻辑错误:
COCO格式的标注文件顶层是字典结构,核心包含images、annotations、categories三个一级键,你原有代码直接for i in dataset_dicts遍历的是字典的键字符串(比如首个循环的i就是字符串"images"),对字符串执行i['file_name']取值操作自然触发「字符串索引必须为整数」的报错。

修复后的代码
import json
from detectron2.structures import BoxMode # 确保你已经导入对应依赖

def get_board_dicts(imgdir):
    json_file = imgdir + "/_annotations.coco.json"
    with open(json_file) as f:
        coco_dict = json.load(f)
    
    # 先把所有标注按image_id分组,方便后续关联到对应图片
    anno_by_imgid = {}
    for anno in coco_dict["annotations"]:
        img_id = anno["image_id"]
        if img_id not in anno_by_imgid:
            anno_by_imgid[img_id] = []
        # 直接在这一步处理标注格式
        anno["bbox_mode"] = BoxMode.XYWH_ABS
        anno["category_id"] = int(anno["category_id"])
        anno_by_imgid[img_id].append(anno)
    
    # 遍历图片列表组装最终结果
    dataset_dicts = []
    for img_info in coco_dict["images"]:
        # 补全图片路径
        img_info["file_name"] = imgdir + "/" + img_info["file_name"]
        # 关联对应标注
        img_info["annotations"] = anno_by_imgid.get(img_info["id"], [])
        dataset_dicts.append(img_info)
    
    return dataset_dicts
关键修改说明
  • 不再直接遍历整个COCO字典,改为遍历coco_dict["images"]下的图片条目,这里的每个条目才是包含file_name字段的字典对象
  • 提前按image_id对所有标注做了分组,避免每遍历一张图都要全量扫描所有标注,提升大体积数据集的处理效率
  • 整个过程没有对文件名做任何修改,你的特殊格式文件名可以正常使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:42:03