Face Recognition Terminal

1. Overview

이번 문서에서는 local에서 실시간으로 촬영한 얼굴 이미지를 Watson Visual Recognition으로 분석하여 web UI로 볼 수 있게 구성해 보겠습니다.

다음 문서를 직접 해보고 작성한 문서입니다.
Chapter 6. Face Recognition Terminal: link

2. Prerequisites

IBM Cloud 계정 : link
IBM Watson 계정 : link
Python설치 : link
Node js설치 : link

Local Test version
Node js : v10.15.3
Python : v3.7.3

3. Architecture

프로젝트의 구조는 아래 사진과 같습니다.
image

  1. Local에서 Webcam으로 이미지를 촬영
  2. Local device의 정보(org_id, deviceType, mac주소)를 IoT Platform으로 Publish
  3. 이미지파일은 COS에 PUT
  4. Node-RED에서 메세지를 subscribe하고 있음
  5. Node-RED에서 COS의 이미지를 GET
  6. GET한 이미지를 Watson Visual Recognition으로 분류
  7. 결과를 Node-RED의 web base UI로 뿌려줌

4. STEP

Create IoT Platform

Cloud Foundry App인 IoT Platform을 생성해줍니다.

리소스생성 > Internet of Things Platform 스타터

image

생성하게 되면 아래사진과 같이 iotf-servicecloudant가 서비스로 붙게 됩니다.
image

이 두 서비스를 이어주고 메세지를 전달해주며 우리가 앞으로 만들 프로그램의 중추역할을 할 코어는 해당 cloud foundry app의 Node-RED로 구현되어있습니다.

Node-RED에 몇가지 파일을 추가하기 위해 로컬환경에서 편집을 진행할 수 있도록 Continuous-Delivery를 추가하도록 하겠습니다.

Configure Continuous-Delivery

절차는 다음 링크를 참조해주세요.
https://gruuuuu.github.io/simple-tutorial/icos-api/#continuos-delivery

주의해야할 점은 저장소 유형을 “복제”로 해야한다는 것입니다.
image

git clone을 받아두고 auth까지 되면 다음단계로 넘어가 주세요.

add Node Dependency

로컬에 clone을 받고나면 directory구조는 다음과 같이 보일것입니다.

image

dependency를 추가하기 위해 package.json에 다음 라인을 추가해줍시다.

"dependencies": {
  ...
  "node-red-node-random":"0.x",
  "node-red-node-smooth":"0.x",
  "node-red-contrib-web-worldmap":"1.x",
  "node-red-node-geofence":"*",
  "node-red-contrib-slacker":"*",
  "node-red-node-base64": "*",
  "node-red-contrib-play-audio": "*",
  "node-red-dashboard":"node-red/node-red-dashboard",
  "request":"~2.74.0",
  "bluebird": "^3.3.3",
  "knox": "latest",
  "fs": "latest",
  "fs-extra": "latest",
  "node-uuid": "latest"
},

그 다음, node-red-contrib-cos.zip의 압축을 풀어서 nodes폴더 하에 옮겨둡니다.

image

Push하고 Delivery Pipeline에서 deploy가 성공한 것을 확인할 수 있습니다.
image

이제 필요한 dependency를 모두 추가하였으니 Node-RED에서의 Flow를 생성하여야 합니다.

Node-RED Flow

앱 URL방문을 클릭합니다.
image

계정을 생성해준뒤, default로 생성되어있는 flow들을 삭제합니다.

그 뒤, face_recognition_nodered_flow.txt를 복사해서 노드로 가져오기 합니다.
image

불러온 노드의 모습은 다음과 같습니다. 위의 전체 구조와 비교해서 보신다면 더 잘 이해가 되실겁니다.
image

큰 틀은 완성이 되었습니다. 이제 각 서비스들을 구성해주어야 합니다.

Create Cloud Object Storage

먼저 로컬에서 생성한 이미지를 저장하기 위해 Cloud Object Storage를 생성해줍니다. 추가로 사용할 버킷도 미리 생성해 줍니다.
참고 -> link

인증정보 중 AccessKey와 SecretKey는 다른곳에 적어둡니다.

Configure IoT Service

iotf-service의 dashboard를 열어주세요.
image

해당 서비스로 메세지를 보낼 장치를 등록할 것입니다.
디바이스 추가를 클릭합니다.
image

디바이스를 추가하기 위해선 해당 디바이스의 MAC Address가 필요합니다.

윈도우에서 MAC주소는 다음 명령어를 통해 알 수 있습니다.

$ getmac /v

image

물리적 주소라고 적힌 부분이 MAC주소이고, ‘-‘을 빼고 12자리 캐릭터를 디바이스 ID로 적어주시면 됩니다.
디바이스 유형은 Laptop으로 적어줍니다.
image

저 두가지 항목만 적어주시고 완료버튼을 눌러 디바이스를 추가해줍니다.
image

디바이스를 추가하고 정보를 확인해보면 다음과 같이 나옵니다.
조직ID와 인증토큰은 다른곳에 잘 저장해둡시다.
로컬에서 iotf-service로 메세지를 보낼때 사용하게 됩니다.
image

이제 iotf-service의 구성은 마무리되었고, 핵심모듈중 하나인 watson visual recognition서비스를 추가하여야 합니다.

Add Watson Visual Recognition service

리소스 추가 > visual검색 > Visual Recognition선택
image

서비스를 생성합니다.
image

인증정보를 새로 생성하고, 다른 서비스와의 연결을 위해 apikey를 저장해둡니다.
image

여기까지 각 서비스들의 구성은 끝나게 됩니다. 이제 따로따로 떨어져있는 서비스들을 Node-RED를 사용해 하나로 엮어야 합니다.

큰 틀은 위에서 구성하였으니 각 서비스 노드만 수정해주면 됩니다.

Fix Node-RED

노드의 흐름을 잘 따라와주세요.

첫번째로 내 디바이스에서 이벤트가 발생하였을때 iotf-service에서 이벤트를 수집하는 노드입니다.
내 디바이스가 무엇인지 식별하기 위해 장치의 Mac Address를 Device Id에 작성해줍니다.
반드시 iotf-service에서 등록했던 장치의 Mac Address여야합니다.
image

두번째로는 로컬에서 이미지를 저장하고 Visual Recognition에서 식별할 이미지를 가져올 장소인 COS노드를 수정해줍니다.

cos-config의 노드타입 추가를 선택하고 연필버튼을 클릭해 줍니다.
image

COS만들때 생성했던 인증정보를 토대로 Access KeySecret Key, Endpoint를 적어줍니다. 다음으로 연속적으로 불러올 이미지인 campic.jpg를 ObjectName으로 적어주고 해당 이미지가 저장되어있을 장소인 Bucket이름을 적어주면 됩니다.
image

frame단위로 저장할 이미지의 이름: campic.jpg
해당이미지는 n초단위로 같은이름으로 COS에 저장되고, Visual Recognition에서 분류되기때문에 거의 실시간의 detection이 가능하다.

마지막으로 COS에서 가져온 이미지를 식별해줄 Watson Visual Recognition을 연결해줍시다. Face Detection노드를 클릭하여 API KeyService Endpoint를 입력해줍니다.
각 항목은 Visual Recognition의 인증정보(apikeyurl)를 참조하여 작성하시면 됩니다.
image

여기까지 각 노드의 구성은 마무리가 되었고 이제 로컬에서 웹캠으로 촬영하는 단계만 남았습니다!

face_detection_terminal.py

웹캠을 실행하고, iotf-service에 메세지를 보내고, COS에 이미지를 보내는 프로그램입니다.
소스코드는 이곳

당연히 서비스에 연결하려면 인증정보를 입력해야 합니다.

iotf-service에 연결하기 위해 수정해야하는 코드입니다.
각 라인에 올바른 값을 넣어주시면 됩니다.

organization은 iotf-service의 일반설정에서 확인할 수 있습니다.
image

image

COS에 연결하기 위해 수정해야하는 코드입니다.
각 라인에 올바른 값을 넣어주세요.

endpoint_url은 COS인증정보의 url을 참조하시면됩니다.

image

수정이 끝났다면 실행에 필요한 라이브러리들을 받아야 합니다.

  • paho-mqtt
    $ pip install paho-mqtt
    

    image

  • OpenCV
    $ python -m pip install opencv-python
    
  • boto3
    aws s3 연결을 하기위해 aws에서 제공하는 S3 SDK
    $ pip install boto3
    

(주의) 아무 이미지를 다운받아서 tmp/campic.jpg로 저장해두고 프로그램을 실행시켜야합니다.

프로그램을 실행시키고 Node-RED의 디버그창을 확인해보면 다음과 같이 각 노드에서의 메세지들을 확인할 수 있습니다.
image

또한 다음 링크로 접속하게되면 UI창을 확인할 수 있습니다.

https://{APP_NAME}.mybluemix.net/ui

웹캠에 보여지는 얼굴을 인식해서 나이와 성별을 예측하는 화면입니다.
image

image


댓글남기기