본문 바로가기
라즈베리파이/RaspberryPi

[라즈베리파이/응용] Raspberry Pi 2, Camera와 Google Cloud Vision API/Python 사용

by 작동미학 2016. 3. 15.
반응형

라즈베리파이 2용 카메라 모듈 장착 및 네트워크 연결 후 Google Cloud Vision API를 사용하여 각종 인식 기능을 사용한다.

 

▶ 이 가이드를 따라하면

- 라즈베리파이 2 기반하여 Google Vision API를 쓸 수 있다(Raspbian, Python 사용)

 

▶ 먼저 읽을 강좌

- 라즈비안 설치 : http://bbangpan.tistory.com/15

- 카메라 모듈 : http://bbangpan.tistory.com/60

- WiFi 모듈 : http://bbangpan.tistory.com/59

- USB웹캠 연결 : http://bbangpan.tistory.com/78

 

▶ 부품 설명 및 회로 구성

오늘 시험할 하드웨어는 라즈비안이 설치되고 카메라가 장착된 이 녀석이다. 상세 내용은 http://bbangpan.tistory.com/60 를 참조로 준비하자. USB 웹캠도 사진을 캡춰할 수 있으므로 카메라 모듈 구매가 번거로운 사람은 활용하도록 하자(http://bbangpan.tistory.com/78)

[카메라 모듈 장착된 라즈베리파이2/라즈비안 설치]

이 라즈베리파이에 python기반으로 google vision API를 실행할 수 있다. (nodejs로도 간단히 가능하지만, 관련 패키지 버전이 꼬이면 설치가 어렵다)

 

▶ Google Vision API 가입 및 인증키 받기

Google Vision API는 최근에 Google이 open한 딥러닝 기반의 영상 관련 인식 API이다. 가입 후 service account key(서비스 계정 키)를 받자. 간단히 요약하면 아래와 같다.

  1. http://cloud.google.com/vision에 접속한다. 구글 계정이 필요하다.
  2. Google Cloud Platform에 Free Trial을 선택한다. 신용카드 번호를 필요로 하는데 실제 과금되지 않는다($1 시험 결제가 이루어지긴 한다)

    [https://cloud.google.com/vision/ 에 접속하여 Free Trial(무료사용) 선택]

  3. 콘솔에서 API Manager를 선택한 후 Cloud vision API를 활성화한다.

    [API Manager화면]

  4. API Manager에서 사용자 인증 정보(Credentials)를 선택해서 서비스 계정키(Service Account Key)를 받는다.

    [사용자 인증키 생성, Name은 unique한 것으로 6글자 이상 해주자]

이렇게 하면 json파일이 다운로드 되는데 잘 보관해두자. json이 아닌 파일이 생성되는 경우가 있는데

$ base64 –d < test.json > real.json

으로 라즈베리파이 상에서 디코딩 가능하다. (다만 본인의 경우 이렇게 base64인코딩된 json은 일단 리눅스 서버상에서는 잘 구동되었으나 라즈베리파이에서는 잘 구동이 되지 않았다. 몇번 key를 생성하다보면 실제 json({}로 감싸진) 파일을 얻게 된다.

 

▶ 라즈베리파이 설정

우선 Google Vision API를 사용하기 위해 python설정이 필요하다. (Node.js사용도 가능하나, 라이브러리 설치시 문제가 발생한다.)

아래 관련 python 모듈을 설치한다.

 

$ sudo apt-get update

$ sudo apt-get install python-pip python-requests python-pycurl

$ sudo pip install --upgrade pip

$ sudo pip install google-api-python-client

$ sudo pip install requests

 

실행하기 전 소스는 다음과 같다. 아래 모두 Google vision API 예제를 조금 수정하였다.

(python source는 탭이 중요하므로, 실제 사용시에는 URL 링크를 통해 아래 소스코드를 다운로드 받아 사용하자)

 

얼굴인식 python 소스 - face.py :

https://github.com/bbangpan/bbangpan.com/blob/master/neibc_google_vision_API_raspberrypi/face.py

#!/usr/bin/env python

# From google sample codes

# modified by bbangpan.com

#

# recommended package installation:

# $ sudo apt-get update

# $ sudo apt-get install python-pip python-requests python-pycurl

# $ sudo pip install --upgrade pip

# $ sudo pip install google-api-python-client

# $ sudo pip install requests

 

"""

usage> ./face.py <path-to-image>

"""

# [START import_libraries]

import argparse

import base64

import httplib2

import logging

import json

 

from googleapiclient import discovery

from oauth2client.service_account import ServiceAccountCredentials

from httplib2 import Http

 

# The url template to retrieve the discovery document for trusted testers.

DISCOVERY_URL='https://{api}.googleapis.com/$discovery/rest?version={apiVersion}'

# [END import_libraries]

 

 

logging.basicConfig(level=logging.INFO)

 

def main(photo_file):

"""Run a label request on a single image"""

 

# [START authenticate]

# credentials = GoogleCredentials.get_application_default()

scopes = ['https://www.googleapis.com/auth/cloud-platform']

credentials = ServiceAccountCredentials.from_json_keyfile_name(

'/work/chaosnet/key.json', scopes)

http_auth = credentials.authorize(Http())

service = discovery.build('vision', 'v1', credentials=credentials,

discoveryServiceUrl=DISCOVERY_URL)

 

# [END authenticate]

 

# [START construct_request]

 

with open(photo_file, 'rb') as image:

image_content = base64.b64encode(image.read())

 

batch_request = [{

'image': {

'content': image_content.decode('UTF-8')

},

'features': [{

'type': 'FACE_DETECTION',

'maxResults': 1,

}]

}]

 

request = service.images().annotate(body={

'requests': batch_request,

})

response = request.execute()

 

face = response['responses'][0]['faceAnnotations']

 

 

print('%s : %s' % ('joy',face[0]['joyLikelihood']))

print('%s : %s' % ('sorrow',face[0]['sorrowLikelihood']))

print('%s : %s' % ('anger',face[0]['angerLikelihood']))

print('%s : %s' % ('surprise',face[0]['surpriseLikelihood']))

print('raw data:')

print('Found face_detect: %s for %s' % (face, photo_file))

 

return 0

 

# [END parse_response]

 

# [START run_application]

if __name__ == '__main__':

parser = argparse.ArgumentParser()

parser.add_argument('image_file', help='The image you\'d like to label.')

args = parser.parse_args()

main(args.image_file)

# [END run_application]

 

물체 인식 python 소스 – label.py :

https://github.com/bbangpan/bbangpan.com/blob/master/neibc_google_vision_API_raspberrypi/label.py

 

#!/usr/bin/env python

# From google sample codes

# modified by bbangpan.com

#

# recommended package installation:

# $ sudo apt-get update

# $ sudo apt-get install python-pip python-requests python-pycurl

# $ sudo pip install --upgrade pip

# $ sudo pip install google-api-python-client

# $ sudo pip install requests

 

"""

usage> ./face.py <path-to-image>

"""

#!/usr/bin/env python

# From google sample codes

# modified by bbangpan.com

 

"""

usage> ./face.py <path-to-image>

"""

# [START import_libraries]

import argparse

import base64

import httplib2

import logging

 

from googleapiclient import discovery

from oauth2client.service_account import ServiceAccountCredentials

from httplib2 import Http

 

# The url template to retrieve the discovery document for trusted testers.

DISCOVERY_URL='https://{api}.googleapis.com/$discovery/rest?version={apiVersion}'

# [END import_libraries]

 

 

logging.basicConfig(level=logging.INFO)

 

def main(photo_file):

"""Run a label request on a single image"""

 

# [START authenticate]

# credentials = GoogleCredentials.get_application_default()

scopes = ['https://www.googleapis.com/auth/cloud-platform']

credentials = ServiceAccountCredentials.from_json_keyfile_name(

'/work/chaosnet/key.json', scopes)

http_auth = credentials.authorize(Http())

service = discovery.build('vision', 'v1', credentials=credentials,

discoveryServiceUrl=DISCOVERY_URL)

 

# [END authenticate]

 

# [START construct_request]

with open(photo_file, 'rb') as image:

image_content = base64.b64encode(image.read())

service_request = service.images().annotate(body={

'requests': [{

'image': {

'content': image_content.decode('UTF-8')

},

'features': [{

'type': 'LABEL_DETECTION',

'maxResults': 1

}]

}]

})

# [END construct_request]

# [START parse_response]

response = service_request.execute()

label = response['responses'][0]['labelAnnotations'][0]['description']

print(response)

 

print('Found label: %s for %s' % (label, photo_file))

return 0

# [END parse_response]

 

# [START run_application]

if __name__ == '__main__':

parser = argparse.ArgumentParser()

parser.add_argument('image_file', help='The image you\'d like to label.')

args = parser.parse_args()

main(args.image_file)

# [END run_application]

 

상기 소스를 아래 /work/chaosnet에 배치하자. Key는 key.json으로 저장하면 된다.

 

$ sudo mkdir –p /work/chaosnet

$ sudo chown pi:pi /work/chaosnet

$ cd /work/chaosnet

$ base64 –d < serveraccountkey.json > key.json #base64 encoding된 파일을 받은 경우만 실행

 

먼저 object detection(물체 인식)과 face detection(얼굴 인식)을 모두 수행해보자.

$ raspistill –vf –hf –o cam2.jpg #cam에서 사진을 캡춰해서 저장

$ python label.py cam2.jpg # label.py수행

$ python face.py cam2.jpg # face.py 수행

<Raspberry Pi 2에 연결한 모습>

간혹 수행시 The OAuth client was not found. 가 발견되는 이럴 때는 다시 인증서를 받자(new service account key is needed).

상기 예제를 보면 cam2.jpg에 찍힌 것은 사람(person)이고, 얼굴 표정은 기쁨(joy)으로 보인다고 판정한 것을 알 수 있다. 관련된 정보를 python상에서 얻어와 적절한 처리를 통해 다양한 기능 수행이 가능하다.

 

▶ 구매 가이드

Raspberry pi camera : http://www.aliexpress.com/w/wholesale-raspberry-pi-camera.html?spm=2114.01020208.0.887.sLeWWt&initiative_id=SB_20150829054550&site=glo&groupsort=1&SortType=total_tranpro_desc&shipCountry=kr&SearchText=raspberry+pi+camera ($13~$25)

 

강의 키워드

라즈베리파이, 라즈베리파이2, Raspberry Pi 2, 카메라, 설치, 촬영, 라즈비안, raspberry pi camera module, Google Cloud vision API, server account key, Raspbian, 구글 비전 API, Google vision API

 

반응형