[自在]OpenCVかCIDetectorを使ってiOSで顔認識してみよう!

OpenCVを使って、iPhoneで顔認識するアプリを作ってみようと調べてみた。
よさそうなブログ(感謝!感謝!)を発見したので、早速実験!

Swift + OpenCVでリアルタイムに顔認識してみた1 – Give it a shot

Swift + OpenCVでリアルタイムに顔認識してみた2 – Give it a shot

う〜ん、確かに動きはするのだけど、1フレーム5秒ぐらいかかるので実用には厳しい。。。

これは、真面目にOpenCVのコードを最適化させないといけないのかね。と、色々と調べてみる。
で、気づいたのだが、このプログラムは顔認識のアルゴリズムが遅いわけではない!

Xcodeのデバッグ情報を見ていると、やけにメモリ使用量が増加していって、それが速度低下の要因となっているように見える。

最初、Swiftだとオブジェクトのreleaseがうまくいってないので、ヒープ使用量が増加しているのかと思ったが、そうでもなさそうだ。

原因は、dispatch_asyncにありそうだ。メモリを大量に使用する画像認識処理が非同期のキューに複数積まれてしまうのが原因のようだ。
キュー数を減らす方法を考えたが、うまい方法を思いつかない。
「非同期にしなければいいんじゃないか?」
「dispatch_async」を「dispatch_sync」で書き直してみる。

ほぼリアルタイムで顔認識できるようになった!

実は、途中でOpenCVを捨ててCIDetectorを使うようにしてみたのだけど、速度的には似たようなものだと思う。