超簡単な pyTorch トレーニング -> onnx モデル -> C++ OpenCV DNN 推論 (ソース コード アドレス付き)

他の人からより良く学び、

より良いものになりますように。

—— 「ウェイカ・ジーシャン」

e3772c9c3c8c3fa77e5c3381e73e906e.jpeg

この記事の長さは 1974ワードで、読むのにかかる時間は 5分です。

序文

普段は独学で時間が限られているので、ディープラーニングを学びたいと思っていて、pyTorch の入門記事をいくつか読んだことがありますが、どれも断片的なものばかりで、接続することができませんでした。最近、ちょうど疫病の流行で出張が減ったので、ステーションBでpyTorchのビデオを見たら、Liu Er氏の「pyTorch Deep Learning Practice」がよく教えられているというコメントがありました。チュートリアル全体がとても分かりやすかったです 2つ目のブランチを一人で担当するのは入門編と言えます。

pyTorch を使い始めるために最も重要なことは実際にそれを使用することです. OpenCV の DNN モジュールは推論に使用されます, そのため、この記事ではその効果を検証するための最も簡単な例に専念します. ソース コードの Github アドレスは最後にあります記事の。

5004f8cf90fc02c25b8ee1f569027399.png

# 実現方法
1 pyTorch トレーニング データ
2 pyTorch でトレーニングされたデータ モデルを onnx ファイルに転送します
3 C++ OpenCV DNN を使用した推論

構成環境

OS:Windows11ホーム

pyTorch 関連: Miniconda + pyTorch1.12.1(cpu) + python3.9.12、IDE は Visual Studio Code を使用します

OpenCV 関連: OpenCV 4.5.1 + C++、IDE は Visual Studio 2022 を使用

元の環境は Anaconda ファミリ バケットにインストールされており、大きなリソース領域を必要とします。Miniconda は最小の conda インストール環境であるため、ここでは Miniconda を使用することをお勧めします。具体的な環境構成やインストール方法は、動画も含めてインターネット上にかなりたくさん公開されているので、自分で探してみると良いでしょう。

普段は大画面モニターをオフィスに接続していますが、仕事の関係で出張が多くなりました。大画面を使いたいというニーズに応え、出張時にも持ち歩きやすいようにするために、ノートパソコンを次の機種に変更しました。オリジナルの ASUS Lingyao X DUO から ASUS Lingyao X Fold までの折りたたみスクリーン。これに対応して、元々は個別のグラフィックス カードを搭載していましたが、現在は統合グラフィックス カードのみになり、pyTorch は CPU バージョンでもインストールされます。2 つのノートブックの最後の比較写真

83e96114a511e33415ad4c61df050cc0.jpeg

6759c0bf62ef10cfbae9913741a9792b.jpeg

6a728284d90b8475255d091c04b6a770.png

コード

fb545bfb7211ff9f42ecf7d1295acb09.png

マイクロカード志祥

最も単純なトレーニングと推論を行うには、画像を使用せず、次の図に示すように単純な操作だけを行います。

1aa63ce6323e4e49c69473a1b2fcdcbb.png

上の図の赤いボックスは、必要なトレーニング セットを表しています。その効果は、入力値を 2 で乗算して出力結果を取得することであることが一目でわかります。次の 2 つの 4.0 と 100.0 は、結果の推論に使用されます。結果も 8.0 と 200.0 になるはずです

pyトーチトレーニング

01

トレーニングセットを定義する

f2ad9e7d963a72d8d5c9b898b3336b76.png

torch パッケージをインポートした後、入力 x_data を [1, 2, 3] として、出力 y_data を [2, 4, 6] として直接定義します。入力結果は次のように出力されます。

a68a45126a04736a08d8418027470de9.png

02

トレーニングされたネットワーク モデル、損失関数、およびオプティマイザーを定義する

b64b18e4fa425d77f60281fe7eddc272.png

学習モデルも非常にシンプルで、Linear full connection 層は 1 層のみで、フィードフォワード関数では活性化関数は使用されず、直接出力されます。損失関数の MSE、オプティマイザー SGD、学習率パラメーターは 0.02 (lr=0.02) に設定されます。

03

トレーニングモデル

3246ac88e4fc99171001ed3a18e14a6b.png

トレーニングに関しては、主に次の 4 つのステップがあります。

  1. 前方

  2. loss (損失関数を計算)

  3. 逆方向(逆方向伝播)

  4. ステップ (最適化の反復)

上記では、学習回数を 1000 回に設定し、100 回ごとに損失を出力し、最後に重みの値を出力しました。

7021ce4a13703ecca4af15b8292def26.png

04

NXモデルの検証テストと出力

fa45721f84ec758a79d57a586f6d9b7b.png

トレーニングが完了したら、テスト結果を確認しましょう。4 つの値、4、8、10、15 を入力しました。出力された結果は次のとおりです。

0fd88ac00c9572f05b1787eb13caf131.png

上の図からわかるように、予測結果は完全に正確です。次に、OpenCV 推論のためにトレーニング済みモデルを onnx ファイルにエクスポートします。

5e29f94476af31cd77f9d8667ee00098.png

  1. モデルmodelをeval()に変更すると推論モードに設定されます。

  2. 入力パラメトリック モデルを定義する dummy_input

  3. 出力、出力パラメータ名inputとoutput、onnxのファイル名を設定します。

  4. torch.onnx.export を使用してエクスポートします。verbose=True は、エクスポートされた軌跡を出力するデバッグの説明です。

成功すると、現在のディレクトリに test.onnx モデル ファイルが生成され、pyTorch でトレーニングされたモデルが完成します。次のステップでは、推論に OpenCV の DNN が使用されているかどうかを確認します。

C++ OpenCV 推論

a617426b183fbfa832e41ccabf9cac93.png

C++ OpenCV DNN 推論のコードも非常に単純で、主なことは dnn::Net を定義し、次に onnx モデル ファイルのディレクトリを指定し、readNetfromOnnx を使用してモデル ファイルをロードすることです。

入力パラメーターは引き続き OpenCV の Mat を使用します。入力パラメーターが 1 つだけであるため、ここでの定義は 1X1 で、入力データ型は float 型であるため、定義も CV_32F で、Mat が入力パラメーター net に渡されます。 setInput(Mat Value, 入力パラメータ名)、2 番目のパラメータはエクスポートしたパラメータ名と同じであり、net.forward (出力パラメータ名) を通じて返された結果を取得します。

5b2503d7c0eb76cdee9f88f3b9d0f00d.png

コードでは 1024 と入力したので、予測結果は 2048 となり、完全に正解です。 このような単純な pyTorch 学習モデルを onnx に転送すると、C++ OpenCV 推論のデモが完成します。

以上

03f2f1a80dc490a0b6466b5d8e00251e.png

マイクロカード志祥

送信元アドレス

https://github.com/Vaccae/OpenCVDemoCpp.git

クリックして原文を読むと「Code Cloud」のコードアドレスが表示されます

28ddace8f433944132ec58780d3dd951.png

過去の素晴らしいレビュー

f0683ad2d9969228d966a6f41197acf0.jpeg

Kotlin はコルーチンで Select 式を使用して最速の結果を選択します


6042b5dc6188777da35c96415f09843b.jpeg

C++ OpenCV は透視変換のために画像を手動でインターセプトします


9fd98e5417b942887b5bba943491b10b.jpeg

OpenCV を使用して単純な色抽出プログラムを作成する


おすすめ

転載: blog.csdn.net/Vaccae/article/details/128310182