センサーと時系列データ機械学習→離散データをマップ化
はじめに
センサーと機械学習シリーズです。いろいろなセンサーを使ってなんでも機械学習してやろうという試みです。今回は人がいるかいないかの人感センサ(一次元データ)を使用して時系列データで機械学習を行います。データはシミュレーションで作成しています。
この記事で説明していること
・センサー配置とデータ生成:
3個の人感センサーを25m×10mに配置、最大3人の移動をシミュレーションしたデータセット作成
・加算方式ヒートマップと時系列処理:
センサー検知範囲の重複を活用した特徴量設計と時系列データによる精度向上手法
・ConvLSTMによる位置推定:
空間パターンと時間パターンを同時処理する機械学習モデルの実装と学習結果の評価
ステップ1:センサーシステムの基本設定
センサー配置とエリア設定
人物検知システムの開発にあたり、まず基本的なセンサーシステムの構築から始めました。現実的な制約を考慮し、限られた数のセンサーで効果的な検知を実現するため、25m × 10mの矩形エリアに3個のセンサーを配置することで検証しました。センサーの配置については、エリア全体を可能な限りカバーしつつ、センサー間の検知範囲に適度な重複を持たせることを考慮しました。
具体的なセンサー配置として、左側センサーを(7.5m, 5.0m)、中央センサーを(12.5m, 5.0m)、右側センサーを(17.5m, 5.0m)の位置に設定しました。各センサーの検知範囲は半径5mの円形とし、これによりエリア全体をほぼ網羅できる配置としています。この配置により、センサー間の検知範囲が重複する部分が生じますが、これが後述するパターン認識において重要な役割を果たすことになります。

# センサー設定
SENSOR_POSITIONS = np.array([
[7.5, 5.0], # 左側
[12.5, 5.0], # 中央
[17.5, 5.0] # 右側
])
SENSOR_DETECTION_RANGE = 5.0 # センサー検知範囲(m)
人物移動パターンの設定
検知対象となる人物の動作パターンについては、実際の歩行者動線を想定したシンプルなモデルを採用しました。人物はエリアの両端(x=0またはx=25)から反対側へ向かって直線的に移動するものとし、移動速度は0.5〜2.5 m/sの範囲でランダムに設定しています。この速度範囲は、ゆっくりした歩行から早歩きまでの一般的な歩行速度を想定したものです。最大人数は3人としています。
人物の初期位置については、エリア端部のy座標2.5〜7.5mの範囲内でランダムに決定されます。これにより、同じ方向に移動する複数の人物が異なる経路を通ることで、より現実的なシナリオを作成できると考えました。
ステップ2:機械学習によるパターン認識の導入
単一人物検知の限界と機械学習導入の経緯
従来の単純なセンサーシステムでは、「人がいる/いない」の二値判定しかできないため、問題に直面することになります。単一人物の場合は確かに分かりやすく、センサーの反応から人の存在を容易に判定できます。しかし、複数人が同時に存在する場合、どのセンサーがどの人物を検知しているのか、また実際に何人いるのかを判定することが困難になります。
この問題を解決するために、機械学習のパターン認識を導入することを決めました。
加算方式ヒートマップの考案
機械学習によるパターン認識を実現するため、まず効果的な特徴量の設計に取り組みました。基本的な考え方として、人がセンサー検知範囲内にいるときは"1"、センサー検知範囲内にいないときは"0"と判定するシンプルなルールから始めました。
また、複数センサーがある今回のような場合、センサーの検知範囲が重なる部分が生じることに着目しました。この重なり部分では、複数のセンサーが同時に同じ人物を検知する可能性があります。この現象を活用して、重なり部分でどちらのセンサーも検知していた場合に1+1で2と判定する「加算方式」を考案しました。下の図で★が人を表しています。センサーは3つすべて反応していることになります。

この加算方式により、単純な0/1判定では得られない、より豊富な情報を含むヒートマップを作成できるようになりました。このヒートマップは、人数や位置に関する空間的なパターンを機械学習モデルが学習するための重要な特徴量となります。ちなみにヒートマップをグリッド分割し、センサーの値を表示していますが、表示がないところは0としています。このように2次元の配列が出来上がります。
def generate_heatmap(sensor_positions, people_positions, grid_size=(50, 20)):
heatmap = np.zeros(grid_size)
sensor_data = np.zeros(len(sensor_positions))
# 各センサーの検知状態を判定
for sensor_idx, sensor_pos in enumerate(sensor_positions):
for x, y in people_positions:
distance = np.sqrt((sensor_pos[0] - x)**2 + (sensor_pos[1] - y)**2)
if distance <= SENSOR_DETECTION_RANGE:
sensor_data[sensor_idx] = 1
break
# 検知中のセンサーについてヒートマップを更新
for sensor_idx, sensor_pos in enumerate(sensor_positions):
if sensor_data[sensor_idx] == 1:
for i in range(grid_size[0]):
for j in range(grid_size[1]):
grid_x = (i + 0.5) * (AREA_WIDTH / grid_size[0])
grid_y = (j + 0.5) * (AREA_HEIGHT / grid_size[1])
distance = np.sqrt((sensor_pos[0] - grid_x)**2 + (sensor_pos[1] - grid_y)**2)
if distance <= SENSOR_DETECTION_RANGE:
heatmap[i, j] += 1
return heatmap, sensor_data
時系列データ導入の必然性
加算方式によるヒートマップを作成したものの、その瞬間のマップだけを学習させただけでは、まだ十分な精度が出ないのではないかという懸念がありました。人の移動は時間的な連続性を持つため、単一フレームの情報だけでは限界があると考えたからです。
この問題を解決するため、時系列データとして扱うアプローチを採用することにしました。その瞬間のマップを学習させるのではなく、過去10フレーム分のデータを一連のシナリオとして学習を行う方式です。これにより、人物の移動軌跡や移動パターンといった時間的な情報を機械学習モデルが活用できるようになります。
このようにして、パターン認識と時系列データを組み合わせたデータセットを作成し、より高精度な人物検知システムの構築を目指すことになりました。
ヒートマップ分解能の考察
今回のシステムでは、ヒートマップの分解能はコード内のGRID_WIDTHとGRID_HEIGHTパラメータで調整可能です。現在の設定では、25m × 10mの物理的エリアを50 × 20のグリッドに分割しており、これにより各グリッドセルは0.5m × 0.5mの物理的領域に対応しています。
分解能の向上は確かに理論的には精度向上につながると考えられます。より細かいグリッドを使用することで、センサー検知パターンをより詳細に表現でき、人物の位置をより正確に特定できる可能性があります。例えば、グリッドサイズを100 × 40に倍増させれば、各セルは0.25m × 0.25mとなり、位置推定の理論的上限精度が向上します。
しかし、計算量の増大は深刻な問題となります。グリッドサイズを倍にすると、ヒートマップの要素数は4倍になり、ConvLSTMモデルの計算負荷も大幅に増加します。メモリ使用量、学習時間、推論時間すべてが増大し、リアルタイム処理の要求に応えることが困難になる可能性があります。
機械学習の人数推定への影響は複雑です。分解能向上の恩恵を受けるには、学習データの質と量も同時に向上させる必要があります。細かいグリッドに対応する十分な学習データがなければ、過学習のリスクが高まり、かえって汎化性能が低下する可能性があります。また、センサーの検知精度自体に物理的限界がある場合、グリッド分解能だけを向上させても意味のある改善は期待できません。
システムの根本的制約の発見
データセット作成を進める中で、このシステムには根本的な制約が存在することに気づきました。当たり前のことではありますが、センサー数以上の人数は推定できないということです。今回の3センサーシステムでは、理論上最大3人までしか同時に検知できません。3人の場合、3つのセンサーすべてが1(人がいる)を示した状態で4人目を適当に配置してもセンサーの反応は変わりません。すなわち、センサー3つの場合は4人以上はヒートマップ上で反応されない。すなわち学習できないということになります。
ステップ3:ConvLSTMモデルの選択と実装
ConvLSTM選択に至った思考プロセス
パターン認識と時系列データを組み合わせたデータセットを作成した後、これを効果的に学習できるモデル選択が課題となりました。この複雑なデータセットは、空間的なパターン(ヒートマップ上の検知パターン)と時間的なパターン(10フレーム分の時系列変化)の両方を同時に処理する必要があります。
通常の畳み込みニューラルネットワーク(CNN)は空間的特徴の抽出に優れていますが、時系列データの処理には適していません。一方、LSTM(Long Short-Term Memory)は時系列データの処理に優れていますが、空間的な構造を持つデータの処理は苦手です。
この問題を解決するため、ConvLSTM(Convolutional Long Short-Term Memory)を選択することにしました。ConvLSTMは、従来のLSTMの全結合層を畳み込み層に置き換えることで、空間的特徴抽出と時系列処理を同時に実現できるモデルです。
[https://arxiv.org/abs/1506.04214]
ConvLSTMの構造について
このConvLSTMモデルは、複数人の位置推定という複雑なタスクを解決するために設計された、時空間データ処理に特化したアーキテクチャです。

入力データは複数のサンプルを同時に処理し、各サンプルが複数フレーム分の時系列データを持ち、各フレームがグリッド解像度でセンサー検知パターンを表現しています。
ConvLSTM層は、このモデルの中核となる部分で、段階的に次元を増加させた多層構造を採用しています。従来のLSTMが全結合層で時系列処理を行うのに対し、ConvLSTMは畳み込み演算を用いることで、空間的な構造を保持したまま時系列パターンを学習できます。これにより、センサー配置による空間的パターンと人物移動による時間的パターンを同時に捉えることが可能になります。
時間的アテンション機構は、時系列データの中で特に重要な時間ステップを動的に特定する役割を果たします。畳み込み層とシグモイド関数を用いて、各時間ステップに対する重要度スコアを計算し、人物がエリアに新たに入ってきた瞬間や複数人が交錯する重要な場面により多くの注意を向けるよう設計されています。
空間特徴抽出では、複数の異なるスケールでの特徴抽出を並列に実行するマルチスケールアプローチを採用しています。細かい特徴から大域的な特徴まで抽出することで、個別センサーの局所的な反応から全体的な検知パターンまで、様々な空間スケールの情報を包括的に捉えることができます。
特徴融合層では、複数のスケールから抽出された特徴を統合します。畳み込み演算により、異なるスケールの空間情報を効果的に組み合わせ、より豊かな特徴表現を生成します。
最終的な出力は、複数人の座標と信頼度情報として表現されます。各人物についてx座標、y座標、信頼度の値を出力する仕様となっています。
学習データセットの構造設計
データ分割については、シナリオベースの分割を採用しています。個別フレームをランダムに分割するのではなく、完全なシナリオ単位で訓練70%、検証15%、テスト15%に分割することで、データリークを防ぎ、より現実的な汎化性能を評価できるよう配慮しました。
(最初はフレームごとにランダムに訓練データ、学習データとテストデータに分けていました。しかし、後からリークしていることに気づいたのでシナリオごとの分割に変更しました。。)
ステップ4:学習結果と性能評価
学習結果の確認
添付された学習曲線から、ConvLSTMモデルの学習過程が順調に進行していることが確認できます。初期の数エポックで訓練損失が急激に減少し、約2.5から0.5以下まで低下した後、徐々に安定化していきます。検証損失も同様の傾向を示し、訓練損失とほぼ並行して減少しています。重要なのは、50エポック全体を通じて検証損失が訓練損失を大きく上回ることがない点です。これは過学習が発生していないことを示しており、モデルが汎化性能を維持しながら学習できていることを意味します。平均距離誤差4.57mは、グリッド解像度0.5mを考慮すると約9セル分の誤差に相当し、実用的な観点から改善の余地がある精度水準です。最小距離誤差0.71mは理想的な条件下での高精度推定を示し、最大距離誤差9.51mは複数人接近時や境界付近での推定困難性を表しています。まだまだ学習の余地がありそうです。センサーの中心から遠い端の人は誤差が大きい印象ですね。

学習結果
- 平均距離誤差: 4.57 m
- 最大距離誤差: 9.51 m
- 最小距離誤差: 0.71 m
まとめ
今回は人がいるかいないかを判定する人感センサを使用して、人数推定の機械学習モデルを構築しました。精度に関してはまだまだで試行錯誤が必要ですね!!
ソースコード
[https://github.com/badleejet/simulation-multi-person-tracking]
Discussion