이 자습서를 배포하고 50달러의 AWS 학점을 획득하세요!
23508 단어 tutorialmachinelearningserverless
이 예에는 이미지에서 객체를 감지하기 위해 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 창고를 구축하는 것을 안내할 것입니다.
설치 프로그램
새 스택 만들기
새 HTTP API 추가
새 함수 추가
다음 설정을 업데이트합니다.
당신의 자료 출처를 편집합니다
재구매 프로토콜의 비계는 기능의 원본 폴더와 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 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를 두 번 클릭하여 도메인 이름을 찾습니다.
참고: TensorFlow에서 이미지 모델을 로드하고 프로세스를 시작하는 데 1, 2분이 걸릴 수 있습니다.즉, 몇 분 동안 활동하지 않고 API를 처음 사용할 경우 29초 후에 시간이 초과되고 로드가 계속됩니다.함수가 완료될 때까지 실행되지만 HTTP API는 29초 후에 대기를 중지합니다.따라서 URL을 클릭해 보십시오. 몇 번의 시간 초과 후에 결과를 불러올 수 있을 것입니다.Lambda 함수가 따뜻한 상태이면 이미지를 처리하는 데 1초도 걸리지 않습니다.항상 따뜻한 기능을 확보하고 싶다면 첨가Provisioned Concurrency를 고려하지만, 이렇게 하는 것이 좋다cost considerations를 기억해라.
소리 질러!
만약 우리가 사람들이AWS,serverless, 또는 이 ML 프로젝트를 구축하는 다른 방면에 대해 더 많이 이해하도록 도와준다면, 우리는 이러한 것을 듣고 매우 기쁠 것이다.만약 네가 이렇게 생각한다면 트위터에 큰 소리로 외쳐라.우리도 기꺼이 당신에게 감사를 드립니다!
Reference
이 문제에 관하여(이 자습서를 배포하고 50달러의 AWS 학점을 획득하세요!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rolldy/aws-lambda-container-image-support-tutorial-use-machine-learning-to-detect-objects-in-an-image-jd9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)