画像内の異常を検出する - Amazon Lookout for Vision

サポート終了通知: 2025 年 10 月 31 日、 AWS は Amazon Lookout for Vision のサポートを終了します。2025 年 10 月 31 日以降、Lookout for Vision コンソールまたは Lookout for Vision リソースにアクセスできなくなります。詳細については、このブログ記事 を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

画像内の異常を検出する

トレーニング済みの Amazon Lookout for Vision モデルを使用してイメージ内の異常を検出するには、 DetectAnomaliesオペレーションを呼び出します。DetectAnomalies の結果には、1 つ以上の異常を含むような画像を分類するブーリアン予測と、その予測に対する信頼値が含まれます。モデルが画像セグメンテーションモデルの場合、結果にはさまざまなタイプの異常の位置を示す色付きのマスクも含まれます。

DetectAnomalies に提供する画像の幅と高さは、モデルのトレーニングに使用した画像と同じである必要があります。

DetectAnomalies はイメージを PNG または JPG 形式のイメージとして受け入れます。画像のエンコードと圧縮形式は、モデルのトレーニングに使用したものと同じにすることをお勧めします。例えば、モデルをPNGフォーマットイメージでトレーニングする場合は、PNGフォーマットイメージDetectAnomaliesで を呼び出します。

DetectAnomalies を呼び出す前に、まずモデルを StartModel オペレーションで開始してください。詳細については「Amazon Lookout for Vision モデルの開始」を参照してください。モデルが実行される時間 (分単位) と、モデルが使用する異常検出ユニットの数に対して課金されます。モデルを使用していない場合は、StopModel オペレーションでモデルを停止します。詳細については、「Amazon Lookout for Vision モデルの停止」を参照してください。

呼び出し DetectAnomalies

DetectAnomalies を実行するには、以下を指定します。

  • [プロジェクト] — 使用するモデルを含むプロジェクトの名前。

  • ModelVersion – 使用するモデルのバージョン。

  • ContentType – 分析するイメージのタイプ。有効な値は image/png (PNG 形式のイメージ) と image/jpeg (JPG 形式のイメージ) です。

  • [本文] — 画像を表す暗号化されていないバイナリバイト。

    画像は、モデルのトレーニングに使用された画像と同じ寸法である必要があります。

次の例は、DetectAnomalies を–––––––––––––び出す方法を示しています。Python と Java の例の関数レスポンスを使用して、画像が異常であるかどうかの判断 内の関数を呼び出すことができます。

AWS CLI

この AWS CLI コマンドは、 DetectAnomalies CLI オペレーションのJSON出力を表示します。次の入力パラメータの値を変更します。:

  • project name に使用するプロジェクトの名前を入力します。

  • model version に使用するモデルのバージョンを入力します。

  • content type に使用したい画像のタイプを入力します。有効な値は、 image/png (PNG 形式のイメージ) と image/jpeg (JPG 形式のイメージ) です。

  • file name に使用する画像のパスとファイル名を指定します。必ずファイルタイプが content-type の値と一致しているようにしてください。

aws lookoutvision detect-anomalies --project-name project name\ --model-version model version\ --content-type content type\ --body file name \ --profile lookoutvision-access
Python

完全なコード例については、「」を参照してくださいGitHub

def detect_anomalies(lookoutvision_client, project_name, model_version, photo): """ Calls DetectAnomalies using the supplied project, model version, and image. :param lookoutvision_client: A Lookout for Vision Boto3 client. :param project: The project that contains the model that you want to use. :param model_version: The version of the model that you want to use. :param photo: The photo that you want to analyze. :return: The DetectAnomalyResult object that contains the analysis results. """ image_type = imghdr.what(photo) if image_type == "jpeg": content_type = "image/jpeg" elif image_type == "png": content_type = "image/png" else: logger.info("Invalid image type for %s", photo) raise ValueError( f"Invalid file format. Supply a jpeg or png format file: {photo}") # Get images bytes for call to detect_anomalies with open(photo, "rb") as image: response = lookoutvision_client.detect_anomalies( ProjectName=project_name, ContentType=content_type, Body=image.read(), ModelVersion=model_version) return response['DetectAnomalyResult']
Java V2
public static DetectAnomalyResult detectAnomalies(LookoutVisionClient lfvClient, String projectName, String modelVersion, String photo) throws IOException, LookoutVisionException { /** * Creates an Amazon Lookout for Vision dataset from a manifest file. * Returns after Lookout for Vision creates the dataset. * * @param lfvClient An Amazon Lookout for Vision client. * @param projectName The name of the project in which you want to create a * dataset. * @param modelVersion The version of the model that you want to use. * * @param photo The photo that you want to analyze. * * @return DetectAnomalyResult The analysis result from DetectAnomalies. */ logger.log(Level.INFO, "Processing local file: {0}", photo); // Get image bytes. InputStream sourceStream = new FileInputStream(new File(photo)); SdkBytes imageSDKBytes = SdkBytes.fromInputStream(sourceStream); byte[] imageBytes = imageSDKBytes.asByteArray(); // Get the image type. Can be image/jpeg or image/png. String contentType = getImageType(imageBytes); // Detect anomalies in the supplied image. DetectAnomaliesRequest request = DetectAnomaliesRequest.builder().projectName(projectName) .modelVersion(modelVersion).contentType(contentType).build(); DetectAnomaliesResponse response = lfvClient.detectAnomalies(request, RequestBody.fromBytes(imageBytes)); /* * Tip: You can also use the following to analyze a local file. * Path path = Paths.get(photo); * DetectAnomaliesResponse response = lfvClient.detectAnomalies(request, path); */ DetectAnomalyResult result = response.detectAnomalyResult(); String prediction = "Prediction: Normal"; if (Boolean.TRUE.equals(result.isAnomalous())) { prediction = "Prediction: Anomalous"; } // Convert confidence to percentage. NumberFormat defaultFormat = NumberFormat.getPercentInstance(); defaultFormat.setMinimumFractionDigits(1); String confidence = String.format("Confidence: %s", defaultFormat.format(result.confidence())); // Log classification result. String photoPath = "File: " + photo; String[] imageLines = { photoPath, prediction, confidence }; logger.log(Level.INFO, "Image: {0}\nAnomalous: {1}\nConfidence {2}", imageLines); return result; } // Gets the image mime type. Supported formats are image/jpeg and image/png. private static String getImageType(byte[] image) throws IOException { InputStream is = new BufferedInputStream(new ByteArrayInputStream(image)); String mimeType = URLConnection.guessContentTypeFromStream(is); logger.log(Level.INFO, "Image type: {0}", mimeType); if (mimeType.equals("image/jpeg") || mimeType.equals("image/png")) { return mimeType; } // Not a supported file type. logger.log(Level.SEVERE, "Unsupported image type: {0}", mimeType); throw new IOException(String.format("Wrong image type. %s format isn't supported.", mimeType)); }

からのレスポンスを理解する DetectAnomalies

DetectAnomalies からのレスポンスは、トレーニングするモデルのタイプ (分類モデルまたはセグメンテーションモデル) によって異なります。どちらの場合も、レスポンスは DetectAnomalyResult オブジェクトです。

分類モデル

モデルが 画像分類モデル の場合、DetectAnomalies からのレスポンスには以下が含まれます。

  • IsAnomalous– イメージに 1 つ以上の異常が含まれていることを示すブール型インジケータ。

  • Confidence — 異常予測 (IsAnomalous) の精度における Amazon Lookout for Vision の信頼度。Confidence は 0~1 の浮動小数点値です。値が高いほど、信頼度が高いことを示します。

  • SourceDetectAnomalies に渡された画像に関する情報。

{ "DetectAnomalyResult": { "Source": { "Type": "direct" }, "IsAnomalous": true, "Confidence": 0.9996867775917053 } }

画像に異常があるかどうかを判断するには、IsAnomalous フィールドをチェックし、Confidence の値がニーズを満たすほど大きいことを確認します。

DetectAnomalies で返される信頼値が低すぎると感じる場合は、モデルの再トレーニングを検討してください。サンプルコードについては、「分類」を参照してください。

セグメンテーションモデル

モデルが 画像セグメンテーションモデル の場合、レスポンスには分類情報と、画像マスクや異常タイプなどのセグメンテーション情報が含まれます。分類情報はセグメンテーション情報とは別に計算されるため、両者の関係は想定しないでください。レスポンスにセグメンテーション情報が表示されない場合は、最新バージョンの AWS SDKがインストールされていることを確認します (AWS Command Line Interfaceを使用している場合は ) AWS CLI。サンプルコードについては、セグメンテーション分類とセグメンテーションの情報の表示 を参照してください。

  • IsAnomalous (分類) – イメージを正常または異常として分類するブール型インジケータ。

  • Confidence (分類) — 異常予測の精度における Amazon Lookout for Vision の信頼度 (IsAnomalous)。Confidence は 0~1 の浮動小数点値です。値が高いほど、信頼度が高いことを示します。

  • SourceDetectAnomalies に渡された画像に関する情報。

  • AnomalyMask (セグメンテーション) – 分析された画像で見つかった異常をカバーするピクセルマスク。画像には異常が複数存在する場合があります。マスクマップの色は異常のタイプを示します。マスクカラーは、トレーニングデータセット内の異常タイプに割り当てられた色に対応しています。マスクカラーから異常タイプを見つけるには、Anomalies リストで返された各異常の PixelAnomaly フィールドで Color をチェックします。サンプルコードについては、「分類とセグメンテーションの情報の表示」を参照してください。

  • Anomalies (セグメンテーション) — 画像で見つかった異常のリスト。各異常には、異常タイプ (Name) とピクセル情報 (PixelAnomaly) が含まれます。TotalPercentageArea は異常がカバーする画像の面積のパーセンテージです。Color は異常のマスクカラーです。

    リストの最初の要素は常に画像の背景 (BACKGROUND) を表す異常タイプなので、異常と見なすべきではありません。Amazon Lookout for Vision では、背景の異常タイプが自動的にレスポンスに追加されます。データセットで背景異常タイプを宣言する必要はありません。

{ "DetectAnomalyResult": { "Source": { "Type": "direct" }, "IsAnomalous": true, "Confidence": 0.9996814727783203, "Anomalies": [ { "Name": "background", "PixelAnomaly": { "TotalPercentageArea": 0.998999834060669, "Color": "#FFFFFF" } }, { "Name": "scratch", "PixelAnomaly": { "TotalPercentageArea": 0.0004034999874420464, "Color": "#7ED321" } }, { "Name": "dent", "PixelAnomaly": { "TotalPercentageArea": 0.0005966666503809392, "Color": "#4DD8FF" } } ], "AnomalyMask": "iVBORw0....." } }