#Rekognitionはどのような顔を認識できるのかが気になったので実行
AWSを使って色々やってみる。
無料使用枠を超えると料金発生するが、色々できそう。
##目次
①目的
②ポイント
③コード
④所感
###①目的
スマホゲームの人型キャラクターの顔を識別できるのかが気になった。
識別できるならその顔画像をトリミングしてみようと思った
画像はスマホゲームの画像をスクリーンショットで取得。
コードは以前のコードを参照し、少し修正。
###②ポイント
顔認識された画像は下記ドキュメントに記載されているようにレスポンスが返ってくる。
下画像の「BoundingBox」のレスポンスを使って、顔認識した範囲を取得する。
顔認識された範囲は四角形で囲われる。
それぞれ四角形の左上と右下を下記レスポンス値で表示される。
・”Left”:四角形の左上のx座標
・”Top”:四角形の左上のy座標
・”Height”:四角形の右下のx座標がLeftから離れている距離
・”Width”:四角形の右下のy座標がTopから離れている距離
※画像の横・縦サイズを1.0として、その割合の値となっている。
例えば、Leftが0.5なら画像のx座標の0.5(半分)の位置に四角形の一番左がある
AWSドキュメントのリンク
https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/faces-detect-images.html
顔認識された範囲は四角形の例
https://docs.aws.amazon.com/rekognition/latest/dg/faces.html?pg=ln&sec=ft
###③コード
import boto3
import configparser
from PIL import Image
import json
import glob
#操作画像一覧の取得----------------------------------------------
#自分は「input_folder」というフォルダに画像を保存していました。
#folderに画像パス一覧を収納
folder = glob.glob("input_folder/*.png")
#AWS接続-------------------------------------------------------
#以前のコード参照(①のリンク)
ini = configparser.ConfigParser()
ini.read("config.ini","utf-8")
bucket = "AWS S3のバケット名"
region = "AWS のリージョン名"
access_key = ini["AWS_KEY"]["aws_access_key_id"]
secret_key = ini["AWS_KEY"]["aws_secret_key"]
session = boto3.Session(aws_access_key_id=access_key,aws_secret_access_key=secret_key,region_name=region)
s3 = session.client("s3")
rekognition = session.client("rekognition")
cnt = 1
#-------------------------------------------------------------
#顔認識したい画像を順次投入
for Pic in fold:
filename = Pic
img = Image.open(filename)
img_width = img.size[0]
img_height = img.size[1]
with open(filename, "rb") as f:
# 読み込んだファイルをS3サービスにアップロード
s3.put_object(Bucket=bucket, Key=filename, Body=f)
response = rekognition.detect_faces(Image={"S3Object":{"Bucket":bucket,"Name":filename}},Attributes=["ALL"])
#どのような画像が検出できなかった確認するためデータ名を出力
if response['FaceDetails'] == []:
print(filename)
for faceDetail in response['FaceDetails']:
#顔を囲う四角形の左上(x1,y1)と右下(x2,y2)の座標の取得
x1 = int((faceDetail["BoundingBox"]["Left"]) * img_width)
y1 = int((faceDetail["BoundingBox"]["Top"]) * img_height)
x2 = x1 + int((faceDetail["BoundingBox"]["Width"]) * img_width)
y2 = y1 + int((faceDetail["BoundingBox"]["Height"]) * img_height)
crop = img.crop((x1,y1,x2,y2))
crop.save(f"output_folder/face_rect{cnt}.png")
cnt += 1
###④所感
・ちゃんと顔認識していた。
・ただ、下記画像が認識されにくかった(流石にキャラクターデザインは色々あるからなぁ)
→横顔もしっかり認識していたが、片目が隠れているデザインのキャラクターは認識されにくかった。
→目が線、曲線になっている画像(糸目)は高い確率で認識されない。
・けど、ちゃんと使えるから世の中の技術は凄いなぁとしみじみ実感。
・このようなオープンな技術はたくさんあるので、如何に使いこなす・知っておくことが大事なのではとも思った。
以上。