DatabricksにおけるAmazon Rekognitionの活用

こちらを試してみました。

https://aws.amazon.com/jp/rekognition/?nc1=h_ls

こちらの記事を参考にさせていただきました。

https://qiita.com/banquet_kuma/items/560787299b83fb924ff7

# 準備

- 判別する画像をアップロードするS3バケットを作成します。判別する画像をアップロードしておきます。
- AWSのサービスにアクセスするのでアクセスキーを取得しておきます。セキュリティ上、IAMロールなどを使う方がいいのですが今回は動作確認なのでAWSアクセスキーを使用します。

# ライブラリのインポート

ライブラリをインポートします。boto3はDatabricksランタイムに同梱されているので`pip install`は不要です。

```py:Python
# AWSを使用するためのライブラリを読み込む
import boto3

# 認識結果を表示するためのライブラリを読み込む
from matplotlib import pyplot as plt
from PIL import Image
import random
import io

# 使用するバケットを指定する
bucket = "<S3バケット名>"
# 使用するリージョンを指定する
region = "ap-northeast-1"
# 認識させるファイルを指定する(あらかじめ上のバケットに配置しておきます)
filename = "target.png"

# アクセスキー
access_key = "<AWSアクセスキー>"
secret_key = "<AWSシークレットキー>"
```

# AWSサービスへの接続

```py:Python
# サービスへの接続情報を取得する
session = boto3.Session(
    aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region
)

# S3サービスに接続する
s3 = session.client("s3")
# Rekognitionサービスに接続する
rekognition = session.client("rekognition")
```

# 判定画像の読み込み

```py:Python
# オブジェクトデータを取得
s3_object = s3.get_object(
  Bucket=bucket, Key=filename)

# バイトデータを読み込み
image_data = io.BytesIO(s3_object['Body'].read())

# 画像に変換
img = Image.open(image_data)

# 画像のサイズを取得する
img_width = img.size[0]
img_height = img.size[1]
```

# Rekognitionによる認識

ちなみに指定している画像はこちらです。自分の写真です。
![IMG_3525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a0e8be6c-c27c-9470-2cb8-65be1dc40fa0.png)

```py:Python
# S3に置いたファイルをRekognitionに認識させる
res = rekognition.detect_labels(
  Image={"S3Object": {"Bucket": bucket, "Name": filename}})

# Rekognitionの認識結果を表示する
print("Detected labels for " + filename)
print()
for label in res["Labels"]:
  print("Label: " + label["Name"])
  print("Confidence: " + str(label["Confidence"]))
  print("Instances:")
  for instance in label["Instances"]:
      print("  Bounding box")
      print("    Top: " + str(instance["BoundingBox"]["Top"]))
      print("    Left: " + str(instance["BoundingBox"]["Left"]))
      print("    Width: " + str(instance["BoundingBox"]["Width"]))
      print("    Height: " + str(instance["BoundingBox"]["Height"]))
      print("  Confidence: " + str(instance["Confidence"]))
      print()

      print("Parents:")
      for parent in label["Parents"]:
          print("   " + parent["Name"])
      print("----------")
      print()
```

認識結果が表示されます。
![Screenshot 2023-02-24 at 20.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/29161b23-df62-ff15-84b4-54830b0b3587.png)

# 認識結果の可視化

これだと判別しにくいので画像に認識結果をオーバーレイさせます。

```py:Python
# 画像と枠を表示させる
colors = {}
for label in res["Labels"]:
  label_name = label["Name"]
  if label_name not in colors:
      colors[label_name] = (random.random(), random.random(), random.random())
      for instance in label["Instances"]:
          bb = instance["BoundingBox"]

          rect = plt.Rectangle(
              (bb["Left"] * img_width, bb["Top"] * img_height),
              bb["Width"] * img_width,
              bb["Height"] * img_height,
              fill=False,
              edgecolor=colors[label_name],
          )
          plt.gca().add_patch(rect)

plt.imshow(img)
plt.show()
````

人間も鳥も認識されていることがわかります。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/40b1d658-75eb-a6df-8631-048d1e55ef23.png)

なお、類似のサービスにLabelboxというものがあります。こちらもDatabricksと連携することが可能です。

https://qiita.com/taka_yayoi/items/1921192a94246810bc11

# PrivateLink環境での利用

追加の設定が必要となります。こちらをご覧ください。

https://qiita.com/taka_yayoi/items/6517e8422f1479ab6a7b

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)