カスタムレイヤ定義スクリプト - DigitalMediaProfessionals/dv-sdk GitHub Wiki

カスタムレイヤをネットワーク変換ツールに認識させるには、カスタムレイヤの定義をPython スクリプトで用意しなくてはなりません。

各種のカスタムレイヤに対し、変換されたネットワークにエクスポートされるパラメータの名前のリストを用意し、変換ツールにカスタムレイヤの出力の次元を計算する関数を実装しなくてはなりません。最後にカスタムレイヤの種類をパラメータと関数に対応付けるために、custom_layer ディレクトリを用意してください。

必要なパラメータのリストは文字列のリストとして与えてください。変換ツールはそれらの名前のパラメータを復元します。

custom_params = ['name1', 'name2', ... , 'nameN']

カスタムレイヤの出力の次元を計算する関数には次のような雛形があります。

def compute_output_shape(params, input_shape):
    # ...
    # output_shape is a tuple of the output shape
    return output_shape

params は変換ツールにより渡されるカスタムレイヤのパラメータの辞書です。キーはパラメータ名で、値はパラメータの値です。 input_shape は入力次元を示すタプルです。 この関数は出力次元を表すタプルを返さなくてはなりません。

辞書 custom_layer は各カスタムタイプをパラメータリストと出力次元を計算する関数に対応付けなくてはなりません。

custom_layer = {'Type1': (custom_params_1, compute_output_shape_1),
                'Type2': (custom_params_2, compute_output_shape_2),
                ...
                'TypeN': (custom_params_N, compute_output_shape_N)}

最後に、変換ツールにの設定ファイルでcustom_layer パラメータにカスタムレイヤ定義スクリプトを指定してください。

[INPUT]
; Other parameters
; ...
custom_layer = custom_layer_def.py               ; Optional parameter for custom layers

; ...

例: PriorBox 層定義スクリプト

PriorBox 層定義スクリプトは次のようになります。

priorbox_params = ['img_size', 'min_size', 'max_size', 'aspect_ratios', 'variances', 'clip']

def compute_priorbox_output_shape(params, input_shape):
    num_priors_ = len(params['aspect_ratios'])
    layer_width = input_shape[0]
    layer_height = input_shape[1]
    num_boxes = num_priors_ * layer_width * layer_height
    return (num_boxes, 8)

custom_layer = {'PriorBox': (priorbox_params, compute_priorbox_output_shape)}

PriorBox 層はSingle Shot MultiBox Detector における唯一のカスタムレイヤなので、辞書custom_layer には一つのペアしかありません。

compute_priorbox_output_shape とKeras のcompute_output_shape の実装を比較するととても似ていることが分かります。実際に違う点はパラメータを取得する方法だけです。これは、カスタムレイヤ定義スクリプトでは実装がクラスの内部にないためです。しかしそのために、元の実装から出力次元を計算する関数に変換することはとても簡単です。