ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

顔認識システムの紹介

こんにちは、データエンジニアリングチームの宮崎です。

先日、ルクミーフォトの顔認識システムのリプレースを行いました。 これまで顔認識システムにはサードパーティ製のものを使用してきたのですが、今回ユニファ独自で開発したものをリリースしました。

unifa-e.com

データエンジニアリングチームがこの顔認識システムの開発を担当したため、概要を紹介したいと思います。

ルクミーフォトにおける顔認識システム

ルクミーフォトでは保育園・幼稚園などで撮影された写真について保護者向けの販売を代行しています。保護者は時には千枚ほどもある写真の中から我が子の写真を見つけ出さなければなりません。そこで、顔認識システムは予め登録された写真と近しい子供の写真をピックアップし、保護者の写真選びをサポートします。

lookmee.jp

この顔認識システムにおいて、認識精度の向上や、日々増加する写真に対応してスケール可能にすべく新たにシステム開発を行いました。

顔認識の仕組み

顔認識システムがどのような処理を行って顔を認識するか紹介します。主に以下の4ステップで行なっています。

  • (1) 入力された画像から顔を検出
  • (2) 検出された顔領域を切り抜き
  • (3) 顔画像から特徴ベクトルを取得
  • (4) あらかじめDBに保存された各人物の特徴ベクトルとの類似度を計算

f:id:unifa_tech:20220214105327j:plain
顔認識の仕組み

(4)で計算された類似度が最も高い人物を、対象の顔領域の人物だと推定します。この画像の例ではAちゃんの類似度が0.98と最も高いため、写真の女の子はAちゃんだと推定されます。 また、(1)顔検出と(3)特徴ベクトル化ではそれぞれDeep Learningのモデルを使用して処理しています。

システム構成

顔認識を実際にサービスで使用するためには、モデルを開発するだけでなくシステムとして実装する必要があります。 ユニファでは主にAWSを使用しているため、今回顔認識システムもAWS上に実装しました。

処理の流れとしては、以下のようになっております。

  1. ルクミーフォトからAPI Gatewayを介して顔認識のリクエストを受信し、内部のSQSにリクエストを積んでいきます。
  2. 顔認識のメイン処理を担うLambdaは順次SQSから起動され、先述の顔認識の仕組みで紹介した処理を行なっていきます。
  3. 顔認識の処理が完了したら、推定された結果を出力用のSQSに積んでいきます。
  4. ルクミーフォトから結果取得のAPIを叩かれたら、SQSから刈り取って顔認識の結果を返却します。

f:id:unifa_tech:20220214153321j:plain
顔認識システムの構成

先述した顔認識の仕組みの (1)顔検出や(3)特徴ベクトルの計算はSageMaker上にDeep Learningのモデルをデプロイして動かしています。また、特徴ベクトルを保存するDBとしてはDynamoDBを採用しました。

今回システムを設計する上では以下の点に留意しつつ行いました。

  • API Gatewayを介してルクミーフォトと通信することで、疎結合にする
  • LambdaやDynamoDBなど自動でスケールするサーバレスの仕組みを利用することで運用の手間を減らす
  • SQSで非同期にすることで、ルクミーフォトからの急な負荷増加にも対応

これにより、Deep Learningを用いて高精度で、負荷増加に応じてスケール可能な顔認識システムを構築することができました。

おわりに

実はユニファでは2018年頃から顔認識システムの検討を行なっていて、ようやくリリースにこぎつけることができました。 機械学習システムは一般的にサービスリリースするためのハードルが高く、死の谷なんて呼ばれたりしますが、無事に乗り越えることができ、喜びもひとしおです。

これからも引き続きAIでルクミーのサービスが便利になるよう取り組んでいきたいと思います。


ユニファで一緒に働く仲間を募集しています!

unifa-e.com