連載
» 2021年10月28日 05時00分 公開

初学者向け「Amazon Rekognition」(AI画像/動画分析サービス)をPythonで利用するにはAWSチートシート

AWS活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、AWSのAI画像/動画分析サービス「Amazon Rekognition」をPythonで利用する方法を紹介する。

[金晟基,東京ITスクール]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、AWSのAI画像/動画分析サービス「Amazon Rekognition」をPythonで利用します。以下、Amazon Rekognitionに用意されているメソッドを概観し、幾つかの使い方を紹介します。

「Amazon Rekognition」とは

 AWSには、事前トレーニング済みのAI(人工知能)を手軽に利用できる「AIサービス」が多数用意されており、その内容はコンピュータビジョンから言語、レコメンデーション、予測と多岐にわたります。

 今回紹介するAmazon Rekognitionは、深層学習を利用して画像と動画(一部ストリーミングを含む)を分析するAIクラウドサービスです。分析のタイプは「ラベル検出」「顔検出」「顔検索」「人物の動線追跡」「個人用防護具検出」「有名人検出」「テキスト検出」「不適切なコンテンツ検出」「カスタムラベル検出」の9つに大別されます。

Amazon Rekognition

 ラベル検出では、物体や人物、テキスト、イベント、シーン、アクティビティーなど(Amazon Rekognitionではこれらを「ラベル」と総称)を、画像と動画から検出できます。

 顔検出では、画像内の顔や目などの位置、感情や年齢などを予測できます。事前に保存しておいた顔の情報に対して、新たな画像や動画から検出された顔と照合できます。

 人物の動線追跡では、保存済み動画内で検出された人物の動線を追跡できます。

 個人用防護具検出では、画像で検出された人物が着用するフェースカバー、ハンドカバー、ヘッドカバーを検出できます。

 有名人検出では、検出した有名人の名前、顔の特徴や表情、動線などを取得できます。

 テキスト検出では、画像内のテキスト(英数字と記号)を検出できます。

 不適切なコンテンツの検出では、アダルトコンテンツや暴力的なコンテンツを検出できます。

 なお、ここまでの分析はAmazon Rekognitionの学習済みモデルを使用しますが、カスタムラベル検出では、ユーザーの画像や動画データを基にモデルを追加でトレーニングすることで、ビジネスニーズに固有の物体やシーンを検出できるようになります。

 Amazon Rekognitionの構成は分析対象とモデルトレーニングの有無によって、画像分析の「Amazon Rekognition Image」、動画分析の「Amazon Rekognition Video」、カスタムラベル検出の「Amazon Rekognition カスタムラベル」に分類されます。本稿では、このうちAmazon Rekognition Imageを紹介します。

AWSの「AIサービス」はコンソール画面から利用できますが、開発を念頭に置かなくても、慣れてくれば今回のようにAPIを利用する方がより便利で効率的に感じてくるでしょう。本稿がそのように利用するきっかけになれば幸いです。


利用料金について

 Amazon Rekognitionは従量課金制で、Amazon Rekognition ImageではAPIを使用して分析した画像の枚数に応じて毎月課金されます。その際の単価は、累積利用枚数に応じて段階的な割引が適用されるスタイルです。東京リージョンでの料金を画像1000枚当たりで見ると、最初の100万枚は1.30ドル、続く900万枚は1.00ドル、続く9000万枚は0.80ドル、1億枚以降は0.50ドルとなっています。顔メタデータのストレージは、1データ1カ月当たり0.00001ドルで、利用が1カ月未満の場合は日割りで料金が計算されます。

 なお、Amazon Rekognition Imageは無料利用枠の対象になっており、最初のリクエストから12カ月間は1カ月当たり5000枚の画像分析と1000個の顔メタデータの保存を、無料で利用できます(ただし、無料利用枠を超えた場合には従量課金が適用されます)。

本稿では割愛するAmazon Rekognition VideoとAmazon Rekognition カスタムラベルも従量課金制で、無料利用枠も設定されています。詳しくは公式サイトでご確認ください。


必要条件

 本稿では、読者の環境で下記要件が満たされていることを仮定しています。

  • AWSアカウントを有しており、「AWS Identity and Access Management」(IAM)ユーザーに必要な権限(今回ならAmazon Rekognitionに関するもの)が付与されていること。ホームディレクトリにAPIを利用するための認証情報が保存されていること
  • AWSが提供するPython用のSDK「Boto3」がインストールされていること

 なおこれは必須ではありませんが、以下のサンプルコードは「Jupyter Notebook」での実行を想定しています。

メソッド一覧

 Amazon Rekognition Imageには下記メソッドが用意されています。

メソッド名 機能 引数 戻り値
detect_labels 画像から物体やイベント、テーマなどのラベルを検出する 画像データ、レスポンスに含めるラベル数の最大値、信頼度の下限 辞書
detect_faces 画像から顔を検出する 画像データ、顔属性要件 辞書
compare_faces ソース画像内の最も大きい顔とターゲット画像内の顔を比較する ソース画像データ、ターゲット画像データ、類似度しきい値、品質フィルター値 辞書
detect_protective_equipment 画像から検出された人が着用している個人用防護具(PPE)を検出する 画像データ、概要属性要件 辞書
recognize_celebrities 画像から有名人を検出する 画像データ 辞書
get_celebrity_info 有名人情報を取得する 有名人ID 辞書
detect_moderation_labels 画像から不適切なコンテンツを検出する 画像データ、信頼度の下限、HumanLoop構成 辞書
detect_text 画像から文字を検出する 画像データ、フィルター要件 辞書
create_collection 特定のリージョンにコレクションを作成する コレクションに付けるIDとタグ 辞書
list_collections アカウント内のコレクションID情報を返す NextToken、レスポンスの最大値 辞書
describe_collection 特定のコレクションの情報を返す コレクションID 辞書
index_faces 画像から顔を検出して特定のコレクションに追加する コレクションID、画像データ、外部画像ID、検出属性要件、最大検出数、品質フィルター値 辞書
list_faces 特定のコレクションにある顔のメタデータを返す コレクションID、NextToken、レスポンスの最大値 辞書
search_faces_by_image 入力画像内の最も大きい顔と類似する顔をコレクションから検索する コレクションID、画像データ、検索する顔の数の最大値、信頼度のしきい値、品質フィルター値 辞書
search_faces 指定した顔IDと類似する顔をコレクションから検索する コレクションID、顔ID、検索する顔の数の最大値、信頼度のしきい値 辞書
delete_faces 特定のコレクションから顔情報を削除する コレクションID、フェースID 辞書
delete_collection 特定のコレクションを削除する コレクションID 辞書
tag_resource 特定のリソースにタグを追加する リソースARN、タグ 辞書
list_tags_for_resource コレクションとカスタムモデルラベル内のタグリストを返す リソースARN 辞書
untag_resource 特定のリソースからタグを削除する リソースARN、タグのキー 辞書
can_paginate 各メソッドのページネーション有無を調べる メソッド名 真偽値
get_paginator メソッドに関するページネータを生成する メソッド名 ページネータオブジェクト
generate_presigned_url 署名済みURLを返す メソッドとその引数 署名済みURL

 幾つか解説します。

 Amazon Rekognition Imageにおける入力画像のファイル形式としては、JPEGとPNGがサポートされています。API実行時の画像データの渡し方には、バイトデータを直接渡す方法(最大5MB)と、「Amazon S3」バケットに保存されているオブジェクトを指定する方法(最大15MB)があります。本稿では全て前者で実行することにします。

 Amazon Rekognition ImageのAPIには、入力イメージから検出された情報を保持しない非ストレージ型APIと、特定の顔情報を保持するストレージ型APIの2種類があります。アプリケーションの設計、インデックス構築などの際には、これらの違いを考慮する必要があります。

 検出系のメソッドの戻り値には、物体や顔の境界を表すバウンディングボックスの情報が含まれるものがあり、これを基にアイテムの周囲に境界を表示できます。なおこの情報は、ボックスの高さと幅(HightとWidth)に関する数値と、画像内におけるボックス左上かどの位置(LeftとTop)の数値で構成されています。また、これらの数値は元画像のサイズを縦横とも「1」にスケールした尺度で与えられています(下図参照)。

 そこで、バウンディングボックスを画像に重ねる際には、ボックスの値に画像のピクセル値をかけてリサイズしています。

# 画像にバウンディングボックスとキャプションを重ねる際に使用する関数
def draw_bbox(imgWidth, imgHeight, draw, bbox, caption, color):
 
    # バウンディングボックスの値を重ねる画像の大きさにスケーリング
    left = imgWidth * bbox['Left']
    top = imgHeight * bbox['Top']
    width = imgWidth * bbox['Width']
    height = imgHeight * bbox['Height']
    
    # 頂点の設定
    points = (
        (left, top),
        (left + width, top),
        (left + width, top + height),
        (left, top + height),
        (left, top)
    )
 
    # バウンディングボックスの描画
    draw.line(points, fill=color, width=3)
    
    # キャプションのサイズを取得
    text_w, text_h = draw.textsize(caption)
    # キャプション領域を描画
    draw.rectangle((left, top-text_h, left+text_w, top), fill=color)
    # キャプションの印字
    draw.text((left, top-text_h), caption, fill='black')

 ここからは、Amazon Rekognitionのメソッドの使い方を幾つか紹介します。

detect_labelsメソッド

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。