【社内ハッカソン】 社内カメラでCTO検出機を作ってみた


この記事は[セーフィー株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/safie) の12月20日の記事です！:tada::tada::tada:

セーフィーでエンジニアとして働いている伊林です。

セーフィーではこれまで、AI領域の開発やエッジアプリの開発、サーバーサイドの開発などいろいろな開発をしてきました。今回は、中でも愛着深い、**解析プラットフォーム**というプロダクトに関する記事です。

解析プラットフォームとは、セーフィーのカメラの映像に任意の機械学習モデルをデプロイ出来るという、非常に夢のあるプロダクトです ([詳細はこちら](https://engineers.safie.link/entry/ai-platform))

今回は、社内ハッカソンの形式で、解析プラットフォームに載せる画像処理アルゴリズムを開発してみました。

## ハッカソンのテーマ

弊社CTOの森本を検知するアルゴリズムを構築することが今回のテーマです。多忙な森本さんを捕まえたい人にとっては便利なサービスかもしれません 笑

また最終的には、成果物を解析プラットフォームにサービスとしてデプロイすることを目指します！


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/234f4085-b9f7-e225-504b-4626e68078c1.png" width=500>


ハッカソンの内容については、[こちら](https://qiita.com/n_kswg/items/dd538d11c14ce3d69f93)の記事に詳しく記載されています。


## 利用したアルゴリズム
自分以外のハッカソン参加メンバーは、分類モデルを学習させることで検出器を作ろうとした方が多かったですが、前から興味のあったFaceNetを試してみることにしました。

具体的には
1. 物体検出により顔画像を切り抜く
2. FaceNetにより、くり抜いた画像を対象の人物かどうか判別する

という二段構成で推論を行います。

**ハッカソン参加メンバーの記事**

https://qiita.com/n_kswg/items/dd538d11c14ce3d69f93

https://engineers.safie.link/entry/2022/12/02/AI%E3%83%A2%E3%83%87%E3%83%AB%E4%BD%9C%E6%88%90%E3%81%AF%E7%B0%A1%E5%8D%98%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F

### MTCNN
MTCNNとは、顔検出専用の物体検出モデルです。特に再学習などはせず、既成のものを使いました。

https://medium.com/@iselagradilla94/d46b0866e4d6

### FaceNet
今回は、学習済みの顔認識モデルとして有名なモデルです。FaceNetとは、簡潔にいうと「人物顔をその人特有の特徴量ベクトルに変換することができるモデル」です。

この特徴量ベクトルを比較することで、「画像同士が似ているか似ていないか」 ≒ 「同一人物かどうか」を**学習を必要とせずに**判別することができます。

↑ このようなFaceNetの特徴を利用すれば、「**任意の人物を映像から検索するサービス**」を作ることもおそらく可能です! 夢が広がりますね:dizzy:


MCTNNとFaceNetの実装は、以下のレポジトリを利用しました。
https://github.com/timesler/facenet-pytorch

FaceNetの論文はこちら
https://arxiv.org/pdf/1503.03832.pdf

### ベース画像
以下の2枚の画像と入力画像を比較することで、対象人物かどうかを判別します。
※一枚でもある程度判別できましたが、念のため2枚用意しました

**ベース画像1**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/c72c1a44-59c6-77e2-ba6d-b109278fd628.png" width=400>

**ベース画像2**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/65de571f-6cb9-f48d-37f2-716afbe80107.jpeg" width=400>


## 評価結果
評価は、社内カメラを利用して収集した画像で行いました。

| Accuracy | Precition| Recall | 
| --- | --- | --|
| 0.83  | 0.90 | 0.75 |

見逃しは若干あるものの、Precitionはかなり高いようです！
おそらく、顔が正面から写っていないと正しく検出されずらいのではないかなと思います。

### 正しく予測できているもの (TP)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/4ecf5165-dcac-9d8d-291f-846f5c23ea54.jpeg" width=600>

### 間違って予測したもの (FP)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/bda7f11a-a6da-de55-5200-4d741218a7be.jpeg" width=600>


### 見逃したもの (FN)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/090a6a2e-d10d-7f49-6127-5057003892b3.jpeg" width=600>


## 解析PFへの組み込み
思いのほか簡単に、うまくCTOを予測できる検出器ができたため、今度は解析プラットフォームへサービスとしてデプロイしてみます。解析PFにモデルを組み込むためには、指定のフォーマットでDockerイメージを作成する必要があります。

具体的には、以下のような作業を行いました。
1. 作成したコードを実行できるように、Dockerfileのベースイメージを変えたり、必要なライブラリをインストールする
1. サンプルコード内の画像処理をおこなうメソッドを実装する

また、検出結果に応じてメールやSlack通知を送信したり、任意のWeb Hookを実行させることができます。今回は、Slackに検知結果を通知してみました。

過検出が若干ありましたが、概ねうまく動いていそうです:tada:

**slack通知の様子**
![スクリーンショット 2022-12-19 17.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/1875274b-adb6-16de-9c26-57d3de3d04c6.png)

**検知されたCTOの様子**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324326/9660e7eb-3d90-b61d-d81c-679dadd6bb1e.png" width=600>


## まとめ
今回は社内ハッカソンという形で、社内カメラを使って画像処理のアルゴリズムを作成し、解析プラットフォームへデプロイしてみました。

解析プラットフォームはまだ公開前ですが、現在の段階でも簡単にアルゴリズムをSafieのカメラへ繋げられるので、面白かったです。今後、思いついたアルゴリズムを簡単に試せるようになっていくと、良いアイデアやサービスがたくさん生まれる気がしました。

今回はCTO検出器でしたが、他にも作ってみたいものはたくさんあるので、このような取り組は今後も続けていきたいです。