이미지에서 이상 탐지 - Amazon Lookout for Vision

지원 종료 알림: 2025 AWS 년 10월 31일에 는 Amazon Lookout for Vision에 대한 지원을 중단할 예정입니다. 2025년 10월 31일 이후에는 Lookout for Vision 콘솔 또는 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 형식 이미지)입니다.

  • 본문 — 이미지를 나타내는 인코딩되지 않은 2진 바이트입니다.

    이미지는 모델 학습에 사용된 이미지와 크기가 같아야 합니다.

다음 예에는 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 Command Line Interface를 사용하는 경우 AWS CLI). 예제 코드는 세분화분류 및 세분화 정보 표시 단원을 참조하세요.

  • 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....." } }