Detectron2-寫模型(Write Models)官方文件中文翻譯

_KATANA_發表於2020-11-17

寫模型

如果您試圖做一些全新的事情,您可能希望完全從頭開始實現一個模型。但是,在很多情況下,你也許會對修改或者擴充現有模型中的一些內容有興趣。因此, 我們還提供了一些機制,讓使用者可以重寫標準模型的某些內部元件的行為。

註冊新的內容

對於使用者經常想要定製的常見概念,如 “backbone feature extractor” ,“box head” ,我們提供了一個序號產生器制,讓使用者注入定製實現,將立即在配置檔案中使用。

例如,為了新增新的 backbone ,import 這些程式碼到你的程式碼中:

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)}

在這個程式碼中,我們在 Backbone 類介面後面實現一個新的 backbone ,在 import 完這些程式碼,detectron2 能夠將 class 的名字連線到它的實現中。因此你能寫如下的程式碼:

cfg = ...   # read a config
cfg.MODEL.BACKBONE.NAME = 'ToyBackbone'   # or set it in the config file
model = build_model(cfg)  # it will find `ToyBackbone` defined above

作為另一個例子,在廣義的R-CNN元架構中向 ROI heads 新增新的能力,你能實現一個新的 ROI Heads 並把它放進 ROI_HEADS_REGISTRYDensePoseMeshRCNN是兩個例子,這兩個例子實現了新的 ROIHeads 去完成新的任務。projects包含了更多例子,例子實現了不同的架構。

API文件中可以找到登錄檔的完整列表。您可以在這些註冊中心中註冊元件,以定製模型的不同部分或整個模型。

用明確的引數構建模型

登錄檔是連線配置檔案中的名稱到實際程式碼的橋樑。它們旨在涵蓋使用者經常需要替換的幾個主要元件,但是,基於文字的配置檔案的功能有時是有限的,一些更深層次的定製可能只能通過編寫程式碼來實現。

detectron2中的大多數模型元件都有一個清晰的剩餘 init 介面,用來記錄它需要的輸入引數。使用自定義引數呼叫它們將為您提供模型的自定義變體。

舉個例子,在一個更快的 R-CNNbox head 中使用自定義損失函式,我們可以做到以下幾點:

  • Losses 當前在 FastRCNNOutputLayers我們需要實現它的一個變體或子類,使用自定義損失函式,名為 MyRCNNOutput。
  • box_predictor=MyRCNNOutput() 呼叫 StandardROIHeads 而不是內建的 FastRCNNOutputLayers 。如果所有其他引數應該保持不變,這能通過使用 可配置的( init)獲得:
roi_heads = StandardROIHeads(
  cfg, backbone.output_shape(),
  box_predictor=MyRCNNOutput(...)
)
  • (可選)如果我們想從配置檔案中啟用這個新模型,需要註冊:
@ROI_HEADS_REGISTRY.register()
class MyStandardROIHeads(StandardROIHeads):
  def __init__(self, cfg, input_shape):
    super().__init__(cfg, input_shape,
                     box_predictor=MyRCNNOutput(...))

相關文章