雜亂大全27-Deteron2簡介(上)

  • 前言:介紹Deteron2
tags: 六角學院

主題:雜亂大全27-Deteron2簡介(上)

本篇重點:

  • 學習Deteron2

簡介

由facebook團隊開發
全名:Facebook 人工智慧研究實驗室(FAIR)

死對頭

由Google釋出的TF Object Detection API
兩者的比較: https://www.zhihu.com/question/357186421

第一代簡介-(官方說請用第二代)

:::success
第一代基於caffe2
已經不推薦使用
:::

GitHub:

第一代標檢測算法的實現

1
2
3
4
5
6
Mask R-CNN — 在ICCV 2017獲得Marr大獎
RetinaNet — 在ICCV 2017獲得最佳研究論文獎
Faster R-CNN
RPN
Fast R-CNN
R-FCN

第一代骨幹網絡架構:

1
2
3
4
ResNeXt{50,101,152}
ResNet{50,101,152}
Feature Pyramid Networks ( ResNet/ResNeXt)
VGG16

參考網址:https://kknews.cc/science/ezryjkq.html


==第二代簡介==

1
2
3
4
5
6
7
8
9
使用包括
Faster R-CNN
Mask R-CNN
RetinaNet
DensePose
還新加入了
Cascade R-CNN
Panoptic FPN
TensorMask

GitHub:

教學網址(使用colab)

https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5#scrollTo=vM54r6jlKTII

解析官方提供程式碼:

  • ==CfgNode==

    參數設定的靈魂中心

    1
    2
    3
    trainer = DefaultTrainer(cfg)
    trainer.resume_or_load() # load last checkpoint or MODEL.WEIGHTS
    trainer.train()
  • ==模型結構 Model Structure==

    • Detectron2需利用build_model方法來建立和DetectionCheckpointer類別載入權重
      1
      2
      3
      4
      5
      6
      self.checkpointer = DetectionCheckpointer(             
      model,
      cfg.OUTPUT_DIR,
      optimizer=optimizer,
      scheduler=self.scheduler,
      )
    • 可以直接調用model Zoo庫,只須改config file(.yaml檔案)
      1
      2
      3
      4
      5
      以調用Mask R-CNN為例
      from detectron2.config import get_cfg
      cfg = get_cfg()
      cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
      cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Let training initialize from model zoo
    • 客製化模型 Customized Model
      • 1.註冊CfgNode
        1
        2
        3
        4

        @META_ARCH_REGISTRY.register()
        class NewModel(nn.Module):
        ...
      • 2.修改detectron2.modeling.build.py中的build_model
        1
        2
        3
        4
        5
        6
        7
        8
        9
        def build_model(cfg):
        """
        Build the whole model architecture, defined by ``cfg.MODEL.META_ARCHITECTURE``.
        Note that it does not load any weights from ``cfg``.
        """
        meta_arch = cfg.MODEL.META_ARCHITECTURE
        model = META_ARCH_REGISTRY.get(meta_arch)(cfg)
        model.to(torch.device(cfg.MODEL.DEVICE))
        return model
      • 3.若只修改其中某部分(如骨幹)
        1
        2
        3
        4
        5
        # refers to TridenNet
        @BACKBONE_REGISTRY.register()
        def build_trident_resnet_backbone(cfg, input_shape: ShapeSpec):
        ...
        return ResNet(stem, stages, out_features=out_features)
      • 4.設定好 cfg.MODEL.BACKBONE.NAME
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(以Base-TridentNet-Fast-C4.yaml為例)
self.backbone = build_backbone(cfg)
def build_backbone(cfg, input_shape=None):
"""
Build a backbone from `cfg.MODEL.BACKBONE.NAME`.
Returns:
an instance of :class:`Backbone`
"""
if input_shape is None:
input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN))
backbone_name = cfg.MODEL.BACKBONE.NAME
backbone = BACKBONE_REGISTRY.get(backbone_name)(cfg, input_shape)
assert isinstance(backbone, Backbone)
return backbone

補充

  • 剩下的部分將於下一篇說明

參考資料