检测图像中的异常 - Amazon Lookout for Vision

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

检测图像中的异常

要使用经过训练的 Amazon Lookout for Vision 模型来检测图像中的异常,您需要调用 DetectAnomalies 操作。DetectAnomalies 的结果中包括一个布尔预测值,该预测会按照图像包含一个异常或多个异常来对其进行分类,此外还包括对所做预测的置信度值。如果模型是图像分割模型,则结果中还包括有色掩码,用于显示不同类型异常的位置。

在宽度和高度尺寸上,您提供给 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:一种用于表示图像包含一个或多个异常的布尔指示符。

  • 置信度:Amazon Lookout for Vision 对异常预测 (IsAnomalous) 准确度的信心。Confidence 是介于 0 和 1 之间的浮点值。值越高表示置信度越高。

  • 来源:与传递给 DetectAnomalies 的图像相关的信息。

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

通过检查 IsAnomalous 字段并确认 Confidence 值是否高到足以满足您的需求,您可以确定图像是否存在异常。

如果您发现 DetectAnomalies 返回的置信度值过低,请考虑重新训练模型。有关示例代码,请参阅 分类

分割模型

如果您的模型是图像分割模型,则响应中将包括分类信息和分割信息,如图像掩码和异常类型。分类信息与分割信息分开进行计算,您不应假设它们之间存在关系。如果未在响应中获取分割信息,请检查是否已安装最新版本的 AWS SDK(如果使用的是 AWS CLI,则检查 AWS Command Line Interface)。有关示例代码,请参阅分段显示分类和分割信息

  • IsAnomalous(分类):一种用于将图像归类为正常或异常的布尔指示符。

  • 置信度(分类):Amazon Lookout for Vision 对图像分类 (IsAnomalous) 准确度的信心。Confidence 是介于 0 和 1 之间的浮点值。值越高表示置信度越高。

  • 来源:与传递给 DetectAnomalies 的图像相关的信息。

  • AnomalyMask(分割):一种像素掩码,用于覆盖所分析图像中发现的异常。图像上可能存在多个异常。掩码贴图的颜色表示异常的类型。掩码颜色对应训练数据集中分配给各异常类型的颜色。要通过掩码颜色查找异常类型,请在 Anomalies 列表返回的每个异常的 PixelAnomaly 字段中检查 Color。有关示例代码,请参阅 显示分类和分割信息

  • 异常(分割):图像中发现的异常列表。每个异常都包括异常类型 (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....." } }