はじめに
三菱総研DCSのAIエンジニアの桃井です。
東京デジタルイノベーション2020でデモンストレーションを行ったサンプルアプリケーションの内容について、前回に引き続きご紹介します。アプリケーションの概要は第1回の記事をご参照ください。
第1回 デモアプリの概要
第2回 来訪者の動線可視化
第3回 来訪者の人数計測(本記事)
第4回 リーフレットの残量計測
本記事では、来訪者の人数計測を行った箇所の実装について解説します。
来訪者の人数計測アプリケーションの概要
本出展では、ブースの一部にディスプレイが配置され、一定時間ごとに当社社員によるセッションが行われました。人数計測アプリケーションでは、ディスプレイ上部に設置したUSBカメラの画像をもとに人物の顔部分を検出し、ディスプレイの前にいる人の人数を計測・可視化します。
図1.アプリ概要
システム構成および使用デバイスは以下の通りです。全体のシステム構成のうち主に以下のデバイス(赤く囲んだ箇所)で処理を行っています。
図2.システム構成
表1. 使用デバイス
種類 | 製品名 | 備考 |
エッジ端末 | RaspberryPi 4B | CPU:1.5GHz クアッドコア ARM Cortex-A72 GPU:デュアルコア VideoCore VI® 500MHz メモリ:4GB DDR4-2400 低電圧 SDRAM |
外部演算装置 | NeuralComputeStick2 (NCS2) | プロセッサ:Intel® Movidius™ Myriad™ X Vision Processing Unit 4GB |
処理概要
以下の流れで処理を行います。
① 顔検出
② 顔方向の推定
③ 性別・年齢の推定
④ 総人数、および性別・年齢ごとの人数をIoTゲートウェイ経由でAWSに送信
図3.処理概要
処理の詳細
使用するフレームワーク
今回はRaspberryPi上で推論を行うということで、推論の高速化のためのデバイス、「NeuralComputeStick2」と、開発用のフレームワーク、「OpenVINO」を使用しました。初めにこれについて説明します。
Neural Compute Stick 2(NCS2)
プロセッサとしてVPU[1]を搭載したUSB型の外部演算装置で、CPUのみを搭載したPCやRaspberryPiなどのエッジ端末上でも、高速なディープラーニングの推論を行うことが可能になります。
一方、開発用のフレームワークに制約があるというデメリットもあります。NCS2を利用するには後述のOpenVINOを使う必要があり、TensorflowやPyTorchで書かれたプログラムをそのまま高速化することはできません。
[1] VPU:IoT画像処理に向いた演算装置で、演算性能はGPUに劣りますが、コンパクトで電力消費も少ないため、今回のようにエッジ端末で推論を行うシステムに向いています。
OpenVINO
Intel製のディープラーニング用のSDKで、ディープラーニングによる推論の実行やモデル変換の機能を備えています。先述のNCS2を利用するには、このツールキットを使ってアプリケーションを開発する必要があります。モデルはIR(Intermediate Representation)形式で.binと.xmlからなりますが、他のフレームワークで作られたモデル(.pbや.onnxなど)も、内蔵のモデル変換スクリプトを使うことで使用できるようになります。また、IR形式の学習済みモデル群であるOpenModelZooも公開されており、手軽にアプリケーション開発を行うことができるのが特徴です。
処理の流れ
①顔検出
カメラで撮影された画像から、人物の顔領域を検出します。モデルはOpenModelZooの学習済みモデルを使用しました。アルゴリズムや学習データなどの具体的な内容は不明ですが、別途Yolo v3で検証した際と相違無い精度で検出できていると感じます。
単純なエリア内の人数計測ならこの処理だけで十分です。その場合、以降の処理も行う場合と比べ、1.5倍ほど処理速度が速くなります。
使用モデル:
モデル名:face-detection-adas-0001
種類:顔検出モデル
概要:入力画像に対し、検出された顔の矩形の座標を返す
図4.顔検出のイメージ
②顔方向の推定
①で顔領域の矩形を検出した後、その矩形を入力とし、顔の向いている方向の推定を行います。得られた回転角とディプレイの設置位置を元に、人物がディスプレイを見ているか(=ブースの来場者か)を判定します。本イベントの会場配置では、正面の他社ブースの人物や通行人もカメラの画角に入ってしまいます。正確な来場者数のカウントのため、顔が向いている人物のみに対して以降の処理を実行します。
使用モデル:
モデル名:head-pose-estimation-adas-0001
種類:頭部姿勢推定モデル
概要:入力画像(頭部の矩形)に対し、yaw、pitch、rollのそれぞれの回転角を返す
図5.顔方向の推定のイメージ
③性別・年齢の推定
①の矩形を入力とし、性別および年齢の推定を行います。
実際に小売店などで人数計測を行う場合は、このようにして来場者の属性を判別することで客層の分析をする材料となり得ます。
使用モデル:
モデル名:age-gender-recognition-retail-0013
種類:性別・年齢推定モデル
概要:入力画像(頭部の矩形)に対し、年齢の値と性別の予測確度(0~1の線形値)を返す
図6.性別・年齢の推定のイメージ
④人数をAWSに送信
計測したデータは、IoTゲートウェイを兼ねたこのエッジ端末上に立ち上げたNode-RedにWebSocketを用いて送信し、順次MQTTS通信でAWSへデータを送信、AWS Elasticsearch Serviceへデータを永続化します。そして前回の記事と同様に、S3上にデプロイしたシングルページアプリケーションで可視化します。
送信するデータは総人数に加えて、性別ごとの内訳と年齢層ごとの内訳(~19歳/20歳~64歳/65歳~)になります。
また、実際に計測された人数の推移が以下の図になります。
図7.イベントスペースの人数の推移
薄いピンク色で示された時間帯が、当社社員によるセッションが行われていた時間になります。平時に比べ人数が多くなっていることが分かります。
まとめ
苦労した点
- NCS2の性能を最大限に発揮するにはセルフパワーのUSBハブに繋げる必要があります。処理速度(fps)はバスパワーで約3.7、セルフパワーで約7.8と、2倍ほどの違いが生じました。イベント本番では複数のエッジ端末の電源との兼ね合いもあり、バスパワーで妥協しました。IoTプロジェクトではアプリケーションだけではなく、電源や機器の設置といった物理的な問題の考慮も重要になります。
課題
- ディスプレイを見ているか否かの判定に顔方向を使用しましたが、精度を求めるのであれば視線推定を行う方が適切です。
- OpenModelZooのモデルによる年齢の推定精度があまり高くありませんでした。一般に顔画像のデータセットは日本人の割合が少なく、高い精度を求めるのであればデータを補充して独自モデルを作成する必要があると思われます。
今回はイベントで展示したIoTデモアプリケーションのうち、イベントスペースでの人数計測アプリケーションの詳細について説明しました。
次回は引き続き、リーフレットの残量計測機能について説明します。