カメラでリアルタイム追跡
もう忘れやすい頭になっているので自分的なメモ
仕事で、依頼されて作ったオブジェクトトラッキングだけど結局予算がなくなって使わなくなった
不憫なシステムの記録。
システム構成としてはWindowsPCにUSBカメラからリアルタイムで映像データを取得し
フレーム単位で、プライマリースレッドからワーカースレッドにフレーム単位で非同期処理を仕掛け
yolov4で物体認識を実施し、位置情報と識別したいラベルの情報のみをピックアップさせる。
並行して、それとは別に動的差分を取って動いている物体を抽出してトラッキング対象物のピックアップ
させる。
yolov4のラベル情報と、位置情報を取得し動的差分で検知した位置とをマッピングさせて対象物が何なのか
を識別する。
未知の物体が、yolov4によって物体を識別できたら追跡情報としてユニークな識別番号を生成しリンクさせる。
未確定なものであれば、不明なオブジェクトして記録する。
既に識別できているものであれば、追跡を続ける。
オブジェクトは、確定、未確定問わず次のフレームでどの位置に移動するのかカルマンフィルターを使用して
算出し予測位置に対象物が現れるかどうかを絶えずチェックし、移動ベクトルと加速度を割り出して計算精度
を絶えず更新する。
トラッキングできる数は理論上無制限であるがメモリが許す限り追跡し続ける。
但し、カメラのフレームからフレームアウトしたものについては追跡をやめる。
よくある人数をカウントする方法としては、仮想的な線を設けてそれを振んだら計測開始、終了用の線を踏んだら
カウントアップして計測をやめる、みたいなものはある。
認識させた後で、顔から年齢と性別などを推定させ、ログデータとして記録しているのも多い。
個人情報の保護から画像データそのものではなくて、ベクトル化されたデータのみを利用し画像としては保存しない。
但し、個人情報の定義は法律上個人を特定できるデータは個人情報となりえる為に取扱いには注意する必要がある
のと法務部門や弁護士など専門家を交えて問題がないか確認する必要あり。
複数台のカメラで、対象物をトラッキングする際にはフレームアウトしたカメラからフレームインしたカメラに
ベクトル化したデータを引き継ぎ処理させる必要がある。
また、複数台のPCやサーバなどを使用する際にはシベクトルデータをどこで引き継ぐかを慎重に検討する必要がある。
処理速度にも気を遣う必要がある為に、物理カメラから近しい位置で処理させることが望ましい。
実際のカメラはカメラ性能や環境によってノイズが大きくのる場合が多く
ご認識する部分もでてくるので、ノイズ除去に注意する必要がある。