扩展Detectron2的默认功能

研究的本质在于以新方法探索事物。 这给代码抽象化的实现带来了张力, 对于任何规模较大的研究工程项目来说都是一个挑战:

  1. 一方面,它需要具备非常精简的抽象层,以便能够以全新方式实现各种功能。应该能够相对容易地打破现有抽象结构并用新的抽象来替代。

  2. 另一方面,这样的项目也需要合理的高层抽象,这样用户就能以标准方式轻松完成工作,而无需过多关注只有特定研究人员才会关心的细节。

在detectron2中,有两种接口共同解决了这一矛盾:

  1. 接收从yaml文件创建的配置(cfg)参数(有时带有少量额外参数)的函数和类。

    这些函数和类实现了"标准默认"行为:它们会从给定配置中读取所需内容并执行"标准"操作。用户只需加载专家制作的配置并传递它,无需担心使用了哪些参数及其含义。

    详见Yacs Configs详细教程。

  2. 具有明确定义参数的函数和类。

    每个都是整个系统中的小型构建模块。 它们需要用户专业知识来理解每个参数的含义, 并且需要更多努力才能组合成更大的系统。 但它们可以以更灵活的方式进行组合。

    当你需要实现detectron2中"标准默认值"不支持的功能时, 这些定义明确的组件可以被重复使用。

    LazyConfig系统依赖于这类函数和类。

  3. 部分函数和类是通过 @configurable 装饰器实现的 - 它们可以通过配置、显式参数或两者混合的方式进行调用。 目前它们的显式参数接口仍处于实验阶段。

    例如,可以通过以下方式构建一个Mask R-CNN模型:

    1. 仅配置:

      # 加载正确的yaml配置文件,然后
      model = build_model(cfg)
      
    2. 配置与额外参数覆盖的混合使用:

      model = GeneralizedRCNN(
        cfg,
        roi_heads=StandardROIHeads(cfg, batch_size_per_image=666),
        pixel_std=[57.0, 57.0, 57.0])
      
    3. 完整显式参数:

    (click to expand)
    model = GeneralizedRCNN(
        backbone=FPN(
            ResNet(
                BasicStem(3, 64, norm="FrozenBN"),
                ResNet.make_default_stages(50, stride_in_1x1=True, norm="FrozenBN"),
                out_features=["res2", "res3", "res4", "res5"],
            ).freeze(2),
            ["res2", "res3", "res4", "res5"],
            256,
            top_block=LastLevelMaxPool(),
        ),
        proposal_generator=RPN(
            in_features=["p2", "p3", "p4", "p5", "p6"],
            head=StandardRPNHead(in_channels=256, num_anchors=3),
            anchor_generator=DefaultAnchorGenerator(
                sizes=[[32], [64], [128], [256], [512]],
                aspect_ratios=[0.5, 1.0, 2.0],
                strides=[4, 8, 16, 32, 64],
                offset=0.0,
            ),
            anchor_matcher=Matcher([0.3, 0.7], [0, -1, 1], allow_low_quality_matches=True),
            box2box_transform=Box2BoxTransform([1.0, 1.0, 1.0, 1.0]),
            batch_size_per_image=256,
            positive_fraction=0.5,
            pre_nms_topk=(2000, 1000),
            post_nms_topk=(1000, 1000),
            nms_thresh=0.7,
        ),
        roi_heads=StandardROIHeads(
            num_classes=80,
            batch_size_per_image=512,
            positive_fraction=0.25,
            proposal_matcher=Matcher([0.5], [0, 1], allow_low_quality_matches=False),
            box_in_features=["p2", "p3", "p4", "p5"],
            box_pooler=ROIPooler(7, (1.0 / 4, 1.0 / 8, 1.0 / 16, 1.0 / 32), 0, "ROIAlignV2"),
            box_head=FastRCNNConvFCHead(
                ShapeSpec(channels=256, height=7, width=7), conv_dims=[], fc_dims=[1024, 1024]
            ),
            box_predictor=FastRCNNOutputLayers(
                ShapeSpec(channels=1024),
                test_score_thresh=0.05,
                box2box_transform=Box2BoxTransform((10, 10, 5, 5)),
                num_classes=80,
            ),
            mask_in_features=["p2", "p3", "p4", "p5"],
            mask_pooler=ROIPooler(14, (1.0 / 4, 1.0 / 8, 1.0 / 16, 1.0 / 32), 0, "ROIAlignV2"),
            mask_head=MaskRCNNConvUpsampleHead(
                ShapeSpec(channels=256, width=14, height=14),
                num_classes=80,
                conv_dims=[256, 256, 256, 256, 256],
            ),
        ),
        pixel_mean=[103.530, 116.280, 123.675],
        pixel_std=[1.0, 1.0, 1.0],
        input_format="BGR",
    )
    

如果您只需要标准功能,初学者教程就足够了。如果您需要将detectron2扩展到自己的需求,请参阅以下教程获取更多详情:

  • Detectron2包含了一些标准数据集。如需使用自定义数据集,请参阅使用自定义数据集

  • Detectron2 包含了从数据集创建用于训练/测试的数据加载器的标准逻辑,但您也可以编写自己的逻辑。参见 使用自定义数据加载器

  • Detectron2实现了许多标准检测模型,并提供了覆盖其行为的方法。参见使用模型编写模型

  • Detectron2 提供了一个适用于常见训练任务的默认训练循环。您可以通过钩子(hooks)来自定义它,或者编写自己的循环。详见training