前回やったこと
- 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 までの値が入ってくるため、これを利用します。
- 事前に海っぽいラベル一覧と、そのスコアを仮決めし、最終的に最もスコアが高かったラベルのスコアを「海っぽさ」としています。
Sea
やOcean
といった「海を表す単語」は 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 にはモデルを自前で作り上げる、カスタムラベルという機能もあります。
今回の例で言えば、全国の海岸の画像を与えて学習させ、どこの海岸かを当てさせる…みたいなこともできるのでは・・・?
と思ったのですが・・・ちょこっと調べた限り、なかなかのお値段のコンピューティングリソースコストがかかるようなので、またの機会…とすることにしました。