Amazon Rekognition による「画像からの物体検出、テキスト検出」をブラウザから試す

## はじめに

AWS は様々な AI サービスを提供しています

そして、それらのサービスはブラウザから簡単に試せるようになっています

https://aws.amazon.com/jp/free/machine-learning/

| サービス    | 機能                     | お試し記事     | Elixir 実装例 |
|:------------|:-------------------------|:----------------| :-----|
| Transcribe  |音声の文字起こし（音声認識）| [参照](https://qiita.com/RyoWakabayashi/private/396e2047d377e258950f)  | [参照](https://qiita.com/RyoWakabayashi/items/1fc64587c9fa352935c6) |
| Polly       |文書の読み上げ（音声合成）  | [参照](https://qiita.com/RyoWakabayashi/private/2aad1952f63b4e76b652) | [参照](https://qiita.com/RyoWakabayashi/items/93adae047ccb4fee8d78) |
| Lex         |チャットボット             | [参照](https://qiita.com/RyoWakabayashi/private/6c7e7a248e192f3a8afc) | Coming Soon... |
| Translate   |翻訳                      | [参照](https://qiita.com/RyoWakabayashi/private/688418e52cde44871c1e) | [参照](https://qiita.com/RyoWakabayashi/items/5f262ba0d1e11219edec) |
| Rekognition |画像認識<br/>顔認識        | [参照](https://qiita.com/RyoWakabayashi/private/d8c7f57a71e83d9140d5)<br/>[参照](https://qiita.com/RyoWakabayashi/private/10f93c3417041b005c31)  | [参照](https://qiita.com/RyoWakabayashi/items/2219e84642ff2d05481c) |
| Textract    |画像からの表データ読込     | [参照](https://qiita.com/RyoWakabayashi/private/b7bd7079d20326d9e4be) | [参照](https://qiita.com/RyoWakabayashi/items/7c26d0dda7d566adc694) |
| Bedrock     |生成AIによるチャット、画像生成| [参照](https://qiita.com/RyoWakabayashi/private/5680a4bac246a1a0c532) | [参照](https://qiita.com/RyoWakabayashi/private/bb85dd2286420205e2da) |

本記事では AWS の AI 画像処理サービス Amazon Rekognition の物体検出、テキスト検出をブラウザから試してみます

なお、顔検出、顔識別機能については以下の記事にまとめています

https://qiita.com/RyoWakabayashi/private/10f93c3417041b005c31

## Amazon Rekognition とは

Amazon Rekognition　は AI モデルによって画像から物体や人物の顔を検出し、それが何であるか識別するサービスです

https://aws.amazon.com/jp/rekognition/

### Amazon Rekognition の使い途（ユースケース）

Amazon Rekognition は画像に何が写っているかだけでなく、それがどこにあるのかを返してくれます

Amazon Rekognition は以下のような用途に使用可能です

- 監視カメラ映像からの不審人物検出
- ドライブレコーダー映像からの車両検出
- 写真からのテキスト抽出
- 動画から特定人物が写った箇所だけを抽出

### Amazon Rekognition の料金

https://aws.amazon.com/jp/rekognition/pricing/

AWS の料金は基本的に従量課金制です

また、リージョン（サービス提供するサーバーが存在する地域）によって料金が異なります

Amazon Rekognition を東京リージョンで使う場合、静止画からの物体検出なら `$0.0013 / 枚`　の料金になります

`150 ¥/$` の場合、 `¥0.195 / 枚` = `¥１９５ / 千枚` となります

例えば 1 万枚の写真からの物体検出を実行した場合、 ¥1,950 請求されます

ただし、 AWS のサービスの多くには無料利用枠が存在します

> 無料利用枠
> AWS の無料利用枠の一環として、Amazon Rekognition Image を無料で開始していただけます。無料利用枠は 12 か月ご利用になれます。
> 画像分析: 無料利用枠期間中は、グループ 1 およびグループ 2 の API で、それぞれ 1 か月に 5,000 枚の画像を無料で分析することができます。 Image Properties は無料利用枠ではありません。

グループ 1 は顔識別等に使う API で、グループ 2 がそれ以外です

無料利用期間中の場合、物体検出なら 5,000 枚まで無料利用可能なため、本記事で実行する程度の処理であれば無料範囲内に収まります

## アカウント作成

Amazon Rekognition を使うためには、 AWS のアカウント作成が必要です

以下の公式手順に従って、アカウントを作成してください

:::note warn
クレジットカードと電話番号が必要になります

予めご用意ください
:::

https://aws.amazon.com/jp/register-flow/

## ブラウザからの物体検出実行

### Amazon Rekognition への移動

AWS のマネジメントコンソールにログインすると、以下のような画面が表示されます

https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#

![スクリーンショット 2023-11-26 9.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ccb18a17-4e2e-e5e6-098f-e779c8f69eef.png)

この画面から最近使ったサービスなどにアクセスできるようになっています

上メニューにある検索ボックスに `rek` と入力してみましょう

![スクリーンショット 2023-11-26 20.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a49b7f51-870f-ae15-5e81-4bdff9311dd9.png)

サービスの候補として Amazon Rekognition が表示されます

Amazon Rekognition をクリックして、サービスページに移動しましょう

以下のような画面が表示されます

https://ap-northeast-1.console.aws.amazon.com/rekognition/home?region=ap-northeast-1#/

![スクリーンショット 2023-11-26 20.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/5fb6f2c7-aa16-f9fb-9c3a-ad014233eff6.png)

### ラベル検出の実行

ブラウザから物体検出（ラベル検出 = 何が写っているか）を実行してみましょう

左メニューから「デモ」の「ラベル検出」をクリックします

![スクリーンショット 2023-11-26 20.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7fc9c8da-50f5-141f-f954-8212f0ca7f06.png)

ラベル検出のデモ画面が表示され、サンプル画像での実行結果が表示されます

左側の画像に対して、右側に検出された物体の名前が列挙されています

- Neighborhood（近所） 99.9 %
- City（街） 99.9 %
- Road（道路） 99.9 %
- Street（通り） 99.9 %
- Urban（都会） 99.9 %
- Person（人） 98.7 %

数値は確信度で、 AI がどれだけ自信を持って答えているか、という意味です
99.9 % なら「ほぼ間違いない」回答として AI は答えていますが、 30 % 程度なら「もしかしたら」程度の回答です
多くの場合、確信度が一定の値（閾値）以上の場合のみ画面に表示する、というような制御を行います

また、画像内の四角形の内側にカーソルを合わせると、その中に写っているものの名前が表示されます

![スクリーンショット 2023-11-26 20.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/38dcbfe2-0848-a61c-dbea-074ae8f02be7.png)

この四角形が AI によって検出した物体の位置を示しています

また、右側の「レスポンス」をクリックすると、以下のようなテキストが表示されます

```json
{
    "Labels": [
        {
            "Name": "Neighborhood",
            "Confidence": 99.99998474121094,
            "Instances": [],
            "Parents": [],
            "Aliases": [],
            "Categories": [
                {
                    "Name": "Buildings and Architecture"
                }
            ]
        },
        {
            "Name": "City",
            "Confidence": 99.98468017578125,
            "Instances": [],
            "Parents": [],
            "Aliases": [
                {
                    "Name": "Town"
                }
            ],
            "Categories": [
                {
                    "Name": "Buildings and Architecture"
                }
            ]
        },
        {
            "Name": "Road",
            "Confidence": 99.98146057128906,
            "Instances": [],
            "Parents": [],
            "Aliases": [],
            "Categories": [
                {
                    "Name": "Transport and Logistics"
                }
            ]
        },
        {
            "Name": "Street",
            "Confidence": 99.98146057128906,
            "Instances": [],
            "Parents": [
                {
                    "Name": "City"
                },
                {
                    "Name": "Road"
                },
                {
                    "Name": "Urban"
                }
            ],
            "Aliases": [],
            "Categories": [
                {
                    "Name": "Buildings and Architecture"
                }
            ]
        },
        {
            "Name": "Urban",
            "Confidence": 99.98146057128906,
            "Instances": [],
            "Parents": [],
            "Aliases": [],
            "Categories": [
                {
                    "Name": "Colors and Visual Composition"
                }
            ]
        },
        {
            "Name": "Person",
            "Confidence": 98.77580261230469,
            "Instances": [
                {
                    "BoundingBox": {
                        "Width": 0.20574712753295898,
                        "Height": 0.2853928506374359,
                        "Left": 0.4315406382083893,
                        "Top": 0.3422974646091461
                    },
                    "Confidence": 98.77580261230469
                },
                {
                    "BoundingBox": {
                        "Width": 0.009459801018238068,
                        "Height": 0.016445089131593704,
                        "Left": 0.218057319521904,
                        "Top": 0.535713255405426
                    },
                    "Confidence": 96.38606262207031
                },
                ...
```

これは JSON という形式で物体検出結果を表したものです

`Neighborhood` や `City` のような画像全体に対するラベルと、 `Person` や `Car` のような画像に写っている物に対するラベルが含まれています
画像に写っている物の場合、 `BoundingBox` の中に位置情報も入っています
幅、高さ、左位置、上位置を画像全体に対する比で示しています

プログラムから Rekognition を呼び出す場合、この JSON を読み込んで利用することになります

「アップロード またはドラッグアンドドロップ」のところから、自前の画像をアップロードしてみましょう

![スクリーンショット 2023-11-26 21.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e3e25d40-8f35-a267-cda4-ece8f6955beb.png)

別府の鬼山地獄の写真をアップロードしたところ、 Crocodile = ワニ と Lizard = トカゲ が返ってきました

http://www.beppu-jigoku.com/oniyama/

Crocodile の方が確信度が高いので、まあ正解と言えるのではないでしょうか

返答されるラベルはあくまでも Rekognition が標準的に学習しているラベルなので、例えば「畳」のような日本独自のものは答えられません

そういったものに対応する場合、カスタムラベルをトレーニングする必要があります

https://docs.aws.amazon.com/rekognition/latest/customlabels-dg/what-is.html

### 画像のプロパティ

左メニューから「画像のプロパティ」をクリックすると、画像の色や品質に関する情報を取得するデモが表示されます

![スクリーンショット 2023-11-26 21.16.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/42240c8b-4121-00b3-1a19-91fce775f99c.png)

左側に表示されている画像に対して、右側に以下の情報を表示しています

- ドミナントカラー = メインとして使われている色
- Brightness = 明るさ
- Sharpness = 輪郭の鮮明さ
- Contrast = 明暗の明確さ

　また、前景と背景に分けた場合のそれぞれの値（Contrast 除く）も取得可能です

 ![スクリーンショット 2023-11-26 21.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/361e659c-0430-5949-beca-daf97f81d320.png)

### 画像のモデレーション（不適切画像の検出）

左メニューから「画像のモデレーション」をクリックすると、不適切画像を検出するデモが表示されます

![スクリーンショット 2023-11-26 21.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d8f9a7ab-4d5a-7325-bf32-6c281762f4ef.png)

左下サンプル画像のうち、左側の画像に対しては「結果」欄に「もでレーションは検出されませんでした」と表示されています

サンプル画像のうち、右側の画像（ビキニの女性）をクリックしてみましょう

![スクリーンショット 2023-11-26 21.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/dcffd62f-3fd3-5a4b-26e8-56d4e783f19d.png)

「結果」欄には以下のように表示されました

- Suggestive = 挑発的
- Female Swimwear Or Underwear = 女性の水着、下着
- Revealing Clothes = 露出度の高い服

例えば写真共有サービスで不適切画像のアップロードを規制するなどの用途に使えます

### イメージ内のテキスト

左メニューから「イメージ内のテキスト」をクリックすると、画像からのテキスト検出デモが表示されます

![スクリーンショット 2023-11-26 21.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/faf36a06-a266-24f7-8e3f-d94a0b8fa701.png)

左側の画像に対して、右側に検出したテキストが表示されます

「レスポンス」をクリックすると、以下のように表示されます

```json
{
    "TextDetections": [
        {
            "DetectedText": "IT'S",
            "Type": "LINE",
            "Id": 0,
            "Confidence": 100,
            "Geometry": {
                "BoundingBox": {
                    "Width": 0.14000000059604645,
                    "Height": 0.09833335876464844,
                    "Left": 0.6722222566604614,
                    "Top": 0.1850000023841858
                },
                "Polygon": [
                    {
                        "X": 0.6722222566604614,
                        "Y": 0.1850000023841858
                    },
                    {
                        "X": 0.8122222423553467,
                        "Y": 0.1850000023841858
                    },
                    {
                        "X": 0.8122222423553467,
                        "Y": 0.28333336114883423
                    },
                    {
                        "X": 0.6722222566604614,
                        "Y": 0.28333336114883423
                    }
                ]
            }
        },
        ...
```

幅、高さ、左位置、上位置で表す `BoundingBox` とは別に、 `Polygon` でテキストを含む多角形の頂点も取得しています

これはテキストが斜めになっている場合への対応です

この機能を使うことで、ナンバープレートの文字検出などが可能になります

ただし、日本語には対応していないことに注意しましょう

https://docs.aws.amazon.com/rekognition/latest/dg/text-detection.html

> Amazon Rekognition is designed to detect words in English, Arabic, Russian, German, French, Italian, Portuguese and Spanish.

### PPE 検出

ヘルメットやゴーグル、マスクなどの個人用防護具 = PPE 検出も可能です

![スクリーンショット 2023-11-26 21.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/17dada65-4435-365a-a59c-ecad1bf90aee.png)

この機能により、作業者が正しい装備をしているか、といったチェックが可能です

## まとめ

Amazon Rekognition を使うことで、画像から物体やテキストなどが検出できます

画像の色検出や不適切な画像の検出なども可能なので、組み合わせることで様々な応用が可能です

まずはデモで色々検出してみて、自分の用途に合うのか確認してみましょう