search
LoginSignup
4

More than 1 year has passed since last update.

posted at

updated at

AWSでAIサービスを使ってみる〜第5回Rekognition編〜

Amazon Rekognitionとは

画像から人物の顔を検出したり、顔を探したりする機能があるサービスです。

検出した顔の位置を画像で示してみよう

今回フリー素材で頂いたモデルさんの写真を使います。
4937866_s.jpg

検出ファイルは以下の手順で動作
①boto3,json,sysのインポート
②rekognition作成、画像ファイルから顔の検出、jsonファイルへ出力
③画像ファイルの読み込みと出力画像の作成
④顔の処理を行い、出力画像へ

face_detect.py
import boto3
import json
import sys
from PIL import Image

rekognition = boto3.client('rekognition')
with open(sys.argv[1],  'rb') as file:
  #画像ファイルから顔の検出
  result = rekognition.detect_faces(
    Image={'Bytes': file.read()})
  #Jsonファイルに出力
  print(json.dumps(result, indent=4))

#画像ファイルの読み込み
image_in = Image.open(sys.argv[1])
#画像サイズの取得
w, h = image_in.size
#出力画像を作成
image_out = Image.new('RGB', (w, h), (200, 200, 200))

#検出された顔を順番に処理
for face in result['FaceDetails']:
  box = face['BoundingBox']
  left = int(box['Left']*w)
  top = int(box['Top']*h)
  right = left+int(box['Width']*w)
  bottom = top+int(box['Height']*h)

  #入力画像から出力画像に顔の部分を貼り付け
  image_out.paste(
    image_in.crop((left, top, right, bottom)),
    (left, top))
image_out.save('show_'+ sys.argv[1])
image_out.show()

face_detect.pyの実行

python face_detect.py 画像ファイル.jpg

実行結果

モデルさんの顔のみが検出されました。
show_model.jpg

指定した顔のみ探す

次に指定した画像の顔を別の画像から探す機能を紹介します。

比較ファイルの動作
①boto3,json,sysのインポート
②rekognition作成、ソース画像、ターゲット画像を開く、ソース画像をターゲットから探す
③画像ファイルの読み込みと出力画像の作成
④顔の処理を行い、出力画像へ

face_compare.py
import boto3
import json
import sys
from PIL import Image

rekognition = boto3.client('rekognition')
#ソース画像を開く
with open(sys.argv[1], 'rb') as source:
 #ターゲット画像を開く
  with open(sys.argv[2], 'rb') as target:
  #ソース画像の顔をターゲット画像から探す
    result = rekognition.compare_faces(
      SourceImage = {'Bytes': source.read()},
      TargetImage = {'Bytes': target.read()})
    print(json.dumps(result, indent=4))

image_in = Image.open(sys.argv[2])
w, h = image_in.size
image_out = Image.new('RGB', (w, h), (200, 200, 200))
for face in result['FaceMatches']:
  box = face['Face']['BoundingBox']
  left = int(box['Left']*w)
  top = int(box['Top']*h)
  right = left+int(box['Width']*w)
  bottom = top+int(box['Height']*h)
  image_out.paste(
    image_in.crop((left, top, right, bottom)),
    (left, top))

image_out.save('compare_'+sys.argv[2])
image_out.show()

比較するためのファイルが準備できたら、ターゲット画像を選択し実行していきます。

ターゲットを同一のモデルさんの画像と比較して精度を見てみましょう。
model2.jpg

face_compare.pyの実行

python face_compare.py ソース画像ファイル.jpg ターゲット画像ファイル.jpg

実行結果

類似性が非常に高くAIも同一人物だと判断しています。

"SourceImageFace": {
        "BoundingBox": {
            "Width": 0.11432299762964249,
            "Height": 0.23545916378498077,
            "Left": 0.4095838665962219,
            "Top": 0.25787225365638733
        },
        "Confidence(信用度)": 99.99809265136719
    },
    "FaceMatches": [
        {
            "Similarity(類似性)": 99.99671936035156,
            以下省略

出力画像
顔のみが検出されている
compare_model2.jpg

別の人物の画像と比べたらどうなるか

今度は同じface_compare.pyを用いて、異なる人物のターゲット画像を選択し実行します。

ターゲット画像はこちらです。
別のモデルさんですね。
2236213_s.jpg

ターゲット画像を変更しface_compare.pyの実行

python face_compare.py ソース画像ファイル.jpg 別ターゲット画像ファイル.jpg

実行結果

FaceMatchesの後にUnmatchedFacesとなっているため、AIも同一人物と判断しなかった。

"FaceMatches": [],
    "UnmatchedFaces": [
        {
            "BoundingBox": {
                "Width": 0.1854589879512787,
                "Height": 0.32693713903427124,
                "Left": 0.3605557084083557,
                "Top": 0.1766277402639389
            },
            "Confidence": 99.99568176269531,
       以下省略

出力画像
一致していないため何も検出されていない
compare_model3.jpg

まとめ

今回はrekognitionを用いた画像認識について紹介しました。次回を引き続きAWSの画像認識を紹介していきます。

引用 参考文献

この記事は以下の情報を参考にして執筆しました
photo-ac
AWSでつくるAIプログラミング入門

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4