Amazon Web Services 한국 블로그

Edge기반 기계 학습: AWS IoT Greengrass를 활용한 이미지 분류 모델 훈련 (Part 1)

지난 re:Invent 2018에서 소개된 AWS IoT Greengrass Image Classification connector를 통해 엣지에서 AWS IoT Greengrass를 활용한 이미지 분류가 훨씬 쉬워졌습니다. AWS IoT Greengrass는 로컬 디바이스에 상주하는 소프트웨어이므로 소스(예: 센서 등)에 가까운 위치에서 데이터를 분석할 수 있으며, AWS IoT Greengrass connector를 사용하면 코드를 작성하지 않고 AWS IoT Greengrass 코어 디바이스를 타사 애플리케이션, 온프레미스 소프트웨어 및 AWS 서비스에 연결이 가능합니다. AWS IoT Greengrass Image Classification connector는 AWS IoT Greengrass 코어 디바이스가 이미지를 여러 범주 중 하나로 분류할 수 있게 해줍니다(예를 들면, 공장에서 마이크로칩을 불량/정상으로 분류, 인벤토리 유형 분류 또는 Instagram에서 팔로우하는 강아지 종류 파악). 이 예측과정을 추론이라고 부릅니다. 이미지 분류와 AWS IoT Greengrass를 조합하면 디바이스가 클라우드에 연결되어 있지 않을 때에도 추론을 수행할 수 있습니다!

AWS IoT Greengrass Image Classification connector가 Amazon SageMakerImage Classification 알고리즘을 사용하여 훈련된 기계 학습 모델을 사용하게 되어 있습니다. 커넥터를 배포하면 예측을 수행하는 데 필요한 모든 Lambda 함수 및 기계 학습 라이브러리(MXNet)가 다운로드되어 AWS IoT Greengrass 코어 디바이스에 자동으로 구성됩니다.

2부로 구성된 이 게시물에서는 이미지 분류를 사용하는 애플리케이션의 생성 예를 통해 처음부터 끝까지 단계별로 살펴봅니다. 1부에서는 Amazon SageMaker를 사용하여 새 이미지 분류 모델을 생성하고 AWS IoT Greengrass Image Classification connector의 사용을 시작합니다. 2부에서는 필드에 데이터를 수집하고, 모델을 재훈련하고, 추론 결과의 변경을 관찰해 봅니다.

구축 내용

이미지 분류의 사용을 통해 해결할 수 있는 실제 세상의 문제로, 재활용 시설에서 음료 용기를 분류하는 작업을 다루어보겠습니다. 우리는 이미지 내의 사물이 맥주잔, 와인병, 커피 머그잔 또는 청량음료 캔인지 식별하도록 모델을 훈련하겠습니다. 또한 이미지가 이러한 분류 중 하나에 속하지 않는 경우를 위해 기타 범주를 포함하겠습니다.

먼저, Caltech 256 데이터세트를 사용하여 이미지 분류 모델을 구축하겠습니다. 그런 다음 AWS IoT Greengrass Image Classification connector를 생성하고 음료 용기 분류를 전담하는 Lambda 함수를 통해 이 커넥터와 상호 작용해 보겠습니다. 1부를 마치면 다음과 같은 아키텍처가 완성됩니다.

사전 조건

이 게시물의 방법을 따라하기 위해서는 다음 항목들이 필요합니다.

  • Raspberry Pi 3 모델 B
  • Raspberry Pi 카메라 모듈 V2 – 8메가픽셀, 1080p

AWS IoT Greengrass 코어 v1.7.0을 실행 중인 Raspberry Pi에 Geengrass 그룹이 배포되어 있는지 확인하십시오. Greengrass 그룹에는 AWSGreengrassResourceAccessRolePolicy 및 AWSGreengrassFullAccess 정책이 연결된 IAM 그룹 역할이 하나 이상 있어야 합니다. 이렇게 설정하기 위해서는 AWS IoT 콘솔을 열고 [Settings]를 선택합니다. 디바이스에 AWS IoT Greengrass를 설정하는 방법에 대한 자세한 내용을 보려면 AWS IoT Greengrass 개발자 가이드의 AWS IoT Greengrass 시작하기를 참조하십시오.

IoT Greengrass Image Classification connector를 사용하려면, 이미지 분류에 사용되는 기계 학습 라이브러리인 MXNet에 대한 필수 종속 라이브러리를 설치해야 합니다. Image Classification connector 설명서를 참고하여 ARMv7에 대해 설명된 설치 스크립트를 수행합니다.

참고: Raspberry Pi에 종속 라이브러리를 설치하려면 스왑 파일 크기를 늘려야 합니다. 권장 설정 크기는 1000입니다. 이 설치 작업은 최대 1시간이 소요될 수 있습니다.

마지막으로, 배포 중에 Raspberry Pi/opencv 관련 문제가 발생하지 않도록 Image Classification connector 설명서의 문제 해결 섹션을 따라 다음 명령을 실행합니다.

$ sudo ln /dev/null /dev/raw1394

이 단계를 수행하는 데 어려움이 있는 경우 AWS IoT Greengrass 설명서의 문제 해결 섹션을 참조하십시오.

애플리케이션 구축 및 테스트

먼저, Pi 카메라를 사용하여 사진을 찍고 이미지 분류 모델을 사용하여 예측을 수행할 수 있는 Lambda 함수를 생성하겠습니다.

Lambda 함수 만들기

Lambda 함수를 하나 생성합니다. GitHub에서 beverageclassifier.py를 새 디렉토리로 다운로드한 다음 AWS IoT Greengrass Machine Learning SDK를 동일한 위치로 다운로드하여 압축 해제합니다. 해당 디렉터리를 .zip 파일로 압축하고 이를 사용하여 AWS Lambda 콘솔에 Lambda 함수를 생성합니다. 이 Lambda 함수를 [beverage_classifier]라고 명명했습니다. AWS IoT 콘솔에서 이 Lambda 함수를 그룹에 추가하고 다음 스크린샷과 같이 128MB의 메모리 제한과 10초의 시간 제한을 가진 장기 수명의 Lambda 함수로 구성합니다. Lambda 함수의 생성 및 패키징에 대한 자세한 내용은 AWS IoT Greengrass 개발자 가이드의 Lambda 함수 생성 및 패키징을 참조하십시오.

Raspberry Pi에서 다음 명령을 실행하여 AWS IoT Greengrass 코어 SDK를 설치합니다.

$ pip install greengrasssdk

Pi 카메라를 사용하려면 Raspberry Pi와 일부 로컬 리소스를 설정해야 합니다. AWS IoT Greengrass 개발자 가이드의 Rasberry Pi 구성Greengrass 그룹에 리소스 추가 섹션에 있는 단계를 따르십시오.

참고로 Image Classification connector와의 상호 작용은 AWS IoT Greengrass Machine Learning SDK를 통해 이루어집니다.

모델 만들기

Amazon SageMaker를 사용하여 이미지 분류 모델을 생성하고 훈련하겠습니다. Amazon SageMaker 콘솔에서 GitHub을 통해 제공된 샘플을 사용하여 노트북을 생성합니다.

1부에 대한 노트북의 지침을 따릅니다. 작업을 완료하면 Image Classification Connector를 구성하는 데 사용될 수 있는 Amazon SageMaker 훈련 작업이 생성됩니다.

Image Classification Connector 구성

훈련 작업이 생성되었으므로 커넥터를 설정할 수 있습니다. 커넥터를 코어 디바이스에 배포하면 이전 단계에서 생성한 Lambda 함수가 이미지 분류 모델을 로컬에서 사용할 수 있게 됩니다.

먼저 Greengrass 그룹에 기계 학습 리소스를 생성하여 시작합니다. 그룹은 AWS IoT 콘솔의 Greengrass 그룹 페이지에서 찾을 수 있습니다. 이 페이지의 [Resources] 아래에서 [Machine Learning] 탭을 선택한 다음 [Add a machine learning resource]를 선택합니다. 다음 스크린샷에 있는 값을 사용하여 필드를 완성합니다. [SageMaker Model]의 경우 이전 단계에서 생성한 Amazon SageMaker 모델을 선택했는지 확인합니다.

[Save]을 선택하고 배포를 생성합니다.

이제 커넥터를 생성할 준비가 되었습니다. Greengrass 그룹으로 이동하여 [Connectors] 탭을 선택한 다음 [Add a connector]를 선택합니다. 이 커넥터를 Raspberry Pi에 배포할 것이므로 [Select a connector]에서 [Image Classification ARMv7 connector]를 선택합니다.

다음 페이지에서는 커넥터에 대한 일부 파라미터를 구성합니다. 먼저 이전 단계에서 생성한 기계 학습 리소스를 선택하고, [Local inference service name]에 beverage-classifier를 입력합니다. 이 이름은 AWS IoT Greengrass Machine Learning SDK를 통해 커넥터를 호출할 때 Lambda 코드에 사용됩니다. 아래 스크린샷에 있는 값을 사용하여 커넥터의 나머지 파라미터를 구성합니다.

[Add]를 선택한 다음 새 배포를 생성합니다. Lambda 함수는 이제 이미지 분류 모델에 액세스할 수 있습니다!

이러한 단계와 관련하여 어려움이 있는 경우에는 Image Classification Connector 설명서의 문제 해결 섹션을 참조하십시오.

구독 구성

커넥터와 Lambda 함수를 설정했으니 이제 애플리케이션과 상호 작용하는 방식을 구현해 보겠습니다. 디바이스가 이미지를 캡처하고 콘솔에서 추론 결과를 볼 수 있도록 AWS IoT 콘솔의 [Test] 페이지를 사용하여 AWS 클라우드와 beverage_classifier Lambda 함수 사이에 구독을 구성합니다. 실제로는 어떤 MQTT 메시지라도 beverage_classifier Lambda 함수를 트리거할 수 있습니다. 이 예에서는 디버깅 피드백을 쉽게 확인하기 위해 AWS IoT 콘솔을 사용하여 이벤트를 트리거하지만 그 외에도 이벤트를 트리거하는 다양한 방법이 존재합니다. 생산 환경에서는 다른 디바이스 또는 Lambda 함수에서 이러한 MQTT 이벤트를 전송할 수 있습니다. (Greengrass 코어 디바이스가 클라우드로부터 연결 해제된 상태에서도 디바이스와 코어 디바이스 사이에 메시지를 전송할 수 있습니다!) 사용 사례에 따라 AWS IoT 작업도 Greengrass 코어 디바이스와 상호 작용할 수 있는 방식을 제공합니다.

AWS IoT 콘솔에서 그룹에 대해 다음과 같은 구독을 구성합니다.

  1. beverage_classifier Lambda (대상)의 /request/classify/beverage_container(주제)에 대한 AWS IoT 클라우드(소스)의 구독. 이 주제의 메시지가 Lambda 코드를 트리거합니다.
  2. AWS IoT 클라우드(대상)의 /response/prediction/beverage_container(주제)에 대한 beverage_classifier Lambda(소스)의 구독. 이 메시지는 AWS IoT 콘솔에 표시되고 예측을 보고합니다.

로컬 리소스 설정

캡처한 이미지를 저장할 로컬 디렉터리에 대한 볼륨 리소스를 구성합니다.

배포하기 전에 디바이스에 /home/ggc_user/raw_field_data 디렉터리를 생성해야 합니다. ggc_user에게 읽기 및 쓰기 권한도 부여해야 합니다.

$ sudo mkdir -p /home/ggc_user/raw_field_data
$ sudo chown -R ggc_user:ggc_group /home/ggc_user/raw_field_data/

아니면 음료 분류기 AWS IoT Greengrass Lambda 함수 구성에서 [Run as] 필드를 설정하여 자신의 사용자 ID/그룹 ID에 권한을 부여할 수도 있습니다. 자세한 내용은 AWS IoT Greengrass 개발자 가이드의 그룹별 구성을 사용한 Greengrass Lambda 함수 실행 제어를 참조하십시오.

자, 이제 배포를 생성합니다.

테스트

이제 모든 설정을 마쳤으므로 음료 용기 분류기를 테스트해 보겠습니다. AWS IoT 콘솔에서 [Test]를 선택하고 /response/prediction/beverage_container 주제를 구독합니다. /request/classify/beverage_container 주제에 게시하면 이미지가 캡처 및 분류됩니다! 커피 머그잔, 맥주잔, 와인병 또는 청량음료 캔을 Pi 카메라 앞에 놓고 [Publish to topic]을 선택합니다. 코어 디바이스가 이미지를 캡처하고 예측을 수행한 다음 결과를 AWS IoT 콘솔에 반환합니다.

결론

테스트는 Caltech 256 데이터 세트의 한계 내에서 시연되어 예측결과가 틀렸거나 신뢰도가 낮을 수 있습니다. 이 테스트에서는 맥주잔을 제외한 모든 대상에 신뢰도가 낮거나 잘못된 예측이 제공되는 것이 확인되었습니다.

 

이 모델의 정확도를 개선할 수 있다면 좋을 것입니다. 2부에서는 기존에 보유한 이미지를 수집하도록 이 애플리케이션을 확장하고 모델 재훈련을 통해 성능 개선을 시도해 보겠습니다!

– Mark Mevorah;