pytorch 如何“可视化”进入模型内的图像,以便在Detectron 2中进行训练?

afdcj2ne  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(126)

如何查看Detectron 2: Faster RCNN对象检测模型的输入?我需要调试我的模型,以查看X(图像)和Y(边界框坐标,类,标签等)。我正在使用一些自定义增强功能,在这个github评论中它说
您可以使用for data in data_loader循环访问数据加载器并可视化它们
但我该怎么做呢?我可以很容易地通过我的自定义增强运行一个循环,但我想知道的是我如何在进入模型的第一层之前看到输入
我正在使用mapper的自定义增强,如:

def custom_mapper(dataset_dict, transform_list = None):
    
    if transform_list is None:
      transform_list = [T.RandomBrightness(0.8, 1.2),
                      T.RandomContrast(0.8, 1.2),
                      T.RandomSaturation(0.8, 1.2),
                      ]
                      
    dataset_dict = copy.deepcopy(dataset_dict)
    image = utils.read_image(dataset_dict["file_name"], format="BGR")
                      
    image, transforms = T.apply_transform_gens(transform_list, image)
    tensor_image = torch.as_tensor(image.transpose(2, 0, 1).astype("float32"))
    dataset_dict["image"] =  tensor_image

    annos = [
        utils.transform_instance_annotations(obj, transforms, image.shape[:2])
        for obj in dataset_dict.pop("annotations")
        if obj.get("iscrowd", 0) == 0
    ]
    instances = utils.annotations_to_instances(annos, image.shape[:2])
    dataset_dict["instances"] = utils.filter_empty_instances(instances)

    # visualizer = Visualizer(dataset_dict["image"].numpy().transpose(1,2,0).astype(np.uint8)[:, :, ::-1], scale=0.5)
    # out = visualizer.draw_dataset_dict(dataset_dict)
    # cv2.imwrite(str(np.random.rand())+".jpg", out.get_image()[:, :, ::-1], )

    return dataset_dict

class AugTrainer(DefaultTrainer): # Trainer with augmentations
    @classmethod
    def build_train_loader(cls, cfg):
        return build_detection_train_loader(cfg, mapper=custom_mapper)

我尝试使用这3条注解掉的行(就在return dataset_dict之前)来保存图像,这样我就可以看到图像的样子,但是我怎么知道它们是否形成了正确的BB,Class,更重要的是,这些是模型内部的确切图像,并且没有其他东西改变我的输入?

qoefvg9y

qoefvg9y1#

还没有测试过,但似乎有一种方法可以覆盖SimpleTrainer类。在类detectron2.engine.train_loop.SimpleTrainer中,有一个run_step函数,其中数据在第307 - 311行进入模型内部:

loss_dict = self.model(data)

因此,我们可以在这里获得data的随机样本,并基于一些随机逻辑在训练期间保存。
但是要做到这一点,要么你必须克隆并修改系统中的Detectron 2代码,要么重写该方法。我会在未来测试第二种方法。

相关问题