こんにちは、AWS SSOを使って個人的に利用しているアカウントサービスを極力シングルサインオンにしたいと企んでいるディーネットの山田です。
さて、先日より社内でAWSハンズオンが実施されており、AWSマネジメントコンソールからAmazon Rekognitionを使って画像認識させてみようという課題がありました。
AWSマネジメントコンソールから簡単にAmazon Rekognitionを利用できますが、そのままハンズオンを淡々とこなすだけでは面白くないと思いPythonでスクリプトを書いてみました。
そのときのスクリプトをせっかくなので、技術ブログで紹介したいと思います。
Amazon Rekognitionについては、以前ブログで私がどこに居るのか探してみたという記事がありますので、こちらも併せて確認してみてください。
目次
Amazon Rekognitionの使い方
- Pythonを動かすEC2には、"AmazonRekognitionFullAccess"のIAMポリシーを設定したIAMロールを割り当てています。
- PythonでAmazon RekognitionのAPIを使うために、AWS SDK for Pythonであるboto3をインストールしています。
- サイズが5MBまでであれば、APIで直接投げ込めるので、直接投げ込んでいます。
検証内容
- 弊社技術ブログにある、エンジニア採用のバナー画像を対象にします。
- 笑顔が素敵な人を見つけ出して、対象者を示した画像を出力します。
事前準備
必要なライブラリをインストール
- 前回のブログの際には記載を忘れていましたが、boto3と画像編集のためのmatplotlibをpipコマンドでインストールしてください。
pip install --upgrade boto3
pip install --upgrade matplotlib
検証対象の画像を保存したフォルダを作成
- プログラムを修正できる方であればソースを修正いただいても構いません。
mkdir PICTURE/
用意したコード
- 今回作成したコードは以下の通りです。
import boto3
from matplotlib import pyplot as plt
from PIL import Image
# 画像ファイルを定義する
Source = './PICTURE/banner_recruit_900-900.png' # 笑顔のステキな人を探す画像を定義
Result = './PICTURE/a_nice_smile.png' # 笑顔のステキな人が見つかればどこで見つかったかを表示する
# boto3でrekognitionを定義する
rekognition = boto3.client('rekognition', region_name='ap-northeast-1')
# 画像ファイルを読み込む(5MBまでであれば、S3を使わずに利用可能)
imageSource = open(Source,'rb')
# rekognitionで顔分析を行う
response = rekognition.detect_faces(Image={'Bytes': imageSource.read()},Attributes=['ALL'])
# 読み込んだ画像は不要なのでクローズ
imageSource.close()
# スコア配列の初期化
scores = []
# rekognitionの結果から笑顔がステキな方の座標とスコアを配列に格納
for faceDetail in response['FaceDetails']:
if faceDetail['Smile']['Value'] == True:
score = faceDetail['Smile']
score.update(faceDetail['BoundingBox'])
scores.append(score)
if len(scores) >= 1:
print("笑顔のステキな方が見つかりました")
print("詳しくは、出力結果の画像を確認してください")
print("保存先:{0}".format(Result))
# スコア値が高い人順に並び変える
scores_sorted = sorted(scores, key=lambda x: x['Confidence'], reverse=True)
# スコア値が一番高い人の情報を取得する
max_score = scores_sorted[0]
# 笑顔のステキな人を探す画像を編集のためにオープン
img = Image.open(Source)
img_width = img.size[0]
img_height = img.size[1]
# 笑顔のステキな人が見つかった位置を扱いやすいように変数に定義する
size_width = max_score['Width']
size_height = max_score['Height']
size_left = max_score['Left']
size_top = max_score['Top']
# 笑顔のステキな人がどの部分に見つかったか画像を修正
rect = plt.Rectangle(
(size_left * img_width, size_top * img_height),
size_width * img_width, size_height * img_height,
fill=False,
edgecolor='red')
plt.gca().add_patch(rect)
plt.imshow(img)
# 検索対象が見つかった画像をファイルに出力する
plt.savefig(Result, dpi=600)
else:
print("笑顔のステキな方は見つかりませんでした")
検証画像の設置
- 先ほど作成した"PICTURE/"配下に、以下の画像を"banner_recruit_900-900.png"という名前で設置します。
プログラムを実行
- プログラムを実行します。
笑顔のステキな方が見つかりました
詳しくは、出力結果の画像を確認してください。
保存先:./PICTURE/a_nice_smile.png
- 先ほど作成した"PICTURE/"配下に、"a_nice_smile.png"というファイル名で笑顔がステキな方にマーキングされて出力されます。
余談
- 今回は笑顔がステキな方を抽出してみましたが、他にもいろいろな属性が返却されますので、機会があれば他の機能も紹介したいと思います。
- "画像からテキストの検出"もできるようですが、ロボット対策のCaptcha認証とどこまで対抗できるかやってみたいと思っています。
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ
どうも、笑顔が素敵な人です。
リコちゃんありがとう!!