気の向くままに辿るIT/ICT/IoT
ハードウェア

AMD Ryzen AIチュートリアルYOLOv8 Video/Webcam

ホーム前へ次へ
AMD Ryzen AIソフトウェアって?

AMD Ryzen AIチュートリアルYOLOv8 Video/Webcam

AMD Ryzen AIチュートリアルYOLOv8 Video/Webcam

2025/04/07

 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_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上の実行が自動的には、終わらずエンドレスなのでしょうが、使用したカメラの質によるのか絶えずノイズが入るかのようにチラつくんですよね。

conda仮想環境と必須パッケージのインストール

path\to\yolov8_python> conda activate ryzen-ai-1.4.0
(ryzen-ai-1.4.0) path\to\yolov8_python>

 ここでは、c++ではなく、python版を実行するものとし、作業ディレクトリは、yolov8_python\。

 yolov8_webcam、yolov8_video何れから実行するにせよ、まずは、quicktest時と同様に仮想環境を作って、仮想環境を有効にしてから始めます。

 ryzen-ai-1.4.0は、Ryzen AIソフトウェアのインストール中に指定時、デフォルトのconda仮想環境名、もしくは、それをベースに変更したconda仮想環境名です。

(ryzen-ai-1.4.0) path\to\yolov8_python> pip install -r requirements.txt

 続いて当該プロジェクトで必要なパッケージのインストール。

Ryzen AI Softwareチュートリアルyolov8を実行する前に

2025/04/11

 yolov8_video.ipynbについては、後述の通り、ちょっとした修正が必要です。

Ryzen AI Softwareチュートリアルyolov8_webcamの実行

Ryzen AI Softwareチュートリアルyolov8_webcam Jupyter notebook上の実行結果全画面スクリーンショット/Ryzen 7 8845HS|Hawk Point

 早速、PowerShell上からjupyter notebook yolov8_webcam.ipynbを実行(、必要に応じカーネルを選択、Run、もしくはカーネル再起動&Run)した結果、Jupyter notebookのファイルメニューからHTMLとして出力後の全画面スクショ。

Ryzen AI Softwareチュートリアルyolov8_webcam 静止画からの人物検出用オリジナル画像/Ryzen 7 8845HS|Hawk Point

 オリジナルサンプル画像。

Ryzen AI Softwareチュートリアルyolov8_webcam CPU推論による静止画からの物体検出結果/Ryzen 7 8845HS|Hawk Point

 CPUで推論した1枚の写真内の物体検出結果。

 推論時間 364.93ms。

Ryzen AI Softwareチュートリアルyolov8_webcam iGPU推論による静止画からの物体検出結果/Ryzen 7 8845HS|Hawk Point

 iGPUで推論した1枚の写真内の物体検出結果。

 推論時間 306.13ms。

Ryzen AI Softwareチュートリアルyolov8_webcam NPU推論による静止画からの物体検出結果/Ryzen 7 8845HS|Hawk Point

 NPUで推論した1枚の写真内の物体検出結果。

 と思いきや、NPUだけは、人物と蝶ネクタイ以外のものも検出してますね、これ壁?柱?建具?ってことは、やっぱり、人物じゃなくて物体検知?

 推論時間 60.11ms。

 おお、このケースにおいては、NPUが桁違いで圧勝、次いで僅差でiGPU、CPUの順。

 とは言え、単位は1/1000秒ですから、何れも僅差と言えば僅差、かと言ってAI分野ではチリ積もで凄いことになることも珍しくないので、1msでも速いに越したことはなく、その差は大きいか。

Ryzen AI Softwareチュートリアルyolov8_webcam USBカメラ映像からの物体検知結果/Ryzen 7 8845HS|Hawk Point

 そしてWebカメラ映像から物体検出している様子。

 静止画では、そこそこ写ってますが、映像だと絶えずチラつくんですよね、ノイズなのかな、使ったWebカメラの質の問題?それともメモリ容量不足?

Ryzen AI Softwareチュートリアルyolov8_videoの実行

2025/04/11
Ryzen AI Softwareチュートリアルyolov8_video MP4ファイル映像からの物体検知結果/Ryzen 7 8845HS|Hawk Point

 素直にできず、しばし放置していましたが、ネット情報皆無、とは言え、試した絶対数が少ないだけで、そんなに根深いはずもないでしょと重い腰を上げてデバグ、ようやく、jupyter notebook上でyolov8_videoの実行結果を取得することができました。

Ryzen AI Softwareチュートリアルyolov8_videoデフォルトmotorbikes.mp4ファイル映像からの物体検知結果のスクリーンショット画像/Ryzen 7 8845HS|Hawk Point

 サンプルの.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での推論もできるようになっていますね。

Ryzen AI Softwareチュートリアルyolov8.pyの実行

path\to\yolov8_python>conda activate ryzen-ai-1.4.0
 
path\to\yolov8_python>CALL "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.13.5
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
 
(ryzen-ai-1.4.0) path\to\yolov8_python>python yolov8.py
----------------------------------------
Inference time: 341.05 ms
----------------------------------------
----------------------------------------
Inference time: 572.52 ms
----------------------------------------
APU Type: PHX/HPT
Setting environment for PHX/HPT
XLNX_VART_FIRMWARE= C:\Program Files\RyzenAI\1.4.0\voe-4.0-win_amd64\xclbins\phoenix\1x4.xclbin
NUM_OF_DPU_RUNNERS= 1
XLNX_TARGET_NAME= AMD_AIE2_Nx4_Overlay
WARNING: Logging before InitGoogleLogging() is written to STDERR
I20250410 16:54:34.138180 14468 vitisai_compile_model.cpp:1144] Vitis AI EP Load ONNX Model Success
I20250410 16:54:34.139179 14468 vitisai_compile_model.cpp:1145] Graph Input Node Name/Shape (1)
I20250410 16:54:34.139179 14468 vitisai_compile_model.cpp:1149] DetectionModel::input_0 : [-1x640x640x3]
I20250410 16:54:34.140179 14468 vitisai_compile_model.cpp:1155] Graph Output Node Name/Shape (3)
I20250410 16:54:34.140179 14468 vitisai_compile_model.cpp:1159] 3359_transpose : [-1x80x80x144]
I20250410 16:54:34.140179 14468 vitisai_compile_model.cpp:1159] 3560_transpose : [-1x40x40x144]
I20250410 16:54:34.141184 14468 vitisai_compile_model.cpp:1159] 3761_transpose : [-1x20x20x144]
[Vitis AI EP] No. of Operators : CPU 4 NPU 1293
[Vitis AI EP] No. of Subgraphs : NPU 1 Actually running on NPU 1
2025-04-10 16:56:35.7225083 [W:onnxruntime:, session_state.cc:1168 onnxruntime::VerifyEachNodeIsAssignedToAnEp] Some nodes were not assigned to the preferred execution providers which may or may not have an negative impact on performance. e.g. ORT explicitly assigns shape related ops to CPU to improve perf.
2025-04-10 16:56:35.7304165 [W:onnxruntime:, session_state.cc:1170 onnxruntime::VerifyEachNodeIsAssignedToAnEp] Rerunning with verbose output on a non-minimal build will show node assignments.
----------------------------------------
Inference time: 60.0 ms
----------------------------------------
 
(ryzen-ai-1.4.0) path\to\yolov8_python>

 yolov8.pyを実行、推論時間、NPUは、60.0 msと桁違い、圧倒的に高速、次いでCPUの341.05 ms、でiGPUが572.52 ms。

 というか、conda activate実行でvcvars64.batをVisual Studioから呼んでるっぽいですね。

終わったらconda deactivateを忘れずに

(ryzen-ai-1.4.0) path\to\yolov8\yolov8_python> conda deactivate
path\to\yolov8\yolov8_python>

 condaの仮想環境での作業が一通り終わったら、conda deactivate(activateの反対語deactivate)しましょう。

 これを忘れると、たいてい痛い目にあうので要注意。

conda info -e
 
# conda environments
#
 
base                path\to\anaconda3
ryzen-ai-1.4.0      path\to\anaconda3\envs\ryzen-ai-1.4.0

 conda deactivateしたら、都度、conda info -eで[*]のついた仮想環境がないことを確認しておくと安心です。

 なぜなら、一見、作業ディレクトリパス先頭から(ryzen-ai-1.4.0)といった仮想環境の表記が消えてもconda info -eで確認すると、まだ[*]が付いているなんてことがあったり、なぜか、代わりに(base)という仮想環境に入ってしまっていたり、知らずにAnacondaコマンドプロンプトを閉じて戻っても同様だったりすることもあったりするので。

 仮想環境baseになってしまう場合、ディレクトリパス先頭に表示されるとは言え、本来の仮想環境については、deactivateコマンドを実行した確信が手伝うのか、意外と気づかないことも多く...。

 何れにせよ、condaの仮想環境にいることを、知らずに、そのまま作業し続けると何かとハマりやすいので要注意。

作業中のyolov8_pythonディレクトリ一覧

Ryzen AI Softwareチュートリアル作業中のyolov8_pythonディレクトリ一覧の一例/Ryzen 7 8845HS|Hawk Point

 一例として作業中のyolov8_pythonディレクトリ一覧を上げておきます。

 requirement.txt.origとenc_test.pyは、やらかしてcondaじゃなくpip仮想環境でやってしまった際のエラー対処用の残骸なので本来ないはずのもの、それら自動バックアップファイルも同様。

 yolov8_webcamは実行結果を得られ、yolov8_videoは、現時点では、未完ながら試した際の残骸もあるかもしれません。

備考

 当初、ポカをやらかし、Ryzen AIソフトウェアのインストールに失敗していながらチュートリアルを試行していたことが判明。

 このyolov8もそうで実行結果を得られなかったのですが、NPU動いてなさ気なのも原因かも...と、これに気づいてRyzen AIソフトウェアを正常にインストールした後、最後に残していたチュートリアルのyolov8_pythonの内、yolov8_webcamについては、素直に実行結果を得ることができるようになりました。

ホーム前へ次へ