이 자습서를 배포하고 50달러의 AWS 학점을 획득하세요!

AWS Lambda 컨테이너 이미지를 사용하는 머신러닝 이미지 인식 스택의 예입니다.Lambda 컨테이너 이미지는 기존 ZIP 패키지보다 더 많은 원본 자산(10GB와 250MB 이미지 크기)을 포함할 수 있어 더 큰 ML 모델을 사용할 수 있다.
이 예에는 이미지에서 객체를 감지하기 위해 Open Images DatasetTensorFlow 모델을 사용하는 AWS Lambda 함수가 포함되어 있습니다.이미지의 URL을 사용하여/detector API 라우트를 호출하면 이 함수는 이미지를 다운로드하고 TensorFlow 모델로 객체를 감지한 다음 이미지의 주석 버전을 클라이언트에게 반환합니다.
다음은 본 재구매 계약의 파일에 대한 개요입니다.
.
├── .gitignore                         <-- Gitignore for Stackery
├── .stackery-config.yaml              <-- Default CLI parameters for root directory
├── LICENSE                            <-- MIT!
├── README.md                          <-- This README file
├── src
│  └── Recognizer
│     ├── Dockerfile                   <-- Dockerfile for building Recognizer Function
│     ├── font
│     │  ├── Apache License.txt        <-- License for OpenSans font used for annotation labels
│     │  └── OpenSans-Regular.ttf      <-- OpenSans font used for annotation labels
│     ├── handler.py                   <-- Recognizer Function Python source
│     └── requirements.txt             <-- Recognizer Function Python dependencies
└── template.yaml                      <-- SAM infrastructure-as-code template

어떻게


저장소에는 Stackery를 직접 가져와 배포할 수 있는 완전한 예제 스택이 포함되어 있습니다.이 문서의 나머지 부분은 Stackery를 사용하여 자신의 ML 창고를 구축하는 것을 안내할 것입니다.

설치 프로그램

  • 우선, create an AWS account 당신이 없으면.걱정하지 마십시오. 저희가 이 예에서 한 모든 것은 AWS Free Tier의 요구에 부합될 것입니다. 설령 귀하가 무료 등급을 받을 자격이 없다 하더라도, 귀하는 이 예제 창고를 운행할 때 한 푼의 우수리를 쓰게 될 것입니다.
  • 다음으로 free Stackery account를 만듭니다.Stackery를 사용하여 어플리케이션을 구축한 다음 AWS 계정에 배포합니다.
  • Stackery 계정을 만든 후 다음 단계에 따라 AWS 계정을 연결합니다.이는 Stackery 패키지 함수와 생성CloudFormationChange Sets의 권한을 주지만, AWS 계정의 자원을 임의로 수정할 수 있는 권한은 주지 않는다.너는 여기서 더 많은 세부 사항을 찾을 수 있다. Stackery Permissions & Controls.
  • 새 스택 만들기

  • AWS 계정을 연결하면 새로운 창고를 만들 수 있습니다!Stacks로 이동하고 녹색 스택 추가 버튼을 클릭합니다.이것은 새 무제목 창고를 만들 것입니다.

  • 우선, 창고에 이름을 붙여 봅시다.현재 스택 이름 옆에 있는 세 개의 점(현재 이름이 Untitled 또는 Untitled-1과 유사)을 클릭하고 스택 이름 바꾸기를 선택합니다.현재, 이름을 선택하십시오. (ml 이미지 식별이 작동합니다!)저장합니다.
  • 우리가 계속 전진하기 전에 우리는 왜 우리의 진보를 보존하지 않습니까?Git의 녹색 대보존을 클릭하세요...단추를 누르면 가장 좋아하는Git 공급자에게 인증을 하고 창고에 새 리포를 만들고 우리의 시작 창고를 제출합니다.
  • 새 HTTP API 추가

  • 우리는 새로운 창고에 사용할 공백 화포를 보았다.HTTP API를 추가합니다!캔버스의 오른쪽 상단에 있는 녹색에 자원 추가 단추를 누르십시오.팔레트에서 HTTP API 에셋을 클릭하여 스택에 새 API를 추가합니다.팔레트를 닫습니다.

  • 새 HTTP API를 두 번 클릭합니다(참고: GET/route를 두 번 클릭하지 마십시오. 그러면 API 설정이 아닌 라우팅 설정이 열립니다.

  • 경로를 GET/to GET/detector에서 GET/detector로 변경합니다.
  • 설정 패널 아래쪽에 있는 녹색 저장 버튼을 클릭합니다.
  • 새 함수 추가

  • 이제 Lambda 함수를 추가합니다!캔버스의 오른쪽 상단에 있는 녹색 자원 추가 단추를 다시 누르십시오.팔레트에서 함수 에셋을 클릭하여 새 함수를 스택에 추가합니다.팔레트를 닫습니다.
  • 새 기능을 두 번 클릭하여 설정을 편집합니다.

  • 다음 설정을 업데이트합니다.
  • 논리 ID: 식별기와 같은 묘사적인 것들
  • 패키지 유형: Docker Image(이렇게 하면 우리는 대형 ML모델을 우리의 원본 자산에 넣을 수 있습니다!)
  • Docker 컨텍스트 구축:/src/Function에서/src/Recognizer와 유사한 내용으로 업데이트할 수 있습니다.
  • 제한 시간: 120(TensorFlow를 시작하려면 시간이 걸립니다!)
  • 패널 밑에 있는 녹색 대저장 버튼을 누르는 것을 잊지 마세요!

  • 커밋을 클릭하여 스택을 저장합니다..버튼을 누릅니다.template Diff 패널을 열어 AWS SAM 템플릿에 무엇을 추가했는지 확인할 수 있는 좋은 기회입니다.예를 들어 AWS ECR 용기 이미지 저장소와 CodeBuild 프로젝트는 어떻게 구축되어 새로운 기능의 구축과 운행을 지원합니까?
  • 당신의 자료 출처를 편집합니다

  • 이제 소스 코드에 발을 적실 때가 됐어요!가장 좋아하는 편집기/IDE를 사용하여 편집할 수 있는 스택의 Git repo 드롭다운

  • 재구매 프로토콜의 비계는 기능의 원본 폴더와 Dockerfile입니다.이 Dockerfile에는 선택할 수 있는 여러 가지 시작점이 있습니다.Python 함수를 구축하므로 기본 Python Dockerfile 명령을 볼 수 있습니다.그러나 특정 구현을 구성하고 있으므로 Dockerfile의 컨텐트를 삭제하고 다음 컨텐트로 대체합니다.
    # Download the Open Images TensorFlow model and extract it to the `model`
    # folder.
    FROM alpine AS builder
    RUN mkdir model
    RUN wget -c https://storage.googleapis.com/tfhub-modules/google/openimages_v4/ssd/mobilenet_v2/1.tar.gz -O - | tar xz -C model
    # Make sure it's world-readable so the Lambda service user can access it.
    RUN chmod -R a+r model
    
    # Build the runtime image from the official AWS Lambda Python base image.
    FROM public.ecr.aws/lambda/python
    # Copy the extracted Open Images model into the source code space.
    COPY --from=builder model model
    # Copy in the sources.
    COPY handler.py requirements.txt ./
    # Copy the OpenSans font for annotation use
    COPY font ./font
    # Install the Python dependencies
    RUN python3 -m pip install -r requirements.txt
    # Tell the Lambda runtime where the function handler is located.
    CMD ["handler.lambda_handler"]
    

  • 현재, 다음 내용을 필요에 추가해서 Python 의존항을 추가합니다.txt:
    requests
    tensorflow
    Pillow
    

  • 마지막으로 함수 처리 프로그램의 원본 코드를 처리 프로그램에 추가합니다.py:
    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
    # Copyright Stackery, Inc. All Rights Reserved.
    # SPDX-License-Identifier: MIT-0
    
    import base64
    from io import BytesIO
    
    from PIL import Image, ImageDraw, ImageFont
    import requests
    import tensorflow as tf
    
    # Detect and annotate top N objects
    NUM_OBJECTS = 3
    
    # Loading model
    loaded_model = tf.saved_model.load('model')
    detector = loaded_model.signatures['default']
    
    # Loading font
    font = ImageFont.truetype('font/OpenSans-Regular.ttf', 25)
    
    def lambda_handler(event, context):
        # Get image URL from `url` querystring parameter
        r = requests.get(event['queryStringParameters']['url'])
    
        # Detect objects from image
        objects = detect_objects(r.content)
    
        # Annotate objects onto image
        img = annotate_image(r.content, objects)
    
        # Encode image back into original format
        with BytesIO() as output:
            img.save(output, format=img.format)
            body = output.getvalue()
    
        # Send 200 response with annotated image back to client
        return {
            'statusCode': 200,
            'isBase64Encoded': True,
            'headers': {
                'Content-Type': img.get_format_mimetype()
            },
            'body': base64.b64encode(body)
        }
    
    def detect_objects(image_content):
        img = tf.io.decode_image(image_content)
    
        # Executing inference.
        converted_img = tf.image.convert_image_dtype(img, tf.float32)[tf.newaxis, ...]
        result = detector(converted_img)
    
        return [
            {
                # TF results are in [ ymin, xmin, ymax, xmax ] format, switch to [ ( xmin, ymin ), ( xmax, ymax ) ] for PIL
                'box': [ ( result['detection_boxes'][i][1], result['detection_boxes'][i][0] ), ( result['detection_boxes'][i][3], result['detection_boxes'][i][2] ) ],
                'score': result['detection_scores'][i].numpy(),
                'class': result['detection_class_entities'][i].numpy().decode('UTF-8')
            }  for i in range(NUM_OBJECTS)
        ]
    
    def annotate_image(image_content, objects):
        img = Image.open(BytesIO(image_content))
        draw = ImageDraw.Draw(img)
    
        for object in objects:
            # Multiply input coordinates, which range from 0 to 1, to number of pixels
            box = [ ( object['box'][0][0] * img.width, object['box'][0][1] * img.height ), ( object['box'][1][0] * img.width, object['box'][1][1] * img.height ) ]
    
            # Draw red rectangle around object
            draw.rectangle(box, outline='red', width=5)
    
            # Create label text and figure out how much space it uses
            label = f"{object['class']} ({round(object['score'] * 100)}%)"
            label_size = font.getsize(label)
      # Draw background rectangle for label
            draw.rectangle([ box[0], ( box[0][0] + label_size[0], box[0][1] + label_size[1]) ], fill='red')
    
            # Draw label text
            draw.text(box[0], label, fill='white', font=font)
    
        return img;
    
  • 변경 사항을 창고에 저장하고 추가하고 제출하며 전송합니다.
  • 스택 배포

  • 이제 스택을 배치할 때입니다!만약 Stackery CLI (여기 설명에서 설치할 수 있습니다: https://docs.stackery.io/docs/using-stackery/cli#install-the-cli)) 그것은 실행 stackery deploy --git-ref main 처럼 간단합니다. (교환 main 코드가 있는 모든 지점)네비게이션이 창고https://app.stackery.io.에 도착하면 왼쪽 사이드바의 deploy 부분을 네비게이션하여 저희 계기판 인터페이스를 클릭하여 배치할 수 있습니다.
  • 테스트


    브라우저에서 API를 열면 스택을 쉽게 테스트할 수 있습니다.우선, 우리는 당신의 API 도메인 이름을 찾아야 합니다.이 작업은 Stackery CLI 또는 Stackery 대시보드에서 수행할 수 있습니다.

  • Stackery CLI 사용: 배포 후 Stackery CLI는 API 도메인 이름을 인쇄합니다.너도 운행stackery describe을 통해 그것을 찾을 수 있다.

  • Stackery dashboard 사용: 스택https://app.stackery.io으로 이동한 후 Stackery dashboard에서 API의 도메인 이름을 찾을 수 있습니다. 방법은 왼쪽 사이드바의 View 부분으로 이동하는 것입니다.캔버스 뷰에서 API를 두 번 클릭하여 도메인 이름을 찾습니다.
  • 현재 브라우저에서 URL을 필드에 붙이고/detector를 추가해서 API를 엽니까?url=https%3A%2F%2Fimages.페크스.com%2Fphotos%2F310983%2Fpexels-photo-310983.jpeg%3Fauto%3DCompression%26cs%3Dtinysrgb%26dpr%3D2%26h%3D650%26w%3D940.이는 API에 이 이미지를 다운로드하고 가장 자신 있게 식별할 수 있는 세 객체에 주석을 달도록 안내합니다.

    참고: TensorFlow에서 이미지 모델을 로드하고 프로세스를 시작하는 데 1, 2분이 걸릴 수 있습니다.즉, 몇 분 동안 활동하지 않고 API를 처음 사용할 경우 29초 후에 시간이 초과되고 로드가 계속됩니다.함수가 완료될 때까지 실행되지만 HTTP API는 29초 후에 대기를 중지합니다.따라서 URL을 클릭해 보십시오. 몇 번의 시간 초과 후에 결과를 불러올 수 있을 것입니다.Lambda 함수가 따뜻한 상태이면 이미지를 처리하는 데 1초도 걸리지 않습니다.항상 따뜻한 기능을 확보하고 싶다면 첨가Provisioned Concurrency를 고려하지만, 이렇게 하는 것이 좋다cost considerations를 기억해라.

    소리 질러!


    만약 우리가 사람들이AWS,serverless, 또는 이 ML 프로젝트를 구축하는 다른 방면에 대해 더 많이 이해하도록 도와준다면, 우리는 이러한 것을 듣고 매우 기쁠 것이다.만약 네가 이렇게 생각한다면 트위터에 큰 소리로 외쳐라.우리도 기꺼이 당신에게 감사를 드립니다!

    좋은 웹페이지 즐겨찾기