2018년 11월 18일 일요일

아마존 AWS 딥렌즈(DeepLens) 사용기

이 글은 연구용으로 2018년 여름에 구매했던 아마존 AWS 딥렌즈(DeepLens)의 간단한 사용기이다. 가격은 겨우 $249로 아마존에서 판매하고 있다. 연말이 되어서야 아래한글 연구행정 문서질을 어느정도 정리하고, 드디어 지금 시간이 있어 딥렌즈 꺼내놓고 사용법을 정리한다.

이 글은 다음과 같이 딥렌즈 장치 설정에서 카메라에서 실시간 객체 인식 예제를 생성하는 방법까지 설명한다. 참고로, 딥렌즈에는 객체인식, 표정인식, 제스춰인식 등 다양한 예제를 제공하고 있으며, 각 인식 모델은 사용자가 학습한 모델로 대치할 수 있다. 그러므로, 다양한 분야에서 딥러닝 모델을 개발하고 적용하는 것이 가능하다. 
웹에서 딥러닝 기반 객체 인식 결과 확인

딥렌즈 장치에서 직접 딥러닝 객체 인식 결과 확인

개요
딥렌즈는 아마존에서 개발한 딥러닝 기반 비전용 카메라이다.


딥렌즈를 이용하면, 미리 훈련된 신경망 모델을 클릭만 해서 딥렌즈에 적용하여, 다양한 비전 프로젝트를 손쉽게 진행할 수 있다. 이미 아마존에는 다양한 최신 신경망 모델이 업로드되어 있어, 적용에 그리 어렵지 않다.

딥렌즈 스펙
딥렌즈 스펙은 다음과 같다. 운영체제는 우분투 16.04를 사용하며, 딥러닝 연산을 위해 Gen9을 사용한다.

Hardware
Intel Atom® processor
Gen9 graphics
Ubuntu 16.04 LTS
106 GFLOPS performance
Dual band Wi-Fi
4 MP camera with MJPEG
H.264 encoding at 1080p resolution
Storage
8 GB RAM
16 GB memory
32 GB SD card
Inputs / Outputs
2 USB ports
Micro HDMI
Audio out
Software
AWS Greengrass pre-configured
Cl-DNN (compute library for deep neural networks)
좀 더 상세한 제품 내용은 개발자 가이드라인을 살펴본다.

셋업
딥렌즈를 구입한 후, 다음 영상을 참고해 셋업한다.

딥렌즈는 AWS를 사용하므로, 설정을 위해서는 먼저 AWS에 가입해야 한다. 가입 후 AWS에 로그인을 한다. 다음은 이후 주요 딥렌즈 설정 순서이다. 

1. 컴퓨터에서 AWS 콘솔(console)에 로그인 후 AWS services의 Find Services에서 AWS DeepLens를 검색.

2. Register device 버튼을 선택해 딥렌즈 장치를 생성함. 이름을 입력하고, 딥렌즈에서 사용할 패키지 사용 권한(permission)을 획득한 후, 장치 접속 인증서를 생성함.

3. 웹페이지에 나타나는 순서대로, 딥렌즈 전원 버튼을 눌러 전원을 켬. 잠시 후 중간 LED가 깜빡깜빡 거리는 reset 상태가 될 것임.

4. 딥렌즈 장치 바닥에 표시된 장치 WiFi SSD를 컴퓨터의 WiFi로 설정하고, 표시된 암호를 입력해 딥렌즈 장치와 연결함. 이후, 계속 다음 버튼을 클릭함.

5. 이후, 딥렌즈 장치 설정 콘솔 열기(Open AWS DeepLens console) 버튼 페이지가 표시됨. 버튼을 클릭함. 나타나는 콘솔 페이지에서, 사용할 WiFi를 설정하고, 방금전 생성한 장치 접속 certificate 압축파일을 선택, 딥렌즈 장치 및 SSH 터미널 접속에 사용할 암호 등을 입력하고, 계속 진행함.

*주의: 참고로, 기존 딥렌즈 장치를 삭제한 후, 이 과정을 다시 진행할 경우, 장치 등록이 안되는 경우가 발생할 수 있음. 이 경우, 딥렌즈 장치 후면의 모니터 micro HDMI, 마우스 및 키보드 USB 단자를 연결해 우분투로 아까 입력한 암호를 이용해 로그인해야 함. 이후, 우분투에 앞서 설정한 WiFi 접속된 SSID 네트워크 연결을 삭제하고, 다시 장치 설정을 reset해야 함(장치 뒷면에 작은 홀이 있는 데, 이를 20초간 바늘 같은 것으로 누르고 있으면 reset상태가 됨). 이후, 앞의 과정을 다시 시작하면 설정이 잘 될 것임.


6. 딥렌즈 장치 내 패키지 업데이트 등이 모두 끝나면, 장치 등록(registration)이 성공하였다는 메시지가 AWS DeepLens 콘솔 페이지에 아래와 같이 표시됨.

정상 등록된 딥렌즈 장치

딥러닝 모델 설치
이 예제에서는 객체를 탐지하는 CNN 모델을 적용할 것이다. 이 모델은 이미 훈련되어 있으며, 딥렌즈에 설치하면, 바로 실행할 수 있다. 다음 영상을 참고하자.

딥렌즈 예제 프로젝트 생성 방법

주요 단계는 다음과 같다.

1. Create new project 버튼 클릭

2. Project type 선택. 이 경우, Object detection 프로젝트를 선택하였음.

3. Create 버튼 클릭

4. AWS 클라우드에 생성된 Object-detection 프로젝트를 Deploy to device 버튼을 클릭해 딥렌즈 장치로 전송함

5. Deploy 중인 상태는 다음 그림과 같이 청색으로 표시됨

6. Deploy 완료하면 다음 그림과 같이 녹색으로 바뀜

7. Deploy 완료된 프로젝트를 선택해, Project output을 확인해 보면, MQTT 로 토픽을 받을 수 있는 링크가 있음. Copy 한 후, 표시된 AWS IoT console 페이지에서 해당 토픽 링크를 붙여 넣어 봄

그럼, 다음과 같이, 객체 인식이 된 결과를 토픽단위로 확인할 수 있음

8. Project output 에서 View the video output을 선택함. 여기서, 설명된 내용과 같이 딥렌즈 장치에서 video server certification 파일을 생성하고, 이를 크롬 브라우저의 보안 인증서로 등록해야 함. 이를 위해, 딥렌즈 장치의 우분투에 로긴해서 해당 파일을 생성하여, 파일을 접속할 컴퓨터에 복사해 와야 함. 본인의 경우, SSH로 원격 접속해서 해당 파일을 생성하지 않고, 장치의 우분투에 직접 로긴해 파일을 생성하고 크롬에 등록하였음(인증서 등록시 별도 암호는 설정하지 않았음).
Video Server 인증서를 크롬에 등록한 후 Video output 페이지 접속한 화면

9. Video output(https://172.30.22:4000) 페이지에 접속하면, 다음과 같은 프로젝트 실행되고 있는 결과를 원격으로 확인할 수 있음



이외 다른 프로젝트를 생성하여, deploy하면 다음과 같은 다양한 딥러닝 결과물을 확인할 수 있다. 
제스쳐 인식 결과
사진에서 페인팅 결과

직접 훈련한 딥러닝 모델도 임포트할 수 있다.
다양한 딥러닝 프레임웍에서 훈련된 모델을 가져오는 화면

참고로, 딥렌즈 장치에서 직접 카메라 스트리밍을 보고싶다면, mplayer를 설치(링크)하고, 다음과 같이 우분투에 로긴해서 명령을 입력하면 된다. 
mplayer -demuxer lavf /opt/awscam/out/ch1_out.h264

딥러닝 결과를 확인하고 싶다면, 다음과 같이 입력하면 된다. 만약, 화면의 질이 않좋다면, -cache 8092 옵션으로 캐쉬 크기를 조정해 본다. 
mplayer -demuxer lavf -lavfdopts format=mjpeg:probesize=32 /tmp/results.mjpeg

SSH 접속 방법
참고로, 딥렌즈에 설치된 우분투로 직접 접속하지 않고, 컴퓨터에서 원격으로 접속해 딥렌즈 소프트웨어를 설치하거나 특정 명령을 실행할 수 있다. 이 경우, SSH 방식으로 터미널 접속해야 한다. 이를 위해 PuTTY 란 프로그램을 다운로드 받아 설치한다.
사용 방법은 아래 링크를 참고한다.

다음은 PuTTY를 이용해 딥렌즈 장치에 접속하는 장면이다.  

TTY 터미널로 접속하면, 다음과 같이 딥렌즈 장치의 우분투 운영체제에 패키지를 설치하고, 유지관리를 손쉽게 할 수 있다.
터미널 접속 화면

참고로, 딥렌즈에서 실행되는 프로세스는 ps -ef 로 확인하거나, 다음과 같이 htop 유틸리티를 설치해 확인해 볼 수 있다.
sudo apt-get install htop

AWS에서 기본으로 설치한 딥렌즈 지원용 프로세스들을 확인해 볼 수 있다.

마무리
지금까지 딥렌즈 사용법을 간단히 살펴보았다. 딥렌즈는 아마존에서 챌린지를 개최하여 다양한 활용 사례들을 발굴하고 있다.

딥러닝 플랫폼이 처음 나올때만해도, 텐서플로 같은 패키지를 설정하는 데만 많은 시간이 걸렸지만, 최근 나오는 딥러닝 도구는 이런 과정 없이 바로 사용할 수 있게 사용 편의성을 높여가고 있다. 점차 딥러닝 사용자의 저변이 넓어지고, 사용하기 쉬워지고 있다.

딥러닝이 특별한 사람들만 사용하는 기술처럼 보이지만, 아마존, 마이크로소프트와 같이 대기업 소프트웨어가 손쉽게 딥러닝 기술을 사용할 수 있는 도구를 출시하고 있어, 조만간 대중화되리라 생각한다. 그때는 누구나 드래그 드롭으로 딥러닝을 개발하고, 응용 프로그램을 만들 수 있을 것이다.

레퍼런스

2018년 11월 3일 토요일

간단한 BIM 기반 스마트 계약 개발하기

이 글에서는 BIM 기반 스마트 계약을 개발할 때, 어떤 방식으로 진행하는 지를 간략히 설명한다.

스마트 계약 개발 절차
개발은 보통 요구사항 정의, 분석, 설계, 개발 및 테스트로 진행된다.  요구사항 정의 시 사용되는 방법 중 하나가 유스케이스 분석이다. 유스케이스 분석을 통해, 실제 사용 사례와 시나리오를 정리한다.

유스케이스 정의
BIM의 경우 제일 큰 이슈 중 하나가 디지털 모델 변경이 다수 관계자간에 진행되어, 모델의 신뢰성 보장이 어렵다는 것이다. 신뢰성 보장을 위해서는 모델에 대한 이슈 발생과 처리 시 과정을 추적할 수 있어야 한다. 이슈 관리 이력을 분산원장(블록체인)에 저장해, 모델 변경 이력을 추적할 수 있도록 하고, 모델에 대한 신뢰성을 확보한다. 그래서, 유스케이스를 BIM 협업 상황에서 모델 변경 관련된 모델링 이슈 이력 관리로 한다. 모델 변경 시 관련 트랜잭션 정보는 다음과 같이 가정한다.

1. BIM file URL = resource_type://address+directory
2. Issue No = IS###
3. Issue reason = enum {element_collision, element_missing, invalid_data, etc}
4. Sender = email
5. Receiver = email
6. Date = YYYY/MM/DD
7. State = enum {open, progress, solved, close}

구현해 보기
앞의 유스케이스를 스마트 계약으로 구현해 보면 다음과 같다.

pragma solidity ^0.4.0;
contract BIM_modeling_issue {
    struct Issue {
        uint no;
        string url;
        uint reason;
        string sender, receiver;
        string date;
        uint state;
    };
    Issue[] issues;

    /// Create a issue
    function BIM_modeling_issue(uint8 num) public {
        issues.length = num;
    }

    function findIssueBySender(string sender) public Issue returns (Issue _is) {
        for(uint8 i = 0; i < issues.length; i++)
        {
            if(issues[i].sender == sender) { 
               _is = issues[i];
            }
        }
    }
}



BIM 모델링 이슈 데이터를 관리하는 Issue 구조체를 정의하고, issues 배열을 만든다. sender가 생성한 issue를 찾는 findIssueBySender라는 간단한 함수를 만들어 보았다. 이 스크립트는 Solidity 계약 개발을 지원하는 REMIX등에서 실행할 수 있다.


레퍼런스
Welcome to Remix documentation!
Create Your First Smart Contract In Ethereum With Ganache And Remix IDE
Build Your First Ethereum Smart Contract with Solidity — Tutorial