みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

ピープルカウンタを考えてみる(7)

Code for Naraがらみで, ピープルカウンタの開発に取り組んではや一年が過ぎた.
昨年12月に, 第5回「HUG²祭り2018」でプロトタイプによる実証実験をさせていただいたこともあり, 今年はCode for Naraに「HUG²祭り2019」で人数カウントをしてほしいとの要望が来ているようだ.

www.volunt-info.jp

そこで, 今年はDeep Learningを用いた人物検出を試してみようと思い, NDIVIA Jetson Nano + Intel RealSense D415でトライすることにした.


関連記事:
ピーブルカウンタを考えてみる(1)
ピープルカウンタを考えてみる(2)
ピープルカウンタを考えてみる(3)
ピープルカウンタを考えてみる(4)
ピープルカウンタを考えてみる(5)
ピープルカウンタを考えてみる(6)
・ピープルカウンタを考えてみる(7)
ピープルカウンタを考えてみる(8)


今回は, 前回の課題である以下の2点に取り組んでみた.

  • 人物検出, トラッキング精度の向上
  • 人物検出処理の高速化


1. アノテーションの改良
前回試したときに, 人物検出に失敗したり, トラッキングが不安定になる症状がみられた.
原因として考えられそうなものとして, 以下が考えられる.

  • バウンディングボックスを人物全体としたことで, 手や足部分の影響で人物形状のバリエーションが増えた.
  • 同様に, これによりバウンディングボックスの重心がバタつく.

そこで, バウンディングボックスを変動が少ない肩から上の部分で試してみることにした.
[従来]
f:id:moonlight-aska:20190928093329p:plain:w500

[今回]
f:id:moonlight-aska:20190928093410p:plain:w500


2. 高速化
高速化については, YOLOv3の枠組みを使う以上アルゴリズム的な改良は難しい.
そこで, 今回は演算処理を少なくすることを考え, 以下の2つを試してみることにした.

  • YOLOv3のモデルへの入力画像サイズを小さくする.

 理由:ピープルカウンタは人物のみの検出であること, あまり小さな人物を扱う必要がないので.

cfg/yolov3-tiny-passer.cfg

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=2
width=224
height=224
channels=1
momentum=0.9
decay=0.0005
 :
  • YOLOv3へ渡す画像をあらかじめ小さくリサイズして渡す.

 理由:以前のこの記事[1]で, OpenCVの画像データからYOLOv3に渡す画像データに変換する処理(c_array in darknet.py)で時間がかかていることが判明しているので.


3. 動作検証
上記改良を行い, Jetson Nanoで動作検証してみた.

学習データ:1124サンプル
評価データ: 281サンプル
max_batches:500000


PeopleCounterUsingYOLOv3_2

処理速度も精度もかなり良くなった感じ!!
昨年の画像処理による簡易人物検出ではできなかった人物が重なった場合でも, 一応問題なくカウントできている.

f:id:moonlight-aska:20190928195108p:plain:w400

少し気になったのは, 子供が検出できない場合があった.

f:id:moonlight-aska:20190928195133p:plain:w400

原因はまだ不明だが, 背が低くカメラからの距離が長くなるため人物画像が暗く&小さくなるからか!?
まっ, 学習データが増えれば改善するとは思うが...

実証実験(12/1)のメドはたったので, あとは主に学習データのアノテーション&増加をやっていこうと思う.

----
参照URL:
[1] Jetson NanoでIntel RealSenseを試してみる(3)







図解速習DEEP LEARNING

図解速習DEEP LEARNING