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

[この記事は、9/18 にXにポストした内容をまとめたものです]

C#のWinFormsからPythonのYOLOv8(物体検出)の処理を呼び、検出結果をWinFormsに表示するようにしてみました(Python․NET使用)。
複数処理を並列で実行したかったのですが、Python․NETの仕様上難しいようです。
デバッグモード+録画しているためCPU負荷が高くなっていますが、単体では数%まで下がりました。25FPSで処理しています。

確認時のGIF画像(約13MB)

YOLOv8
YOLOv8

現状ではC#⇔Pythonのデータの受渡しがうまくできていないのですが、ここができればPython側を色々切り替えられそうです。

試しにノートPCでも動かしてみたのですが、正常に動作しなかったため、コマンドラインからYOLOの呼び出しを行いました。10年位前の古いPCということもありますが、CPUのみでは厳しかったです。1FPSでもCPU使用率が100%になってしまいました。

YOLOv8 NOTE
YOLOv8 NOTE

以下、今回の検証で利用させていただいたサイトです。

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では未対応でした。

YOLOv8 CPU
YOLOv8 CPU

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です