作者|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 你需要的中间结果。 你有以下选择:
- 编写一个(子)模型。按照教程(https://detectron2.readthedocs.io/tutorials/write-models.html),你可以重写模型组件(例如模型的头部),使其与现有组件执行相同的操作,但返回你需要的输出。
- 部分执行模型。你可以照常创建模型,但要使用自定义代码而不是
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/
来源:oschina
链接:https://my.oschina.net/u/4253699/blog/4284321