解析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
相关产品推荐
相关产品推荐

