Detectron2 使用模型 | 六
本文是全系列中第5 / 15篇:Detectron2
- Detectron2 使用自定义数据集 | 四
- Detectron2 基准测试 | 十二
- Detectron2 使用自定义数据加载器 | 五
- Detectron2 与其他库的兼容性 | 十三
- Detectron2 使用模型 | 六
- Detectron2 API 之 checkpoint | 十四
- Detectron2 编写模型 | 七
- Detectron2 API 之 config | 十五
- Detectron2 开始训练 | 八
- Detectron2 安装 | 一
- Detectron2 进行评估 | 九
- Detectron2 入门 | 二
- Detectron2 配置 | 十
- Detectron2 扩展默认值 | 三
- Detectron2 部署 | 十一
作者|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
原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/05/31/detectron2-%e4%bd%bf%e7%94%a8%e6%a8%a1%e5%9e%8b-%e5%85%ad/