先にyolov4の検出に対するDeepSortでの追跡の紹介記事を書いた。
それ以外の検出対象として、顔検出結果に対するDeepSortの実装があった。
動画入力に対して、顔検出の結果を理解するためには、ただ単に、各フレームの検出位置がわかればいいわけではないことが多い。
- 動画入力の中で、顔の位置がどのように移動しているのかが、人の動きを理解することが必要だったりする。
- 人数カウントの場合、シーンに登場して、視野の外に移動していく人の数をカウントしようとすると人の追跡は必須である。
- また、その顔が誰なのかを理解するために、全部のフレームで顔照合をするのも実際的ではない。
- 顔照合を実施するフレームを減らすこと。
- 顔照合困難な顔向きの顔であっても、その前の追跡情報で、正面顔での顔照合が有効であれば、その結果を利用したい。
Multi_Face_Tracker_Using_Deepsort にある動作結果の例
上記のgithub のページではREADEが多くの人に読みなれない言葉で書いてあるので戸惑うかもしれないが、勇気を持って、git clone して動作させてみる価値がある。
コンピュータ分野の記事は、google translate でかなり翻訳できるので、顔に対して追跡を試して見たい人は、ぜひ試してみよう。
git clone 後に自分のPCで動作させる際の留意点
- requirements.txt は、github の該当リポジトリの作者の動作環境を示したものです。
- このリポジトリで本当に必要なモジュールだけを記載したものではありません。
- また、モジュールのバージョンの指定も、作者の動作環境を再現するものになっています。
- 本当に必要なものだけを、step by step でインストールしていきながら、目的のスクリプトが動作するようにしていくのをおすすめします。
ソースコードを読み解く
DeepSortでは、複数の対象物をtrackingする際に、追跡中の対象物の特徴を使って、trackingを行っている(らしい)。そのため、追跡中の対象物から特徴量を算出する部分がある。
# arcface_weights.h5 顔照合の特徴量を取り出すためのモデルファイル
model_filename = os.path.join(home, "weights", "arcface_weights.h5")
encoder = gdet.create_box_encoder(model_filename, batch_size=128)
# imgの各検出枠に対する特徴量を得る。
features = encoder(img, converted_boxes)
この特徴量をも利用し、フレーム間の検出での対応関係をつけている。
deep_sort フォルダのコード
以下のフォルダにあるdeep_sort
とMulti_Face_Tracker_Using_Deepsort
のコードは、差異がある。顔照合のface_db
をdeep_sort
の下のモジュールで利用している。
参考
顔の追跡の別事例
https://github.com/Linzaer/Face-Track-Detect-Extract