如何可视化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
相关产品推荐
相关产品推荐

