face-api.jsの顔検出速度を比較してみた【技術メモ】【小ネタ】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/b6d31427-3ef7-8a1a-d68e-896254c9be43.png)

# はじめに
株式会社マイスター・ギルド新規事業部のウサギーです。
弊社新規事業部では、新規サービスの立ち上げを目指して
日々、アイディアの検証やプロトタイプの作成を行っています。

今回は、face-api.jsの小ネタです。

# 顔モデルの読み込みが遅い…
[face-api.js](https://justadudewhohacks.github.io/face-api.js/docs/index.html)を気に入ってよく使っています。
使って作ったサービス👇

https://m-gild.com/ar/nenga/2022/

なのですが、
よく指摘されるのが「__表示されるまでが遅い__」ということ‥
1度読み込みした端末ではそこそこ早いのですが、
「トラニナル」のようなAR年賀状サービスは何度も継続的に起動するものではないですし、
はじめて起動したその時使う用途がメイン。表示が早くなる工夫はしなくてはなりません。

以前の記事になりますが、

https://qiita.com/Shinkijigyo_no_Usagi/items/7a18439f63bac9181ed7

face-apis.jsの顔モデルには

>    __SSD Mobilenet V1__
>    画像内の各顔の位置を計算し、
>    各顔の確率とともにバウンディングボックスを返します。
>    
>    face-api.js内で一番標準的な（？）顔検出のモデルだと思われます。
>    よく見かけるコードではこちらが使われていることが多いので、
>    私も「トラニナル」では思考停止状態でこちらを使用しました。
>    
>    __Tiny Face Detector__
>    パフォーマンスの高いリアルタイムの顔検出器。
>    SSD Mobilenet V1顔検出器と比較して、高速・小型・リソース消費が少なく、
>    パフォーマンスはわずかに低下します。
>    モバイルデバイスやクライアントのリソースが限られているときはこちらを使用すべき。
>    
>    「トラニナル」は使用者から「重い」という声を聞きました。
>    というか、自分でもテストして「重いなぁ」と思ったんですが
>    その時点で12/27だったので諦めました。
>    そんな問題を解決してくれそうな話がさっそく書いてあります！
>    これは使ってみたい。
>    
>    __MTCNN__
>    MTCNN：マルチタスクカスケード畳み込みニューラルネットワーク。
>    （Google翻訳頼みですが合ってるのかな？）
>    一般に、他の顔検出器の方がパフォーマンスが優れている。
>    
>    実験のためにリポジトリに入っている顔検出器のようです。
>    試すのはもちろんOK。

この3種類があると。

速度はどのくらい違うのか？
ちょっと試してみようと思います。

# 結果

早速結果です。（小ネタなので）

全ての顔検出器＋68点顔ランドマークの読み込みまでの時間を計測しています。
各検出器を読み込みなおす前にブラウザのキャッシュを削除しています。
正確なテストというより「体感どれくらいかな～」を知りたかったので厳密なテストではないことはご了承ください。

### local・PCでテスト
 __SSD Mobilenet V1__+ __68 Point Face Landmark Detection Models__
9284.5 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/52b5230d-7c57-1bcd-2756-991413d28241.png)

 __Tiny Face Detector__+ __68 Point Face Landmark Detection Models__
3788 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/67422242-e828-ca74-13bc-e71fb8722457.png)

 __MTCNN__+ __68 Point Face Landmark Detection Models__
11909.7 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/60b93ef2-dedb-8645-b3d3-93aa9c8d1ffc.png)


### テストサーバに置いてPCでテスト
（回線速度調べるの忘れた‥お許しください）
 __SSD Mobilenet V1__+ __68 Point Face Landmark Detection Models__
7661 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/c3cb0684-b9a3-d340-f925-037dddf48c9f.png)

 __Tiny Face Detector__+ __68 Point Face Landmark Detection Models__
3530.09 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/b1ec93fc-52c3-7290-b7f4-8f26554ddefb.png)

 __MTCNN__+ __68 Point Face Landmark Detection Models__
11917.19 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/1b02ff0c-0a27-bb3a-a4fc-6853e42c701f.png)


### テストサーバに置いてスマホでテスト
4G回線 iPhone12mini

 __SSD Mobilenet V1__+ __68 Point Face Landmark Detection Models__
5279 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/44bbdb43-bf28-03e3-82b5-a8edc5298e76.png)

 __Tiny Face Detector__+ __68 Point Face Landmark Detection Models__
3751 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/eed8b24e-06c9-c70a-b7b1-5f3a9ca75dd7.png)


 __MTCNN__+ __68 Point Face Landmark Detection Models__
10354 ms
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913784/d27188d9-4362-c89a-c310-69f584ba8cdd.png)



表にまとめてみました
|`環境＼検出器`    |`SSD Mobilenet V1（標準）`|`Tiny Face Detector（パフォーマンス高）`|`MTCNN（パフォーマンス低）`|
|----------|--------------------------|-------|-------|
| PC（ローカル） |9284.5(ms)|3788(ms)|11909.7(ms)|
| PC（Wi-Fi）|7661(ms)|3530.09(ms)|11917.19(ms)|
| スマホ（4G）|5279(ms)|3751(ms)|10354(ms)|


# おわりに
SSD Mobilenet ⇒ Tiny Face Detectorで思った以上に速度差が出たなと思いました。
体感としても「ちょっと早くなった！」と感じられるかな？
環境（ネット通信速度とデバイス）の影響が大きいと思うので
他にもいろいろ試せるといいのですが、ちょっと気になる～程度だったので、
今回はここまでで、小ネタとして記録してみました。