제퍼넷 로고

AWS 머신 러닝 및 IoT 서비스로 잔디 모니터 및 잡초 감지 솔루션 구축

시간

신규 주택 구매자에게는 잔디 문제를 효과적으로 관리하는 방법을 이해해야합니다. 이제 당신이 농부라면 많은 에이커의 땅에서 이것을해야한다고 상상해보십시오. 농부로서, 당신이 일반적으로 겪는 어려움 중 일부는 언제 (물을 마시기에 적절한시기), 어디에 (정확하게 물을 주거나 비료를 첨가하는 곳) 및 방법 (잡초를 ​​다루는 방법). WSSA (Weed Science Society of America)가 수행 한 연구에서 통제되지 않은 잡초로 인한 옥수수 및 대두 작물의 총 손실은 연간 총 43 억 달러에 이릅니다. 자세한 내용은 WSSA, 통제되지 않은 잡초로 인한 잠재적 경제적 손실에 대한 수십억 달러 계산 WSSA 웹 사이트에서.

이 문제를 해결하기 위해 컴퓨터 비전 및 머신 러닝 (ML) 분야에서 최신 기술과 기술을 사용할 수 있다면 어떨까요?

이것은 해결해야 할 복잡한 문제이며 많은 기업들이 솔루션을 개발하고 있습니다. 이 게시물에서는 AWS Starter Kit를 사용하여 솔루션을 시작하고 구축하는 방법을 설명합니다. 이 솔루션에는 두 가지 구성 요소가 있습니다.

  • 이미지 분류를 이용한 잡초 감지 AWS 딥렌즈
  • AWS IoT를 사용하여 잔디 상태 (토양 수분 수준, 생식 수준 및 햇빛)에 대한 거의 실시간 모니터링

사전 조건

이 솔루션을 구현하려면 다음 전제 조건이 있어야합니다.

이미지 분류를 사용하여 잡초 감지

제초제 저항성이 점점 더 일반화됨에 따라 잡초 방제가 농업 분야에서 더욱 중요 해지고있다. 농장 생산성을 높이기 위해 잡초를 감지하고 조기에 예방 조치를 취하는 것이 중요합니다. 이제 AWS DeepLens에서 가능합니다. AWS DeepLens는 개발자를위한 세계 최초의 딥 러닝 지원 비디오 카메라입니다. AWS DeepLens를 사용하면 완전히 프로그래밍 가능한 비디오 카메라, 자습서, 코드 및 딥 러닝 기술을 확장하도록 설계된 사전 훈련 된 모델을 사용하여 몇 분 안에 시작할 수 있습니다. 또한 딥 러닝 모델을 기반으로 컴퓨터 비전 응용 프로그램을 개발하기위한 최신 인공 지능 (AI) 도구 및 기술을 배우고 탐색 할 수 있습니다.

AWS DeepLens를 사용하면 이미지를 잡초 또는 풀로 실시간 분류 할 수 있습니다. 또한 AWS DeepLens를 마이크로 컨트롤러에 연결하여 잡초를 제거하기 위해 스프레이를 트리거 할 수 있습니다.

이 게시물에서는 이미지 분류 알고리즘을 사용하여 잡초를 감지하는 방법을 보여줍니다. 아마존 세이지 메이커. Amazon SageMaker는 완전 관리 형 ML 서비스입니다. Amazon SageMaker를 사용하면 ML 모델을 빠르고 쉽게 구축 및 교육 할 수 있으며 프로덕션 지원 호스팅 환경에 직접 배포 할 수 있습니다. 탐색 및 분석을 위해 데이터 소스에 쉽게 액세스 할 수있는 통합 Jupyter 노트북을 제공하므로 서버를 관리 할 필요가 없습니다. 이 게시물에서는 Amazon SageMaker의 완전 관리 형 주문형 교육 인프라에서 모델을 교육하는 방법을 보여줍니다. 또한 훈련 된 모델을 AWS DeepLens에 배포하는 방법도 보여줍니다.

다음 아키텍처 다이어그램은 잡초 감지 솔루션에 대한 고급 개요를 제공합니다.

이 솔루션은 Amazon SageMaker의 이미지 분류 알고리즘을 사용합니다. 전학 학습 모드 사전 훈련 된 모델 (ImageNet 데이터에 대해 훈련 된)을 미세 조정하여 새 데이터 세트를 분류합니다. 전송 학습을 통해 모델을 처음부터 교육해야하는 경우보다 훨씬 적은 데이터로 딥 네트워크를 교육 할 수 있습니다. 전이 학습에서는 본질적으로 모델이 이전 작업에서 배운 지식을 현재 작업으로 이전합니다. 아이디어는 두 가지 작업이 분리되어 있지 않으며, 직접 학습하지 않고도 광범위한 교육을 통해 모델이 학습 한 모든 네트워크 매개 변수를 사용할 수 있습니다.

아키텍처에는 다음 단계가 포함됩니다.

  1. 잡초와 풀로 구성된 이미지의 데이터 세트를 로컬 컴퓨터에 다운로드하십시오. 이미지를 로컬 컴퓨터의 두 개의 개별 폴더로 구성하십시오.
  2. RecordIO 도구를 사용하여 두 개의 .lst 파일 작성 im2rec. 하나의 파일은 데이터 세트의 훈련 부분 (80 %)을위한 것입니다. 다른 하나는 테스트 용입니다 (20 %). 자세한 내용은 RecordIO를 사용하여 데이터 세트 생성 MXNet 웹 사이트에서
  3. 둘 다 생성 .rec 에서 파일을 .lst 파일과 둘 다 복사 .rec 파일 (훈련 및 유효성 검사 이미지) 아마존 S3
  4. 전송 학습 모드에서 Amazon SageMaker 이미지 분류 알고리즘을 사용하여 모델을 학습하십시오.
  5. 모델을 학습 한 후 교육 작업은 모델 아티팩트를 S3 버킷에 업로드합니다. 또는 에지에서 실시간 추론을 위해 훈련 된 모델을 AWS DeepLens에 배포하십시오.

다음 섹션에서는 솔루션의 자세한 구현에 대해 설명합니다.

데이터 세트 이해

XNUMXD덴탈의 분무기 열기 Kaggle 웹 사이트의 이미지 데이터 세트에는 넓은 잎이 달린 도크 (잡초) 사진과 넓은 잎이있는 도크 (잔디)가없는 땅 사진이 포함됩니다. 데이터 세트는 1,306 개의 잡초 이미지와 5,391 개의 풀 이미지와 함께 제공되며, 일반적인 크기는 약 256 픽셀 x 256 픽셀입니다. 데이터 세트는 권장 열차 / 유효 분할을 제공합니다. 다음 이미지는 잡초 및 잔디 이미지 모음입니다.

이미지 데이터 세트 준비

이 게시물에서는 다음을 사용하여 이미지 분류에 RecordIO 파일 형식을 사용하는 방법을 보여줍니다. 파이프 모드. 파이프 모드에서 교육 작업은 Amazon S3에서 직접 데이터를 스트리밍합니다. 파이프 모드를 사용하면 아마존 EBS 훈련 인스턴스에 대한 볼륨. 자세한 내용은 Amazon SageMaker 알고리즘에 파이프 입력 모드 사용. 이미지 또는 알고리즘을 파일 또는 파이프 입력 모드와 함께 사용할 수 있습니다. 파이프 모드는 큰 데이터 세트에 권장되지만 파일 모드는 메모리에 맞는 작은 파일 및 알고리즘에 많은 에포크가있는 파일에 여전히 유용합니다.

MXNet은 im2rec 데이터 세트를위한 RecordIO 파일을 생성합니다. 도구를 사용하기 위해 이미지 세트를 설명하는 목록 파일을 제공합니다. 에 대한 자세한 내용 im2rec,를 참조하십시오 im2rec GitHub 저장소.

이미지 데이터 세트를 준비하려면 로컬 Python 인터프리터 또는 Amazon SageMaker의 Jupyter 노트북을 통해 다음 단계를 완료하십시오. 이미지 데이터 세트를 저장 한 경로에서이 단계를 실행합니다.

  1. 를 사용하여 리스팅 파일 생성 im2rec.py. 다음 코드를 참조하십시오.
    python3 im2rec.py --list --recursive --train-ratio .75 --test-ratio .25 </path/to/folder>

  2. 사용 im2rec 다음 코드를 입력하여 RecordIO 파일을 작성하는 유틸리티 :
    python3 im2rec.py --num-thread 2 --resize 50 --quality 80 </path/to/folder>

    im2rec 다음 매개 변수를 사용합니다.

    • 명부 – im2rec는 루트 폴더를 통과하여 이미지 목록을 만들고 .lst.
    • 재귀 – 하위 디렉토리를 재귀 적으로 살펴보고 각 폴더의 이미지에 고유 한 레이블을 지정합니다.
    • 열차비 – 훈련에 사용할 이미지 비율.
    • 시험비 – 테스트에 사용할 이미지 비율.
    • 숫자 스레드 – 인코딩에 사용할 스레드 수. 이 값이 클수록 처리 속도가 빨라집니다.
    • 크기 조정 – 이미지의 짧은 가장자리를 새로운 크기로 조정하십시오. 원본 이미지는 기본적으로 압축되어 있습니다.
    • 품질 – 인코딩 용 JPEG 품질, 1–100; 또는 인코딩을위한 PNG 압축, 1–9 (기본값 : 95).

자세한 내용은 다음 링크를 참조하세요 MXNet의 간편함 : im2rec 및 데이터 로딩 기능이있는 이미지 RecordIO.

코드 구현

솔루션의 각 단계를 설명하기 위해이 게시물에서는 Jupyter 노트북을 사용합니다. GitHub 레포.

S3 버킷 설정

S3 버킷을 생성하여 훈련 및 검증 파일을 RecordIO 형식 및 모델 아티팩트로 업로드하십시오. 사용 default_bucket() 의 세션 매개 변수 SageMaker Python SDK. S3 버킷을 수동으로 생성하는 방법에 대한 지침은 버킷 만들기.

bucket = sagemaker.Session().default_bucket()

RecordIO 파일은 이미지 분류 알고리즘에 대한 입력으로 사용됩니다. 학습 데이터는 train이라는 서브 디렉토리 안에 있어야하고 유효성 검증 데이터는라는 서브 디렉토리 안에 있어야합니다. validation:

def upload_to_s3(channel, file): s3 = boto3.resource('s3') data = open (file, "rb") key = channel + '/' + file s3.Bucket(bucket).put_object(Key=key, Body=data) s3_train_key = "image-classification-transfer-learning/train"
s3_validation_key = "image-classification-transfer-learning/validation"
s3_train = 's3://{}/{}/'.format(bucket, s3_train_key)
s3_validation = 's3://{}/{}/'.format(bucket, s3_validation_key) upload_to_s3(s3_train_key, 'Data_train.rec')
upload_to_s3(s3_validation_key, 'Data_test.rec')

자세한 내용은를 참조 GitHub 레포.

Amazon SageMaker 내장 알고리즘을 사용하여 이미지 분류 모델 교육

Amazon S3에서 사용 가능한 이미지를 사용하여 모델을 학습 할 수 있습니다. 이 게시물에는 관심있는 몇 가지 하이퍼 파라미터가 있습니다.

  • 수업 및 교육 샘플 수
  • 배치 크기, 에포크, 이미지 크기 및 사전 훈련 된 모델

자세한 내용은 다음 링크를 참조하세요 이미지 분류 하이퍼 파라미터.

Amazon SageMaker 이미지 분류 알고리즘을 사용하려면 ml.p2.xlarge와 같은 GPU 인스턴스 유형에서 모델을 학습해야합니다. 하이퍼 파라미터를 다음 값으로 설정하십시오.

  • num_layers = 18. 네트워크의 레이어 수 (깊이). 이 게시물은 18을 사용하지만 50 및 152와 같은 다른 값을 사용할 수 있습니다.
  • image_shape = 3,224,224. 입력 이미지 치수, num_channels네트워크의 높이, 너비 및 너비 실제 이미지 크기보다 크지 않아야합니다. 채널 수는 실제 이미지와 같아야합니다. 이 게시물은 3, 224, 224의 이미지 크기를 사용하며 이는 ImageNet 데이터 세트와 유사합니다.
  • num_training_samples = 4520. 입력 데이터 세트의 교육 예제 수
  • num_classes = 2. 새 데이터 세트의 출력 클래스 수 이 게시물은 잡초와 잔디라는 두 가지 객체 범주가 있기 때문에 2를 사용합니다.
  • mini_batch_size = 128. 각 미니 배치에 사용 된 교육 샘플 수입니다.
  • epochs = 10. 훈련 신기원의 수.
  • learning_rate =001. 훈련을위한 학습 속도.
  • top_k = 2. 훈련 중 최고 정확도를보고합니다. 최상위 교육 정확도는 이미보고 된 일반 교육 정확도와 동일하므로이 매개 변수는 1보다 커야합니다.
  • use_pretrained_model = 1. 로 설정 1 전학 학습을 위해 사전 훈련 된 모델을 사용합니다.

Amazon S3에 데이터 세트를 업로드하고 하이퍼 파라미터를 설정 한 후 Amazon SageMaker를 사용하여 교육을 시작할 수 있습니다 CreateTrainingJob API. 훈련에 RecordIO 형식을 사용하고 있으므로 훈련 및 검증 채널을 모두 InputDataConfig 의 매개 변수 CreateTrainingJob 의뢰. 기차 채널에 하나의 RecordIO (.rec) 파일과 유효성 검사 채널에 하나의 RecordIO 파일을 지정합니다. 두 채널의 컨텐츠 유형을 application / x-recordio로 설정하십시오. 다음 코드를 참조하십시오.

"InputDataConfig": [ { "ChannelName": "train", "DataSource": { "S3DataSource": { "S3DataType": "S3Prefix", "S3Uri": s3_train, "S3DataDistributionType": "FullyReplicated" } }, "ContentType": "application/x-recordio", "CompressionType": "None" }, { "ChannelName": "validation", "DataSource": { "S3DataSource": { "S3DataType": "S3Prefix", "S3Uri": s3_validation, "S3DataDistributionType": "FullyReplicated" } }, "ContentType": "application/x-recordio", "CompressionType": "None" } ]

훈련 작업이 완료되면 다음 메시지가 표시됩니다.

Training job ended with status: Completed

출력 모델은 다음에 의해 지정된 출력 경로에 저장됩니다 training_params['OutputDataConfig']:

"OutputDataConfig": { "S3OutputPath": 's3://{}/{}/output'.format(bucket, job_name_prefix)

모델 교육에 대한 전체 코드는 GitHub 레포.

실시간 추론을위한 모델 배포

이제 모델을 사용하여 추론을 수행하려고합니다. 이 게시물의 경우 이미지를 잡초 또는 풀로 예측하는 것을 의미합니다.

이 섹션에는 다음 단계가 포함됩니다.

  1. 학습 결과에 대한 모델을 작성하십시오.
  2. 실시간 추론을위한 모델을 호스팅합니다. 추론 끝점을 만들고 실시간 추론을 수행합니다. 이것은 다음 단계로 구성됩니다.
    1. 엔드 포인트를 정의하는 구성을 작성하십시오.
    2. 구성을 사용하여 추론 끝점을 만듭니다.
    3. 엔드 포인트를 사용하여 일부 입력 데이터에 대한 추론을 수행하십시오.

모델 만들기

다음 Python 코드를 사용하여 교육 결과에서 SageMaker 모델을 작성하십시오.

model_name="deeplens-image-classification-model"
info = sage.describe_training_job(TrainingJobName=job_name)
model_data = info['ModelArtifacts']['S3ModelArtifacts']
print(model_data) hosting_image = get_image_uri(boto3.Session().region_name, 'image-classification') primary_container = { 'Image': hosting_image, 'ModelDataUrl': model_data,
} create_model_response = sage.create_model( ModelName = model_name, ExecutionRoleArn = role, PrimaryContainer = primary_container) print(create_model_response['ModelArn'])

실시간 추론

이제 엔드 포인트로 모델을 호스팅하고 실시간 추론을 수행 할 수 있습니다.

엔드 포인트 구성 작성

Amazon SageMaker 호스팅 서비스가 모델을 배포하는 데 사용하는 엔드 포인트 구성을 생성하십시오. 다음 코드를 참조하십시오.

endpoint_config_name = job_name_prefix + '-epc-' + timestamp
endpoint_config_response = sage.create_endpoint_config( EndpointConfigName = endpoint_config_name, ProductionVariants=[{ 'InstanceType':'ml.m4.xlarge', 'InitialInstanceCount':1, 'ModelName':model_name, 'VariantName':'AllTraffic'}])

엔드 포인트 생성

이전에 정의한 이름과 구성을 지정하여 모델을 제공하는 엔드 포인트를 작성하십시오. 결과적으로 검증하고 프로덕션 애플리케이션에 통합 할 수있는 엔드 포인트가됩니다. m9.xlarge 인스턴스에서 완료하는 데 약 11-4 분이 걸립니다. 다음 코드를 참조하십시오.

endpoint_name = job_name_prefix + '-ep-' + timestamp
print('Endpoint name: {}'.format(endpoint_name)) endpoint_params = { 'EndpointName': endpoint_name, 'EndpointConfigName': endpoint_config_name,
}
endpoint_response = sagemaker.create_endpoint(**endpoint_params)

다음 코드를 사용하여 엔드 포인트를 작성하십시오.

response = sagemaker.describe_endpoint(EndpointName=endpoint_name)
status = response['EndpointStatus']
print('EndpointStatus = {}'.format(status))
# wait until the status has changed
sagemaker.get_waiter('endpoint_in_service').wait(EndpointName=endpoint_name)
# print the status of the endpoint
endpoint_response = sagemaker.describe_endpoint(EndpointName=endpoint_name)
status = endpoint_response['EndpointStatus']
print('Endpoint creation ended with EndpointStatus = {}'.format(status)) if status != 'InService': raise Exception('Endpoint creation failed.')

엔드 포인트 구성 및 상태를 확인할 수 있습니다. 종점 Amazon SageMaker 콘솔에서

이제 엔드 포인트를 호출 할 수있는 런타임 오브젝트를 작성할 수 있습니다.

추론 수행

사용할 모델의 유효성을 검증하려면 이전 조작의 결과를 사용하여 클라이언트 라이브러리에서 엔드 포인트를 확보하고 해당 엔드 포인트를 사용하여 훈련 된 모델에서 분류를 생성하십시오. 이 코드는 아래 테스트를 위해 잡초 샘플 이미지를 사용합니다. 다음 코드를 참조하십시오.

runtime = boto3.Session().client(service_name='runtime.sagemaker')
file_name = 'rsz_photo-1.jpg'
# test image
from IPython.display import Image
Image(file_name)

import json
import numpy as np
with open(file_name, 'rb') as f: payload = f.read() payload = bytearray(payload)
response = runtime.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=payload)
result = response['Body'].read()
# result will be in json format and convert it to ndarray
result = json.loads(result)
# the result will output the probabilities for all classes
# find the class with maximum probability and print the class index
index = np.argmax(result)
object_categories = ['weed','grass']
print("Result: label - " + object_categories[index] + ", probability - " + str(result[index])) Result: label - weed, probability - 0.9998767375946045

AWS DeepLens를 사용하여 엣지에서 모델 실행

AWS DeepLens를 사용하면 엣지에서 딥 러닝을 실험 할 수 있으므로 훈련 된 모델을 쉽게 배포하고 Python 코드를 사용하여 흥미로운 애플리케이션을 만들 수 있습니다. 잡초 식별자의 경우 잔디밭이 내려다 보이는 전선에 AWS DeepLens 디바이스를 장착 할 수 있습니다. 장치는 감지 된 잡초 및 자르기의 자른 이미지를 Amazon S3에 공급합니다. 잡초를 감지하면 휴대폰으로 문자를 보낼 수도 있습니다.

AWS DeepLens 프로젝트는 훈련 된 모델과 AWS 람다 함수. 이 기능은 AWS IoT 그린그래스 AWS DeepLens에서 다음 작업을 수행합니다.

  • 비디오 스트림에서 이미지 캡처
  • 배포 된 ML 모델에 대해 해당 이미지를 사용하여 추론 수행
  • AWS IoT 및 출력 비디오 스트림에 결과 제공

AWS IoT Greengrass를 사용하면 Lambda 기능을 로컬에서 실행할 수 있으므로 내장 소프트웨어 개발의 복잡성이 줄어 듭니다. 자세한 내용은 AWS DeepLens 추론 Lambda 함수 생성 및 게시.

Amazon SageMaker에서 생성 한 사용자 지정 이미지 분류 모델을 사용하면 AWS DeepLens 추론 Lambda 함수에 추가 단계가 있습니다. 추론 함수는 MXNet을 호출해야합니다. 모델 최적화 모델을 사용하여 추론을 수행하기 전에. 모델을 최적화하고로드하려면 다음 코드를 참조하십시오.

model_path = '/opt/awscam/artifacts/image-classification.xml'
error, model_path = mo.optimize(model_name,224,224,aux_inputs={'--epoch':10}) model = awscam.Model(model_path, {'GPU': 1})

AWS DeepLens에서 모델 추론 수행

Lambda 함수의 모델 유추는 Amazon SageMaker 호스팅 엔드 포인트를 사용하여 모델을 호출하는 이전 단계와 매우 유사합니다. 다음 Python 코드는 AWS DeepLens 비디오 카메라가 제공하는 프레임에서 잡초와 풀을 찾습니다.

frame_resize = cv2.resize(frame, (512, 512)) # Run the images through the inference engine and parse the results using
# the parser API. Note it is possible to get the output of doInference
# and do the parsing manually, but since it is a ssd model,
# a simple API is provided.
parsed_inference_results = model.parseResult( model_type, model.doInference(frame_resize))

이 이미지 분류 모델과 함께 AWS DeepLens에서 사용할 전체 추론 Lambda 함수에 대한 자세한 내용은 GitHub 레포. Lambda 함수는 AWS IoT Greengrass SDK를 사용하여 IoT 주제에 대한 텍스트 기반 출력을 JSON 형식으로 게시합니다. 여기에 IoT Console에서 출력을 보는 방법에 대한 지침.

아래 그림은 샘플 설정을 보여줍니다.

농장 상황에 대한 거의 실시간 모니터링

적절한 양의 물과 영양분이 농장 생산성을 향상시키는 데 중요합니다. 이를 달성 할 수있는 방법 중 하나는 현장의 실시간 모니터링을 통해 물과 비료 소비에 대한 비용을 절약하는 것입니다. 실시간 모니터링에서 수집 된 정보는 토양에 물을 공급하거나 비옥 할시기와 장소를 식별하는 데 도움이됩니다.

토양 상태를 모니터링하기 위해이 포스트는 2 개의 토양 센서를 사용하고 1 피트 x XNUMX 피트 식물 층의 패치를 모니터링했습니다. 이 센서는 토양의 현재 수분 수준과 비옥도, 수광량 및 주변 온도를 감지 할 수 있습니다. Bluetooth가 활성화 된 Raspberry Pi를 통해이 정보를 수집합니다. 실제 생산을 위해서는 LoRa와 같은 훨씬 더 긴 범위의 프로토콜을 사용해야합니다. Raspberry Pi는 센서를 폴링하고이 정보를 수집하여 AWS IoT 코어. IoT 규칙을 사용하여 데이터를 수집하여 전달 Amazon Kinesis 데이터 분석 실시간 분석을 위해. 이제 팜의 특정 부분에 대한 수분 수준이 임계 값 아래로 떨어지면 경고 알림이 트리거됩니다. 이 정보를 사용하여 스프링클러 시스템 제어를 자동화 할 수도 있습니다.

이 시스템에는 또한 현지 기상 조건을 폴링하기위한 내장 로직이 있습니다. 이 정보를 사용하여 스프링클러를 언제, 언제 켜야할지 결정할 수 있습니다.

아키텍처

다음 다이어그램은이 워크 플로의 아키텍처를 보여줍니다.

아키텍처에는 다음과 같은 고급 단계가 포함됩니다.

  • Raspberry Pi는 Edge Gateway 장치 역할을하며 Bluetooth를 통해 토양 수분 센서에서 정보를 수집합니다.
  • 인증 후 Raspberry Pi는 IoT 주제를 구독하고 해당 주제에 메시지를 게시하기 시작합니다.
  • IoT 규칙 엔진을 사용하면 데이터가 아마존 키네 시스 데이터 파이어 호스영구 저장 소용 Amazon S3와 실시간 처리를위한 Kinesis Data Analytics의 두 대상이 있습니다.
  • Kinesis Data Analytics의 출력은 Lambda 함수이며 수분 수준이 임계 값 아래로 떨어질 때 SNS 경고를 트리거합니다.
  • 마지막으로 Amazon S3 데이터를 사용하여 아마존 퀵 사이트

이 아키텍처를 준비하려면 Raspberry Pi 및 토양 수분 센서가 필요합니다.

IoT 장치 설정

데이터를 생성하도록 Raspberry Pi를 설정하려면 다음 단계를 완료하십시오.

  1. Raspberry Pi를 구성하고 AWS IoT에 연결하십시오. 자세한 내용은 Raspberry Pi에서 AWS IoT SDK 사용을 참조하십시오.
  2. 최신 버전의 Python 다운로드 AWS IoT SDK SSH 또는 PuTTY의 명령 프롬프트로 Raspberry Pi에서. pip3 프로그램 명령을 사용할 수 있습니다. 다음 코드를 참조하십시오.
    pip3 install AWSIoTPythonSDK

    Python 3.4 이상을 사용하십시오. 블트랩 miflora 센서에 사용되는 라이브러리는 Python 3.4 이상에서만 작동합니다.

  3. miflora 센서 라이브러리를 다운로드하여 다음 코드로 센서와 통신하십시오.
    pip3 install miflora

    이 코드는 또한 miflora에 필요한 bltewrap 라이브러리를 자동으로 다운로드합니다. 자세한 내용은 GitHub 레포.

  4. 다음에서 farmbot.py 스크립트를 다운로드하십시오. GitHub의 다음 매개 변수를 업데이트하십시오.
    • clientID – IoT 및 IoT 섀도 클라이언트 ID (1 단계)
    • 구성 엔드포인트 – AWS Management Console의 IoT 및 IoT 섀도 엔드 포인트
    • 구성 자격 증명 – Raspberry Pi의 IoT 및 IoT 섀도 자격 증명 위치 (1 단계)
    • 센서 – 센서의 mac 주소 값 업데이트
  1. Raspberry Pi에 SSH를 연결하고 Python py 스크립트를 시작하십시오. 이 스크립트는 이전 단계에서 구성된 토양 수분 센서를 폴링합니다. 다음 코드를 참조하십시오.
    python3 farmbot.py

Lambda 변환을 사용하여 Firehose 전송 스트림 생성

이 게시물은 아마존 키네 시스 데이터 파이어 호스 데이터를 스트리밍하는 전송 스트림. Firehose 전송 스트림의 데이터를 Kinesis Data Analytics에 대한 입력으로 사용하고 Amazon S3에 저장하여 아마존 퀵 사이트 계기반. 전달 스트림을 작성하려면 다음 단계를 완료하십시오.

  1. Kinesis Data Firehose 콘솔에서 배달 스트림 만들기.
  2. Firehose 배송 스트림 만들기 이름이 적힌 IoT-data-Stream.
  3. 소스를 기본값으로 선택하십시오 직접 PUT 또는 기타 소스 떠난다. 서버 측 암호화 기본적으로 선택되어 있지 않습니다.
  4. 왼쪽 메뉴에서 다음 보기
  5. 럭셔리 AWS Lambda에 대한 소스 레코드 변환, 고르다 사용.
  6. 왼쪽 메뉴에서 새로 만들기.
  7. 이 Lambda 함수를 사용하여 전송 스트림에서 Amazon S3로 전송 된 데이터의 각 레코드 끝에 줄 바꾸기 문자를 추가하십시오. 자세한 내용은 GitHub 레포.

Amazon QuickSight에서 시각화를 생성하는 데 필요합니다. 다음 코드를 참조하십시오.

'use strict';
console.log('Loading function'); exports.handler = (event, context, callback) => { /* Process the list of records and transform them */ /* The following must be the schema of the returning record Otherwise you will get processing-failed exceptions {recordId: <id>, result: 'Ok/Processing/Failed', data: <base64 encoded JSON string> } */ const output = event.records.map((record) => ({ /* This transformation is the "identity" transformation, the data is left intact */ recordId: record.recordId, result: 'Ok', data: record.data+"Cg==", })); console.log(`Processing completed. Successful records ${output.length}.`); callback(null, { records: output });
};

  1. 럭셔리 레코드 형식 변환, 사용 안함을 선택하십시오.
  2. 왼쪽 메뉴에서 다음 보기.
  3. 럭셔리 목적지선택한다. 아마존 S3.
  4. 이름이 지정된 새 S3 버킷을 만듭니다. <your unique name>-kinesis.
  5. 다른 모든 필드는 기본값으로 유지하십시오.
  6. 왼쪽 메뉴에서 다음 보기.
  7. $XNUMX Million 미만 S3 버퍼 조건에 대한 버퍼 간격, 입력 60 초.
  8. 럭셔리 버퍼 크기, 입력 1 MB.
  9. 왼쪽 메뉴에서 IAM 역할 생성. Kinesis Data Firehose는이 역할을 사용하여 버킷에 액세스합니다.
  10. 다른 모든 필드는 기본값으로 유지하십시오.
  11. 왼쪽 메뉴에서 다음 보기.
  12. 모든 필드를 검토하고 선택하십시오 배달 스트림 만들기.

전송 스트림으로 데이터를 전달하도록 AWS IoT 설정

전달 스트림으로 데이터를 전달하려면 다음 단계를 완료하십시오.

  1. AWS IoT Core 콘솔에서 행동.
  2. 왼쪽 메뉴에서 규칙 만들기.
  3. 새로운 AWS IoT 규칙 생성 다음 필드 값으로
     Name: 'IoT_to_Firehose' Attribute :' * ' Rule Querry Statement : SELECT * FROM 'farmbot/#' Add Action : " Send messages to an Amazon Kinesis Data Firehose stream (select IoT-Source-Stream from the Stream name dropdown)" Select Separator: " n (newline) "

  4. IAM 역할에 대해 새로운 역할 만들기.

콘솔은 AWS IoT가 Kinesis Data Firehose에 액세스 할 수있는 적절한 권한으로 IAM 역할을 생성합니다. 기존 역할을 사용하려면 드롭 다운 메뉴에서 역할을 선택하고 역할 업데이트. 그러면 선택한 IAM 역할에 필요한 권한이 추가됩니다.

분석 애플리케이션의 대상 작성

분석 애플리케이션의 대상을 작성하려면 다음 단계를 완료하십시오.

  1. Amazon SNS 콘솔에서 주제를 생성하고 이메일 또는 텍스트를 통해 구독하십시오. 자세한 내용은 1 단계 및 2 단계를 참조하십시오. Amazon SNS 시작하기
  2. SNS 주제에 대한 ARN을 텍스트 파일로 복사하십시오.

데이터를 처리하기위한 분석 애플리케이션 작성

분석 애플리케이션을 작성하려면 다음 단계를 완료하십시오.

  1. Amazon Kinesis 콘솔에서 데이터 분석.
  2. 왼쪽 메뉴에서 응용 프로그램 만들기.
  3. 응용 프로그램 이름으로 다음을 입력하십시오. Farmbot-application.
  4. 런타임에 대해 SQL 선택하고 응용 프로그램 만들기
  5. 소스로 스트리밍 데이터 연결 선택 소스를 선택하십시오.
  6. 왼쪽 메뉴에서 Kinesis Data Firehose 전송 스트림.
  7. 왼쪽 메뉴에서 IoT 소스 스트림.
  8. 휴가 Lambda를 통한 레코드 전처리
  9. $XNUMX Million 미만 접근 권한콘솔에서 Kinesis Data Analytics와 함께 사용할 IAM 역할을 생성 및 업데이트 할 수 있습니다.

Kinesis Data Analytics가 가정 할 수있는 적절한 IAM 역할이 이미있는 경우 드롭 다운 메뉴에서 해당 역할을 선택하십시오.

  1. 왼쪽 메뉴에서 스키마를 발견하십시오.
  2. 응용 프로그램이 결과를 표시 할 때까지 기다렸다가 저장하고 계속하십시오..

모든 것을 올바르게 구성한 경우 센서 이름, 매개 변수 및 타임 스탬프가있는 테이블이 표시됩니다. 다음 스크린 샷을 참조하십시오.

  1. 실시간 분석 처리를 위해 SQL 편집기로 이동하십시오.
  2. 다음 매개 변수를 입력하십시오.
  • SOURCE_SQL_STREAM_001 – 수신 스트림의 값 및 시간 소인이있는 이름 및 센서 매개 변수를 포함합니다.
  • 중간_SQL_STREAM – 모든 레코드를 포함 Moisture 보다 작은 값 25 더 적은 수의 매개 변수로 필터링합니다.이 게시물의 경우 MoistureConductivity.
  • DESTINATION_SQL_HHR_STREAM – 지정된 열에 대해 2 분 슬라이딩 창에서 집계 행에서 기능을 수행합니다. 센서가 2 분 동안 지속적으로 낮은 습도를보고하는지 감지합니다.

다음 예제 코드를 참조하십시오.

-- Create an output stream with seven columns, which is used to send IoT data to the destination
SELECT STREAM "Moisture","Temperature","Name","Conductivity","Light","Battery","DateTime" FROM "SOURCE_SQL_STREAM_001"; CREATE OR REPLACE STREAM "INTERMIDIATE_SQL_STREAM" (Moisture INT, Conductivity INT, Name VARCHAR(16));
-- Create pump to insert into output CREATE OR REPLACE PUMP "STREAM_PUMP_001" AS INSERT IGNORE INTO "INTERMIDIATE_SQL_STREAM" -- Select all columns from source stream
SELECT STREAM "Moisture","Conductivity","Name"
FROM "SOURCE_SQL_STREAM_001"
-- LIKE compares a string to a string pattern (_ matches all char, % matches substring)
-- SIMILAR TO compares string to a regex, may use ESCAPE
WHERE "Moisture" < 25; -- ** Aggregate (COUNT, AVG, etc.) + Sliding time window **
-- Performs function on the aggregate rows over a 2 minute sliding window for a specified column. -- .----------. .----------. .----------. -- | SOURCE | | INSERT | | DESTIN. | -- Source-->| STREAM |-->| & SELECT |-->| STREAM |-->Destination
-- | | | (PUMP) | | | -- '----------' '----------' '----------' CREATE OR REPLACE STREAM "DESTINATION_SQL_HHR_STREAM" (Name VARCHAR(16), high_count INTEGER);
-- Create a pump which continuously selects from a source stream (SOURCE_SQL_STREAM_001) -- performs an aggregate count that is grouped by columns ticker over a 2-minute sliding window
CREATE OR REPLACE PUMP "STREAM_PUMP_002" AS INSERT IGNORE INTO "DESTINATION_SQL_HHR_STREAM"
-- COUNT|AVG|MAX|MIN|SUM|STDDEV_POP|STDDEV_SAMP|VAR_POP|VAR_SAMP)
SELECT STREAM *
FROM ( SELECT STREAM Name, COUNT(*) OVER THIRTY_SECOND_SLIDING_WINDOW AS high_count FROM "INTERMIDIATE_SQL_STREAM" WINDOW TWO_MINUTE_SLIDING_WINDOW AS ( PARTITION BY Name RANGE INTERVAL '2' MINUTE PRECEDING)
) AS a
WHERE (high_count >3); 

실시간 분석 탭에서 SQL 쿼리 결과를 볼 수 있습니다. 다음 스크린 샷을 참조하십시오.

분석 애플리케이션의 대상 연결

분석 애플리케이션의 대상을 연결하려면 다음 단계를 완료하십시오.

  1. 럭셔리 목적지, 고르다 AWS Lambda 함수.
  2. 새로운 Lambda 함수를 생성하고 Lambda 청사진을 선택하십시오.
  3. 검색 창에 SNS.
  4. 왼쪽 메뉴에서 키네 시스 분석 출력 SNS .
  5. 기능 이름을 입력하십시오.
  6. 출력 형식을 JSON으로 선택
  7. 실행 역할에 대해 기본 Lambda 권한으로 새 역할 생성.

Lambda 함수는 애플리케이션 결과를 처리하고 생성 한 SNS 주제로 결과를 보냅니다.

  1. 다음 기능 코드를 수정하고 기록한 주제 ARN을 추가하십시오.
    import base64
    import json
    import boto3
    from botocore.vendored import requests #import requests snsClient = boto3.client('sns')
    print('Loading function') for record in event['records']: # Kinesis data is base64 encoded so decode here print 'Number of records {}.'.format(len(event['records'])) payload = json.loads(base64.b64decode(record['data'])) #payload = base64.b64decode(record['kinesis']['data']) print payload response = snsClient.publish( TopicArn= 'arn:aws:sns:<region>:<account_id>:<topic_name>', Message='Based on current soil moisture level you need to water your lawn! ', Subject='Lawn maintenance reminder ', MessageStructure='string', MessageAttributes={ 'String': { 'DataType': 'String', 'StringValue': 'New records have been processed.' } } ) return 'Successfully processed {} records.'.format(len(event['records']))

  2. 왼쪽 메뉴에서 기능 만들기.
  3. Kinesis Data Analytics 콘솔의 인앱 스트림, 고르다 기존 인앱 스트림
  4. 드롭 다운 메뉴에서 DESTINATION_SQL_HHR_STREAM JSON 출력 형식으로.
  5. $XNUMX Million 미만 액세스 권한 Kinesis Data Analytics와 함께 사용할 IAM 역할 생성 또는 업데이트를 선택합니다.

Kinesis Data Analytics가 가정 할 수있는 적절한 IAM 역할이 이미있는 경우 드롭 다운 메뉴에서 해당 역할을 선택하십시오.

데이터 시각화를 위해 Amazon QuickSight 연결

Amazon QuickSight 대시 보드를 구축하려면 Kinesis Data Firehose에서 JSON 원시 데이터를 수집해야합니다. 다음 단계를 완료하십시오.

  1. 콘솔에서 퀵 사이트.

Amazon QuickSight를 처음 사용하는 경우 새 계정을 만들어야합니다.

  1. 로그인 한 후 새로운 분석.
  2. 왼쪽 메뉴에서 새로운 데이터 세트.
  3. 사용 가능한 소스에서 S3.
  4. 데이터 소스 이름을 입력하십시오.
  5. 선택 업로드 매니페스트 파일.

매니페스트 파일은 S3 버킷의 위치와 Amazon S3의 데이터 형식을 제공합니다. 자세한 내용은 Amazon S3 매니페스트 파일에 지원되는 형식. 다음 예제 코드를 참조하십시오.

{ "fileLocations": [ {"URIPrefixes": ["https://s3.amazonaws.com/<YOUR_BUCKET_NAME>/data/<YEAR>/<MONTH>/<DATE>/<HOUR>/" ]} ], "globalUploadSettings": { "format": "JSON" }
}

Amazon QuickSight는 데이터를 가져오고 구문 분석합니다.

  1. 수집 된 데이터를 변환하고 형식을 지정하려면 데이터 편집 / 미리보기.
  2. 포맷이 끝나면 데이터 저장 및 시각화.

시각화 화면에서 분석을 빌드하려면 다음 단계를 완료하십시오.

  1. 럭셔리 비주얼 타입선택한다. 라인 차트.
  2. 드래그 앤 드롭 DateTime ~에 필드 필드 웰 X 축.
  3. 무브 Light ~로 가치관
  4. 무브 Name ~로 색상

그러면 XNUMX 개의 센서 위치에 대한 일정 기간 동안의 빛의 양을 보여주는 대시 보드가 만들어집니다.

  1. 변경 DateTime 에서 집계 옵션 DAYMINUTE.
  2. 변화 LightSumAverage.
  3. 시각적 형식 지정 옵션을 선택하여 X 축, Y 축 또는 범례 속성을 변경하십시오.

다음 그래프는 시간에 따른 평균 조명을 보여줍니다. 습기, 온도 및 토양 비옥도 수준을 위해 유사하게 만들 수 있습니다.

결론

이 게시물에서는 AWS DeepLens 및 Amazon SageMaker의 내장 이미지 분류 알고리즘을 사용하여 공개적으로 사용 가능한 데이터 세트를 기반으로 잔디에서 잡초를 감지하고 Amazon Kinesis 및 AWS IoT를 사용하여 실시간 잔디밭 모니터링 시스템을 구축하는 방법을 보여주었습니다. Amazon QuickSight를 사용하여 데이터를 시각화 할 수도 있습니다. 자신의 사용 사례에 맞게이 예제를 복제하고 확장 할 수 있습니다.


저자에 관하여

Ravi Gupta는 Amazon 웹 서비스의 엔터프라이즈 솔루션 아키텍트입니다. 그는 고객과 함께 일하고 혁신적인 솔루션을 구축하도록 돕는 열정적 인 기술 애호가입니다. 그의 핵심 분야는 IoT, 분석 및 기계 학습입니다. 여가 시간에 Ravi는 가족 및 사진과 함께 시간을 보냅니다.

Shayon Sanyal은 Amazon Web Services에서 글로벌 금융 서비스를 담당하는 수석 데이터 아키텍트 (Data Lake)입니다. 그는 AWS 고객과 파트너가 복잡하고 까다로운 AI / ML, IoT 및 데이터 분석 문제를 해결하고 데이터 중심 엔터프라이즈에 대한 비전을 실현하도록 도와줍니다. 여가 시간에 Shayon은 여행, 달리기 및 하이킹을 즐깁니다.

출처 : https://aws.amazon.com/blogs/machine-learning/building-a-lawn-monitor-and-weed-detection-solution-with-aws-machine-learning-and-iot-services/

spot_img

최신 인텔리전스

spot_img