AWS Rekognition を LINE Bot で使う-2

Pocket

前回やったこと

  • LINE に画像をアップロードした際に、その画像が何なのか Botに答えてもらいました。

今回やりたいこと

  • 前回のLINE Botを少し変更し、どのくらいその画像っぽいのか?(具体的には どれくらい「海」っぽいのか?)を評価したい
  • Rekognition を使って面白い機能を… と思った際の、足がかりとなりそうなものを作ってみたい

構成イメージ

  • 構成は前回と同じ以下の通りです

構成

コード

  • コードも前回のものと、基本的には同じですが、
  • 前回のコードの // ★3. 取得したラベル(画像判定結果)を元に、リプライを返す の部分だけ、以下のように変えてみました。

index.js

        // ★3. 取得したラベル(画像判定結果)を元に、リプライを返す

        // 海っぽいラベルに対するスコア表(直接的な単語はスコアを高めに設定)
        const seaLikeScore = {
            Water: 0.4,
            Waterfront: 0.5,
            Port: 0.6,
            Dock: 0.6,
            Shoreline: 0.7,
            Coast: 0.7,
            Sea: 1,
            Ocean: 1,
        };
        // ラベルに含まれる海っぽい単語を評価、それらの内もっとも割合が高いものを採用
        const seaLikeRatios = imgLabels.map(il => (seaLikeScore[il.Name] || 0) * (il.Confidence / 100), 0);
        const seaLikeRatio = seaLikeRatios.sort().pop() * 100;
        await client.replyMessage(event.replyToken, { type: 'text', text: `海っぽさ ${seaLikeRatio}%\n\n${imgLabels.map(il => il.Name).join(', ')}` });

ポイント

  • Rekognition API が返す Labe には Name の他に Confidence という項目があり、これは 信頼のレベル を示す値だそうです。

    有効範囲: 最小値は 0 です。最大値は 100 です。

  • 0 ~ 100 までの値が入ってくるため、これを利用します。
  • 事前に海っぽいラベル一覧と、そのスコアを仮決めし、最終的に最もスコアが高かったラベルのスコアを「海っぽさ」としています。
    • SeaOcean といった「海を表す単語」は 1 とし
    • それ以外の「海に関連する単語」は 0 < score < 1 の範囲で仮決めしておきます
  • 実際に写真を投げて、結果をチェックしつつ、それっぽくなるように、スコアを調整すれば良いかと思います。

使ってみる

デプロイは前回と同様に実施し、今回は様々な写真を投げてみます。

写真

左上から順に 「本物の海」 「本物の海」 「本物の海」 「路地裏」 「池」 「湖」 「カニ」 です。

結果

こんな感じになりました。

結果

結果

海っぽさの度合いをまとめると

  • 本物の海 99.99642181396484%
  • 本物の海 99.96426391601562%
  • 本物の海 99.99974060058594%
  • 路地裏 0%
  • 池 39.999481201171875%
  • 湖 99.06098175048828%
  • カニ 22.270748901367188%

となりました。


本物の海に関しては言うことなしですね。海要素0の路地裏の写真もきちんと判別できています。

湖・・・に関しては広い水たまりなので海と認識されても仕方なし・・・?

池を「海とは違うっぽい」と認識しているのは中々賢いです。

カニはまあ水槽に入っているので、海っぽさが少しあっても・・・?


割とそれっぽい結果になったのではないでしょうか!

まとめ

  • Rekognition を使った具体的なLINE Botを作ってみました。
  • Rekognition は 画像にラベル(名前とその信頼度)を与えてくれます。
  • ただ、具体的に ○○っぽいかどうかを判定したい! となった場合、どうアプローチすれば良いか?と迷ったので、今回はそれをテーマにLINE Botを作ってみました。
  • 他にもアイデア次第で、いくらでも面白いアプリやBotが作れると思います。
    • 今回のLINE Botも、そこまで膨大なプログラムを組んで・・・というものではないので、気軽に試せるのも良い点ですね。

余談

Rekognition にはモデルを自前で作り上げる、カスタムラベルという機能もあります。

今回の例で言えば、全国の海岸の画像を与えて学習させ、どこの海岸かを当てさせる…みたいなこともできるのでは・・・?

と思ったのですが・・・ちょこっと調べた限り、なかなかのお値段のコンピューティングリソースコストがかかるようなので、またの機会…とすることにしました。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です