detectron2模型使用、读写、训练及测试

转载:https://blog.csdn.net/weixin_34910922/article/details/106991586,这里仅当学习使用

1、使用模型

在detectron2模型(及其子模型)是由功能,如内置build_model,build_backbone,build_roi_heads:

from detectron2.modeling import build_model
model = build_model(cfg)  # returns a torch.nn.Module

1.1、加载/保存检查点

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的检查点可以识别pytorch .pth格式的模型以及.pkl我们模型动物园中的文件。 有关其用法的更多详细信息,请参见API文档

该模型文件可以使用任意操纵torch.{load,save}的.pth文件或 pickle.{dump,load}对.pkl文件。

1.2、使用模型

可以通过调用模型,其中是。每个字典对应一个图像,所需的键取决于模型的类型以及模型是处于训练还是评估模式。例如,为了进行推断,所有现有模型都希望使用“图像”键,并且可以选择使用“高度”和“宽度”。现有模型的输入和输出的详细格式说明如下。

outputs = model(inputs) inputs list[dict]

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

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

如果只想使用现有模型进行简单推断,则 DefaultPredictor 是提供此类基本功能的模型包装。它包括默认行为,包括模型加载,预处理以及对单个图像(而不是批量图像)进行操作。有关用法,请参见其文档。

模型也可以像这样直接使用:

model.eval()
with torch.no_grad():
  outputs = model(inputs)

1.3、模型输入格式

用户可以实现支持任何任意输入格式的自定义模型。在这里,我们描述了detectron2中所 有内置模型都支持的标准输入格式。它们都以a list[dict]作为输入。每个字典对应于有关一个图像的信息。

该字典可能包含以下键:

  • “图像”:Tensor(C,H,W)格式。通道的含义由定义cfg.INPUT.FORMAT。图像归一化(如果有)将使用在模型内部执行 cfg.MODEL.PIXEL_{MEAN,STD}。

  • “ height”,“ width”:所需的输出高度和宽度,不一定与image字段的高度或宽度相同。例如,image如果将调整大小用作预处理步骤,则该字段包含调整大小的图像。但是您可能希望输出为原始分辨率。

  • “实例”:一个 用于训练的实例对象,具有以下字段:

    • “ gt_boxes”:一个Boxes对象,存储N个盒子,每个实例一个。

    • “ gt_classes”:Tensor长类型,是N个标签的向量,范围[0,num_categories)。

    • “ gt_masks”:一个PolygonMasks 或BitMasks对象,存储N个遮罩,每个实例一个。

    • “gt_keypoints”:一个关键点 对象存储N个关键点集,每个实例。

  • “建议”: 仅在Fast R-CNN样式模型中使用的Instances对象,具有以下字段:

    • “ proposal_boxes”:一个Boxes对象,存储P个投标框。

    • “ objectness_logits”:TensorP分数的向量,每个提案一个。

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

  • “ sem_seg”:(Tensor[int]H,W)格式。语义分割是训练的基础。值代表从0开始的类别标签。

它如何连接到数据加载器:

默认DatasetMapper的输出是遵循上述格式的字典。数据加载器执行批处理后,list[dict]内置模型将支持它。

1.4、模型输出格式

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

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

  • “实例”: 具有以下字段的实例对象:

    • “ pred_boxes”:Boxes对象,存储N个盒子,每个检测到的实例一个。

    • “分数”:TensorN个分数的向量。

    • “ pred_classes”:TensorN个标签的向量,范围为[0,num_categories)。

    • “ pred_masks”:Tensor形状(N,H,W)的a,每个检测到的实例的掩码。

    • “ pred_keypoints”:Tensor形状为a(N,num_keypoint,3)。最后一维中的每一行都是(x,y,score)。分数大于0。

  • “ sem_seg”:Tensorof(num_categories,H,W),语义分割预测。

  • “建议”: 具有以下字段的实例对象:

    • “ proposal_boxes”: 存储N个盒子的Boxes对象。

    • “ objectness_logits”:N个得分的火炬矢量。

  • “ panoptic_seg”:的元组。张量具有(H,W)的形状,其中每个元素代表像素的段ID。每个字典描述一个段ID,并具有以下字段:(Tensor, list[dict])

    • “ id”:细分ID

    • “事物”:细分是事物还是事物

    • “ category_id”:此细分的类别ID。它表示when isthing==True的事物类ID,否则代表stuff类ID。

1.5、部分执行模型

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

  1. 编写一个(子)模型。在学习完本教程之后,您可以重写模型组件(例如,模型的头部),使其与现有组件具有相同的功能,但是返回所需的输出。

  2. 部分执行模型。您可以像往常一样创建模型,但是可以使用自定义代码而不是来执行模型forward()。例如,以下代码在蒙版头之前获取蒙版特征。

images = ImageList.from_tensors(...)  # preprocessed input tensor
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 = [features[f] for f in model.roi_heads.in_features]
mask_features = model.roi_heads.mask_pooler(mask_features, [x.pred_boxes for x in instances])

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

2、写模型

如果您要尝试全新的工作,则可能希望完全在detectron2中从头开始实现模型。但是,在许多情况下,您可能会对修改或扩展现有模型的某些组件感兴趣。因此,我们还提供了一种注册机制,使您可以覆盖标准模型的某些内部组件的行为。

例如,要添加新的主干,请将以下代码导入您的代码中:

复制代码
from detectron2.modeling import BACKBONE_REGISTRY, Backbone, ShapeSpec
 
@BACKBONE_REGISTRY.register()
class ToyBackBone(Backbone):
  def __init__(self, cfg, input_shape):
    super().__init__()
    # create your own backbone
    self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=16, padding=3)
 
  def forward(self, image):
    return {"conv1": self.conv1(image)}
 
  def output_shape(self):
    return {"conv1": ShapeSpec(channels=64, stride=16)}
复制代码

然后,您可以在配置对象中使用。 然后会致电给您。cfg.MODEL.BACKBONE.NAME = 'ToyBackBone'build_model(cfg)ToyBackBone

再举一个例子,要向Generalized R-CNN元体系结构中的ROI头添加新功能,可以实现一个新的 ROIHeads子类并将其放在中ROI_HEADS_REGISTRY。有关 实现新ROIHeads来执行新任务的示例,请参见detectron2 和meshrcnn中的密集姿势。和项目/ 包含实现不同的架构更多的例子。

完整的注册表列表可以在API文档中找到。您可以在这些注册表中注册组件,以自定义模型的不同部分或整个模型。

3、训练

从前面的教程中,您现在可能已经有了一个自定义模型和一个数据加载器。要进行培训,用户通常会偏好以下两种样式之一:

3.1、自定义训练

准备好模型和数据加载器后,可以在PyTorch中找到编写训练循环所需的所有其他内容,您可以自己编写训练循环。这种风格使研究人员可以更清晰地管理整个培训逻辑并拥有完全的控制权。tools / plain_train_net.py中提供了一个这样的示例。

然后,用户可以轻松地控制训练逻辑上的任何定制。

3.2、训练抽象

我们还提供带有钩子系统的标准化“培训师”抽象,可帮助简化标准培训行为。它包括以下两个实例:

  • SimpleTrainer 为单一成本的单一优化器单一数据源的培训提供了一个最小的培训循环,仅此而已。其他任务(检查点,记录等)可以使用挂钩系统来实现 。

  • DefaultTrainer是SimpleTrainer从配置中初始化的,由 tools / train_net.py和许多脚本使用。它包括人们可能希望采用的更多标准默认行为,包括优化程序的默认配置,学习率计划,日志记录,评估,检查点等。

要自定义DefaultTrainer:

  1. 对于简单的自定义(例如,更改优化器,评估器,LR调度程序,数据加载器等),请在子类中覆盖其方法,就像tools / train_net.py一样

  2. 使用培训师+挂钩系统意味着总会有一些非标准行为无法得到支持,尤其是在研究中。对于培训期间的更复杂的任务,请查看 挂钩系统是否可以支持它,或者从tools / plain_train_net.py开始手动实施培训逻辑。

3.3、指标记录

在训练过程中,detectron2模型和训练员将指标放入集中式EventStorage中。您可以使用以下代码对其进行访问并为其记录指标:

from detectron2.utils.events import get_event_storage
 
# inside the model:
if self.training:
  value = # compute the value from inputs
  storage = get_event_storage()
  storage.put_scalar("some_accuracy", value)

4.1、使用评估器

要使用评估器的方法进行手动评估,请执行以下操作:

def get_all_inputs_outputs():
  for data in data_loader:
    yield data, model(data)
 
evaluator.reset()
for inputs, outputs in get_all_inputs_outputs():
  evaluator.process(inputs, outputs)
eval_results = evaluator.evaluate()

评估程序也可以与inference_on_dataset一起使用。例如,

eval_results = inference_on_dataset(
    model,
    data_loader,
    DatasetEvaluators([COCOEvaluator(...), Counter()]))

这将model在来自的所有输入上执行data_loader,并调用evaluator进行处理。

与使用模型手动运行评估相比,此功能的优势在于可以使用DatasetEvaluators将评估器合并在一起,并且所有评估都可以在数据集的一次向前传递中完成。此功能还为给定的模型和数据集提供准确的速度基准。

4.2、自定义数据集的评估器

detectron2中的许多评估器都是针对特定数据集的,以便使用每个数据集的官方API获得分数。除此之外,两个评估器还能够评估遵循detectron2的标准数据集格式的任何通用数据,因此它们可用于评估自定义数据集:

  • COCOEvaluator能够评估AP(平均精度),以便在任何自定义数据集上进行框检测,实例细分,关键点检测。

  • SemSegEvaluator能够评估任何自定义数据集上的语义细分指标。

detectron2配置安装,总目录

1、coco数据集下载格式解析

2、win10下detectron2环境配置

3、windows10离线安装pycocotools

4、detectron2代码运行及数据集配置

5、detectron2使用自定义数据集及数据加载

6、detectron2模型使用、读写、训练及测试

7、detectron2配置与部署

posted on   Sanny.Liu-CV&&ML  阅读(2522)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2017-09-20 转载:DenseNet算法详解

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示