Detectron2 使用模型 | 六

时光总嘲笑我的痴心妄想 提交于 2020-07-28 13:33:26

作者|facebookresearch 编译|Flin 来源|Github

使用模型

detectron2中的模型(及其子模型)由函数,例如build_model,build_backbone,build_roi_heads构成:

from detectron2.modeling import build_model
model = build_model(cfg)  #返回torch.nn.Module

注意,build_model仅构建模型结构,并用随机参数填充它。要将现有检查点加载到模型,请使用 DetectionCheckpointer(model).load(file_path)。Detectron2可以识别pytorch .pth格式的模型,以及我们model zoo中的.pkl文件。

你可以通过outputs = model(inputs)使用模型。接下来,我们解释一下detectron2中内置模型使用的输入/输出格式。

DefaultPredictor(https://detectron2.readthedocs.io/modules/engine.html#detectron2.engine.defaults.DefaultPredictor) 是模型的包装,提供常规推断的默认行为。它包括模型加载和预处理,并且对单个图像进行操作,而不是按批处理。

模型输入格式

所有内置模型均以"list [dict]"作为输入。每个字典对应于有关一张图像的信息。

该字典可能包含以下键:

  • "image":(C,H,W)格式的Tensor。通道的含义由cfg.INPUT.FORMAT定义。图像归一化(如果有)将在模型内部执行。

  • "instances":一个 Instances对象,具有以下字段:

    • "gt_boxes":一个Boxes对象,存储N个box,每个实例一个。
    • "gt_classes":Tensor长类型,是N个标签的向量,范围[0,num_categories)。
    • "gt_masks":一个PolygonMasks 或BitMasks对象,存储N个mask,每个实例一个。
    • "gt_keypoints":一个关键点对象存储N个关键点集,每个实例。
  • "proposals":仅在Fast R-CNN样式模型中使用的Instances对象,具有以下字段:

    • "proposal_boxes":一个 Boxes对象,用于存储P个proposal box。
    • "objectness_logits":"Tensor",P得分的向量,每个proposal一个。
  • "height","width":所需的输出高度和宽度,不一定与image输入字段的高度或宽度相同。例如,image输入字段可能是调整大小的图像,但你可能希望输出为原始分辨率。

    如果提供,模型将以该分辨率产生输出,而不是将"图像"的分辨率作为模型的输入。这样更有效,更准确。

  • "sem_seg":Tensor int (H,W)格式。语义分割ground truth.。值表示从0开始的类别标签。

如何连接到数据加载器:

默认的DatasetMapper(https://detectron2.readthedocs.io/modules/engine.html#detectron2.engine.defaults.DefaultPredictor) 的输出是字典,遵循上述格式。 数据加载器执行批处理后,list[dict]内置模型将支持它。

模型输出格式

在训练模式下,内置模型输出所有损失的dict [str-> ScalarTensor]

在推理模式下,内置模型输出一个"list [dict]",每个图像一个dict。 根据模型正在执行的任务,每个字典可能包含以下字段:

  • "instances":Instances对象具有以下字段:

    • "pred_boxes":Boxes对象,存储N个box,每个检测到的实例一个。
    • "分数":"Tensor",是N个得分的向量。
    • "pred_classes":Tensor,N个标签的向量,范围为[0,num_categories)。
    • "pred_masks":形状(N,H,W)的"张量",每个检测到的实例的mask。
    • "pred_keypoints":形状为(N,num_keypoint,3)的"张量"。 最后一维中的每一行都是(x,y,score)。分数大于0。
  • "sem_seg":(num_categories,H,W)的Tensor,语义分割预测。

  • "proposals": 具有以下字段的实例对象:

    • "proposal_boxes":存储N个盒子的Boxes对象。
    • "objectness_logits":N个得分的torch矢量。
  • "panoptic_seg":(Tensor, list[dict])的元组。张量具有(H,W)形状,其中每个元素代表像素的段ID。每个字典描述一个段ID,并具有以下字段:

    • "id":片段ID
    • "isthing":片段是thing还是stuff
    • "category_id":此片段的类别ID。表示当isthing==True时它代表thing类ID,否则代表stuff类ID。

如何在代码中使用模型:

用必要的键构造自己的list [dict]作为输入。然后调用outputs = model(inputs)。 例如,为了进行推断,请为字典提供"图像",以及可选的"高度"和"宽度"。

请注意,在训练模式下,所有模型都必须在"EventStorage"下使用。训练统计信息将被存储:

from detectron2.utils.events import EventStorage
with EventStorage() as storage:
  losses = model(inputs)

要记住的另一件事:detectron2模型不支持model.to(device)model.cpu()。该设备在 cfg.MODEL.DEVICE中定义,之后无法更改。

部分执行模型:

有时你可能想在模型内部获得中间张量。 由于通常有数百个中间张量,因此没有提供你的API 你需要的中间结果。 你有以下选择:

  1. 编写一个(子)模型。按照教程(https://detectron2.readthedocs.io/tutorials/write-models.html),你可以重写模型组件(例如模型的头部),使其与现有组件执行相同的操作,但返回你需要的输出。
  2. 部分执行模型。你可以照常创建模型,但要使用自定义代码而不是forward()来执行它。例如,以下代码在mask head之前获取mask 特征。
images = ImageList(...)  # 预处理输入张量
model = build_model(cfg)
features = model.backbone(images.tensor)
proposals, _ = model.proposal_generator(images, features)
instances = model.roi_heads._forward_box(features, proposals)
mask_features = model.roi_heads.mask_pooler(features, [x.pred_boxes for x in instances])

请注意,这两个选项都要求你阅读现有的后面的文档代码以了解 如何编写代码以获得所需的输出。

原文链接:https://detectron2.readthedocs.io/tutorials/models.html

欢迎关注磐创AI博客站: http://panchuang.net/

sklearn机器学习中文官方文档: http://sklearn123.com/

欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!