扩展 Detectron2 的默认值¶
研究就是以新的方式做事。这在如何创建代码抽象方面带来了一个难题,这对任何规模庞大的研究工程项目来说都是一个挑战。
一方面,它需要有非常薄的抽象层,以便能够以新的方式做任何事情。它应该相当容易打破现有的抽象层并用新的抽象层替换它们。
另一方面,这样的项目也需要相当高层的抽象层,以便用户可以轻松地以标准方式做事,而不用过多地担心只有某些研究人员才会关心的细节。
在 detectron2 中,有两种类型的接口共同解决了这个难题。
接受从 yaml 文件创建的配置 (
cfg
) 参数的函数和类(有时还有一些额外的参数)。这些函数和类实现了“标准默认”行为:它将从给定的配置中读取它需要的内容,并执行“标准”操作。用户只需要加载一个专家制作的配置并将其传递,而不必担心使用了哪些参数以及它们都代表什么。
有关详细教程,请参见Yacs 配置。
具有明确定义的显式参数的函数和类。
它们中的每一个都是整个系统的一个小构建块。它们需要用户的专业知识来理解每个参数应该是什么,并且需要更多努力才能拼凑成更大的系统。但它们可以以更灵活的方式拼凑在一起。
当您需要实现 detectron2 中未包含的“标准默认值”不支持的内容时,可以使用这些定义良好的组件。
延迟配置系统依赖于此类函数和类。
一些函数和类是用@configurable 装饰器实现的 - 它们可以用配置、显式参数或两者的混合调用。它们的显式参数接口目前处于实验阶段。
例如,Mask R-CNN 模型可以通过以下方式构建。
仅配置
# load proper yaml config file, then model = build_model(cfg)
配置和附加参数覆盖的混合
model = GeneralizedRCNN( cfg, roi_heads=StandardROIHeads(cfg, batch_size_per_image=666), pixel_std=[57.0, 57.0, 57.0])
完整的显式参数
(点击展开)
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 提供了一个默认的训练循环,适用于常见的训练任务。您可以使用钩子自定义它,或者编写自己的循环。请参见训练。