レイアウト API の概要#
レイアウトの概念は、入力/出力テンソルのそれぞれの特定の次元が何を意味するのかをユーザー (およびアプリケーション) が理解するのに役立ちます。例えば、入力が {1, 3, 720, 1280}
の形状で NCHW
レイアウトの場合、N(バッチ)=1、C (チャネル) = 3、H (高さ) = 720、W (幅) = 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 番目の次元に割り当てられます。
高度な構文#
高度な構文を使用すると、単語を次元に割り当てることができます。これには、レイアウトを角括弧 []
で囲み、それぞれの名前をカンマ ,
で区切って指定します。
# 各次元の名前はカンマで区切られています
# レイアウトは角括弧で囲まれています
layout = Layout('[time,temperature,humidity]')
# 各次元の名前はカンマで区切られています
# レイアウトは角括弧で囲まれています
layout = ov::Layout("[time,temperature,humidity]");
部分的に定義されたレイアウト#
特定の次元が重要でない場合は、その名前を ?
に設定できます。
# 最初の次元はバッチ、4 番目は 'チャネル’ です。# 他は重要ではありません
layout = Layout('N??C')
# また高度な構文を使用して同じです
layout = Layout('[n,?,?,c]')
// 最初の次元はバッチ、4 番目は 'チャネル’ です。他は重要ではありません
layout = ov::Layout("N??C");
// また高度な構文を使用して同じです
layout = ov::Layout("[n,?,?,c]");
動的レイアウト#
次元が重要でない場合は、省略記号 ...
を使用してそれらの次元を指定できます。
# 最初の次元は 'バッチ' で、他の次元は何でもかまいません
layout = Layout('N...')
# 2 番目の次元は 'チャネル' で、他は何でもかまいません
layout = Layout('?C...')
# 最後の次元は 'チャネル' です。他は何でもかまいません
layout = Layout('...C')
// 最初の次元は 'バッチ' で、他の次元は何でもかまいません
layout = ov::Layout("N...");
// 2 番目の次元は 'チャネル' で、他は何でもかまいません
layout = ov::Layout("?C...");
// 最後の次元は 'チャネル' です。他は何でもかまいません
layout = ov::Layout("...C");
事前定義された名前#
レイアウトには、コンピューター・ビジョンで広く使用されている事前定義された次元名があります:
N
/Batch
- バッチサイズC
/Channels
- チャネルD
/Depth
- 深さH
/Height
- 髙さW
/Width
- 幅
これらの名前は、前処理 API で使用されます。レイアウトから適切な次元のインデックスを取得する一連のヘルパー関数があります。
from openvino.runtime import layout_helpers
# バッチの場合は 0 を返します
layout_helpers.batch_idx(Layout('NCDHW'))
# チャネルの場合は 1 を返します
layout_helpers.channels_idx(Layout('NCDHW'))
# 深さは 2 を返します
layout_helpers.depth_idx(Layout('NCDHW'))
# 高さは -2 を返します
layout_helpers.height_idx(Layout('...HW'))
# 幅は -1 を返します
layout_helpers.width_idx(Layout('...HW'))
// バッチの場合は 0 を返します
ov::layout::batch_idx("NCDHW");
// チャネルの場合は 1 を返します
ov::layout::channels_idx("NCDHW");
// 深さは 2 を返します
ov::layout::depth_idx("NCDHW");
// 高さは -2 を返します
ov::layout::height_idx("...HW");
// 幅は -1 を返します
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 は、モデルの入力または出力からレイアウトを取得するシンプルなインターフェイスを持つヘルパーを提供します。
# モデル入力のレイアウトを取得
layout = layout_helpers.get_layout(model.input("input_tensor_name"))
# 単一出力のモデルのレイアウトを取得
layout = layout_helpers.get_layout(model.output())
// モデル入力のレイアウトを取得
layout = ov::layout::get_layout(model->input("input_tensor_name"));
// 単一出力のモデルのレイアウトを取得
layout = ov::layout::get_layout(model->output());
関連情報#
API リファレンス:
ov::Layout
C++ クラス