AWS Rekognitionを触ってみた(Ruby編)


はじめに

こんにちは、@t-osdyと申します。
Livesense Advent Calendar 2016 その3 14日目です。

先日のAWS re:inventで新サービスの発表がありました。
今回は業務とは関係ないですが、同僚の方が私の写真を取りながらデモ画面で遊んでいたのを機に、AWS RekognitionをRuby側からサービスを触ってみたのでやったことをまとめたいと思います。

AWS Rekognitionについて

AWS Recognition – 深層学習による画像検出と認識

詳しいことは色々な方面で説明されていると思うので割愛しますが、まとめてしまうと画像ファイルから人物やその表情の分析や比較、またシーンやどういった物体が含まれているかを検出するサービスです。

今回の内容

AWSドキュメントを参考にRubyで以下のことをやりました。

  • インプット画像のシーンや物体を分析(detect_labels)
  • インプット画像の内の顔の表情検出(detect_face)
  • 2つの画像からの顔を比較する(compare_faces)

やってみた

まずはcredential情報を設定してAWSへのアクセス準備します。Rekognitionはまだ東京リージョンがないので注意してください。(私はus-east-1を設定しました。)

require 'aws-sdk'
require 'dotenv'
Dotenv.load

Aws.config.update({
  region: ENV['AWS_REGION'],
  credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'],ENV['AWS_SECRET_ACCESS_KEY'])
})

rekognition = Aws::Rekognition::Client.new(region: Aws.config[:region], credentials: Aws.config[:credentials])

インプット画像のシーンや物体を分析

デモ画面でも試せるdetect_labelsを実行してみます。

response_detect_labels = rekognition.detect_labels(
  image: { bytes: File.read(ARGV.first) }
)

response_detect_labels.labels.each do |label|
  puts " #{label.name} #{label.confidence.to_i}"
end

サンプル画像

実行結果

 Animal 86
 Cat 86
 Mammal 86
 Manx 86
 Pet 86
 Hardwood 68
 Wood 68
 Chest 67
 Drawer 67
 Furniture 67
 Indoors 50
 Interior Design 50
 Room 50

猫、かわいいですね。猫だけでなくそれ以外の物体も認識してますね。すごい。
余談ですが、クロネコヤマトのダンボールに入った猫は猫を認識してくれませんでした。

インプット画像の内の顔検出(detect_face)

次にdetect_faceを使って画像内の顔を認識して、表情を分析します。

response_detect_faces = rekognition.detect_faces({
  image: { bytes: File.read(ARGV.first) },
  attributes: ['ALL']
})

response_detect_faces.face_details[0].emotions.each do |emotion|
  puts emotion.type + " " + emotion.confidence.to_i.to_s
end

サンプル画像

実行結果

HAPPY 99
CONFUSED 9
SAD 3

何が正しいのかはわからないですが、上の画像からCONFUSEDSADが検出されている辺り精度が高く思えてきます。

2つの画像からの顔を比較する(compare_faces)

最後に2つの画像から顔を比較して類似度を表示します。

response_compare_faces = rekognition.compare_faces({
    source_image:{ bytes: File.read(ARGV[0]) },
    target_image:{ bytes: File.read(ARGV[1]) },
    similarity_threshold: 1.0
})

puts response_compare_faces.face_matches[:similarity]

サンプル画像

sorce target

実行結果

#<struct Aws::Rekognition::Types::CompareFacesMatch 
  similarity=0.0, 
  face=
#<struct Aws::Rekognition::Types::ComparedFace bounding_box=
#<struct Aws::Rekognition::Types::BoundingBox 
  width=0.1088888868689537, 
  height=0.18386492133140564, 
  left=0.596666693687439, 
  top=0.23076923191547394>, 
  confidence=99.9999771118164>>

ありゃ、本当か?まさかの類似度0…同じモデルさんですが帽子、角度等があると精度が落ちまだ難しいのでしょうか?(そもそもサンプルが悪かった気がする…)
※念の為、同一モデルの正面を向いた写真で何枚か試してみたところでは類似度80%くらいでした。)

まとめ

今回は公式ドキュメントをもとにAWS Rekoginitonを触ってみました。
触りながら分析の部分とかはブラックボックスで処理結果も???となった面もありましたが、こういったディープラーニングによる画像認識が手軽に利用できる様になり気持ちが躍ります。

また、AWS RekognitionではCollectionと言われるAWS上のクラスタ(?)に画像ファイルから顔情報を格納(index_faces)して、その情報郡に対して類似画像検索(search_faces_by_image)と言った使い方もできるようでサービスのアイデアが出てきたので別途試してみたいと思います。