レイアウト API の概要

レイアウトの概念は、入力/出力テンソルのそれぞれの特定の次元が何を意味するのかをユーザー (およびアプリケーション) が理解するのに役立ちます。例えば、入力が {1, 3, 720, 1280} の形状で NCHW レイアウトの場合、N(バッチ)=1C (チャネル) = 3H (高さ) = 720W (幅) = 1280 であることが分かります。レイアウト情報がないと、{1, 3, 720, 1280} タプルは、これらの数値が何を意味するのか、モデルの期待に合わせて入力画像のサイズを変更するにはどうしたらよいかに関する情報をアプリケーションに提供しません。

NCHW レイアウトを使用すると、{8, 3, 224, 224} モデルの形状の意味することを理解しやすくなります。レイアウトがなければ、それは単なる 4 次元のテンソルです。

以下は、入出力レイアウトが重要となるケースの一覧です。

  • モデル変更の実行:

    • 減算、スケールによる除算、画像のサイズ変更、RGB <-> BGR の変換などの前処理ステップを適用します。

    • モデルのバッチを設定/取得します。

  • モデル変換フェーズで使用したのと同じ操作を実行します。詳細については、モデル・オプティマイザーの埋め込み前処理計算ガイドを参照してください。

  • モデルの入出力の可読性を向上します。

レイアウトの構文

短縮構文

最も簡単な方法は、各次元を 1 つのアルファベットで指定することです。

from openvino import Layout
layout = Layout('NCHW')
layout = ov::Layout("NHWC");

これにより、N が 1 番目の次元に、C が 2 番目の次元に、H が 3 番目の次元に、そして W が 4 番目の次元に割り当てられます。

高度な構文

高度な構文を使用すると、単語を次元に割り当てることができます。これには、レイアウトを角括弧 [] で囲み、それぞれの名前をカンマ , で区切って指定します。

# Each dimension has name separated by comma
# Layout is wrapped with square brackets
layout = Layout('[time,temperature,humidity]')
// Each dimension has name separated by comma, layout is wrapped with square brackets
layout = ov::Layout("[time,temperature,humidity]");

部分的に定義されたレイアウト

特定の次元が重要でない場合は、その名前を ? に設定できます。

# First dimension is batch, 4th is 'channels'.
# Others are not important for us
layout = Layout('N??C')

# Or the same using advanced syntax
layout = Layout('[n,?,?,c]')
// First dimension is batch, 4th is 'channels'. Others are not important for us
layout = ov::Layout("N??C");
// Or the same using advanced syntax
layout = ov::Layout("[n,?,?,c]");

動的レイアウト

次元が重要でない場合は、省略記号 ... を使用してそれらの次元を指定できます。

# First dimension is 'batch' others are whatever
layout = Layout('N...')

# Second dimension is 'channels' others are whatever
layout = Layout('?C...')

# Last dimension is 'channels' others are whatever
layout = Layout('...C')
// First dimension is 'batch' others are whatever
layout = ov::Layout("N...");

// Second dimension is 'channels' others are whatever
layout = ov::Layout("?C...");

// Last dimension is 'channels' others are whatever
layout = ov::Layout("...C");

事前定義された名前

レイアウトには、コンピューター・ビジョンで広く使用されている事前定義された次元名があります。

  • NBatch - バッチサイズ

  • C/Channels - チャネル

  • D/Depth - 深さ

  • H/Height - 髙さ

  • W/Width - 幅

これらの名前は、前処理 API で使用されます。レイアウトから適切な次元のインデックスを取得する一連のヘルパー関数があります。

from openvino.runtime import layout_helpers
# returns 0 for batch
layout_helpers.batch_idx(Layout('NCDHW'))

# returns 1 for channels
layout_helpers.channels_idx(Layout('NCDHW'))

# returns 2 for depth
layout_helpers.depth_idx(Layout('NCDHW'))

# returns -2 for height
layout_helpers.height_idx(Layout('...HW'))

# returns -1 for width
layout_helpers.width_idx(Layout('...HW'))
// returns 0 for batch
ov::layout::batch_idx("NCDHW");

// returns 1 for channels
ov::layout::channels_idx("NCDHW");

// returns 2 for depth
ov::layout::depth_idx("NCDHW");

// returns -2 for height
ov::layout::height_idx("...HW");

// returns -1 for width
ov::layout::width_idx("...HW");

同等性

レイアウト名では大文字と小文字が区別されません。つまり、Layout("NCHW")Layout("nChW")Layout("[N,c,H,w]") はすべて同じです。

ダンプレイアウト

レイアウトは、高度な構文形式の文字列に変換できます。これは、デバッグやシリアル化に役立ちます。

layout = Layout('NCHW')
print(layout)    # prints [N,C,H,W]
layout = ov::Layout("NCHW");
std::cout << layout.to_string(); // prints [N,C,H,W]

モデル入力/出力からレイアウトを取得

OpenVINO は、モデルの入力または出力からレイアウトを取得するシンプルなインターフェイスを持つヘルパーを提供します。

# Get layout for model input
layout = layout_helpers.get_layout(model.input("input_tensor_name"))
# Get layout for model with single output
layout = layout_helpers.get_layout(model.output())
// Get layout for model input
layout = ov::layout::get_layout(model->input("input_tensor_name"));
// Get layout for model with single output
layout = ov::layout::get_layout(model->output());

関連情報

  • API リファレンス: ov::Layout C++ クラス