detectron2无标注图像数据集推理、注册及无标注COCO/Labelme文件生成问题
问题解答
1. 是否可以不使用标注文件直接注册测试数据集?
不需要标注文件,也可以不用走detectron2的数据集注册流程。推理阶段完全不依赖标注数据,你可以直接遍历图片文件夹构造推理样本列表,省略注册、加载JSON的步骤,代码更简洁。
简化后的推理代码示例:
import os import cv2 from detectron2.engine import DefaultPredictor from detectron2.config import get_cfg image_dir = "data/test" # 支持的图片后缀 img_exts = ('.jpg', '.jpeg', '.png', '.bmp') # 配置部分和之前一致,省略细节 cfg = get_cfg() predictor = DefaultPredictor(cfg) # 直接遍历文件夹获取所有图片路径 for img_name in os.listdir(image_dir): if not img_name.lower().endswith(img_exts): continue image_filename = os.path.join(image_dir, img_name) img = cv2.imread(image_filename) outputs = predictor(img) # 后续处理预测结果、保存的逻辑和之前一致
如果你确实需要按照原有流程注册数据集,也可以手动构造数据集字典后调用DatasetCatalog.register接口直接注册,不需要生成JSON文件:
import os from detectron2.data import DatasetCatalog, MetadataCatalog from PIL import Image dataset_name = "test_data" image_dir = "data/test" img_exts = ('.jpg', '.jpeg', '.png', '.bmp') def get_test_dicts(): dataset_dicts = [] for idx, img_name in enumerate(os.listdir(image_dir)): if not img_name.lower().endswith(img_exts): continue file_path = os.path.join(image_dir, img_name) with Image.open(file_path) as img: width, height = img.size record = { "file_name": file_path, "image_id": idx, "height": height, "width": width, "annotations": [] # 空标注即可 } dataset_dicts.append(record) return dataset_dicts # 直接注册数据集 DatasetCatalog.register(dataset_name, get_test_dicts) # 配置你的类别元信息 MetadataCatalog.get(dataset_name).set(thing_classes=["你的类别1", "你的类别2"]) metadata = MetadataCatalog.get(dataset_name)
2. 无标注COCO/Labelme JSON生成方法
如果你的流程必须依赖COCO格式的标注文件,最简单的方式是手动构造COCO格式的字典后导出为JSON,不需要依赖额外工具:
import os import json from PIL import Image image_dir = "data/test" output_coco_path = "data/test_annotations.json" img_exts = ('.jpg', '.jpeg', '.png', '.bmp') # 替换成你自己的类别列表,id从1开始 categories = [{"id": 1, "name": "类别1"}, {"id": 2, "name": "类别2"}] coco_data = { "info": {}, "licenses": [], "categories": categories, "images": [], "annotations": [] # 标注字段留空即可 } for idx, img_name in enumerate(os.listdir(image_dir)): if not img_name.lower().endswith(img_exts): continue file_path = os.path.join(image_dir, img_name) with Image.open(file_path) as img: width, height = img.size coco_data["images"].append({ "id": idx, "file_name": img_name, # 注意这里用相对路径,和你调用register_coco_instances时传入的image_dir对应 "width": width, "height": height }) with open(output_coco_path, "w", encoding="utf-8") as f: json.dump(coco_data, f, ensure_ascii=False, indent=2)
生成的JSON文件可以直接传入你原有代码的register_coco_instances接口使用。如果需要生成Labelme格式的单图JSON,只需要遍历每张图片时单独构造包含version、flags、shapes(空数组)、imagePath、imageData(填null即可)、imageHeight、imageWidth字段的字典,单独导出为和图片同名的JSON文件即可。
内容的提问来源于stack exchange,提问作者DV82XL
相关产品推荐
相关产品推荐

