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

1、使用模型

在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仅建立模型结构并用随机参数填充它。有关如何将现有检查点加载到模型以及如何使用model对象的信息,请参见下文。

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)

有关更多详细信息,请参阅其文档。

然后使用EventWriter将度量标准写入不同的目标。DefaultTrainer启用了一些EventWriter默认配置。有关如何自定义它们的信息,请参见上文。

4、评价

评估是一个过程,需要多个输入/输出对并进行汇总。您始终可以直接使用模型,而只是手动解析其输入/输出以执行评估。或者,可以使用DatasetEvaluator 接口在detectron2中实现评估。

Detectron2包括一些DatasetEvaluator使用标准数据集特定的API(例如COCO,LVIS)来计算指标的工具。您也可以DatasetEvaluator使用输入/输出对来实现自己的任务,以执行其他一些工作。例如,要计算在验证集上检测到多少个实例:

class Counter(DatasetEvaluator):
  def reset(self):
    self.count = 0
  def process(self, inputs, outputs):
    for output in outputs:
      self.count += len(output["instances"])
  def evaluate(self):
    # save self.count somewhere, or print it, or return it.
    return {"count": self.count}

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配置与部署

对寄存器模型进行读写测试的方法可以分为以下几个步骤: 1. 定义寄存器模型:首先,你需要定义寄存器模型的结构和功能。寄存器模型可以是一个简单的数组,每个元素代表一个寄存器。你可以定义寄存器的位宽、初始值、读写操作等。 2. 编写测试程序:编写测试程序,包括对寄存器的读写操作。测试程序可以是一个简单的程序,通过读写寄存器来验证寄存器模型的正确性。你可以定义一系列的读写操作,包括读取寄存器的值、写入寄存器的值,并对结果进行验证。 3. 运行测试程序:将编写好的测试程序加载到目标系统中,并运行。测试程序会执行一系列的读写操作,并记录每次操作的结果。 4. 验证测试结果:根据测试程序的预期结果,验证实际执行的读写操作是否符合预期。比较每次读写操作的结果与预期结果是否一致,如果不一致,则说明寄存器模型存在问题。 5. 调试和修复问题:如果测试结果与预期结果不一致,需要对寄存器模型进行调试和修复。可以通过打印调试信息、检查寄存器的值等方式来定位问题,并对寄存器模型进行修复。 需要注意的是,在进行读写测试时,应该考虑各种边界情况和异常情况,以确保寄存器模型的稳定性和正确性。此外,可以使用一些自动化测试框架和工具来简化测试过程,并提高测试效率。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值