RaspberryPI를 사용하여 Amazon Rekognition의 이미지 인식을 시도했습니다.

개요



우연히 RaspberryPI Model 3이 손에 들었기 때문에 굴러 있던 USB 카메라를 이용하여
외출중인 햄스터들의 이미지를 Slack에 투고하는 시스템을 만들어 보았습니다.

구성





USB 카메라에서 이미지 획득



raspberry pi이므로 카메라 모듈이라고 생각했는데, 일반 USB 카메라를 사용합니다.

기기 인식



특히 아무것도 생각하지 않고, USB를 접속하는 것만으로 인식될 것입니다.
인식되었는지 확인하려면 lsusb 명령을 실행합니다.
아래는 내 환경의 예입니다.
한 줄로 카메라 장치를 인식합니다. (Logitech의 카메라를 사용하고 있기 때문에 Logitech 라고 출력되고 있습니다)
$ sudo lsusb
Bus 001 Device 004: ID 046d:0826 Logitech, Inc.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Python 프로그램에서 이미지 (동영상) 가져 오기



여러 가지 방법이 있다고 생각하지만 OpenCV를 사용했습니다.
(화상 처리도 간단하게 할 수 있고)

특히 버전을 고집하지 않는다면 다음 명령으로 OpenCV가 설치되어 Python에서 사용할 수 있습니다.
들어가는 버전은 2.4입니다.
sudo apt-get install libopencv-dev python-opencv

이제 다음과 같이 파이썬에서 USB 카메라 이미지를 얻을 수 있습니다.
# -*- coding: utf-8 -*-
import cv2
# OpenCVを利用してWebカメラからのキャプチャ準備
cap = cv2.VideoCapture(0)
# Webカメラから画像読み込み
ret, frame = cap.read()

Amazon Rekognition을 사용한 이미지 인식



Amazon Rekognition 사용에는 무료 프레임이 있지만 사용 방법에 따라 사용료가 발생하는 경우가 있습니다.
AWS 페이지 등에서 이용 요금을 확실히 확인합시다.

AWS PythonSDK 설치 및 사용 준비



AWS PythonSDK를 설치합니다.
sudo pip install boto3
~/.aws/credentials 라는 파일을 준비하고,
AWS 자격 증명을 설명합니다.
[default]
aws_access_key_id = ****
aws_secret_access_key = ****
region = us-west-2

이제 PythonSDK에서 AWS에 액세스할 수 있습니다.

AWS Rekognition 사용



boto3에서 AWS Rekognition의 Detect Labels API를 호출합니다.

Detect Labels API는 이미지가 입력되면,
이미지에 포함 된 객체의 이름 (= 레이블) 목록과
그 객체가 실제로 이미지에 포함되어 있는지 정확도가 반환됩니다.

주의점으로서는, AWS측은 화상 데이터를 byterayray형으로 받기 때문에,
OpenCV측에서 ndarray형이 되고 있는 데이터를 변환할 필요가 있는 점입니까.
import boto3

client = boto3.client('rekognition')

# awsに送信するためndarrayとなっている画像をpngのbytearrayに変換
ret, data = cv2.imencode('.png', frame)
byte_data = bytearray(data)

# Amazon rekognitionを呼び出し
response = client.detect_labels(
    Image={
        'Bytes': byte_data
    },
    MaxLabels=50
)
print(response)

응답 예:
{u'Labels': [
{u'Confidence': 66.29442596435547, u'Name': u'Animal'}, 
{u'Confidence': 66.29442596435547, u'Name': u'Hamster'},
{u'Confidence': 66.29442596435547, u'Name': u'Mammal'},
{u'Confidence': 66.29442596435547, u'Name': u'Rodent'}],
'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '***', 
'HTTPHeaders': {'date': 'Fri, 12 May 2017 06:20:06 GMT', 'x-amzn-requestid': '***', 'content-length': '244', 'content-type': 'application/x-amz-json-1.1', 'connection': 'keep-alive'}}, 
u'OrientationCorrection': u'ROTATE_0'}

그리고는 응답 데이터의 Labels를 판정하면, 물체 인식을 실현할 수 있습니다.
나는 다음과 같이 Hamster 라벨이 존재하는지 확인하려고합니다.
def exists_hamster(labels):
    '''
    From amazon rekognition detect label response,
    Detect exisiting hamster
    @return confidencial
    '''
    for label in labels:
        if label['Name'] == 'Hamster':
            return label['Confidence']
    return 0

동작 결과



집의 햄스터들에게 실험대가 되어 주었습니다.

촬영 이미지:



실행 결과:



어쩌면 Slack에게 햄스터 이미지가 알려졌습니다.

좋은 웹페이지 즐겨찾기