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

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


##検出した顔の位置を画像で示してみよう
今回フリー素材で頂いたモデルさんの写真を使います。
![4937866_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658175/c7302fae-90bb-c285-9fbd-29e80150ab61.jpeg)

検出ファイルは以下の手順で動作
①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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658175/e5d729c6-6d05-c786-db07-de2cd2bc5815.jpeg)


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

比較ファイルの動作
①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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658175/d17e2285-7f90-0efc-8e60-58bd0af594d0.jpeg)


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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658175/d13fb21c-112c-f432-6d95-6ce6c49c800a.jpeg)

##別の人物の画像と比べたらどうなるか
今度は同じface_compare.pyを用いて、異なる人物のターゲット画像を選択し実行します。

ターゲット画像はこちらです。
別のモデルさんですね。
![2236213_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658175/c88a4dd7-9627-672e-acbc-c598274a8900.jpeg)


ターゲット画像を変更し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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658175/8658e0fc-70b6-3863-6534-673f8071427f.jpeg)


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

##引用 参考文献

この記事は以下の情報を参考にして執筆しました
[photo-ac](https://www.photo-ac.com/)
[AWSでつくるAIプログラミング入門](https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-AI%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4798059056)