NPU:Intel Compute Stick 2

8-1 라즈베리파이 B(B+)에 OpenVINO에 의한 Intel Neural Compute Stick2 설치

coding art 2019. 12. 11. 17:48
728x90




Stretch OS 라즈베리파이 보드에 인텔의 Neural Compute Stick2를 설치해 보자. 201912월 현재 보급되는 Buster 이전의 OS Stretch 버전이며 2018년에 OpenCV를 성공적으로 설치한 경험이 있다. 인텔의 홈페이지에서도 Stretch 버전을 대상으로 설치하고 있으며 Buster 버전도 안된다는 법은 없으므로 곧 시도해 볼 필요가 있을 것이다.

인텔 홈페이지에 윈도우즈, 리눅스 및 라즈비안 세가지 버전을 명시하고 있으나 리눅스 버전에 라즈비안 버전을 살짝 까워 넣는 방식으로 설명하고 있으므로 주의 깊게 혼란을 피하도록 하자.


라즈비안 OS 다운경로로 클릭해 들어가면 OpenVINO 설치 과정 개요를 볼 수 있다.


스크롤 다운하여 다음 화면의 intel@Distribution of OpenVINO toolkit for Linux* OX 경로로 들어가서 다운로드하자. 이 부분 영어 문장 “you need to perform extra steps comparing to the∙∙∙번역에 상당히 혼란스러울 수가 있으나 그냥 클릭하고 들어가 보면 된다.




버전 R3를 클릭하면 Ubuntu 버전들과 함께 2019.3.334 Raspbian 버전이 있으므로 다운로드 받도록 하자.


터미널 화면 /home/pi에서 “sudo mkdir p /opt/intel/openvino” 명령을 실행하고 라즈베리 File 아이콘을 클릭하여 root(“/”) 아래에 opt 폴더가 생성되었음을 확인하자.

 

다시 터미날에서 Downloads폴더로 이동한다. Downloads 폴더에서 확장자가 tgz 인 압축파일을 확인하자. 다운받은 압축파일의 <version> 부분에 2019.3.334 를 대체하여 Unpack 명령을 실행하자.

 

sudo tar xf 1_openvino_toolkit_runtime_raspbian_p_2019.3.334.tgz strip 1 C /opt/intel/openvino

 

압축을 푼 후에 cd ..하여 /home/pi에서 cmake를 다운로드 하자. 버전이 3.7.2.이상임을 확인한다. source 명령을 사용하여 /opt/intel/openvino/bin/ 디렉토리의 setupvars.sh를 터미널을 열 때마다(./bashrc) 실행하여 변수들을 초기화 시키도록 하자.


build 폴더를 생성하여 들어가자. 위 그림의 예는 작업 순서가 잘못 된 사례이다. setupvars.sh 실행 및 초기화 후 앞 과정에서 에러가 발생했던 usbRule을 수정하여 다시 실행하였으며 Sucessfully installed를 확인하였다. Intel Neural Compute Stick2 USB 형태로 인터페이스하여 사용된다는 점에 유의하자. 이어서 Cmake로 오픈소스 컴파일 작업을 실행하자. C 컴파일러와 많은 수의 C 라이브러리들과 libinference_engine.so 들이 컴파일 이 이루어지며 native make 파일이 생성된다. make를 실행한다. make 작업 결과 target object_detection_sample_ssd 가 생성된다


target을 실행하려면 필요한 라이브러리 모듈 즉 face-detection-ada-0001.xml, 디바이스 이름 즉 MYRIAD 및 입력 이미지 bmp 파일명을 지정해 주어야 한다.


아래는 실행 결과 얻어진 이미지 파일이다.




C++ 코드 예제가 아닌 파이선3 예제 코드를 살펴보자. 다음과 같이 .bin 파일과 .xml 파일을

build 폴더에 다운로드 받아야 한다. C++에서는 .xml 파일 하나를 다운 받아 사용하였는데 파이선에서는 .bin .xml 의 두 파일로 나뉘어져 있는 셈이다. 다음의 Workflow 구조를 참조하자.



라즈베리 파이 IDLEdependency 설정이 되어 있지 않으므로 build 폴더에서 command line 명령 “python3 openvino_fd_myriad.py”을 사용해야 한다.

 

import cv2 as cv

# Load the model.

net = cv.dnn.readNet('face-detection-adas-0001.xml',

'face-detection-adas-0001.bin')

# Specify target device.

net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

# Read an image.

frame = cv.imread('faces.bmp')

if frame is None:

raise Exception('Image not found!')

# Prepare input blob and perform an inference.

blob = cv.dnn.blobFromImage(frame, size=(672, 384), ddepth=cv.CV_8U)

net.setInput(blob)

out = net.forward()

# Draw detected faces on the frame.

for detection in out.reshape(-1, 7):

confidence = float(detection[2])

xmin = int(detection[3] * frame.shape[1])

ymin = int(detection[4] * frame.shape[0])

xmax = int(detection[5] * frame.shape[1])

ymax = int(detection[6] * frame.shape[0])

if confidence > 0.5:

cv.rectangle(frame, (xmin, ymin), (xmax, ymax), color=(0, 255, 0))

# Save the frame to an image file.

cv.imwrite('outfaces.png', frame)

 

다음은 Neural Compute Stick2 의 안면 인식 결과이다. 얼굴이 기울어지거나 일정 각도 회전한 상태에서도 괜찮은 인식 결과를 주고 있다.




라즈베리 파이 보드에서는 Inference_engine만 지원이 되고 model optimizer는 지원이 되지 않으므로 pre-trained model

을 사용해야 한다. model optimizer의 실 예로서는 2012년의 Alexnet을 생각하면 될 것이다. Class 1000개를 대상으로 GPU 지원이 가능한 고성능 컴퓨터에서 한 달 정도 연산하여 얻어지는 학습 결과를 필요로 하는데 일반 데스크 톱 PC로는 처리가 불가능하다고 볼 수 있을 것이다. 그런 이유로 Trandfer Learning 방식에 의해서 pre-trained model을 사용하는 것이다.

.

아울러 라즈베리 파이에서 NCS2 르 사용하더라도 결국은 파이카메라와 연동하여 실시간 안면인식 코드를 작성해야 할 것이다.

 

이 블로그의 내용은 다음 URL 주소의 내용을 참조하였다. pre-trained model 사용법에 관한 URL 주소도 포함되어 있다.

https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_raspbian.html#install-package