TensorFlow オブジェクト検出 API モデルの変換

危険

ここで説明されているコードは非推奨になりました。従来のソリューションの適用を避けるため使用しないでください。下位互換性を確保するためにしばらく保持されますが、最新のアプリケーションでは使用してはなりません

このガイドでは、非推奨となった変換方法について説明します。新しい推奨方法に関するガイドは、Python チュートリアルに記載されています。

  • 2022.1 リリース以降、モデル変換 API は TensorFlow 物体検出 API Faster と Mask RCNN トポロジーを異なる方法で変換できるようになりました。デフォルトでは、モデル変換により、生成された IR に操作 “提案” が追加されます。この操作には、“image_info” という名前のモデルの追加入力が必要です。これには、入力画像に適用される前処理を記述するいくつかの値を入力する必要があります (詳細については、提案操作の仕様を参照してください)。ただし、この入力は、同じサイズの画像でトレーニングおよび推論されたモデルでは冗長的です。モデル変換 API は、そのようなモデルの IR を生成し、Proposal の代わりに DetectionOutput 操作を挿入できます。DetectionOutput 操作には追加のモデル入力 “image_info” は必要ありません。さらに、一部のモデルでは、生成された推論結果が元の TensorFlow モデルに近似します。新しい動作をトリガーするには、対応する JSON 変換構成ファイルの属性 “operation_to_add” を、デフォルトの “Proposal” ではなく “DetectionOutput” 値に設定する必要があります。

  • 2021.1 リリース以降、モデル変換 API は TensorFlow 物体検出 API SSD、Faster および Mask RCNN トポロジーを変換し、デフォルトで形状計算サブグラフを維持するため、専用の形状 API を使用して OpenVINO ランタイムでトポロジーを再形成できます。この機能の使い方の詳細については、形状推論を使用ガイドを参照してください。入力画像の空間次元とバッチサイズの両方を変更することができます。

  • TF 1 SSD トポロジーの IR を生成する、モデル変換 API は、特定の入力イメージサイズに対して計算された以前のボックスを含む定数ノードの代わりに、多数の PriorBoxClustered 操作を生成します。この変更により、専用 API により OpenVINO ランタイムのトポロジーを再形成できるようになります。再形成は、FPN を除くすべての SSD トポロジーでサポートされています。FPN には、トポロジー入力形状の変更を妨げる一部の操作がハードコードされた形状が含まれています。

モデルの変換

TensorFlow オブジェクト検出 API モデルは、TensorFlow 1 Detection Model Zoo または TensorFlow 2 Detection Model Zoo からダウンロードできます。

変換する前に、モデル変換 API が設定されていることを確認してください。構成手順は、モデルの変換を参照してください。

TensorFlow 物体検出 API モデルを変換するには、次の必須パラメーターを指定して mo コマンドを実行します。

  • input_model <path_to_frozen.pb> - 事前トレーニング済みモデルを含むファイル (フリーズ後のバイナリーまたはテキスト .pb ファイル)、または TensorFlow 2 モデルの saved_model_dir <path_to_saved_model>

  • transformations_config <path_to_subgraph_replacement_configuration_file.json> 変換の説明を含むサブグラフ置換構成ファイル。TensorFlow 物体検出 API zoo からダウンロードしたモデルの設定ファイルは、<PYTHON_SITE_PACKAGES>/openvino/tools/mo/front/tf ディレクトリーにあります。次を使用します。

    • ssd_v2_support.json - Model Zoo バージョン 1.13.X までのフリーズされた SSD トポロジーを含む

    • ssd_support_api_v.1.14.json - TensorFlow 物体検出 API バージョン 1.14 から 1.14.X を使用してトレーニングされた SSD トポロジー用

    • ssd_support_api_v.1.15.json - TensorFlow 物体検出 API バージョン 1.15 から 2.0 を使用してトレーニングされた SSD トポロジー用

    • ssd_support_api_v.2.0.json - TensorFlow 物体検出 API バージョン 2.0 から 2.3.X を使用してトレーニングされた SSD トポロジー用

    • ssd_support_api_v.2.4.json - TensorFlow 物体検出 API バージョン 2.4 以降を使用してトレーニングされた SSD トポロジー用

    • efficient_det_support_api_v.2.0.json - TensorFlow 物体検出 API バージョン 2.0 から 2.3.X を使用してトレーニングされた EfficientDet トポロジー用

    • efficient_det_support_api_v.2.4.json - TensorFlow 物体検出 API バージョン 2.4 以降を使用してトレーニングされた EfficientDet トポロジー用

    • faster_rcnn_support.json - 1.6.X までの TensorFlow バージョンを使用してトレーニングされた TF 1.X モデルからの Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v1.7.json - TensorFlow 物体検出 API バージョン 1.7.0 から 1.9.X を使用してトレーニングされた Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v1.10.json - TensorFlow 物体検出 API バージョン 1.10.0 から 1.12.X を使用してトレーニングされた Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v1.13.json - TensorFlow 物体検出 API バージョン 1.13.X を使用してトレーニングされた Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v1.14.json - TensorFlow 物体検出 API バージョン 1.14.0 から 1.14.X を使用してトレーニングされた Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v1.15.json - TensorFlow 物体検出 API バージョン 1.15.0 から 2.0 を使用してトレーニングされた Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v2.0.json - TensorFlow 物体検出 API バージョン 2.0 から 2.3.X を使用してトレーニングされた Faster R-CNN トポロジー用

    • faster_rcnn_support_api_v2.4.json - TensorFlow 物体検出 API バージョン 2.4 以降を使用してトレーニングされた Faster R-CNN トポロジー用

    • mask_rcnn_support.json - TensorFlow バージョン 1.9.0 以下でトレーニングされた TF 1.X モデルのマスク R-CNN トポロジー用

    • mask_rcnn_support_api_v1.7.json - TensorFlow 物体検出 API バージョン 1.7.0 から 1.9.X を使用してトレーニングされた Mask R-CNN トポロジー用

    • mask_rcnn_support_api_v1.11.json - TensorFlow 物体検出 API バージョン 1.11.0 から 1.12.X を使用してトレーニングされた Mask R-CNN トポロジー用

    • mask_rcnn_support_api_v1.13.json - TensorFlow 物体検出 API バージョン 1.13.0 から 1.13.X を使用してトレーニングされた Mask R-CNN トポロジー用

    • mask_rcnn_support_api_v1.14.json - TensorFlow 物体検出 API バージョン 1.14.0 から 1.14.X を使用してトレーニングされた Mask R-CNN トポロジー用

    • mask_rcnn_support_api_v1.15.json - TensorFlow 物体検出 API バージョン 1.15.0 から 2.0 を使用してトレーニングされた Mask R-CNN トポロジー用

    • mask_rcnn_support_api_v2.0.json - TensorFlow 物体検出 API バージョン 2.0 から 2.3.X を使用してトレーニングされた Mask R-CNN トポロジー用

    • mask_rcnn_support_api_v2.4.json - TensorFlow 物体検出 API バージョン 2.4 以降を使用してトレーニングされた Mask R-CNN トポロジー用

    • rfcn_support.json - 1.9.X までの TensorFlow バージョンでトレーニングされたモデルの RFCN トポロジー用

    • rfcn_support_api_v1.10.json - TensorFlow バージョン 1.10.0 から 1.12.X で凍結されたモデルの RFCN トポロジー用 (包括的)

    • rfcn_support_api_v1.13.json - TensorFlow バージョン 1.13.X で凍結された Model Zoo からの RFCN トポロジー用

    • rfcn_support_api_v1.14.json - TensorFlow バージョン 1.14.0 以降で凍結されたモデルの RFCN トポロジー用

  • tensorflow_object_detection_api_pipeline_config <path_to_pipeline.config> - TensorFlow 物体検出 API モデルのトポロジー・ハイパーパラメーターと構造を記述する特別な構成ファイル。TensorFlow 物体検出 API zoo からダウンロードしたモデルの設定ファイルは、pipeline.config ディレクトリーにあります。モデルを自身でトレーニングする予定がある場合は、モデル・リポジトリーでこれらのファイルのテンプレートを見つけることができます。

  • input_shape (オプション) - カスタム入力画像形状。TensorFlow 物体検出 API モデルで input_shape パラメーターがどのように処理されるか、詳細についは、カスタム入力形状ガイドを参照してください。

入力データのカラーチャネルの順序 (RGB または BGR) は、モデルのトレーニング・データセットのチャネルの順序と一致する必要があります。異なる場合は、コマンドライン・パラメーター reverse_input_channels を指定して RGB<->BGR 変換を実行します。そうしないと、推論結果が正しくなくなる可能性があります。OpenVINO サンプル・アプリケーションで使用するために TensorFlow 物体検出 API モデルを変換する場合は、reverse_input_channels パラメーターを指定する必要があります。パラメーターの詳細については、モデルを中間表現 (IR) に変換するガイドの入力チャネルを反転するセクションを参照してください。

上記の必須パラメーターに加えて、必要に応じてオプションの変換パラメーターを使用できます。パラメーターの完全なリストは、TensorFlow モデルの変換ガイドで参照できます。

例えば、事前トレーニングされた SSD InceptionV2 トポロジーをダウンロードし、アーカイブをディレクトリー /tmp/ssd_inception_v2_coco_2018_01_28 に抽出した場合、モデルを変換するコマンドラインは次のようになります。

mo --input_model=/tmp/ssd_inception_v2_coco_2018_01_28/frozen_inference_graph.pb --transformations_config front/tf/ssd_v2_support.json --tensorflow_object_detection_api_pipeline_config /tmp/ssd_inception_v2_coco_2018_01_28/pipeline.config --reverse_input_channels

OpenVINO™ ツールキットのサンプルと Open Model Zoo のデモ

OpenVINO には、OpenVINO ランタイム API の使用方法を示す多数のサンプルが付属しています。さらに、Open Model Zoo は、画像分類、視覚オブジェクト検出、テキスト認識、音声認識、自然言語処理などのさまざまなタスクにおけるディープラーニングに基づいた、現実に近いアプリケーションの実装を示すデモ・アプリケーションを提供します。詳細については、以下のリンクを参照してください。

入力画像をサンプルにフィード

入力画像をサンプルにフィードする場合には、いくつかの注意事項があります。

  1. OpenVINO サンプルは、アスペクト比を維持せずに、入力画像を入力操作のサイズに引き伸ばします。通常、この動作はほとんどのトポロジー (SSD を含む) では正しいですが、Faster R-CNN、Mask R-CNN、R-FCN などの他のモデルでは正しくありません。これらのモデルは通常、アスペクト比を維持したリサイザーを使用します。前処理のタイプは、パイプライン構成ファイルの image_resizer セクションで定義されます。アスペクト比を維持する場合、サンプルに渡す前に画像のサイズを変更し、必要に応じてサイズ変更した画像を 0 でパディングする必要があります (pipeline.config の属性 “pad_to_max_dimension” が “true” の場合)。

  2. 画像サイズ変更の TensorFlow 実装は、サンプルの実装とは異なる場合があります。入力画像を圧縮形式 (.jpg など) から読み取っても、サンプルと TensorFlow では異なる結果が得られる可能性があります。TensorFlow と OpenVINO 間で精度を比較する場合、事前にサイズ変更された入力画像を非圧縮形式 (.bmp など) で渡すことをお勧めします。

  3. OpenVINO サンプルを使用してモデルを推論する場合、reverse_input_channels コマンドライン・パラメーターを指定してモデルを変換します。サンプルは BGR チャネル順序で画像をロードしますが、TensorFlow モデルは RGB 順序で画像をトレーニングされています。reverse_input_channels コマンドライン・パラメーターが指定されている場合、モデル変換 API は最初の畳み込みまたはその他のチャネル依存の操作の重み変更を実行するため、出力は RGB チャネル順序で渡された画像と同様になります。

  4. モデル変換 API から出力されるメッセージをよく読んでください。これらには、推論を実行する前に入力データを準備する方法と出力を解釈する方法に関する重要な指示が含まれています。

カスタム入力形状

モデル変換は、pipeline.config ファイルで定義されている画像リサイザータイプに応じて、TensorFlow 物体検出 API モデルのコマンドライン・パラメーター input_shape で処理します。TensorFlow 物体検出 API は、画像リサイザータイプに基づいてさまざまな Preprocessor サブグラフを生成します。モデル変換 API は 2 種類の画像リサイザーをサポートしています。

  • fixed_shape_resizer — 入力画像を特定の高さと幅に引き伸ばします。以下の pipeline.config コードは、fixed_shape_resizer のサンプル定義を示しています。

    image_resizer { 
      fixed_shape_resizer { 
        height: 300 
        width: 300 
      } 
    }
  • keep_aspect_ratio_resizer — 最小サイズと最大サイズの制約を満たすように、アスペクト比を維持しながら入力画像のサイズを変更します。以下の pipeline.config コードは、keep_aspect_ratio_resizer のサンプル定義を示しています。

    image_resizer { 
      keep_aspect_ratio_resizer { 
        min_dimension: 600 
        max_dimension: 1024 
      } 
    }

追加パラメーター “pad_to_max_dimension” が “true” に等しい場合、サイズ変更された画像はサイズ “max_dimension” の正方形の画像に 0 が埋め込まれます。

固定形状リサイザーの置き換え

  • input_shape コマンドライン・パラメーターが指定されていない場合、モデル変換は、pipeline.config で定義されている高さと幅で入力操作を生成します。

  • input_shape [1, H, W, 3] コマンドライン・パラメーターが指定されている場合、モデル変換は入力操作の高さを H、幅を W に設定してモデルを変換します。ただし、次の理由により変換が失敗する場合があります。

    • モデルは再形成可能ではありません。つまり、モデル入力画像のサイズを変更することはできません。例えば、SSD FPN モデルにはハードコードされた出力形状を使用した Reshape 操作がありますが、これらの Reshape インスタンスへの入力サイズは入力イメージのサイズに依存します。この場合、モデル変換 API は形状推論フェーズ中にエラーを示します。log_level DEBUG でモデル変換を実行し、推論された操作の出力形状を確認して不一致を確認します。

    • カスタム入力形状が小さすぎます。例えば、input_shape [1,100,100,3] を指定して SSD Inception V2 モデルを変換すると、畳み込みノードまたはプーリングノードの 1 つが入力テンソル空間次元を非正の値に減少させます。この場合、モデル変換 API は次のようなエラー メッセージを表示します: ‘[ ERROR ] Shape [ 1 -1 -1 256] is not fully defined for output X of “node_name”.’ ([ エラー ] 形状 [ 1 -1 -1 256] は、“node_name” の出力 X に対して完全に定義されていません。)

アスペクト比を維持したリサイザーの置き換え

  • input_shape コマンドライン・パラメーターが指定されていない場合、モデル変換 API は高さと幅の両方が keep_aspect_ratio_resizer のパラメーター min_dimension の値に等しい入力操作を生成します。

  • input_shape [1, H, W, 3] コマンドライン・パラメーターが指定されている場合、モデル変換 API は、keep_aspect_ratio_resizer で定義されている min_dimension および max_dimension 制約を満たすように、指定された入力イメージの高さ H と幅 W をスケーリングします。次の関数は、入力操作の高さと幅を計算します。

    def calculate_shape_keeping_aspect_ratio(H: int, W: int, min_dimension: int, 
    max_dimension: int): 
        ratio_min = min_dimension / min(H, W) 
        ratio_max = max_dimension / max(H, W) 
        ratio = min(ratio_min, ratio_max) 
        return int(round(H * ratio)), int(round(W * ratio))

input_shape コマンドライン・パラメーターは、“pad_to_max_dimension” が存在しない場合、または keep_aspect_ratio_resizer が “false” に設定されている場合にのみ指定する必要があります。

keep_aspect_ratio_resizer を備えたモデルは、実際のアスペクト比でオブジェクトを認識するようにトレーニングされました。これとは対照的に、垂直方向と水平方向に引き伸ばされたオブジェクトを認識するようにトレーニングされた分類トポロジーとは対照的です。デフォルトでは、トポロジーは keep_aspect_ratio_resizer を使用して変換され、正方形の入力イメージが使用されます。非正方形の画像が入力として提供された場合、アスペクト比を維持せずに引き伸ばされるため、オブジェクト検出の品質が低下します。

入力イメージの次元が事前にわかっている場合は、keep_aspect_ratio_resizer を使用してモデルに input_shape コマンドライン・パラメーターを指定することを強くお勧めします。

モデル変換プロセスの詳細

このセクションは、モデル変換 API が物体検出 API モデル変換を実行する方法を詳しく理解したいユーザー向けです。このセクションの情報は、そのままではモデル変換 API で変換されない複雑なモデルを持つユーザーにも役立ちます。ここで使用されているサブグラフ置換の概念を理解するため、最初に [従来] モデル・オプティマイザーの拡張性グラフ変換拡張機能セクションを読むことを推奨します。

TensorBoard でモデルを開いてトポロジー構造を確認することも重要です。モデル変換 API は、TensorBoard ツールに供給できるイベントファイルを作成できます。2 つのコマンドライン・パラメーターを指定して、モデル変換を実行します。

  • input_model <path_to_frozen.pb> — 凍結されたモデルへのパス。

  • tensorboard_logdir — TensorBoard がイベントファイルを検索するディレクトリーへのパス。

物体検出 API モデルの変換の実装は、ファイル内にあります。変換プロセスの詳細を理解するには、このファイルのコードを参照してください。