C#のWinFormsからPythonのYOLOv8を実行した結果

[この記事は、9/18 にXにポストした内容をまとめたものです]
C#のWinFormsからPythonのYOLOv8(物体検出)の処理を呼び、検出結果をWinFormsに表示するようにしてみました(Python․NET使用)。
複数処理を並列で実行したかったのですが、Python․NETの仕様上難しいようです。
デバッグモード+録画しているためCPU負荷が高くなっていますが、単体では数%まで下がりました。25FPSで処理しています。
確認時のGIF画像(約13MB)
現状ではC#⇔Pythonのデータの受渡しがうまくできていないのですが、ここができればPython側を色々切り替えられそうです。
試しにノートPCでも動かしてみたのですが、正常に動作しなかったため、コマンドラインからYOLOの呼び出しを行いました。10年位前の古いPCということもありますが、CPUのみでは厳しかったです。1FPSでもCPU使用率が100%になってしまいました。
以下、今回の検証で利用させていただいたサイトです。
Python.NET
http://pythonnet.github.io/
YOLOv8 – ultralytics
https://github.com/ultralytics/ultralytics
【pythonnet準備+確認編】C#にpythonで作った処理を組み込む – Qiita
https://tpsxai.com/preparing_pythonnet/
Python の仮想環境での実行方法についても記載があり、分かりやすかったです。
Yolo V8の覚書 – Qiita
https://qiita.com/kotai2003/items/32329a90703394d39d5c
YOLOの呼び出しについては、こちらのページの一番下のコードを参考にさせていただきました。
今回、cv2.imshow() の部分をWin32APIの StretchDIBits()で自前で描画するように書き換えました。
[2023/9/23 追記]
この後、C#でスレッドを2つ生成して、各スレッドから Python の処理を呼出してみたのですが、並列実行はできませんでした。
呼び出しはできるのですが1つ目のスレッドが終了するまで、2つ目のスレッドの処理は行われず待機状態となっていました。
同様にPythonでスレッドを生成しても同様でした。
この辺りは Python.NET の仕様のため、別の方法を考えます。
[2023/9/23 再追記]
別PCでCPUモードで動作確認した結果です。1FPSで確認したのですが、結構CPU負荷がかかってしまっているため、GPUは必須のようです。GPU以外は、最初のPCとほぼ同スペックです。
こちらのGeFroceは古いため、Pytorchでは未対応でした。