この投稿では、 Amazon Kendra と Amazon Rekognition を使用した複雑な画像を検索するための機械学習 (ML) ソリューションについて説明します。具体的には、多数の異なるビジュアルアイコンとテキストが組み込まれているアーキテクチャ図の例を使用します。 インターネットを使えば、画像を検索して取得することはかつてないほど簡単になりました。ほとんどの場合、次の休暇を過ごす場所の画像を検索するなど、目的の画像を正確に見つけることができます。単純な検索は成功しやすいですが、多くの特徴に関連していないためです。目的の画像特性を超えて、通常、検索基準は必要な結果を見つけるための詳細情報を必要としません。たとえば、特定の種類の青いボトルを検索しようとする場合、さまざまな種類の青いボトルの結果が表示されます。ただし、一般的な検索用語のため、目的の青いボトルが簡単に見つからない場合があります。 検索コンテキストの解釈も結果の簡素化に寄与します。ユーザーが特定の画像を考えている場合、それをテキストベースの検索クエリに組み立てようとします。類似したトピックの検索クエリの違いを理解することは重要で、関連する結果を提供し、ユーザーが手動で結果を整理する必要がある手間を最小限に抑えるのに役立ちます。たとえば、“Dog owner plays fetch” (訳注: ここでの plays fetch は、ボールなどのおもちゃを投げて、犬が取ってくる遊び。)という検索クエリは、犬の飼い主が犬と一緒にフェッチをする遊びを示す画像結果を期待しています。しかし、実際の結果は飼い主の関与を表示せず、犬が物をフェッチすることに焦点を当てる場合もあります。複雑な検索を扱う際、ユーザーは不適切な画像結果を手動でフィルタリングする必要があるかもしれません。 複雑な検索に関連する問題に対処するため、この投稿では詳細に説明します。Amazon Kendra と Amazon Rekognition を統合することで、複雑な画像を検索できる検索エンジンをどのように実現できるかを。Amazon Kendra は ML によって強化されたインテリジェントな検索サービスであり、Amazon Rekognition は画像や動画からオブジェクト、人物、テキスト、シーン、アクティビティを識別できる ML サービスです。 どのような画像が検索対象にするには複雑すぎるでしょうか? 一つの例として挙げられるのがアーキテクチャ図です。これらはユースケースの複雑さや必要な技術サービスの数に応じて多くの検索基準と関連付けることができ、ユーザーにとって大きな手動検索の労力を必要とします。例えば、ユーザーが顧客認証のユースケースに適したアーキテクチャの解決策を探したい場合、通常、「顧客認証のためのアーキテクチャ図」といった検索クエリを使用します。しかし、一般的な検索クエリは幅広いサービスと異なるコンテンツ作成日を網羅します。ユーザーは特定のサービスに基づいて適切なアーキテクチャ候補を手動で選択し、コンテンツ作成日と検索日に応じてアーキテクチャ設計の選択の関連性を考慮する必要があります。 次の図は、オーケストレーションされた抽出、変換、ロード (ETL) を実行するソリューションのアーキテクチャを示す図の例を示しています。 クラウドプラットフォームの提供サービスに慣れていないユーザーは、このような図を検索する際に、異なる一般的な方法や説明を提供することがあります。以下は、それがどのように検索されるかのいくつかの例です。 「ETLワークフローをオーケストレーションする」 「バルクデータ処理を自動化する方法」 「データを変換するためのパイプラインを作成する方法」 ソリューションの概要 ソリューションを実装するための以下の手順を順を追って説明します。 Amazon Rekognition カスタムラベル でモデルをトレーニングして、アーキテクチャ図内のシンボルを認識できるようにします。 Amazon Rekognition のテキスト検出機能を組み込んで、アーキテクチャ図のシンボルを検証します。 Amazon Rekognition をウェブクローラー内で使用して、検索用のリポジトリを構築します。 Amazon Kendra を使用してリポジトリを検索します。 関連する結果の大規模なリポジトリをユーザーに簡単に提供するには、信頼できるソースを検索する自動化された方法が必要です。アーキテクチャ図を例にとると、ソリューションはアーキテクチャ図の参照リンクや技術文書を検索し、存在するサービスを特定する必要があります。これらのソースからユースケースや業種などのキーワードを特定することで、情報を収集し、より関連性の高い検索結果をユーザーに表示することもできます。 関連する図をどのように検索するかという目的を考慮すると、画像検索ソリューションは次の 3 つの基準を満たす必要があります。 簡易キーワード検索を有効にする ユーザーが提供するユースケースに基づいて検索クエリを解釈する 検索結果の並べ替えと並べ替え キーワード検索では、単に「Amazon Rekognition」を検索し、さまざまなユースケースでサービスがどのように使用されているかを示すアーキテクチャ図が表示されます。あるいは、アーキテクチャに関連するユースケースや業種を通じて、検索語を図に間接的にリンクさせることもできます。たとえば、「ETL パイプラインのオーケストレーション方法」という用語を検索すると、 AWS Glue と AWS Step Functions で構築されたアーキテクチャ図の結果が返されます。作成日などの属性に基づいて検索結果を並べ替えたり並べ替えたりすることで、サービスの更新やリリースがあってもアーキテクチャ図の関連性が保たれます。次の図は、画像検索ソリューションのアーキテクチャ図を示しています。 前の図とソリューションの概要に示されているように、このソリューションには主に 2 つの側面があります。1 つ目の側面は Amazon Rekognition で行われます。Amazon Rekognition は画像や動画を大規模に分析するために適用できる事前トレーニング済みのモデルで構成されています。Amazon Rekognition のカスタムラベル機能により、ソースから照合した画像を、信頼できる参照リンクや技術文書内のアーキテクチャ図にラベル付けすることで、ML サービスを特定のビジネスニーズに合わせて調整できます。Amazon Rekognition は、少量のトレーニングイメージをアップロードすることで、トレーニングデータを自動的に読み込んで検査し、適切な ML アルゴリズムを選択、モデルをトレーニングし、モデルパフォーマンスメトリクスを提供します。したがって、ML の専門知識がないユーザーでも、オーバーヘッドが大幅に削減されるため、API 呼び出しを通じてカスタムラベルモデルのメリットを享受できます。このソリューションでは、Amazon Rekognition カスタムラベルを適用してアーキテクチャ図上の AWS サービスロゴを検出し、アーキテクチャ図をサービス名で検索できるようにします。モデリングが完了すると、各アーキテクチャ図イメージとそのメタデータ (URL オリジンやイメージタイトルなど) で検出されたサービスが、今後の検索に備えてインデックス化され、高性能アプリケーションを実行するように設計された、フルマネージド型のサーバーレスのキー値 NoSQL データベースである Amazon DynamoDB に保存されます。 2 つ目の側面は、ML を利用したインテリジェントなエンタープライズ検索サービスである Amazon Kendra によって実現されています。これにより、さまざまなコンテンツリポジトリを検索できます。Amazon Kendra では、画像やドキュメントなど、インデックス化された結果を検索できます。検索サービスには組み込みのコネクタが採用されているため、これらの結果をさまざまなリポジトリに保存することもできます。検索にはキーワード、フレーズ、説明を使用できます。これにより、特定のユースケースに関連する図を正確に検索できます。そのため、最小限の開発コストでインテリジェントな検索サービスを簡単に構築できます。 問題と解決策を理解した上で、以降のセクションでは、信頼できるソースからアーキテクチャ図をクロールしてデータソーシングを自動化する方法について詳しく説明します。続いて、フルマネージドサービスでカスタムラベル ML モデルを生成するプロセスを順を追って説明します。最後に、ML を利用したインテリジェントな検索サービスによるデータ取り込みについて説明します。 カスタムラベルを使用して Amazon Rekognition モデルを作成する アーキテクチャ図を入手する前に、画像をアーキテクチャ図として識別できるかどうかを評価するツールが必要です。Amazon Rekognition カスタムラベルを使用すると、ビジネスニーズに特化した画像内のオブジェクトやシーンを識別する画像認識モデルを作成するためのプロセスが簡略化されます。このケースでは、Amazon Rekognition カスタムラベルを使用して AWS サービスアイコンを識別し、Amazon Kendra を使用してより関連性の高い検索を行えるように、そのサービスにイメージがインデックス付けされます。このモデルでは、画像全体がアーキテクチャ図であるかどうかは区別されません。サービスアイコンがあればそれを識別するだけです。そのため、アーキテクチャ図ではない画像が検索結果に表示される場合があります。ただし、このような結果はごくわずかです。 次の図は、このソリューションが Amazon Rekognition カスタムラベルモデルを作成するために実行する手順を示しています。 このプロセスには、データセットをアップロードし、アップロードされたデータセットを参照するマニフェストファイルを生成してから、このマニフェストファイルを Amazon Rekognition にアップロードすることが含まれます。Python スクリプトは、データセットをアップロードしてマニフェストファイルを生成するプロセスを支援するために使用されます。マニフェストファイルが正常に生成されると、Amazon Rekognition にアップロードされ、モデルトレーニングプロセスが開始されます。Python スクリプトとその実行方法の詳細については、 GitHub リポジトリ を参照してください。 モデルをトレーニングするには、Amazon Rekognition プロジェクトで [新しいモデルをトレーニングする] を選択し、トレーニングするプロジェクトを選択します。次に、関連するタグを追加して [モデルをトレーニング] を選択します。Amazon Rekognition カスタムラベルプロジェクトの開始方法については、利用可能な ビデオチュートリアル を参照してください。このデータセットを使用してモデルをトレーニングするには、最大 8 時間かかる場合があります。 トレーニングが完了したら、トレーニング済みのモデルを選択して評価結果を表示できます。精度、再現率、F1 などのさまざまな指標の詳細については、 モデルを評価するための指標 を参照してください。モデルを使用するには、[モデルを使用] タブに移動し、推論単位の数を 1 のままにして、モデルを起動します。次に、 AWS Lambda 関数を使用して base64 の形式でモデルに画像を送信すると、モデルはラベルと信頼度スコアのリストを返します。 Amazon Rekognition カスタムラベルを使用して Amazon Rekognition モデルを正常にトレーニングできたら、このモデルを使用して、クロールされたアーキテクチャ図内のサービスアイコンを識別できます。アーキテクチャ図でサービスを識別する精度を高めるために、 テキスト検出 と呼ばれる別の Amazon Rekognition 機能を使用しています。この機能を使用するには、base64 の形式で同じ画像を渡すと、Amazon Rekognition はその画像で識別されたテキストのリストを返します。以下の 2 つの図では、元の画像と、画像内のサービスを特定した後の画像を比較しています。最初の図は元の画像を示しています。 次の図は、検出されたサービスを含む元の画像を示しています。 スケーラビリティを確保するために、 Amazon API Gateway を使用して作成された API エンドポイントを通じて公開される Lambda 関数を使用しています。Lambda はサーバーレスのイベント駆動型コンピューティングサービスで、サーバーのプロビジョニングや管理をしなくても、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行できます。Lambda 関数を使用すると、API エンドポイントに大量のリクエストが行われた場合のスケールアップに関する一般的な懸念がなくなります。Lambda は特定の API 呼び出しに対して自動的に関数を実行し、呼び出しが完了すると停止するため、ユーザーにかかるコストが削減されます。リクエストは Amazon Rekognition エンドポイントに送信されるため、スケーラブルな Lambda 関数だけでは十分ではありません。Amazon Rekognition エンドポイントをスケーラブルにするには、エンドポイントの推論ユニットを増やすことができます。 推論ユニット の設定の詳細については、推論ユニットを参照してください。 以下は、画像認識処理の Lambda 関数のコードスニペットです。 const AWS = require("aws-sdk"); const axios = require("axios"); // 個々のサービスに関する情報を取得するAPI const SERVICE_API = process.env.SERVICE_API; // Amazon Rekognition モデルの ARN const MODEL_ARN = process.env.MODEL_ARN; const rekognition = new AWS.Rekognition(); exports.handler = async (event) => { const body = JSON.parse(event["body"]); let base64Binary = ""; // ペイロードに画像のURLまたはbase64形式の画像が含まれているか確認 const base64Res = await new Promise((resolve) => { axios .get(body.url, { responseType: "arraybuffer", }) .then((response) => { resolve(Buffer.from(response.data, "binary").toString("base64")); }); }); base64Binary = new Buffer.from(base64Res, "base64"); } else if (body.byte) { const base64Cleaned = body.byte.split("base64,")[1]; base64Binary = new Buffer.from(base64Cleaned, "base64"); } // トレーニングされたカスタムラベルモデルとテキスト検出にコンテンツを渡す const [labels, text] = await Promise.all([ detectLabels(rekognition, base64Binary, MODEL_ARN), detectText(rekognition, base64Binary), ]); const texts = text.TextDetections.map((text) => ({ DetectedText: text.DetectedText, ParentId: text.ParentId, })); // 重複するラベルを比較し、最も信頼度の高いラベルをそのまま使用 let filteredLabels = removeOverlappingLabels(labels); // すべてのラベルを信頼度の高いものから最も信頼度の低いものへと並べ替え filteredLabels = sortByConfidence(filteredLabels); // リスト内の重複したサービスを削除 const services = retrieveUniqueServices(filteredLabels, texts); // 各サービスを参照ドキュメント API に渡して、ドキュメントの URL を取得 const refLinks = await getReferenceLinks(services); var responseBody = { labels: filteredLabels, text: texts, ref_links: refLinks, }; console.log("Response: ", response_body); const response = { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*", // Required for CORS to work }, body: JSON.stringify(responseBody), }; return response; }; // セクション短縮するためにコードを省略 Lambda 関数を作成したら、API Gateway を使用して API として公開することができます。Lambda プロキシ統合を使用して API を作成する手順については、「チュートリアル: Build a Hello World REST API with Lambda proxy integration. を参照してください。 アーキテクチャ図をクロールする 検索機能を簡単に機能させるには、アーキテクチャ図のリポジトリが必要です。ただし、これらの図は、 AWS ブログ や AWS 規範的ガイダンス などの信頼できる情報源からのものでなければなりません。データソースの信頼性を確立することで、ユースケースの根底にある実装と目的が正確になり、十分に吟味されていることが保証されます。次のステップは、多くのアーキテクチャ図を集めてリポジトリに加えるのに役立つクローラを設定することです。関連するソースからアーキテクチャ図や実装の説明などの情報を抽出するウェブクローラーを作成しました。このようなメカニズムを構築する方法は複数あります。この例では、 Amazon Elastic Compute Cloud (Amazon EC2) で実行されるプログラムを使用しています。プログラムは最初に AWS ブログ API からブログ投稿へのリンクを取得します。API から返されるレスポンスには、タイトル、URL、日付、投稿内の画像へのリンクなど、投稿の情報が含まれます。 以下は、Web クロールプロセスの JavaScript 関数のコードスニペットです。 import axios from "axios"; import puppeteer from "puppeteer"; import { putItemDDB, identifyImageHighConfidence, getReferenceList, } from "./utils.js"; /** グローバル変数 */ const blogPostsApi = process.env.BLOG_POSTS_API; const IMAGE_URL_PATTERN = "<pattern in the url that identified as link to image>"; const DDB_Table = process.env.DDB_Table; // パブリック API からレコードの URL を取得する関数 function getURLs(blogPostsApi) { // URL のリストをリターン return axios .get(blogPostsApi) .then((response) => { var data = response.data.items; console.log("RESPONSE:"); const blogLists = data.map((blog) => [ blog.item.additionalFields.link, blog.item.dateUpdated, ]); return blogLists; }) .catch((error) => console.error(error)); } // 個々の URL のコンテンツをクロールする関数 async function crawlFromUrl(urls) { const browser = await puppeteer.launch({ executablePath: "/usr/bin/chromium-browser", }); // const browser = await puppeteer.launch(); const page = await browser.newPage(); let numOfValidArchUrls = 0; for (let index = 0; index < urls.length; index++) { console.log("index: ", index); let blogURL = urls[index][0]; let dateUpdated = urls[index][1]; await page.goto(blogURL); console.log("blogUrl:", blogURL); console.log("date:", dateUpdated); // URL パターンに基づいて投稿から画像を識別して取得 const images = await page.evaluate(() => Array.from(document.images, (e) => e.src) ); const filter1 = images.filter((img) => img.includes(IMAGE_URL_PATTERN)); console.log("all images:", filter1); // 画像がアーキテクチャ図かどうかを検証 for (let index_1 = 0; index_1 < filter1.length; index_1++) { const imageUrl = filter1[index_1]; const rekog = await identifyImageHighConfidence(imageUrl); if (rekog) { if (rekog.labels.size >= 2) { console.log("Rekog.labels.size = ", rekog.labels.size); console.log("Selected image url = ", imageUrl); let articleSection = []; let metadata = await page.$$('span[property="articleSection"]'); for (let i = 0; i < metadata.length; i++) { const element = metadata[i]; const value = await element.evaluate( (el) => el.textContent, element ); console.log("value: ", value); articleSection.push(value); } const title = await page.title(); const allRefLinks = await getReferenceList( rekog.labels, rekog.textServices ); numOfValidArchUrls = numOfValidArchUrls + 1; putItemDDB( blogURL, dateUpdated, imageUrl, articleSection.toString(), rekog, { L: allRefLinks }, title, DDB_Table ); console.log("numOfValidArchUrls = ", numOfValidArchUrls); } } if (rekog && rekog.labels.size >= 2) { break; } } } console.log("valid arch : ", numOfValidArchUrls); await browser.close(); } async function startCrawl() { // URL のリストを取得 // それらの URL からアーキテクチャ図を抽出 const urls = await getURLs(blogPostsApi); if (urls) console.log("Crawling urls completed"); else { console.log("Unable to crawl images"); return; } await crawlFromUrl(urls); } startCrawl(); このメカニズムにより、さまざまなブログから何百、何千もの画像を簡単にクロールできます。ただし、アーキテクチャ図ではない画像を除外するには、アーキテクチャ図(この場合は AWS サービスのアイコン)の内容を含む画像のみを受け入れるフィルタが必要です。 これが Amazon Rekognition のモデルを利用する目的です。ダイアグラムは画像認識プロセスを経てサービスアイコンを識別し、それが有効なアーキテクチャ図と見なせるかどうかを判断します。 以下は、Amazon Rekognition モデルに画像を送信する関数のコードスニペットです。 import axios from "axios"; import AWS from "aws-sdk"; // 設定 AWS.config.update({ region: process.env.REGION }); /** グローバル変数 */ // 画像を特定する API const LABEL_API = process.env.LABEL_API; // 個々のサービスの関連ドキュメントを取得するための API const DOCUMENTATION_API = process.env.DOCUMENTATION_API; // DynamoDB サービスのオブジェクトを作成する const dynamoDB = new AWS.DynamoDB({ apiVersion: "2012-08-10" }); // Amazon Rekognition モデルを呼び出す API を使用して画像を識別する関数 function identifyImageHighConfidence(image_url) { return axios .post(LABEL_API, { url: image_url, }) .then((res) => { let data = res.data; let rekogLabels = new Set(); let rekogTextServices = new Set(); let rekogTextMetadata = new Set(); data.labels.forEach((element) => { if (element.Confidence >= 40) rekogLabels.add(element.Name); }); data.text.forEach((element) => { if ( element.DetectedText.includes("AWS") || element.DetectedText.includes("Amazon") ) { rekogTextServices.add(element.DetectedText); } else { rekogTextMetadata.add(element.DetectedText); } }); rekogTextServices.delete("AWS"); rekogTextServices.delete("Amazon"); return { labels: rekogLabels, textServices: rekogTextServices, textMetadata: Array.from(rekogTextMetadata).join(", "), }; }) .catch((error) => console.error(error)); } Amazon Kendra にメタデータを取り込む アーキテクチャ図が画像認識プロセスを経てメタデータが DynamoDB に保存されたら、メタデータの内容を参照しながら図を検索できるようにする方法が必要です。そのためのアプローチは、アプリケーションと統合でき、大量の検索クエリを処理できる検索エンジンを用意することです。このことから、インテリジェントなエンタープライズ検索サービスである Amazon Kendra を使用しています。 Amazon Kendra をソリューションのインタラクティブコンポーネントとして使用しているのは、その強力な検索機能、特に自然言語を使用できるためです。これにより、ユーザーが探しているものに最も近い図を検索するときの作業がさらに簡単になります。Amazon Kendra には、コンテンツを取り込んで接続するためのデータソースコネクタが多数用意されています。このソリューションでは、カスタムコネクタを使用して DynamoDB からアーキテクチャ図の情報を取り込みます。Amazon Kendra インデックスにデータソースを設定するには、既存のインデックスを使用するか、 新しいインデックスを作成 できます。 次に、クロールされた図を、作成された Amazon Kendra インデックスに取り込む必要があります。次の図は、図のインデックス作成の流れを示しています。 まず、DynamoDB に挿入された図によって Amazon DynamoDB Streams 経由で PUT イベントが作成されます。このイベントは、Amazon Kendra のカスタムデータソースとして機能する Lambda 関数をトリガーし、図をインデックスに取り込みます。Lambda 関数の DynamoDB ストリームトリガーを作成する手順については、チュートリアル: Using AWS Lambda with Amazon DynamoDB Streams を参照してください。 Lambda 関数を DynamoDB と統合したら、関数に送信されたダイアグラムのレコードを Amazon Kendra インデックスに取り込む必要があります。インデックスはさまざまなタイプのソースからデータを受け付けるため、Lambda 関数からインデックスに項目を取り込むには、カスタムデータソース設定を使用する必要があります。インデックスのカスタムデータソースを作成する手順については、 カスタムデータソースコネクタ を参照してください。 以下は、カスタムを利用した方法で図をインデックスに紐付ける方法を示す Lambda 関数のコードスニペットです。 import json import os import boto3 KENDRA = boto3.client("kendra") INDEX_ID = os.environ["INDEX_ID"] DS_ID = os.environ["DS_ID"] def lambda_handler(event, context): dbRecords = event["Records"] # Amazon DynamoDB からのアイテムを繰り返し処理 for row in dbRecords: rowData = row["dynamodb"]["NewImage"] originUrl = rowData["OriginURL"]["S"] publishedDate = rowData["PublishDate"]["S"] architectureUrl = rowData["ArchitectureURL"]["S"] title = rowData["Title"]["S"] metadata = rowData["Metadata"]["M"] crawlerMetadata = metadata["crawler"]["S"] rekognitionMetadata = metadata["Rekognition"]["M"] rekognitionLabels = rekognitionMetadata["labels"]["S"] rekognitionServices = rekognitionMetadata["textServices"]["S"] concatenatedText = ( f"{crawlerMetadata} {rekognitionLabels} {rekognitionServices}" ) add_document( dsId=DS_ID, indexId=INDEX_ID, originUrl=originUrl, architectureUrl=architectureUrl, title=title, publishedDate=publishedDate, text=concatenatedText, ) return # Kendra インデックスにダイアグラムを追加する関数 def add_document(dsId, indexId, originUrl, architectureUrl, title, publishedDate, text): document = get_document( dsId, indexId, originUrl, architectureUrl, title, publishedDate, text ) documents = [document] result = KENDRA.batch_put_document(IndexId=indexId, Documents=documents) print("result:" + json.dumps(result)) return True # 図を Kendra が受け付けられる形式の文書に整形します。 def get_document(dsId, originUrl, architectureUrl, title, publishedDate, text): document = { "Id": originUrl, "Title": title, "Attributes": [ {"Key": "_data_source_id", "Value": {"StringValue": dsId}}, {"Key": "_source_uri", "Value": {"StringValue": architectureUrl}}, {"Key": "_created_at", "Value": {"DateValue": publishedDate}}, {"Key": "publish_date", "Value": {"DateValue": publishedDate}}, ], "Blob": text, } return document 図を検索できるようにする重要な要素は、文書内の Blob キーです。これは、ユーザーが検索入力を行うときに Amazon Kendra が調べる内容です。このコード例の Blob キーには、画像認識プロセスで検出された情報を連結した図のユースケースの要約バージョンが含まれています。これにより、ユーザーは「不正検出」などのユースケースや「Amazon Kendra」などのサービス名に基づいてアーキテクチャ図を検索できます。 Blob キーの例として以下に示すスニペットは、この記事の前半で紹介した最初の ETL ダイアグラムを参照しています。これには、クロール時に取得された図の説明と、Amazon Rekognition モデルによって識別されたサービスが含まれています。 { ..., "Blob": "Build and orchestrate ETL pipelines using Amazon Athena and AWS Step Functions Amazon Athena, AWS Step Functions, Amazon S3, AWS Glue Data Catalog " } Amazon Kendra で検索 このユースケースを検索すると、さまざまなアーキテクチャ図が生成されます。ユーザーには、実装しようとしている特定のワークロードのさまざまな方法が提供されます。 クリーンアップ このセクションの手順を実行して、この記事の一部として作成したリソースをクリーンアップしてください。 API を削除します。 API Gateway コンソールで、削除する API を選択します。 「アクション」メニューで、「Delete」を選択します。 [削除] を選択して確定します。 DynamoDB テーブルを削除します。 DynamoDB コンソールのナビゲーションペインで [テーブル] を選択します。 作成したテーブルを選択し、[削除] を選択します。 確認を求められたら、確認 と入力します。 [削除] を選択して確定します Amazon Kendra インデックスを削除します。 Amazon Kendra コンソールのナビゲーションペインで [Indexes] を選択します。 作成したインデックスを選択し、[Delete] を選択します。 確認を求められたら、理由を入力します。 [削除] を選択して確定します。 Amazon Rekognition プロジェクトを削除します。 Amazon Rekognition コンソールのナビゲーションペインで [カスタムラベルを使用] を選択し、[プロジェクト] を選択します。 作成したプロジェクトを選択し、[削除] を選択します。 確認を求められたら、Delete と入力します。 [関連するデータセットとモデルを削除] を選択して確定します。 Lambda 関数を削除します。 Lambda コンソールで、削除する関数を選択します。 「アクション」メニューで、「削除」を選択します。 確認を求められたら、Delete と入力します。 [削除] を選択して確定します。 まとめ この記事では、画像から情報をインテリジェントに検索する方法の例を示しました。これには、画像のフィルターとして機能する Amazon Rekognition ML モデルをトレーニングするプロセス、信頼性と効率性を確保する画像クロールを自動化するプロセス、より柔軟にアイテムにインデックスを付けることができるカスタムデータソースをアタッチしてダイアグラムをクエリするプロセスが含まれます。コードの実装について詳しくは、 GitHub リポジトリ を参照してください。 複雑な検索のために一元化された検索リポジトリの基盤を提供する方法を理解したところで、独自の画像検索エンジンを作ってみましょう。コア機能の詳細については、「 Amazon Rekognition カスタムラベル入門 」、「 コンテンツのモデレーション 」、および「 Amazon Kendra デベロッパーガイド 」を参照してください。Amazon Rekognition カスタムラベルを初めてご利用になる場合は、無料利用枠を使って試してみてください。3 か月間有効で、1 か月あたり 10 時間の無料トレーニングと、1 か月あたり 4 時間の無料推論時間が含まれます。 著者について Ryan See は AWS のソリューションアーキテクトです。 シンガポールに拠点を置く彼は、顧客と協力してビジネス上の 問題を解決するソリューションを構築するとともに、 クラウドでよりスケーラブルで効率的なワークロードを実行できるように 技術的なビジョンを調整します。 James Ong Jia Xiang は AWS のカスタマーソリューションマネージャーです。 彼は移行加速プログラム (MAP) を専門としており、顧客やパートナーが AWS への大規模な移行プログラムを成功裏に実装できるよう支援しています。 シンガポールに拠点を置き、スケーラブルなメカニズムを通じてAPJ全体で 近代化と企業変革の取り組みを推進することにも注力しています。 余暇には、トレッキングやサーフィンなどの自然アクティビティを 楽しんでいます。 Hang Duong は AWS のソリューションアーキテクトです。 ベトナムのハノイに拠点を置き、可用性が高く安全でスケーラブルな クラウドソリューションを顧客に提供することで、国全体でクラウドの 採用を促進することに注力しています。 さらに、彼女はビルディングが好きで、さまざまなプロトタイピングプロジェクトに 携わっています。彼女は機械学習の分野にも情熱を注いでいます。 Trinh Vo は、ベトナムのホーチミン市を拠点とする AWS のソリューションアーキテクトです。 彼女は、ベトナムのさまざまな業界の顧客やパートナーと協力して、顧客の ビジネスニーズから逆算して機能する AWS プラットフォームのアーキテクチャと デモンストレーションを作成し、適切な AWS テクノロジーの採用を促進することに 重点を置いています。 彼女はレジャーとして洞窟探検やトレッキングを楽しんでいます。 Wai Kin Tham は AWS のクラウドアーキテクトです。 シンガポールに拠点を置く彼の日常業務は、顧客のクラウドへの移行とクラウド内の テクノロジースタックの最新化を支援することです。 自由時間には、ムエタイとブラジリアン柔術のクラスに参加しています。 翻訳はソリューションアーキテクトの福本が担当しました。原文は こちら です。