image = readImage()
cells = 검색 셀 범위 설정
index = 0
for cell in cells
maxPrediction = 0.0
for region in cell.region
cell_image = image.getRegionImage(region)
prediction[index] = prediction(cell_image)
if(maxPrediction < prediction[index])
maxPrediction = prediction[index]
region = cell.grow(region)
else
index++
break
#this is an Image of size 140x140. We will assume it to be black and white (ie only one channel, it would have been 140x140x3 for rgb)
image = readImage()
#We will break the Image into 7 coloumns and 7 rows and process each of the 49 different parts independently
NoOfCells =7#we will try and predict if an image is a dog, cat, cow or wolf. Therfore the number of classes is 4
NoOfClasses =4
threshold =0.7#step will be the size of step to take when moving across the image. Since the image has 7 cells step will be 140/7 = 20
step = height(image)/NoOfCells
#stores the class for each of the 49 cells, each cell will have 4 values which correspond to the probability of a cell being 1 of the 4 classes#prediction_class_array[i,j] is a vector of size 4 which would look like [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow]
prediction_class_array = new_array(size(NoOfCells,NoOfCells,NoOfClasses))
#stores 2 bounding box suggestions for each of the 49 cells, each cell will have 2 bounding boxes, with each bounding box having x, y, w ,h and c predictions. (x,y) are the coordinates of the center of the box, (w,h) are it's height and width and c is it's confidence
predictions_bounding_box_array = new_array(size(NoOfCells,NoOfCells,NoOfCells,NoOfCells))
#it's a blank array in which we will add the final list of predictions
final_predictions = []
#minimum confidence level we require to make a prediction
threshold =0.7for (i<0; i<NoOfCells; i=i+1):
for (j<0; j<NoOfCells;j=j+1):
#we will get each "cell" of size 20x20, 140(image height)/7(no of rows)=20 (step) (size of each cell)"#each cell will be of size (step, step)
cell = image(i:i+step,j:j+step)
#we will first make a prediction on each cell as to what is the probability of it being one of cat, dog, cow, wolf#prediction_class_array[i,j] is a vector of size 4 which would look like [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow]#sum(prediction_class_array[i,j]) = 1#this gives us our preidction as to what each of the different 49 cells are#class predictor is a neural network that has 9 convolutional layers that make a final prediction
prediction_class_array[i,j] = class_predictor(cell)
#predictions_bounding_box_array is an array of 2 bounding boxes made for each cell#size(predictions_bounding_box_array[i,j]) is [2,5]#predictions_bounding_box_array[i,j,1] is bounding box1, predictions_bounding_box_array[i,j,2] is bounding box 2#predictions_bounding_box_array[i,j,1] has 5 values for the bounding box [x,y,w,h,c]#the values are x, y (coordinates of the center of the bounding box) which are whithin the bounding box (values ranging between 0-20 in your case)#the values are h, w (height and width of the bounding box) they extend outside the cell and are in the range of [0-140]#the value is c a confidence of overlap with an acutal bounding box that should be predicted
predictions_bounding_box_array[i,j] = bounding_box_predictor(cell)
#predictions_bounding_box_array[i,j,0, 4] is the confidence value for the first bounding box prediction
best_bounding_box = [0if predictions_bounding_box_array[i,j,0, 4] > predictions_bounding_box_array[i,j,1, 4] else1]
# we will get the class which has the highest probability, for [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow], 0.5 is the highest probability corresponding to cat which is at position 0. So index_of_max_value will return 0
predicted_class = index_of_max_value(prediction_class_array[i,j])
#we will check if the prediction is above a certain threshold (could be something like 0.7)if predictions_bounding_box_array[i,j,best_bounding_box, 4] * max_value(prediction_class_array[i,j]) > threshold:
#the prediction is an array which has the x,y coordinate of the box, the height and the width
prediction = [predictions_bounding_box_array[i,j,best_bounding_box, 0:4], predicted_class]
final_predictions.append(prediction)
print final_predictions
prediction함수는 딥러닝으로 훈련된 모델을 사용한다. 훈련 모델을 얻기위해서는 훈련 데이터를 미리 준비해야 한다. 준비 순서는 다음과 같다.
훈련 데이터 획득
이 단계를 수행하기 위해서는 객체 당 100개 정도 수준의 데이터가 필요하다. 가능한 예측해야할 데이터와 비슷한 자료가 필요하다.
라벨링(labeling) - 주석달기
labelImg와 같은 도구를 이용해 이미지에 테두리 상자를 그리고, 라벨을 달아 놓는다. 사실 딥러닝 소스코드는 그리 어렵지 않은 수준이지만, 라벨링 작업은 매우 노동집약적이고 힘든 작업이다. 딥러닝 소스코드는 사실 이런 데이터가 된다.
모델학습
보통 GPU가 달린 컴퓨터를 이용해 학습을 시킨다. 이미 CNN과 같이 딥러닝 이미지 인식용 모델은 공개된 것이 많다. 예제도 많으니 이런 것들을 사용해 학습시킨다.
훈련에 필요한 데이터 량을 줄이는 것도 필요하다. 이와 관련된 링크를 참고한다. 미리 훈련된 모델은 여기서 찾을 수 있다.
혹시, 텐서플로우나 케라스를 설치하지 않았고, 설치하는 데 힘들다면, 다음과 같이 이미 만들어진 도커 이미지를 사용할 수도 있다. 사용방법은 여기를 참고한다.
sudo nvidia-docker run -p 8000:8000 -v `pwd`:data docker.nanonets.com/pi_training -m train -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -p '{"batch_size":8,"learning_rate":0.003}'
요구사항에 해당하는 객체를 모두 클래스화한다. 그리고, 각 클래스간 관계를 디자인한다. 예를 들어, 코인과 화폐는 서로 관계가 있다.
코인은 가치를 보관하는 개념이다. 트랜잭션은 쌍방간의 계약중 하나이며, 가치의 변경을 담는 역할이다. 블록은 트랜잭션의 변화를 기록한다. 블록은 링크드리스트(linked list) 자료구조로 정의된다. 블록의 위변조는 해쉬값으로 알 수 있다. 블록체인은 블록을 생성하고 관리한다. 스마트계약은 트랜잭션을 발생시킨다.
이 글은 블록체인과 스마트 계약 구현 원리를 이용해 보기 위해 간단히 아키텍처를 디자인해보고, 코드로 구현해 보았다. 사실, 이외 여러 기능과 구성요소가 필요하나, 다양한 블록체인 플랫폼의 핵심적인 내용은 비슷하다. 좀 더 상세한 내용은 다음 레퍼런스를 참고하길 바란다.
이 글은 연구용으로 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를 설치(링크)하고, 다음과 같이 우분투에 로긴해서 명령을 입력하면 된다.
SSH 접속 방법
참고로, 딥렌즈에 설치된 우분투로 직접 접속하지 않고, 컴퓨터에서 원격으로 접속해 딥렌즈 소프트웨어를 설치하거나 특정 명령을 실행할 수 있다. 이 경우, SSH 방식으로 터미널 접속해야 한다. 이를 위해 PuTTY 란 프로그램을 다운로드 받아 설치한다.
딥렌즈 성능은 그리 크게 좋지는 않다(HW스펙 참고). 이 정도 스펙은 세그먼테이션, 다중객체 인식을 실시간으로 돌리는 쉽지 않다. 다만, AWS와 연동성이 좋아, 딥러닝 모델을 쉽게 선택해 사용해 볼 수 있어 편의성은 높다. 그래서, 딥러닝 비전 교육 도구로써는 괜찬다고 생각한다.
딥러닝 플랫폼이 처음 나올때만해도, 텐서플로 같은 패키지를 설정하는 데만 많은 시간이 걸렸지만, 최근 나오는 딥러닝 도구는 이런 과정 없이 바로 사용할 수 있게 사용 편의성을 높여가고 있다. 점차 딥러닝 사용자의 저변이 넓어지고, 사용하기 쉬워지고 있다.
딥러닝이 특별한 사람들만 사용하는 기술처럼 보이지만, 아마존, 마이크로소프트와 같이 대기업 소프트웨어가 손쉽게 딥러닝 기술을 사용할 수 있는 도구를 출시하고 있어, 조만간 대중화되리라 생각한다. 그때는 누구나 드래그 드롭으로 딥러닝을 개발하고, 응용 프로그램을 만들 수 있을 것이다.
이 글에서는 BIM 기반 스마트 계약을 개발할 때, 어떤 방식으로 진행하는 지를 간략히 설명한다.
스마트 계약 개발 절차
개발은 보통 요구사항 정의, 분석, 설계, 개발 및 테스트로 진행된다. 요구사항 정의 시 사용되는 방법 중 하나가 유스케이스 분석이다. 유스케이스 분석을 통해, 실제 사용 사례와 시나리오를 정리한다.
유스케이스 정의
BIM의 경우 제일 큰 이슈 중 하나가 디지털 모델 변경이 다수 관계자간에 진행되어, 모델의 신뢰성 보장이 어렵다는 것이다. 신뢰성 보장을 위해서는 모델에 대한 이슈 발생과 처리 시 과정을 추적할 수 있어야 한다. 이슈 관리 이력을 분산원장(블록체인)에 저장해, 모델 변경 이력을 추적할 수 있도록 하고, 모델에 대한 신뢰성을 확보한다. 그래서, 유스케이스를 BIM 협업 상황에서 모델 변경 관련된 모델링 이슈 이력 관리로 한다. 모델 변경 시 관련 트랜잭션 정보는 다음과 같이 가정한다.
/// 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등에서 실행할 수 있다.