Stretch OS 라즈베리파이 보드에 인텔의 Neural Compute Stick2를 설치해 보자. 2019년 12월 현재 보급되는 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 구조를 참조하자.
라즈베리 파이 IDLE는 dependency 설정이 되어 있지 않으므로 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 주소도 포함되어 있다.
'NPU:Intel Compute Stick 2' 카테고리의 다른 글
8-2 RaspberryPI B + Intel OpenVINO + NCS2 + PiCamera 실시간 AI 시스템 구성 (0) | 2019.12.15 |
---|---|
30년 공백을 깨고 돌아 온 Neural Processing Unit: Intel Neural Compute Stick 2 설치 (0) | 2019.11.25 |