こちらを試してみました。
こちらの記事を参考にさせていただきました。
準備
- 判別する画像をアップロードするS3バケットを作成します。判別する画像をアップロードしておきます。
- AWSのサービスにアクセスするのでアクセスキーを取得しておきます。セキュリティ上、IAMロールなどを使う方がいいのですが今回は動作確認なのでAWSアクセスキーを使用します。
ライブラリのインポート
ライブラリをインポートします。boto3はDatabricksランタイムに同梱されているのでpip install
は不要です。
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サービスへの接続
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")
判定画像の読み込み
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による認識
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()
認識結果の可視化
これだと判別しにくいので画像に認識結果をオーバーレイさせます。
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()
人間も鳥も認識されていることがわかります。
なお、類似のサービスにLabelboxというものがあります。こちらもDatabricksと連携することが可能です。
PrivateLink環境での利用
追加の設定が必要となります。こちらをご覧ください。