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技術に関する記事を執筆中.