TensorFlow YOLO モデルの変換#

危険

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

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

このドキュメントでは、リアルタイム・オブジェクト検出 YOLOv1、YOLOv2、YOLOv3、および YOLOv4 パブリックモデルを中間表現 (IR) に変換する方法について説明します。すべての YOLO モデルは元々 DarkNet フレームワークに実装されており、次の 2 つのファイルで構成されています:

  • モデル構成を含む .cfg ファイル

  • モデルの重みを含む .weights ファイル

YOLO モデルのバージョンに応じて、convert_model() メソッドは異なる方法で変換します:

  • YOLOv4 は最初に Keras から TensorFlow 2 に変換する必要があります。

  • YOLOv3 にはいくつかの実装があります。このチュートリアルでは、IR に直接変換できる YOLOv3 モデルの TensorFlow 実装を使用します。

  • YOLOv1 および YOLOv2 モデルは、最初に DarkFlow を使用して TensorFlow に変換する必要があります。

YOLOv4 モデルを IR に変換#

このセクションでは、YOLOv4 K​​eras モデルをリポジトリーから IR に変換する方法について説明します。YOLOv4 モデルを変換するには、以下の手順に従います:

  1. YOLOv4 の重みと関連付けられた cfg ファイルをダウンロードします:

  2. YOLOv4 モデルを使用してリポジトリーのクローンを作成します:

    git clone https://github.com/david8862/keras-YOLOv3-model-set
  3. モデルを TensorFlow 2 形式に変換します:

    • YOLOv4 の場合:

      python keras-YOLOv3-model-set/tools/model_converter/convert.py <path_to_cfg_file>/yolov4.cfg <path_to_weights>/yolov4.weights <saved_model_dir>
    • YOLOv4-tiny の場合:

      python keras-YOLOv3-model-set/tools/model_converter/convert.py <path_to_cfg_file>/yolov4-tiny.cfg <path_to_weights>/yolov4-tiny.weights <saved_model_dir>
  4. TensorFlow 2 形式から IR へのモデル変換を実行します:

    変換を実行する前に、TensorFlow 2 のモデル・トランスフォーメーション API の依存関係がすべてインストールされていることを確認してください。

    エラーが発生した場合は、入力を 255 で割る手順を追加する必要があります:

    --scale_values=image_input[255]
    mo --saved_model_dir yolov4 --output_dir models/IRs --input_shape [1,608,608,3] --model_name yolov4

YOLOv3 モデルを OpenVINO 形式に変換#

TensorFlow YOLOv3 モデル実装の公開バージョンが GitHub で入手できます。このセクションでは、YOLOv3 モデルをリポジトリー (ed60b90 コミット) から IR に変換する方法について説明しますが、この手順は TensorFlow YOLOv3 モデルの他のバージョンでも同様です。

YOLOv3 モデル・アーキテクチャーの概要#

元の YOLOv3 モデルには、最後に 3 つの異なるスケールで検出を行う 3 つのブランチを持つ Darknet-53 と呼ばれる特徴抽出プログラムが含まれています。これらのブランチは YOLO Region レイヤーで終わる必要があります。

Region レイヤーは DarkNet フレームワークで初めて導入されました。TensorFlow を含む他のフレームワークでは、Region が単一レイヤーとして実装されていないため、パブリック YOLOv3 モデルの作成者はすべて、単純なレイヤーを使用してモデルを作成しています。これはパフォーマンスに悪影響を及ぼします。そのため、YOLOv3 モデルを IR に変換するには、モデルのこれらのカスタム Region 部分を切り取り、必要に応じて Region レイヤーでモデルを完成させます。

YOLOv3 TensorFlow モデルのダンプ#

TensorFlow モデルを GitHub リポジトリーからダンプするには (ed60b90 をコミット)、以下の手順に従います:

  1. リポジトリーのクローンを作成します:

    git clone https://github.com/mystic123/tensorflow-yolo-v3.git cd tensorflow-yolo-v3
  2. (オプション) 変換がテストされたコミットをチェックアウトします:

    git checkout ed60b90
  3. DarkNet ウェブサイトから coco.names ファイルをダウンロードするか、タスクに適合するラベルを使用してください。

  4. yolov3.weights (YOLOv3 モデルの場合) または yolov3-tiny.weights (YOLOv3-tiny モデルの場合) ファイルをダウンロードするか、同じ構造を持つ事前トレーニングされた重みを使用します。

  5. リポジトリー内の変換スクリプトで使用される PIL をインストールします:

    pip install pillow
  6. コンバーターを実行します:

    このコンバーターは TensorFlow 1.x および numpy 1.19 以下で動作します。

    • YOLO-v3 の場合:

      python3 convert_weights_pb.py --class_names coco.names --data_format NHWC --weights_file yolov3.weights
    • YOLOv3-tiny の場合::

      python3 convert_weights_pb.py --class_names coco.names --data_format NHWC --weights_file yolov3-tiny.weights --tiny

    このステップでは、WARNING:tensorflow:Entity <...> could not be transformed and will be executed as-is. のような警告が表示される場合があります。この問題を回避するには、次のコマンドを使用して Gast 0.2.2 に切り替えます:

    pip3 install --user gast==0.2.2

416 (320、608、または独自の) とは異なるサイズの入力画像に対して YOLOv3 重みをトレーニングする場合は、コンバーターの実行中に指定した画像のサイズを --size キーに指定します。例えば、サイズ 608 の画像に対して次のコマンドを実行します:

python3 convert_weights_pb.py --class_names coco.names --data_format NHWC --weights_file yolov3_608.weights --size 608

YOLOv3 TensorFlow モデルを OpenVINO 形式に変換#

YOLOv3 アーキテクチャーの概要セクションで説明する問題を解決するには、<OPENVINO_INSTALL_DIR>/tools/model_optimizer/extensions/front/tf リポジトリーにあるカスタム操作を含む yolo_v3.json または yolo_v3_tiny.json (モデルに応じて) 構成ファイルを使用します。

これはいくつかの属性で構成されます:

[ 
    { 
        "id": "TFYOLOV3", 
        "match_kind": "general", 
        "custom_attributes": { 
            "classes": 80, 
            "anchors": [10, 13, 16, 30, 33, 23, 30, 61, 62, 45, 59, 119, 116, 90, 156, 198, 373, 326], 
            "coords": 4, 
            "num": 9, 
            "masks":[[6, 7, 8], [3, 4, 5], [0, 1, 2]], 
            "entry_points": ["detector/yolo-v3/Reshape", "detector/yolo-v3/Reshape_4", "detector/yolo-v3/Reshape_8"] 
        } 
    } 
]

説明:

  • idmatch_kind は変更できないパラメーターです。

  • custom_attributes は、すべての YOLOv3 固有の属性を保存するパラメーターです:

    • classescoordsnum、および masks は、モデルのトレーニングに使用された構成ファイルからコピーする必要がある属性です。DarkNet 公式共有ウェイトを使用する場合、GitHub リポジトリーyolov3.cfg または yolov3-tiny.cfg 構成ファイルを使用できます。custom_attributes のデフォルト値を、構成ファイルの [yolo] タイトルに続くパラメーターに置き換えます。

    • anchors はオプションのパラメーターであり、モデルの推論中には使用されませんが、デモでは Region レイヤーの出力を解析するために使用されます。

    • entry_points は、モデルを切り取り、上で指定したカスタム属性を持つ Region レイヤーを追加するノード名リストです。

YOLOv3 TensorFlow モデルの IR を生成するには、次を実行します:

mo \
    --input_model /path/to/yolo_v3.pb \
    --transformations_config front/tf/yolo_v3.json \
    --batch 1 \
    --output_dir <OUTPUT_MODEL_DIR>

YOLOv3-tiny TensorFlow モデルの IR を生成するには、次を実行します:

mo \
    --input_model /path/to/yolo_v3_tiny.pb \
    --transformations_config front/tf/yolo_v3_tiny.json \
    --batch 1 \
    --output_dir <OUTPUT_MODEL_DIR>

説明:

  • batch はモデル入力の形状を定義します。この例では、batch は 1 ですが、1 より大きい他の整数を指定することもできます。

  • transformations_config は、不足している Region レイヤーをモデルに追加します。IR では、Region レイヤーには、RegionYolo という名前が付けられます。

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

OpenVINO ツールキットは、YOLOv3 モデルを使用するデモを提供します。詳細については、オブジェクト検出 C++ デモを参照してください。

YOLOv1 および YOLOv2 モデルの IR への変換#

変換する前に、タスクに最適な YOLOv1 または YOLOv2 モデルのバージョンを選択してください。モデル設定ファイルと対応する重みファイルをダウンロードします:

  • DarkFlow リポジトリーから: 設定ファイルは cfg ディレクトリーに保存され、重みファイルへのリンクは README.md ファイルにあります。このリポジトリーのファイルは、DarkFlow を使用した TensorFlow への変換に適合しています。

  • DarkNet Web サイトおよびリポジトリーから: 構成ファイルはリポジトリーcfg ディレクトリーに保存され、重みファイルへのリンクは YOLOv1 および YOLOv2 ウェブサイトにあります。

DarkNet YOLOv1 および YOLOv2 モデルを OpenVINO 形式に変換するには、次の手順に従います:

  1. DarkFlow をインストールします

  2. DarkFlow を使用して DarkNet YOLOv1 または YOLOv2 モデルを TensorFlow に変換する

  3. TensorFlow YOLOv1 または YOLOv2 モデルを IR に変換する

DarkFlow をインストール#

YOLOv1 および YOLOv2 モデルを TensorFlow に変換するには、DarkFlow が必要です。DarkFlow をインストールするには:

  1. DarkFlow に必要な依存関係をインストールします。

  2. DarkFlow git リポジトリーのクローンを作成:

    git clone https://github.com/thtrieu/darkflow.git
  3. クローン作成されたリポジトリーのルート・ディレクトリーに移動します:

    cd darkflow
  4. DarkFlow リポジトリーREADME.md ファイルの手順に従って、DarkFlow をインストールします。

DarkNet YOLOv1 または YOLOv2 モデルを TensorFlow に変換#

YOLOv1 または YOLOv2 モデルを TensorFlow に変換するには、クローンされた DarkFlow リポジトリーのルート・ディレクトリーに移動し、以前にダウンロードした *.cfg および *.weights ファイルを現在のディレクトリーに配置して、次のコマンドを実行します:

  • YOLOv1 の場合:

    python3 flow --model yolov1.cfg --load yolov1.weights --savepb
  • VOC データセットを使用する YOLOv2 では、--labels 引数が必要であり、元のエクスポート・スクリプトに変更を加える必要があります。ファイルの 121 行目を self.offset = 16 から self.offset = 20 に変更します。その後実行します:

    python3 flow --model yolov2-voc.cfg --load yolov2-voc.weights --labels voc-labels.txt --savepb

VOC ラベルは次のリンクで見つけることができます

一般的な変換コマンドは次のとおりです:

python3 flow --model <path_to_model>/<model_name>.cfg --load <path_to_model>/<model_name>.weights --labels <path_to_dataset_labels_file> --savepb

YOLOv1 では、--labels 引数は省略できます。モデルが正常に変換された場合は、クローンが作成された DarkFlow リポジトリーの built_graph サブディレクトリー内に <model_name>.meta<model_name>.pb ファイルを見つけることができます。

ファイル <model_name>.pb は、YOLO モデルの TensorFlow 表現です。

TensorFlow YOLOv1 または YOLOv2 モデルを IR に変換#

変換された TensorFlow YOLO モデルには、Region レイヤーとパラメーターがありません。元の YOLO Region レイヤーのパラメーターは、[region] タイトルの下の <path_to_model>/<model_name>.cfg 構成ファイルに保存されます。

元のモデル構造を再作成するには、モデルを IR に変換するときに、カスタム操作と Region レイヤーのパラメーターを含む対応する yolo .json 構成ファイルを使用します。このファイルは、<OPENVINO_INSTALL_DIR>/tools/model_optimizer/extensions/front/tf ディレクトリーにあります。

選択したモデルのパラメーターに特定の値がある場合は、カスタム操作を含む別の構成ファイルを作成し、それを変換に使用します。

YOLOv1 モデルの IR を生成するには、次のパラメーターを使用して TensorFlow YOLOv1 または YOLOv2 モデルからモデルへのトランスフォーメーション API を提供します:

mo --input_model <path_to_model>/<model_name>.pb \
    --batch 1 \
    --scale 255 \
    --transformations_config front/tf/<yolo_config>.json

説明:

  • batch はモデル入力の形状を定義します。この例では、batch は 1 ですが、1 より大きい他の整数を指定することもできます。

  • scale は、入力値を除算するスケール係数を指定します。モデルは [0,1] 範囲の入力値でトレーニングされました。OpenVINO ツールキットのサンプルは入力イメージを [0,255] 範囲の値として読み取るため、スケール 255 を適用する必要があります。

  • transformations_config は、不足している Region レイヤーをモデルに追加します。IR では、Region レイヤーには、RegionYolo という名前が付けられます。パラメーターの詳細については、TensorFlow からのモデル変換ガイドを参照してください。

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