すでに前から公開されているAWSのサービスですが、弊社のディープラーニング強化の流れにのって、AWSのRekognition APIを試してみました。

 

AWS Rekognition とは?
こちらでも説明がされていますが、画像の解析(物体の検出、顔検出、有名人の認識、不適切コンテンツの識別)を行なうサービスになります。その発展系として、顔の検索や比較も可能です。
これらのサービスのためのAPIがあり、iOS/Androidからも、そのAPIを呼び出すことで、簡単にアプリに画像解析の機能を組み込むことができます。
なお、もちろん完全無料ということはなく、画像処理数によって課金されるシステムとなっております。詳細についてはこちらを参照してください。

※無料枠で最初の 12 か月間は、1 か月あたり 5,000 枚の画像分析が無料でもあるので、ぜひ使ってみてください。

 

Rekognition API(iOS)を早速使ってみた

アプリ側でRekognition APIを使うには、こちらからSDKのダウンロードし、以下のようにAWSRekogtnionのライブラリをインポートするだけです。

import AWSRekognition

では、次にRekognition APIを使用して、2つの画像を比較して、片方の画像の顔がもう一方の画像(例えば集合写真など)に類似の顔があるかを検出する処理を呼び出してみます。

処理は非常に簡単で、AWSRekognitionオブジェクトの初期化、画像のセット、AWSへリクエストの実行となります。

// 初期化
let rekognitionClient:AWSRekognition = AWSRekognition.default()
let comRequest: AWSRekognitionCompareFacesRequest = AWSRekognitionCompareFacesRequest()

// 比較する2つの画像をセット
let sourceImage1 = AWSRekognitionImage()
sourceImage1!.bytes = UIImageJPEGRepresentation(pic1Image.image!,0.5)
let sourceImage2 = AWSRekognitionImage()
sourceImage2!.bytes = UIImageJPEGRepresentation(pic2Image.image!,0.5)
comRequest.sourceImage = sourceImage1
comRequest.targetImage = sourceImage2

// AWSへリクエストを実行
rekognitionClient.compareFaces(comRequest){ (response:AWSRekognitionCompareFacesResponse?, error:Error?) in
   if error == nil {
      //結果処理
      self.sourceImageFace = response?.sourceImageFace //検索したい顔の検出結果
      self.resultFacesMatch = response?.faceMatches  //検出対象画像に対する結果の取得(AWSRekognitionCompareFacesMatch)
   }
   else{
      //エラー処理
   }
}

結果を取得したら、faceMatchesには、顔検出の結果(複数にいれば複数にの顔の位置データと、比較元の画像との類似性)が取得できますので、類似性の値を調整し、同じ顔があったかを判断することが可能になります。

//検出対象元の顔画像の場所を取得しTrim
sourceFaceImage.image = trimImage(origImage: pickedImage1,
      x: sourceImageFace.boundingBox!.left as! CGFloat,
      y: sourceImageFace.boundingBox!.top as! CGFloat,
      width: sourceImageFace.boundingBox!.width as! CGFloat,
      height: sourceImageFace.boundingBox?.height as! CGFloat);
//検出対象先の画像における、顔の場所の取得と類似性の確認
for result in resultFacesMatch {
   let trimedImage = trimImage(origImage: pickedImage2,
      x: result.face?.boundingBox!.left as! CGFloat,
      y: result.face?.boundingBox!.top as! CGFloat,
      width: result.face?.boundingBox!.width as! CGFloat,
      height: result.face?.boundingBox?.height as! CGFloat);
   //類似性の確認(以下の例では80%以上の類似性なら、顔検出と判断)
   var matchResult = result.similarity as! Int > 80 ? "Found the face!" : "Not Match..."
}

そうすると、以下のように集合写真から、探したい人がいるかどうかを確認することができます。