BLOG

AWS 상의 비주얼 써치- Part 2: AWS DeepLens를 사용한 배포
작성일: 2018-09-14

블로그 게시물 시리즈의 1 부에서는 비주얼 검색에 대한 사용 사례와 비주얼 검색 작동 방식에 대해 살펴 보았습니다. 이제 딥 러닝이 가능한 비디오 카메라인 AWS DeepLens를 사용하여 디지털 세계에서 실제 세계로 Part 1의 결과를 확장해 보겠습니다. 현재 비주얼 검색의 대부분의 응용 프로그램은 실시간으로 실제 세계와 직접 상호 작용하지 않습니다. 대신 비주얼 검색은 비주얼 검색 쿼리를 위해 정적 이미지를 전송하는 웹 사이트 및 앱의 디지털 세계에서 발생합니다.

AWS DeepLens를 사용하면 실제 객체와 실시간으로 직접 상호 작용할 수 있습니다. 블로그 게시물 시리즈 중, 이 파트에서는 ​​Part 1에서 만든 모델을 AWS DeepLens 장치에 배포합니다. 이 기기는 백엔드 API 및 웹 애플리케이션과 상호 작용하여 AWS DeepLens 기기에서 표시되는 실제 세계의 실제 항목에 대한 일련의 비주얼 검색 일치를 표시합니다.

 

시스템 구조

아키텍처는 시스템을 만드는 것을 목표로 합니다.

  • 저렴함
  • 쉽고 빠르게 배포
  • 딥 러닝 전문가가 아닌 개발자 및 다른 사람들이 액세스 할 수 있음
  • 상당한 양의 시간과 돈을 들여 교육용 데이터를 수집하고 새 모델을 교육 할 필요가 없으므로 모델 개발에 시간을 절약 할 수 있음

1 부에서 설명한 것처럼 Amazon SageMaker는 feature 벡터를 생성하기 위한 모델을 만드는 데 사용됩니다. 이 모델은 쿼리 이미지와 비교할 참조 비교 이미지 집합을 “featurize” (feature 벡터로 변환)합니다. 이 모델은 잘 알려진 ImageNet 데이터셋에 사전 배치된 기존의 CNN (Convolutional Neural Net) 모델을 수정함으로써 생성되므로 새로운 모델을 처음부터 교육하는 데 드는 시간과 비용을 피할 수 있습니다. 참조 항목을 기능화하는 데 사용 된 것과 동일한 CNN 모델도 AWS DeepLens 장치에 배포됩니다.

시스템이 어떻게 작동하는지 살펴 보겠습니다. 다음 아키텍처 다이어그램을 고려하십시오.

 

실제 항목이 표시되면 AWS DeepLens 장치는 해당 항목을 나타내는 feature 벡터를 생성합니다. 장치에서 생성된 feature 벡터는 AWS IoT Core 서비스를 사용하여 AWS Cloud로 전송됩니다. AWS IoT 규칙은 들어오는 feature 벡터를 AWS DeepLens에서 클라우드 기반 AWS Lambda 함수로 지정하는 데 사용됩니다. 이 검색 Lambda 함수는 feature 벡터를 사용하여 참조 항목 feature 벡터 인덱스를 호스팅하는 Amazon SageMaker 엔드포인트에 요청하여 비주얼로 유사한 항목을 검색합니다. 이 색인은 1 부에서 설명한 것처럼 Amazon SageMaker k-Nearest Neighbors (k-NN) 알고리즘을 사용하여 작성되었습니다. 검색 Lambda 함수는 비주얼로 유사한 참조 항목과 관련이 있는 메타 데이터 (제품 제목, 이미지 URL 등) 를 반환하고 그런 다음 Amazon API 게이트웨이가 리드하는 별도의 API Lambda 함수를 통해 웹 응용 프로그램에서 사용됩니다.

검색을 보다 효율적으로 수행하기 위해 다양한 기술이 사용됩니다. 예를 들어 이전에 발견된 일치 항목을 검색하는 작업은 검색 Lambda 함수가 일치하는 내용을 Amazon ElastiCache Redis를 기반으로 하는 LIFO 대기열의 메모리에 저장하도록 하여 신속하게 처리 할 수 ​​있습니다. 웹 응용프로그램은 LIFO 대기열에 저장된 최신 일치 항목을 읽도록 API Lambda 함수를 호출하여 최신 일치 항목을 찾기 위해 몇 초마다 API를 폴링합니다. ElastiCache Redis를 사용하면 나머지 아키텍쳐에서 웹 응용 프로그램을 분리하여 각기 다른 구성 요소를 개별적으로 수정, 발전 및 확장 할 수 있습니다. 예를 들어, AWS DeepLens 장치는 웹 응용 프로그램이 비주얼로 비슷한 결과를 소비하는 속도와는 다른 속도로 feature 벡터를 생성 할 수 있으며 웹 응용 프로그램은 항상 최신 (오래된 것이 아닌) 일치를 가져올 수 있습니다.

 

AWS DeepLens 프로젝트

(1) Part 1에서 준비한 featurizer 모델과 (2) DeepLens 장치에서 실행되는 Lambda 함수로 AWS DeepLens 프로젝트를 만들어야합니다. 전체 단계별 지침은 이 프로젝트의 GitHub 저장소인 README (github.com/awslabs/visual-search)를 참조하십시오. 다음은 모델과 Lambda 함수를 DeepLens 프로젝트에 결합하기 위해 해야 ​​할 일에 대한 포괄적인 개요입니다.

  1. featherizer 모델을 Amazon S3 버킷에 넣습니다. 이는 AWS DeepLens 서비스가 DeepLens 프로젝트의 일부로 모델을 장치에 배포 할 수 있도록 하는 데 필요합니다.
  2. 모델을 사용하여 feature 벡터를 생성하는 Lambda 함수를 만들고 게시하십시오. 함수를 게시하면 DeepLens 프로젝트의 일부로 AWS DeepLens 장치에 배포 할 수 있습니다.
  3. 마지막으로 모델과 Lambda 함수를 래핑한 AWS DeepLens 프로젝트를 만든 다음 프로젝트를 DeepLens 장치에 배포합니다.

장치에 배포 된 Lambda 함수는 DeepLens Model Optimizer API에 의해 AWS DeepLens GPU에서 실행되도록 최적화된 CNN 모델을 로드합니다. Lambda 함수의 이벤트 루프는 AWS DeepLens 카메라에서 생성된 비디오 프레임을 로드합니다. 비디오 프레임에 표시된 항목에 대한 feature 벡터를 얻으려면, DeepLens awscam.Model API 조치의 doInference 메소드를 호출해야합니다.

AWS DeepLens 프로젝트의 Lambda 함수는 종종 항목의 클래스 (자동차, 보트 등)와 같은 추론을 생성하도록 코딩되지만 직접 코드 수정을 통해 비주얼 검색에 필요한 feature 벡터를 생성하고 반환 할 수 있습니다. 다음 코드 snippet에서 while 루프 내의 코드를 살펴보십시오. AWS DeepLens 장치가 비디오 프레임을 로드하고 CNN 모델에 필요한 모양으로 크기를 조정한 후에는 feature 벡터가 doInference API 호출에 의해 반환된 첫 번째 키 값 쌍의 값으로 간단히 검색됩니다.

import os

import greengrasssdk

import awscam

import mo

import cv2

 

 

client = greengrasssdk.client(‘iot-data’)

iot_topic = ‘$aws/things/{}/infer’.format(os.environ[‘AWS_IOT_THING_NAME’])

 

 

def greengrass_infinite_infer_run():

 

    input_height = 224

    input_width = 224

    model_name = ‘featurizer-v1’

    error, model_path = mo.optimize(model_name, input_width, input_height)

 

    if error != 0:

        client.publish(topic=iot_topic, payload=”Model optimization FAILED”)

    else:

        client.publish(topic=iot_topic, payload=”Model optimization SUCCEEDED”)

 

    model = awscam.Model(model_path, {“GPU” : 1})

    client.publish(topic=iot_topic, payload=”Model loaded SUCCESSFULLY”)

 

    while True:

       

        ret, frame = awscam.getLastFrame()

       

        if not ret:

            client.publish(topic=iot_topic, payload=”FAILED to get frame”)

        else:

            client.publish(topic=iot_topic, payload=”frame retrieved”)

 

        frame_resize = cv2.resize(frame, (input_width, input_height))

        infer_output = model.doInference(frame_resize)

        features_numpy = None

        for _, val in infer_output.iteritems():

            features_numpy = val

 

        features_string = ‘,’.join(str(e) for e in features_numpy)

        msg = ‘{ “features”: “‘ + features_string + ‘” }’

        client.publish(topic=iot_topic, payload=msg)

 

 

greengrass_infinite_infer_run()

 

AWS DeepLens 프로젝트가 DeepLens 장치에 배포 된 후 장치가 feature 벡터를 출력하고 있는지 확인할 수 있어야 합니다. 프로젝트의 다른 구성 요소를 배포하기 전에 이 작업을 수행하는 것이 좋습니다.

적절한 장치 출력을 확인하려면 AWS DeepLens 콘솔로 이동한 다음 장치 탭에서 DeepLens 장치의 목록을 찾습니다. 장치 이름을 선택한 다음 다음 페이지의 가운데 부분으로 이동하여 장치 세부정보 섹션을 찾으십시오. 디바이스에 대한 MQTT 주제를 찾고, 주제 문자열을 복사한 후, 주제 옆에 있는 파란색 정보 링크를 선택하십시오. 유추 출력 작업 페이지에서 하단의 AWS IoT 콘솔 파란색 링크를 선택합니다. 그러면 AWS Greengrass 콘솔로 이동합니다. 여기에서 다음 스크린 샷과 같이 주제 문자열을 Subscription 항목 텍스트 상자에 붙여서 해당 주제에 가입 할 수 있습니다. 비주얼 검색 AWS DeepLens 프로젝트가 기기에 배포되었고 디바이스의 전원이 켜져 있고 네트워크에 연결되어 있음을 가정한다면 프로젝트 배포가 완료되면 몇 분 후에 feature  벡터가 표시됩니다.

기타 구성 요소 배포

Jupyter 노트북 외부의 실제 시나리오에서 비주얼 검색을 배포하려면 최소한 (1) 비주얼로 유사한 내용을 찾는 색인과 (2) 참조 항목 메타데이터의 데이터 저장소가 필요합니다. 이 블로그 게시물 시리즈의 1 부에서는 Amazon SageMaker를 사용하여 색인을 작성했습니다. k-NN 색인은 일치 항목의 ID 만 반환하기 때문에 두 번째 구성 요소가 필요합니다. 메타데이터 데이터 저장소를 사용하면 색인 조회에서 반환된 이미지 ID를 이미지 URL, 제품 제목 및 비주얼로 유사한 검색 결과를 표시하는 기타 메타데이터에 매핑 할 수 있습니다. 논의한 구성 요소 외에도 지원 인프라가 필요합니다.

완전하고 상세한 단계별 지침은 GitHub (github.com/awslabs/visual-search)에 게시되어 있습니다. 다음은 인프라에 대한 간략한 개요입니다.

  • 데이터 저장소 (2 개) : Amazon DynamoDB 테이블을 사용하여 방금 설명한 참조 항목 메타데이터를 저장합니다. 두 번째 데이터 저장소는 ElastiCache Redis입니다. 그것은 최신 일치 정보를 저장하기 위하여 이용됩니다.
  • Lambda 함수 (2 개) : k-NN 인덱스를 호스팅하는 Amazon SageMaker 엔드포인트를 주로 호출하는 검색 Lambda 함수에 대해 살펴 보았습니다. 관련 코드는 github.com/awslabs/visual-search/tree/master/search에 있습니다. 두 번째 Lambda 함수는 일치에 대한 액세스를 제공하는 간단한 RESTful API의 비즈니스 로직을 구현합니다. 코드는 github.com/awslabs/visual-search/tree/master/API에 있습니다.
  • RESTful API 및 웹 응용프로그램 : 앞서 언급한 비즈니스 로직 Lambda 함수 외에도 RESTful API에는 Amazon API 게이트웨이로 생성된 API가 필요합니다. RESTful API는 쿼리 항목에 대해 비주얼로 유사한 항목을 표시하는 웹 애플리케이션에서 액세스합니다. 웹 응용 프로그램 코드는 github.com/awslabs/visual-search/tree/master/web-app에서 확인할 수 있습니다.

이 인프라를 설정한 후에는 DeepLens로 비주얼 검색을 사용해 볼 수 있습니다.

 

결론 및 확장

비주얼 검색 기술은 사람들이 컴퓨팅 장치와 상호 작용하는 방식에 있어서 변형될 수 있는 잠재력을 가지고 있습니다. 결과적으로 비주얼 검색은 활발한 연구 분야입니다. 이 블로그 게시물 시리즈에서 설명하는 비주얼 검색 솔루션은 다양한 방식으로 확장 및 수정 될 수 있습니다.

예를 들어 레이어 수가 다른 여러 가지 CNN 아키텍처, feature 벡터를 저장하는 데 사용되는 다른 유형의 인덱스 또는 특정 사용 사례에 맞게 CNN 자체를 미세 조정할 수 있습니다. 기계 학습의 다른 영역과 마찬가지로 정확도와 계산 시간 사이에 절충점이 있으며 프로젝트에 가장 적합한 절충안을 실험 해 볼 수 있습니다. 또 다른 가능한 확장은 AWS DeepLens 장치가 아닌 다른 카메라 하드웨어를 사용하는 것입니다. AWS Greengrass ML 추론을 사용하면 다양한 유형의 연결된 장치에 해당 모델을 로컬로 배포하고 제공할 수 있습니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/visual-search-on-aws-part-2-deploying-a-visual-search-model-with-aws-deeplens/

** 메가존클라우드 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.