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

如何可视化Detectron2模型训练前的输入图像与标注?

调试Detectron2 Faster RCNN:验证模型输入与标注信息

要确认送入模型的真实图像输入(X)和标注信息(Y,包括边界框、类别等),你需要复用训练时的配置和数据处理逻辑,直接遍历模型使用的数据加载器来获取并可视化数据。以下是具体实现步骤:

1. 构建与训练一致的数据加载器

直接使用训练时的配置cfg和自定义custom_mapper构建数据加载器,这样拿到的就是和模型训练阶段完全相同的输入数据:

from detectron2.data import build_detection_train_loader
# 导入你的配置文件和自定义mapper
from your_training_script import cfg, custom_mapper

# 构建训练数据加载器(和Trainer内部使用的完全一致)
data_loader = build_detection_train_loader(cfg, mapper=custom_mapper)

2. 遍历数据加载器并可视化输入与标注

遍历数据加载器,取出每个batch的样本,将图像tensor还原为可显示的格式,同时用Detectron2的Visualizer绘制标注信息,确保和模型输入完全一致:

import cv2
import numpy as np
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog

# 获取数据集元数据,用于类别名称映射
metadata = MetadataCatalog.get(cfg.DATASETS.TRAIN[0])

# 遍历前5个batch进行调试(可按需调整数量)
for batch_idx, batch in enumerate(data_loader):
    if batch_idx >= 5:
        break
    # 处理batch中的每个样本
    for sample_idx, sample in enumerate(batch):
        # 将模型输入的tensor图像还原为原始格式
        img_tensor = sample["image"]
        # 转换通道顺序:C,H,W → H,W,C
        img = img_tensor.permute(1, 2, 0).cpu().numpy()
        
        # 还原Detectron2的像素预处理(根据你的配置调整)
        mean = np.array(cfg.MODEL.PIXEL_MEAN)
        std = np.array(cfg.MODEL.PIXEL_STD)
        img = img * std + mean  # 若未设置PIXEL_STD,仅需执行 img += mean
        img = np.clip(img, 0, 255).astype(np.uint8)
        
        # 转换为RGB格式(Visualizer默认使用RGB)
        img_rgb = img[:, :, ::-1]
        
        # 初始化可视化工具,绘制标注信息
        visualizer = Visualizer(img_rgb, metadata=metadata, scale=0.8)
        # 绘制真实标注(gt_boxes、gt_classes等)
        out = visualizer.draw_instance_predictions(sample["instances"].to("cpu"))
        
        # 保存调试图像
        save_path = f"debug_batch{batch_idx}_sample{sample_idx}.jpg"
        cv2.imwrite(save_path, out.get_image()[:, :, ::-1])  # 转回BGR格式给OpenCV保存
        print(f"已保存调试图像:{save_path}")

3. 打印标注数值信息验证正确性

除了可视化,还可以直接打印标注的具体数值,确认边界框坐标、类别ID等是否正确:

# 取batch中的第一个样本打印详情
sample = batch[0]
instances = sample["instances"].to("cpu")

print(f"图像尺寸(C,H,W):{sample['image'].shape}")
print(f"有效标注数量:{len(instances)}")
print(f"边界框坐标(xyxy格式):\n{instances.gt_boxes.tensor.numpy()}")
print(f"类别ID:{instances.gt_classes.numpy()}")
print(f"类别名称:{[metadata.thing_classes[cls] for cls in instances.gt_classes.numpy()]}")

为什么之前的方法可能不准确?

你之前在custom_mapper中直接可视化的结果,没有考虑数据加载器后续的潜在处理逻辑(比如配置中的全局像素标准化、batch层面的操作等)。而直接遍历build_detection_train_loader返回的数据加载器,拿到的是完全送入模型第一层的真实数据,能准确验证输入和标注的一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:55:16