2018년 9월 18일 화요일

연구용 로버 프레임 정리

연구 주제가 시설물 운영 관리를 위한 원격 스캔 및 모니티링이라 로버를 사용하지 않을 수 없다. 이 글에서는 가성비 괜찬은 로버 프레임을 간단히 소개한다.

4WD 메카넘휠 로버
개발 상세내용 - https://daddynkidsmakers.blogspot.com/2016/06/3-4wd.html

Equivalent connector rover 5 mobile car chassis

The multifunctional rover 5 robot mobile car platform 




Dagu rover 5 tracked chassis mexico articulated 4 wheel robot


2018년 9월 17일 월요일

케라스 기반 이미지 인식 딥러닝 모델 구현

오랜만에 급한 일이 약간 처리되어, 쌓아 둔 케라스(Keras) 기반 딥러닝 자료를 정리한다. 이 글은 Inception, VGG등 대표적인 딥러닝 모델을 설명하고, 케라스 기반 VGG 딥러닝 구현 예제를 소개한다. 이 예제에서는 구글에서 얻은 건축 이미지와 3D 이미지 예측 정확도를 간단히 테스트해본다.

이미지넷 인식 딥러닝 모델
이미지넷 객체 인식 딥러닝 모델은 이미지넷 ImageNet Large Scale Visual Recognition Competition(ILSVRC) 대회를 통해 크게 발전되었다. 2014년 대회에서는 1000개 이미지 분류 문제가 있었고, 이를 위해, 이미지넷의 120만장 학습 이미지와 5만장 validation set, 10만장 test set을 사용할 수 있다. 
이 대회는 ground truth 와 가장 높은 확률로 예측된 클래스가 서로 일치하는 지 확인하는 top-1 정확도, 가장 높은 확률로 예측된 5개 클래스안에 ground truth 존재 여부를 확인하는 top-5 error rate로 순위를 매긴다.
Top-1 accuracy deep learning model(https://arxiv.org/abs/1605.07678) 

10 Testing Results (Review: ResNet — Winner of ILSVRC 2015 (Image Classification, Localization, Detection))

이미지 인식 문제에서 높은 정확도를 가진 모델 중 대표적인 것만 간략히 살펴본다. 

  • LENET5: 1994년 개발된 모델로 컨볼루션 뉴럴네트워크 사용함. 이 모델은 1988년부터 Yann LeCun이 개발되어 LeNet5으로 이름지어짐. 이 모델은 컨볼루션 레이어 3개를 사용하여, 이미지 특징 벡터를학습하였음. 이 당시에는 GPU가 없어, 대용량 계산 시간을 줄이기 위해 희소 연결 행렬을 사용하였음 

  • AlexNet: 딥러닝 대부 중 한명인 Geoffrey E. Hinton제자인 2012년 Alex Krizhevsky가 발표한 이미지넷의 이미지 인식 정확도를 극적으로높인 첫번째 딥러닝 모델. Top 5 test error가 15.4%로 2위 모델보다(26.2%) 정확도가 매우 높음. 5개 컨볼루션 레이어와 3개 fully connected 레이어 사용함. 이 모델에서 ReLu(Rectified Linear Unit), over fitting 방지를 위한 Dropout 기법이 적용됨. GPU를 NVIDIA GTX 580 사용하였음


  • Xception: 이미지 넷에서 0.945 정확도로 top-5 validation 획득한 모델. 입력 이미지는 299x299임
  • VGG: 2014년 옥스포드 VGG 그룹에서 개발된 딥러닝 모델. 알렉스넷의 커널 크기를 11에서 3x3으로 줄였고, 성능을 높임. 19층 레이어를 쌓음. 이미지넷 정확도를 92.3%로 개선. 층이 깊어 역전파 될 때 그레디언트가 작아져 해가 수렴되지 않은 문제(gradient vanishing)가 있었음 



  • ResNet: 2015년 이미지넷 ILSVRC에서 3.6% 에러율로 1등 차지한 모델. 참고로 인간 분류 오차가 5~10%임. 알렉스넷과 같은 전통적인 순차 네트워크와는 달리, ResNet은 exotic architecture로 네트워크 내에서 네트워크를 구조화한 모델임. 이런 구조는 마이크로 구조라는 블럭 빌딩 세트 집합으로 구성됨. residual block을 이용해 gradient vanishing문제 해결
Residual block(ResNet)

  • Inception: 2015년 이미지넷에서 우승. VGG의 계산 시간/성능을 개선한 모델. 다양한 필터와 1x1 풀링(pooling) 기법 등 사용해 전체적으로 네트워크 연결을 줄임. 컨볼루션 필터을 쪼개어 연산수를 낮게 만듬. 이를 통해, 핵심적인 연산은 밀도있게 처리함

  • DenseNet: 2016년 개발된 모델. 해를 좀 더 효과적으로 찾고 수렴시키기 위해, 역전파를 순차적으로 하는 것이 아닌 건너뛸수 있도록 네트워크 망을 개선함



객체 인식 딥러닝 모델
R-CNN(2013), FAST R-CNN(2015), FASTER R-CNN(2015), YOLO 등은 이미지 속 다양한 객체 경계를 탐색하는 모델이다. 이 문제는 경계 탐색 작업과 객체 분류 작업으로 구성된다.
아래 링크에 이와 관련된 모델 및 구조가 설명되어 있다.

케라스 설치 및 사용 방법
아래 링크를 참고해 케라스를 설치하고 실행되는 지 확인해 본다.

케라스 기반 VGG 딥러닝 모델 구현
케라스는 MXNet, Deeplearning4j, Tensorflow, Theano, 와 같은 다양한 딥러닝 프레임웍을 기능적으로 캡슐화한 딥러닝 프레임웍이다. 모델링이 직관적이고 간편해 많이 사용된다. 

케라스에는 VGG, ResNet, Inception V3, MobileNet 등 다양한 딥러닝 모델이 이미 구현되어 있어, 가져다 사용하기만 하면 된다. 

이 글에서는 VGG 딥러닝 모델을 케라스로 간단히 구현해 본다. 우선, 케라스, numpy, matplotlib 등은 설치되어 있다고 가정한다. VGG 모델은 이미 이미지넷이 훈련된 모델을 다운받아 사용한다. VGG로 이미지를 인식하는 코드는 다음과 같다.

from keras.models import Sequential 
import keras
import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet

#VGG 모델을 로딩함
vgg_model = vgg16.VGG16(weights='imagenet')

from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.imagenet_utils import decode_predictions
import matplotlib.pyplot as plt

filename = '/home/ktw/tensorflow/door1.jpg'
# 이미지 로딩. PIL format
original = load_img(filename, target_size=(224, 224))
print('PIL image size',original.size)
plt.imshow(original)
plt.show()

# PIL 이미지를 numpy 배열로 변환
# Numpy 배열 (height, width, channel)
numpy_image = img_to_array(original)
plt.imshow(np.uint8(numpy_image))
plt.show()
print('numpy array size',numpy_image.shape)

# 이미지를 배치 포맷으로 변환
# 데이터 학습을 위해 특정 축에 차원 추가
# 네트워크 형태는 batchsize, height, width, channels 이 됨
image_batch = np.expand_dims(numpy_image, axis=0)
print('image batch size', image_batch.shape)
plt.imshow(np.uint8(image_batch[0]))

# 모델 준비
processed_image = vgg16.preprocess_input(image_batch.copy())

# 각 클래스 속할 확률 예측
predictions = vgg_model.predict(processed_image)
 
# 예측된 확률을 클래스 라벨로 변환. 상위 5개 예측된 클래스 표시
label = decode_predictions(predictions)
print(label)

구글에서 검색해 얻은 문, 창문과 같은 건축 실내 요소 이미지들을 저장해 놓고, 입력해 얻은 결과는 다음과 같다. sliding door로 인식된 결과를 확인할 수 있다.


다른 테스트를 위해, 3D 모델링에서 캡쳐한 이미지의 인식 정확도를 확인해 보았다. 
VGG딥러닝 모델에서 유사한 클래스가 인식된 것을 확인할 수 있다. 다만, 이미지넷에 올라온 객체가 본인이 제시한 이미지와는 상이한 부분이 있어 정확도가 높지는 않다. BIM과 같은 3D모델에서 캡쳐한 이미지가 유사하게 인식되나, 마찬가지로 정확도가 그리 높지는 않다. 

테스트해본 결과를 보면, 정확도를 높이기 위해서는 목적에 맞는 훈련용 데이터 확보와 처리가 필수적이라는 것을 알 수 있다. 딥러닝 모델은 훈련된 데이터셋에 대한 부분만 정확도 높게 예측할 뿐이다. 

레퍼런스




2018년 7월 13일 금요일

우분투 18.04 아나콘다 기반 텐서플로우 케라스 설치

아래 글은 우분투 18.04 기반 텐서플로우 케라스 설치 방법을 간략히 요약한 것이다.
아나콘다를 사용하기 때문에 설치는 매우 쉽다. 아래는 설치 후 테스트한 노트북 화면이다. 

2018년 7월 9일 월요일

손쉬운 해킹 도구

이 글은 간단한 해킹 도구에 대한 내용을 요약한다.

Hacker Warehouse

Universal Radio Hacker (hackaday.com)

레퍼런스

2018년 6월 20일 수요일

드론 기반 벨로다인 라이다 스캔

SLAM기술은 LiDAR기술이 저렴해 지면서 점점 더 다양한 분야에 확산되고 있다. 이미 드론이나 무인자율주행차량에 장착된 지 오래이며, 일부는 농업, 광업과 같은 특수한 분야에까지 응용되고 있다. 

2018년 6월 19일 화요일

밸로다인 LiDAR 센서와 VeloView 사용기

이 글은 밸로다인(Velodyne) LiDAR 센서와 VeloView 사용기를 간략히 공유한다.

진행 중인 연구과제 핵심 기술을 좀 더 깊게 이해하기 위해, 벨로다인 센서를 구입해 분석중이다. 2014년부터 진행한 비전 역설계 과제의 활용 센서는 Kinect, Intel RGBD sensor, RPLiDAR 였다. 이때 목적은 저렴한 스캔 기술이 가능한지 파악하는 것이었다. 그때 문제는 정확도와 밀도였는 데, Trimble TX5 LiDAR에 비해 현격하게 차이나는 정확도와 밀도는 플랜트와 같은 정밀 엔지니어링에 활용하기 어려운 수준이었다(플랜트 대상).

밸로다인센서 VLP-16은 IMU 데이터를 입력받을 수 있는 데이터 통합 보드를 함께 제공한다. 센서 스펙은 다음과 같다. 참고로, TX5 같은 전문적인 LiDAR 센서는 최소 수백만 포인트 이상 획득되는 데 실시간은 아니며, 가격이 고가이다. 참고로, 저가 모델인 VLP-16은 7~8백만원대로 구입할 수 있다.
  • Dual Returns
  • 830 grams
  • 16 Channels
  • 100m Range
  • Up to 600,000 Points per Second
  • 360° Horizontal FOV
  • ±15° Vertical FOV
  • Low Power Consumption
  • Protective Design

벨로다인에서 얻은 (X, Y, Z, I) 데이터로 구성된 포인트 클라우드 데이터에는 가속도 값이 포함되어 있지 않다. 센서가 기울어지면, 데이터도 함께 기울어지므로, 이를 보정할려면, IMU에서 제공하는 Xa, Ya, Za 가속도 값이 필수적이다. 통합 보드에 IMU를 장착하고, 데이터를 취득하면, (X, Y, Z, I, Xa, Ya, Za) 값이 함께 TCP/IP 케이블을 통해 컴퓨터에 전달되는 구조이다.
센서, 데이터 통합 보드 및 통신 케이블

벨로다인 라이다 센서

데이터 통합 보드

이론상 VLP-16센서는 100미터까지 스캔을 할 수 있다. 본인은 사무실 공간에서 스캔을 해 보았는 데, 600 미터제곱 면적의 사무실 공간 벽체까지 스캔되는 것을 확인하였다. 참고로, 사무실은 둥근 직사각형 모양이며, 중간에서 벽체까지 거리는 25미터 정도이다.
스캔된 포인트 클라우드 모습

밸로다인 센서를 구동하는 프로그램은 VeloView이다. 윈도우에서는 VeloView를 설치하면드라이버가 함께 설치된다. TCP/IP4 네트워크 등 설정 후, 프로그램을 실행하고 연결된 라이다 장치를 VLP-16으로 선택하면 바로 점군을 실시간으로 볼 수 있다. 

TCP/IP4 설정


단, TCP/IP 이더넷 케이블 통신이므로, 방화벽이 있는 경우, 비활성화해야 한다. 우분투 리눅스에서는 아래 github 링크에서 다운로드 받은 VeloView 소스를 빌드해야 한다. 
VeloView는 포인트 클라우드를 시계열방식으로 캡쳐할 수 있는 기능있다. .pcap 점군 캡쳐파일을 저장한 후, 다시 재생할 수 있다. VeloView의 자세한 기능은 다음 영상을 참고한다.

ParaView는 획득된 점군을 분석하고, 처리하는 프로그램으로 구입시 함께 포함되어 있다. 오픈소스이므로, 다운로드받아 설치해도 된다. 
ParaView 활용 예

3차원 점군은 대용량이다. 임베디드 보드는 대용량 점군 처리가 가능한 것이어야 하며, 다음과 같은 것을 추천한다. 
NVIDIA TX2
NVIDIA TX2 CARRIER BOARD(캐리어 보드. TX2 개발보드 크기가 너무 커 이동성이 떨어진다면 캐리어 보드를 사용하면 된다)

다음은 라떼판다(LATTE PANDA) 임베디드 컴퓨터에 VELOVIEW를 설치한 후 실행한 모습이다. 큰 문제 없이 포인트 클라우드가 실시간으로 획득되어 가시화되는 것을 확인할 수 있다.
 



아래는 ODROID XU4에 VLP16를 마운트해 만든 드론 기반 LiDAR 스캔 프로젝트 사례이다. 

이제, 엔지니어링 전용 라이다, 토탈 스테이션과 밸로다인 센서의 정확도, 밀도를 확인 비교해 볼 계획이다.