こんにちは。2024年10月入社のカエンと、11月入社のスウです。今年度の新人グループ研修について報告します。
はじめに
弊社では2か月間のグループ研修を実施しています。今年度の参加者は陳 華炎(カエン)、鄒 宇傑(スウ)と趙 汝豪(ジョゴウ)の3名で、テーマは「Privacy-Preserving Camera(プライバシー保護カメラ)」です。
動機
スマートフォンの普及によって、写真を撮るチャンスが大幅に増えてきました。しかし、イベントや取材、日常のスナップショットなどで第三者の顔が映り、意図せず拡散されることは少なくないと思います。このような状況では、映ってしまった画像や動画は加工・修正する必要がありますが、手動では手間がかかります。そのため、手軽に写真・動画撮影の際のプライバシーを保護できるようなアプリを開発したいと考えました。
この研修では、リアルタイムで顔をぼかせる処理の実装を目標とし、特に利用者が多いスマートフォンに向けて開発しました。
目標
私たちがこの研修で実現したいことを一言でいうと
カメラに映る特定の人以外の顔、リアルタイムにぼかしたいよ!
です。
リアルタイム顔ぼかし機能のあるスマートフォンアプリを事前に調査したところ、iOS対応のものはありましたが、Android対応のものはありませんでした。そのため、開発アプリのターゲットを Android に絞り込みました。
機能実現のための作業工程を分解していくと、以下の4つの段階が必要だと判明しました。
- 顔検出(detection)と追跡(tracking)
- 特定の人の顔の照合(verification)とぼかし
- 1リアルタイム処理化
- Androidアプリ対応
使用機材
- Webcam付きのパソコン: 1台
- CPU: Intel i7-1355U
- RAM: 32GB
- 撮影フレームレート: 30fps (1080p)
- カメラ付きのスマホ:1台
- 機種: Google Pixel 9 Pro
- SoC: Google Tensor G4 (Octa-core)
- 1x 3.1 GHz Cortex-X4
- 3x 2.6 GHz Cortex-A720
- 4x 1.92 GHz Cortex-A520
- RAM: 16GB
- 撮影フレームレート: 30fps (1080p)
- 機種: Google Pixel 9 Pro
メソッド
目標の達成に向けて、以下の開発を行いました。
顔検出
顔検出は物体検知の一例であり、画像内に顔が存在するかどうかを判別し、顔がどこに位置しているかを特定することを目的とするタスクです。
要件に基づき、弊社が保有する既存の顔検出技術を調査したところ、face detectorと呼ばれるプロジェクトがあることがわかりました。しかし、face detector は古くてマイグレーションが難しく、研修期間内にカスタマイズして使うことが難しいことが判明したため、採用を見送りました。代わりに、代表的な汎用物体検出手法であるYOLO(You Only Look Once)v11[1]を採用しました。パソコンで処理速度を計測した結果、検出は約51.9ms/frame(19.26fps)であることがわかりました。
顔照合
顔照合は、2枚の顔画像の特徴(例えば、顔の輪郭、目、口の位置などの特徴)を比較し、同一人物かどうかを判定する技術のことです。実際のユースケースでは、撮影角度、光、カメラなどの影響を考慮する必要があるため、顔検出と比べてさらに複雑です。
私たちは初めに、今回の目的に適した顔照合の既存手法の調査を行いました。調査の結果、次のような手法を見つけました:
- Seqface[3]:識別ラベルと連続IDを組み合わせた損失関数により、識別性能と特徴の分離性を同時に向上させる顔照合手法。顔照合の手法の中では精度が随一だが、モデルサイズが大きすぎる
- Deepface[4] :Facebookが開発した初期の顔照合モデルで、顔の位置合わせに3Dモデルを活用し、高精度な顔照合を実現
- Sface[5] :高品質・低品質な顔画像の両方に頑健な認識性能を持つ軽量な顔照合手法。加重されたコサイン類似度ベースの損失関数を導入し、計算効率と精度を両立
これらの手法の精度と速度を評価した結果、今回の要件に最も適したのは Sface ということが判明したので、採用しました。
各手法の評価結果は以下の通りです(パソコン):
- Seqface (フレームワークが古く、評価未実施)
- Deepface:精度 = 97.40% 所要時間 = 1103ms/回
- Sface:精度 = 92.42% 所要時間 = 112.3ms/回
高速化
これらの手法を組み合わせたときの処理速度を見積もりました。実際の検出の複雑さを考慮して、処理時間については次の標準ケースを検討します。
- 動画は1秒(30fps)です
- 顔データベースにはひとつの顔画像があります
そして、この1秒の動画は、
- 撮り始める時顔が映らない
- 1番目の顔はフレーム8から現れる
- 2番目の顔はフレーム16から現れる
- 3番目の顔はフレーム24から現れる
高速化前、パソコンを使用する際には、上記の標準ケースにおいては以下の計算時間(バックグランド処理)が必要です。
処理時間=(フレーム1からフレーム7まで)51.9*7
+(フレーム8からフレーム15まで)51.9*8+112.3*8
+(フレーム16からフレーム23まで)51.9*8+112.3*8*2
+(フレーム24からフレーム30まで)51.9*7+112.3*7*3
= 6610.5 (ms)
したがって、理論フレームレートは 30/6.6105 = 4.53fps であることが判明しました。 また、実際の動作環境(パソコン)で計測した結果は4.36fpsでした。30fpsの目標を達成するために、以下の高速化手法を使用しました。
検出頻度の削減
顔検出処理の負荷を軽減するために、3フレームに1回の検出(1 detection / 3 frames)に削減する手法を採用しました。この工夫により、検出の精度を維持しつつも、計算リソースの節約と処理速度の向上を実現できます。
一方で上記変更に伴い、顔が動いている時、検出されなかったフレームの顔はボックスからぶれてしまう可能性があるので、検出精度の低下が懸念されました。そのため、YOLOの出力ボックスサイズを、デフォルト値よりも余裕を持たせた少し大きなものに修正しました。
より大きなバウンディングボックスを使用することで、顔が多少動いたとしても、連続するフレーム間では両方のボックス内に収まる可能性が高くなり、顔検出の頻度を抑えることが可能になります。
照合頻度の削減と顔追跡(Face Tracking)
顔の検出漏れを減らすとともに、照合頻度を減らすために、物体追跡アルゴリズムの一つであるByteTrack[6]を導入しました。追跡とは、既存の検出物体ボックスに基づいて物体の移動方向を予測することで、検出率を向上させる手法です。遮蔽などで見落とされがちな対象は、検出器によってスコアが低く出がちです。従来の手法では、これらは「無視」されてしまいます。
ByteTrackは、スコアが下がった対象も、「前後のフレームと一貫性のある動き」をしていれば、低スコアでも信頼できるとして活用し、追跡を維持、従来の追跡アルゴリズムで見落とされがちな対象も確実に追跡できるよう工夫されています。これにより、照合回数を減らしつつ、検出漏れを減らせることで精度と速度両方の向上が期待されます。
結果
頻度削減の結果を上記の標準ケースに当てはめて、比較検討します。
処理時間=(フレーム1からフレーム7まで)51.9*3
+(フレーム8からフレーム15まで)51.9*2+112.3
+(フレーム16からフレーム23まで)51.9*3+112.3
+(フレーム24からフレーム30まで)51.9*2+112.3
= 855.9 (ms)
したがって、理論フレームレートは 30/855.9 = 35.05fps に改善されました。
パソコンで計測した結果は31.02fpsとなりました。目標を達成できているので次の段階のアプリ開発に十分使えると考えました。
スマートフォン向けの開発
Python の既存ライブラリと公開モデルを活用し、4週間で試作を実装しました。また、Webカメラを使用して多数のテストを行いました。最終的には3週間かけて一部のアルゴリズムをC/C++で再構築し、Java を外部インターフェースとして、内部に C/C++ コードを組み込む形で Android デバイス上に実装しました。
まとめ
今回の研修ではプライバシー保護カメラ、すなわち、登録ユーザー以外の顔をリアルタイムでぼかすアプリの開発に取り組みました。この研修を通じて、顔検出・照合・追跡のディープラーニング手法に触れることができました。また、グループワーク・進捗管理、アルゴリズム開発・実装とクロスコンパイル、 Android開発を経験することができました。この経験を今後の業務に活かしたいと思います。
今回の研修で作成したアプリには、以下の課題が残っています。
- カメラが動いている場合、検出に必要なフレームが多い。
- 動いている人の顔や、遠くいる人の顔、一部の顔の向きが検出されないこと。
- アプリはまだスマートフォンのアルバムにアクセスできないこと。
最後までお読みいただき、ありがとうございました。
参考文献
[1] Ultralytics YOLOv11, https://docs.ultralytics.com/ja/models/yolo11/
[2] WIDER FACE: A Face Detection Benchmark Shuo Yang, Ping Luo, Chen Change Loy, Xiaoou Tang https://shuoyang1213.me/WIDERFACE/
[3] SeqFace: Make Full Use of Sequence Information for Face Recognition Zhenyao Zhu, Ping Luo, Xiaogang Wang, Xiaoou Tang https://arxiv.org/abs/1708.01826
[4] DeepFace: Lightweight Face Recognition Framework GitHub: https://github.com/serengil/deepface
[5] SFace: Sigmoid-Constrained Hypersphere Loss for Robust Face Recognition Jingjing Deng, Jia Guo, Niannan Xue, Stefanos Zafeiriou https://arxiv.org/abs/1909.09099
[6] ByteTrack: Multi-Object Tracking by Associating Every Detection Box Yifu Zhang, Peize Sun, Yi Jiang, Rufeng Zhang, Lijie Fan, Zehuan Yuan, Ping Luo https://arxiv.org/abs/2110.06864
- 主に生放送や動画処理に使用されることを想定し、本研修では30fpsをリアルタイムと設定しました。↩