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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:36:08