AMD Ryzen AIソフトウェアとNPUドライバをインストールした自身初購入のミニパソコンRyzen 7 8845HS搭載AOOSTAR GEM12 Pro MAX/Windows 11 Proにamd / RyzenAI-SWをgit cloneしてAI学習するYolov8 Video/Yolov8 Webcam編。
YOLOv8とは、YOLOv5の開発者Ultralytics氏により開発されたとされるコンピュータビジョンモデルアーキテクチャ。
コンピュータビジョンは、デジタルな画像や動画をコンピュータがどれほど正確に認識できるかという研究分野、コンピュータビジョンモデルは、画像や動画内のオブジェクトを検出するよう訓練されたソフトウェアプログラム、コンピュータビジョンモデルアーキテクチャは、そうした物体検知技術。
当該チュートリアルの詳細は...、README.mdもイマイチなので、なし...、情報源はソースくらいでしょう。
yolov8_videoは、ここでは、mp4な動画ファイルからの「動体」検知、yolov8_webcamは、PCに接続のWebカメラ|USBカメラ映像内の「物体」を検知する様子を表示するサンプル。
ただ、yolov8_webcamの方は、リアルなカメラ映像の物体検知結果は、最後尾ですが、それだけでなく、その前にCPU、iGPU(GPU)、NPU、それぞれで推論を行ない、ここでは1人は後頭部だけですが、3人の人物が写る1枚のサンプル写真から蝶ネクタイもマーキングされてるから物体?人物?を検出した結果と思われる画像もオリジナル画像と併せて表示されています。
尚、カメラ映像は終わりがないことからJupyter Notebook上の実行が自動的には、終わらずエンドレスなのでしょうが、使用したカメラの質によるのか絶えずノイズが入るかのようにチラつくんですよね。
ここでは、c++ではなく、python版を実行するものとし、作業ディレクトリは、yolov8_python\。
yolov8_webcam、yolov8_video何れから実行するにせよ、まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。
ryzen-ai-1.4.0は、Ryzen AIソフトウェアのインストール中に指定時、デフォルトのconda仮想環境名、もしくは、それをベースに変更したconda仮想環境名です。
続いて当該プロジェクトで必要なパッケージのインストール。
yolov8_video.ipynbについては、後述の通り、ちょっとした修正が必要です。
早速、PowerShell上からjupyter notebook yolov8_webcam.ipynbを実行(、必要に応じカーネルを選択、Run、もしくはカーネル再起動&Run)した結果、Jupyter notebookのファイルメニューからHTMLとして出力後の全画面スクショ。
オリジナルサンプル画像。
CPUで推論した1枚の写真内の物体検出結果。
推論時間 364.93ms。
iGPUで推論した1枚の写真内の物体検出結果。
推論時間 306.13ms。
NPUで推論した1枚の写真内の物体検出結果。
と思いきや、NPUだけは、人物と蝶ネクタイ以外のものも検出してますね、これ壁?柱?建具?ってことは、やっぱり、人物じゃなくて物体検知?
推論時間 60.11ms。
おお、このケースにおいては、NPUが桁違いで圧勝、次いで僅差でiGPU、CPUの順。
とは言え、単位は1/1000秒ですから、何れも僅差と言えば僅差、かと言ってAI分野ではチリ積もで凄いことになることも珍しくないので、1msでも速いに越したことはなく、その差は大きいか。
そしてWebカメラ映像から物体検出している様子。
静止画では、そこそこ写ってますが、映像だと絶えずチラつくんですよね、ノイズなのかな、使ったWebカメラの質の問題?それともメモリ容量不足?
素直にできず、しばし放置していましたが、ネット情報皆無、とは言え、試した絶対数が少ないだけで、そんなに根深いはずもないでしょと重い腰を上げてデバグ、ようやく、jupyter notebook上でyolov8_videoの実行結果を取得することができました。
サンプルの.mp4ファイルは複数ありますが、デフォルトでは、車も検知できてますが、このカットからして主役は、バイク乗り達でしょ。
修正箇所については、yolov8_video.ipynbファイルのサンプルの最後の2つのセルの結合とyolov8_utils.pyの不要なsplit行含め2行修正。
前者は、npu_session、LoadImagesがスコープにないと...、そんなに見えないとか(会えないとか、さみしいとか)言うなら、いっそのこと一緒になっちゃえば?とばかりにセル結合、これで見えるところで一緒にいられるよねと。
後者は、names.split('\n')となっている部分がエラーになり、namesを調べると気を利かせたのがアダになったのか、names自体既にyolov8_video.ipynbファイル内でsplitlines()されており、既にリストだったというわけでyolov8.py側でnames.split()行(ってホントはsplitlines()だろうけど)をコメントアウトしつつ、次行のif not文のnames2をnamesに修正。
となれば、後者については、むしろ、yolov8_video.ipynbファイル内で[names = names.splitlines()]行をコメントアウトするだけでも...と思いきや、yolov8_utils.pyもsplit()をsplitlines()に変更する必要はあるか...いや、コメントアウトだけでもいけました。
エラーの入口は、print文内のonnx_model_pathなんて知らないよということでしたが、セル結合により、この情報を持つnpu_sessionが見えるようになり、これは自ずと解決。
あー、よかった、思っていた以上に根が浅くて。
あ、あと、デフォルトだとNPUでの推論ですが、yolov8_video.ipynb上でコメントアウト行を変更すれば、CPU、iGPUでの推論もできるようになっていますね。
yolov8.pyを実行、推論時間、NPUは、60.0 msと桁違い、圧倒的に高速、次いでCPUの341.05 ms、でiGPUが572.52 ms。
というか、conda activate実行でvcvars64.batをVisual Studioから呼んでるっぽいですね。
condaの仮想環境での作業が一通り終わったら、conda deactivate(activateの反対語deactivate)しましょう。
これを忘れると、たいてい痛い目にあうので要注意。
conda deactivateしたら、都度、conda info -eで[*]のついた仮想環境がないことを確認しておくと安心です。
なぜなら、一見、作業ディレクトリパス先頭から(ryzen-ai-1.4.0)といった仮想環境の表記が消えてもconda info -eで確認すると、まだ[*]が付いているなんてことがあったり、なぜか、代わりに(base)という仮想環境に入ってしまっていたり、知らずにAnacondaコマンドプロンプトを閉じて戻っても同様だったりすることもあったりするので。
仮想環境baseになってしまう場合、ディレクトリパス先頭に表示されるとは言え、本来の仮想環境については、deactivateコマンドを実行した確信が手伝うのか、意外と気づかないことも多く...。
何れにせよ、condaの仮想環境にいることを、知らずに、そのまま作業し続けると何かとハマりやすいので要注意。
一例として作業中のyolov8_pythonディレクトリ一覧を上げておきます。
requirement.txt.origとenc_test.pyは、やらかしてcondaじゃなくpip仮想環境でやってしまった際のエラー対処用の残骸なので本来ないはずのもの、それら自動バックアップファイルも同様。
yolov8_webcamは実行結果を得られ、yolov8_videoは、現時点では、未完ながら試した際の残骸もあるかもしれません。
当初、ポカをやらかし、Ryzen AIソフトウェアのインストールに失敗していながらチュートリアルを試行していたことが判明。
このyolov8もそうで実行結果を得られなかったのですが、NPU動いてなさ気なのも原因かも...と、これに気づいてRyzen AIソフトウェアを正常にインストールした後、最後に残していたチュートリアルのyolov8_pythonの内、yolov8_webcamについては、素直に実行結果を得ることができるようになりました。