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.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默认配置。有关如何自定义它们的信息,请参见上文。

评估是一个过程,需要多个输入/输出对并进行汇总。您始终可以直接 使用模型 ,而只是手动解析其输入/输出以执行评估。或者,可以使用 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、使用模型在detectron2模型(及其子模型)是由功能,如内置build_model,build_backbone,build_roi_heads:from detectron2.modeling import build_modelmodel = build_model(cfg) # returns a torch.nn.Modulebuild_model仅建立模型结构并用随机参数填充它。有关如何将现有检查点加载到模型以及如何使用model对象的信息,请参见下文。1.1、加载/
MySQL-Proxy是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言Lua。这个代理可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的 使用 场景:负载平衡和故障转移处理查询分析和日志SQL宏(SQLmacros)查询重写(queryrewriting)执行shell命令MySQLProxy更强大的一项功能是实现“ 读写 分离(Read/WriteSplitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SEL ECT 查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。MMM即Master-MasterReplicatio
detect ron2 训练 自己的数据实现目标检测和关键点检测 ——ubuntu18.04编译 测试 detect ron2 1. 配置1.1 环境要求2. 环境安装2.1 torch 和 torchvision2.2 cocoapi (pycocotools)2.3 下载安装 detect ron2 3. 测试 detect ron2 ——ubuntu18.04编译 测试 detect ron2 ) 1. 配置
本教程实现 使用 Detect ron2 训练 自定义目标检测器。值得注意的是, Detect ron2 库远不止目标检测,它支持语义分割、关键点检测、掩码和稠密估计。 我们将介绍在自定义对象上 训练 Detect ron2 所需的步骤。我们 使用 公共血细胞检测数据集。 为了 训练 我们的检测器,我们采取以下步骤: 获取 Detect ron2 的Docker镜像,并创建自己的容器 可视化 Detect ron2 训练 数据 编写我们的 Detect ron2 训练 配置 运行 Detect ron2 训练 评估 Detect ron2 性能 在 测试 图像上运行De
文章目录背景配置环境搭建步骤下载源码创建虚拟环境安装torch,torchvision,cudatoolkit编译detec ron2 源码 测试 demo 最近在跑mask-rcnn,看到facebook推荐 使用 detect ron2 ,所以就去配置了一下detec ron2 的环境,虽然二者的核心代码是差不多的,但是明显 detect ron2 环境的配置过程比较简单,所以下面就来看看如何配置detec ron2 的环境吧~ 搭建环境之前,先来说一下我的显卡配置,毕竟不同的显卡所支持的cuda版本是不一样的,比如GT
Detect ron2 提供了一个基于键值的配置系统,该系统可用于获取标准的常见行为。 Detect ron2 的配置系统 使用 YAML和yacs。除了访问和更新配置的基本操作外,我们还提供以下额外功能: 该配置可以具有字段,该字段将首先加载基本配置。如果存在任何冲突,则基本配置中的值将在子配置中被覆盖。我们为标准 模型 架构提供了一些基本配置。_BASE_:base.yaml 我们提供配置版本控制,以实现向后兼容。如果您的配置文件 使用 config行这样的版本进行版本控制,即使将来我们更
python:3.8 Detect ron: 0.3(笔者可以在win环境成功编译安装 detect ron2 Detect ron2 模型 数量虽然比mm detect ion少,不过有些论文还是用 Detect ron2 做的,因此有必要了解一下如何用 Detect ron2 训练 自定义数据集。 关于mm detect ion下 训练 coco格式的自定义数据请移步笔者另一篇博文:mm detect ion-v2.3安装配置及 训练 自定义