AWS AI Service Seminarに登壇しました!

Ryosuke Sugihara
Eureka Engineering
Published in
8 min readJun 4, 2019

はじめに

エウレカのサーバーサイドエンジニアの Ryosuke Sugihara です。現在はAPI Teamに所属しています。好きな食べ物は🍣と🍜、趣味はTwitterとサバゲーです。

どういうイベント?

AWSさんの事前トレーニング済み AI サービス(Amazon Rekognition、Amazon Polly、Amazon Personalizeなど)を活用している企業の事例紹介を中心としたイベントで、聴講者は110名程度いらっしゃいました。

登壇の様子(力武)
登壇の様子(杉原)

登壇内容

当日私は、弊社のオンラインデーティングサービス「Pairs」にAmazon Rekognitionを導入した話をriki(Rikitake)と共同登壇しました!

「Pairs」では顔認識機能を採用しています。

主に検索結果に反映させたり、似ているユーザーを表示させたりと様々な用途で使用しています。

顔認識機能を実現するには、

  • 自前で実装する
  • Amazon RekognitionのようなSaasサービスを使う

の2つの選択肢がありました。

それぞれ比較検討(SaasサービスはRekognitionの他にも何個か)した結果、Rekognitionにしました(検討事項はスライドで)。

Amazon Rekognitionを導入して特に良かったことは機械学習やデータサイエンスの専門家の依存がほとんどなくアプリケーションエンジニアだけでプロジェクトを完遂できた点だと言えます!

システムアーキテクチャ

下記が「Pairs」の顔認識機能のシステムアーキテクチャ例です(スライドから抜粋)

簡単に説明すると、下記のようなフローで実現しています。

  1. ユーザーが画像をアップロードする
  2. ワーカーが非同期で1の画像をダウンロードする
  3. ダウンロードした画像をRekognitionのDetectFaces APIのリクエストパラメータにつけてAPIを実行する
  4. レスポンスには顔検出後の情報が返るので、必要な情報をPairs側のDBに保存する(例: 画像内の顔の数など)

Rekognitionの顔認識APIについて

Rekognitionでは、顔認識にはDetectFaces APIを使います。

リクエストパラメータには下記2つのどちらかの画像情報が必須です。

  • イメージのバイト配列 (base64 でエンコードされたイメージのバイト)
  • Amazon S3 オブジェクトのPath

レスポンスには、現時点では下記の7つの情報が返却されます。

1. 境界ボックス — 顔を囲む境界ボックスの座標。

2. 信頼度 — 境界ボックス内に顔が含まれている信頼度。

3. 顔のランドマーク — 顔のランドマークの配列。ランドマーク (左目、右目、口など) ごとに X 座標と Y 座標がレスポンスで返されます。

4. 顔の属性 — 性別、顔にひげがあるかどうかなどの顔の属性のセット。レスポンスでは、顔属性ごとに値が返されます。値は、ブール値 (サングラスをしているかどうか) や文字列 (男性か女性か) など、さまざまな型で返される場合があります。また、ほとんどの属性では検出した値の信頼度も返されます。

5. 画質 — 顔の明るさとシャープネスを示します。できるだけ最良の顔検出を実現する方法については、「顔認識用の入力イメージに関する推奨事項」を参照してください。

6. ポーズ — イメージ内の顔のローテーションを示します。

7. 感情 — 感情と分析の信頼度のセット。

実装イメージ

PairsではGoを使っているので、aws-sdk-goを用いた簡単な実装を紹介したいと思います。

import "github.com/aws/aws-sdk-go/service/rekognition"type RekognitionService struct{
client *rekognition.Rekognition
}
func (s *RekognitionService) DetectFacesImage(imageByte []byte) {
// リクエストに画像データを詰める
input := &rekognition.DetectFacesInput{
Image: &rekognition.Image{
Bytes: imageByte,
},
}
resp, err := s.client.DetectFaces(input)

// DBに必要なレスポンス情報を保存する
...
}

基本的には上記で実装したDetectFacesImageメソッドに、認識したい画像のバイト列を渡して呼び出すだけで顔認識が可能です。

あとは、DetectFaces API コールのレスポンスは下記のような情報が返るので、こちらから必要な情報を保存すれば終了です。

{
"FaceDetails": [
{
"AgeRange": {
"High": 40,
"Low": 23
},
"Beard": {
"Confidence": 98.50941802978516,
"Value": true
},
"BoundingBox": {
"Height": 0.6968063116073608,
"Left": 0.26937249302864075,
"Top": 0.11424895375967026,
"Width": 0.42325547337532043
},
"Confidence": 99.99995422363281,
"Emotions": [
{
"Confidence": 0.042965151369571686,
"Type": "DISGUSTED"
},
{
"Confidence": 0.002022328320890665,
"Type": "HAPPY"
},
{
"Confidence": 0.4482877850532532,
"Type": "SURPRISED"
},
{
"Confidence": 0.007082826923578978,
"Type": "ANGRY"
},
{
"Confidence": 0,
"Type": "CONFUSED"
},
{
"Confidence": 99.47616577148438,
"Type": "CALM"
},
{
"Confidence": 0.017732391133904457,
"Type": "SAD"
}
],
"Eyeglasses": {
"Confidence": 99.42405700683594,
"Value": false
},
"EyesOpen": {
"Confidence": 99.99604797363281,
"Value": true
},
"Gender": {
"Confidence": 99.722412109375,
"Value": "Male"
},
"Landmarks": [
{
"Type": "eyeLeft",
"X": 0.38549351692199707,
"Y": 0.3959200084209442
},
// 長いので省略...
}
]
}

公式サイトにDetectFacesAPIについて詳しく書かれていますので、気になる方はご覧ください。

おわりに

今回外部での登壇が初めてで100名以上の前で話すのはとても緊張しましたが良い経験になったと思います。

今回のイベントではAWSさんからAmazon Rekognition、Amazon Polly、Amazon Personalizeのデモを交えた発表がありました。その中でも特にAmazon Personalizeは簡単に商品などのレコメンデーションシステムが構築できるということで活用している企業の紹介事例の中でプレビュー版を試してみたというようなものが複数ありました!今後どのようなアップデートがくるのか非常に楽しみな機能です!

--

--

Ryosuke Sugihara
Eureka Engineering

eureka, Inc API team Pairsのweb版開発を担当しています。 主にバックエンドを担当、フロント少々。 Twitterが好きで学生時代はTwitterアプリの開発ばかりやっていた。