参考
Detectron2入门教程
Use Models
Detectron2-使用模型(Use Models)官方文档中文翻译
总览
- 主要介绍如何构建模型。
- 构建模型方式:通过调用
build_model
,build_backbone
,build_roi_heads
等方法来构建。 - 要导入权重可以使用
DetectionCheckpointer(model).load(file_path)
。 - 使用模型就是
outputs = model(inputs)
- 模型输入使用的参数通过
list[dict]
来实现,即上面dataloader
的输出,具体的key
形式可以参考这个页面中的内容。 - 模型输出也是一个
list[dict]
,具体的形式可以参考这篇文章中的内容。
detectron2 中的模型(及其子模型)是由例如build_model
, build_backbone
, build_roi_heads
等函数构建。
from detectron2.modeling import build_model
model = build_model(cfg) # returns a torch.nn.Module
build_model
只构建模型结构,并用随机参数填充它。有关如何将现有Checkpoint加载到模型以及如何使用model
对象,请参见下面的内容。
1 加载/保存 Checkpoint
from detectron2.checkpoint import DetectionCheckpointer
DetectionCheckpointer(model).load(file_path_or_url) # load a file, usually from cfg.MODEL.WEIGHTS
checkpointer = DetectionCheckpointer(model, save_dir="output")
checkpointer.save("model_999") # save to output/model_999.pth
Detectron2的Checkpoint可以识别pytorch中 .pth
格式的模型,以及我们的model zoo中的.pkl
文件,更多使用细节请看API doc。
model files可以使用.pth
文件来任意操作torch.{load,save}
或者使用.pkl
文件pickle.{dump,load}
2 使用模型
使用outputs = model(inputs)
来调用模型,inputs
是list[dict]
中的一个, 每个dict对应一个图像,所需的keys取决于模型的类型,以及模型是处于训练模式还是评估模式。 例如,为了进行推断,所有现有的模型都需要“image” key,以及可选的“height”和“width” key。现将现有模型输入和输出的详细格式解释如下。
Training:当处于训练模型时,所有的模型都需要在EventStorage下使用。将训练统计数据存入仓库:
from detectron2.utils.events import EventStorage
with EventStorage() as storage:
losses = model(inputs)
Inference:如果你只想使用现有的模型进行简单的推断,DefaultPredictor是提供这种基本功能的模型的包装器。它包括默认行为,包括模型加载、预处理,对单个图像而不是批处理进行操作。请参阅其文档了解其用法。
你也可以像这样直接运行推断:
model.eval()
with torch.no_grad():
outputs = model(inputs)
3 模型输入格式
用户可以实现支持任意输入格式的自定义模型。这里我们描述所有内置模型在detectron2中支持的标准输入格式。它们都以list[dict]作为输入。每个dict对应于一个图像的信息。
dict可能包含以下的keys:
- “image”:
Tensor
在(C,H,W)格式,通道的意义被cfg.INPUT.FORMAT
定义,图像归一化,如果有,将在模型内使用cfg.MODEL.PIXEL_{MEAN,STD}
执行。 - “height”,“width” : 期望输出的高度和宽度,不一定与图像字段的高度或宽度相同,例如,如果将调整大小用作预处理步骤,则图像字段包含调整大小的图像。但你可能希望输出为原始分辨率,如果提供,模型将以该分辨率输出,而不是以图像的分辨率作为模型的输入。这样更有效率、更准确。
- “instances”: 用于训练的实例对象,具有以下字段
- “gt_boxes” : Boxes存了 N 个 boxes ,一个 box 对应一个实例。
- “gt_classes” : long 类型的 Tensor ,一个有 N 个标号的向量,范围为 [0,num_categories]
- “gt_masks” : PolygonMasks 或者 BitMasks 存储了 N 个 mask,每个实例有一个 mask
- “gt_keypoints” : Keypoints 存储了 N 个 keypoint 集合,每个实例有一个。
- “sem_seg”: (H,W) 格式的 Tensor[int] .语义分割为训练奠定了基础。值表示从0开始的类别标签。
-“proposals”: 只用在 Fast R-CNN 风格模型中的实例物体,有以下字段:- “proposal_boxes” : 是一个 Boxes 存储了 P proposal boxes
- “objectness_logits”: Tensor, a vector of P scores, one for each proposal.
对于内部模型的推断,只需要 “image” ,而 “width/height” 是可选的。
我们当前不会为全景分割训练定义标准的输入格式,因为模型现在使用自定义 data loader 产生的自定义格式。
它是怎样连接到 data loader 上的:
默认的 DatasetMapper 是一个包含了以上格式的 dict 的输出。数据加载器执行批处理后, 便成为了内置模型支持的 list[dict]
。