Last updated on

WoLNamesBlackedOutに物体追跡のDeepSORTを実装してみた


自分だけは黒塗りせずに表示させたい?

WoLNamesBlackedOutは、相変わらず鳴かず飛ばずの人気で。
いっそyoutuber向けに顔を認識してモザイクかけるアプリとして作った方が人気出るのでは?なんて思ったり。
でもyoutuberだと、自分の顔はモザイクせずに他人の顔だけモザイクしたい!って感じになりそう。
こんな場合、どうやって実装するのかな?

物体追跡で検出したものにIDを振れば実現できそう?

検出した物体に固有のIDを振って、このIDはモザイク処理の対象外よ、と指示できれば実現できそう。
こういうのを物体追跡といって、メジャーどころではbytetrackやDeepSORTがそれらしい。

bytetrackはフレーム間の物体検出の枠の重なり加減で追跡するので、処理は速いものの、隠れたり重なったりに弱い模様。
DeepSORTは検出した部分を画像分類で特徴を比較して、追跡するみたい。ちょっと重そう?

とりあえずWoLNamesBlackedOutに実装してみた。

顔モザイクアプリができたらいいけど、お試しということでとりあえずWoLNamesBlackedOutに実装しようとしてみた。
が、これがなかなか大変だった。良く分かってないから。

yolov8は、Ultralyticsのpython実装ではそもそも物体追跡できる機能があるみたいで。
でもC++はなさそうだったので、仕方なく検索。

すると、ちょうどC++でyolov5とDeepSORT、bytetrackを実装したリポジトリが見つかりました!

もう作ってあるし、あとはうちの環境にあわせるだけだー!ラクショー!

と思ってからが長かった。
私がonnxruntimeを根本的に分かってないので、まー動かない!
結局生成AIに添削してもらって、元のコードの原型をとどめないくらい修正して、なんとか動くようになりました。

動くようにはなったのですが、まだ問題はあって、

  • DeepSORTが重くて、5FPS程度しか出ない
  • 重なりや隠れなどでIDが変わったりしてる

処理速度が遅いのはかなりネックで、モデルを小さくしたり、ReIDの処理を毎フレームではなく、たまにするくらいにしないと難しいかなー?
IDが変わる問題については、ReIDにOSNetを利用したけど、特に学習させたわけじゃないから特徴の違いが表れにくいのかもしれない。
また追跡自体は全体の中ではバックエンド的なもので、実際にはUIで"これを対象外に"っていうところも作らないといけないから、まだまだボリュームは大きい感じ。

WoLNamesBlackedOutでは、実際にはそこまで使われないんじゃないかなーという気はするので、なんとなく動いたところまでにしといて、一旦はお蔵入りかなー?
まぁ動いた、ということで、また何か作る時に役に立つ時もあるかもしれない。