Interface編集部

ailia SDKを試す<第2回>ailia SDK付属の活動認識モデルax_action_recognitionで動作を認識
本稿では,ラズベリー・パイ4上で動作するailia SDK(アイリア)を利用します.ailia SDK付属の活動認識モデルax_action_recognitionを用いて,人の動作をリアルタイムに認識する方法をご紹介します.
ailia SDKは高性能なクロスプラットフォーム推論ライブラリで,ラズベリーパイでもNEON最適化などにより高速推論を実現しています.前回はラズベリー・パイ4に ailia SDKをインストールできました.ailia SDKには,数多くの学習済みモデルが登録されているので,それを使ってailia SDKを試してみます.
ailia SDK用のモデルailia modelも前回,ダウンロードしているので,それを利用することとします.
●活動認識モデルax_action_recognitionを動かしてみる
紹介するのは,ailia-modelsに含まれる活動認識モデルax_action_recognition(GitHub: axinc-ai/ailia-models/action_recognition/ax_action_recognition)です.今回は付属サンプル動画とUBSカメラを使い,どの程度認識できるかを確認します.
●1.サンプル動画を利用した認識
デモンストレーション用GIF動画「punch_03-12-09-21-27-876.gif」を使って,モデルがパンチと認識するかを検証します(リスト1).
# 推論スクリプトがあるディレクトリへ移動
$ cd ailia-models/action_recognition/ax_action_recognition
# サンプルGIFで推論実行(軽量Poseモデル lw_human_pose を指定)
$ python3 ax_action_recognition.py \
–video punch_03-12-09-21-27-876.gif \
–arch lw_human_pose
リスト1 サンプル動画を利用した認識
描画ウィンドウには動画に重ねて認識結果が表示され,リアルタイムで「punch」と認識されています(図1).
図1 認識結果
Video is generated from dataset in https://github.com/felixchenfy/Realtime-Action-Recognition
●Webカメラによるリアルタイム認識
Webカメラやラズベリーパイ・カメラモジュールPiCameraを接続して,リアルタイムで動作認識を行う場合は,リスト2のようにします.
# カメラ映像を入力ソースとして指定(0 はデバイスID)
$ python3 ax_action_recognition.py \
–video 0 \
–arch lw_human_pose
リスト2 Webカメラによるリアルタイム認識
▲認識1…静止画
まず,骨格認識の精度を確認するため,AIで生成した「走っている男性」の画像を印刷してカメラに映してみました.静止画のため姿勢変化がなく,Standと判定されましたが,検出された骨格キーポイントは正しく並んでおり,Poseモジュールの精度を確認できました(図2).
図2 静止画で骨格認識
▲認識2…カメラを動かす
Webカメラを接続した状態で,カメラの向きや角度を動かして試してみたところ,リアルタイムで表示される認識ラベルが変化しました.これは 骨格キーポイントの位置や形状が視野内で変化し,それに伴って動作分類器の判定が変化するからと考えられます.横に動かすと「walk」,縦に動かすと「jump]と判断しました(図3).
図3 Webカメラを縦横に動かしてみた
●ライブ・カメラ映像での活動認識
新宿歌舞伎町のライブ・カメラ映像を使って動作認識を試してみました.
https://www.youtube.com/watch?v=DjdUEyjx8GM&list=PLnijyl7KNnKH5IXhD8zkLCttWqIlp_Zx0&index=160
多くの人々の動作がリアルタイムに「squat」(しゃがむ)と認識されました.これはライブカメラの設置角度や高さが,学習データの視点とずれていることが原因と考えられます.姿勢の違いや関節の見え方が大きく異なるため,分類器がsquatと誤認識しやすいようです(図4).
図4 カメラの取り付け位置が高いせいか,squatと認識されることが多い
●使用されている主要API:ailia.PoseEstimator
今回のサンプル・プログラムで中核となるのは,recognize_from_video() 関数で使っているailia.PoseEstimatorクラスです(リスト3).
# ======================
# Main functions
# ======================
def recognize_from_video():
;
# pose estimation
env_id = args.env_id
print(f’env_id: {env_id}’)
if args.arch==”lw_human_pose”:
pose = ailia.PoseEstimator(
MODEL_PATH, WEIGHT_PATH, env_id=env_id, algorithm=ALGORITHM
)
リスト3 主要API:ailia.PoseEstimator
この poseには,画像から推論された人の骨格情報が格納されます.例えば,人物ごとに関節点(キー・ポイント)の座標データが保存され,これをもとに,さらに動作分類(活動認識)が行われます.なお,recognize_from_video() 関数やこのAPIの詳細な仕様については,公式のAPIドキュメントにも詳しく解説されています.関心のある方は,文献(1)を参照してください.
●まとめ
本記事で検証したラズベリーパイ4Model B上での活動認識では,サンプルGIFを用いた場合,秒間2フレーム(2fps)という判定速度でした.この結果はエッジ・デバイスかつCPUのみという制約下では妥当ですが,リアルタイム用途や常時監視の運用には十分とは言えません.
一方で,動作認識の用途によっては,幾つかの工夫で実用に近づけることも可能です.
・フレーム間引き(入力動画のフレーム・レートを落とす)
・認識対象アクションの絞り込み(必要な活動のみ判定することでモデルや後処理を軽量化)
・入力画像の解像度調整やROI設定(興味領域のみ推論して負荷を下げる)
など,目的に応じた工夫を加えることで,現状の性能でも一定の用途には十分対応できると考えます.
■参考文献■
(1)ailia Python API document.2021, AXELL CORPORATION, ax Inc
https://axinc-ai.github.io/ailia-sdk/api/python/en/ailia.html#ailia.PoseEstimator
氏森 充(うじもり・たかし)
約30年間,(株)構造計画研究所にてIoT,ビッグデータ,機械学習,AI関連のシステム開発や実務応用に従事.退職後はLLM(大規模言語モデル)関連の情報収集や技術動向の調査・発信に注力し,雑誌「Interface」でもLLM技術に関する記事を執筆中.