라즈베리파이 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(서비스 계정 키)를 받자. 간단히 요약하면 아래와 같다.
- http://cloud.google.com/vision에 접속한다. 구글 계정이 필요하다.
- Google Cloud Platform에 Free Trial을 선택한다. 신용카드 번호를 필요로 하는데 실제 과금되지 않는다($1 시험 결제가 이루어지긴 한다)
[https://cloud.google.com/vision/ 에 접속하여 Free Trial(무료사용) 선택]
- 콘솔에서 API Manager를 선택한 후 Cloud vision API를 활성화한다.
[API Manager화면]
- 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
'라즈베리파이/RaspberryPi' 카테고리의 다른 글
[라즈베리파이3,4/레트로게임기] 남는 라즈베리파이로 만드는 고전 게임기(retropie, recalbox) (1) | 2020.10.30 |
---|---|
[제로] raspberry pi zero W (WiFi) 설치하기 (0) | 2018.05.17 |
[라즈베리파이3/설치] Raspberry Pi 3 사용기/설치기 (3) | 2016.07.05 |
[라즈베리파이/LCD] 3.5 inch RPi LCD V3.0 (8) | 2016.06.06 |
[라즈베리파이/웹캠] USB 웹캠(webcam)으로 사진을 찍어 저장해보자 (2) | 2016.03.23 |
[디스플레이/LCD] 5” touch HDMI LCD를 붙여보자 (2) | 2015.11.28 |
[라즈베리파이/카메라] Camera 모듈을 장착해 사진을 찍어보자 / Camera module (0) | 2015.08.29 |
[라즈베리파이/WiFi] WiFi USB 어댑터를 장착해 WiFi로 운영하기 / EDUP EP-N8508GS (0) | 2015.08.27 |
[라즈베리파이/어댑터] 라즈베리 파이를 빵판에 연결하는 GPIO cobbler (connector) + 40pin 케이블 (0) | 2015.07.30 |
[라즈베리파이] 라즈베리파이2(RaspberryPi 2) – GPIO LED blink 구동하기 / 라즈비안(Raspbian) (3) | 2015.03.09 |