NPU:Intel Compute Stick 2

8-2 RaspberryPI B + Intel OpenVINO + NCS2 + PiCamera 실시간 AI 시스템 구성

coding art 2019. 12. 15. 17:43
728x90

 

 

 

 

지금까지 인공지능 알고리듬에 관한 블로그를 상당부분 게재하였으나 이번부터는 실제 카메라와 연동이 되는 실시간 시스템을 구성해 보는 단계로 넘어 가기로 한다. 비록 알고리듬 분야가 익숙하지 않더라도 실시간 카메라 인공지능 시스템을 구성할 수 있다면 인공지능 연구개발을 시작할 수 있으리라 본다.

 

IntelNCS2를 사용한 기본적인 예제들을 대상으로 살펴보면 실시간 카메라와 연동되는 AI 영상인식 튜토리얼 사례를 찾을 수 없는 듯하다. 특히 윈도우즈10 데스크 톱 PC를 사용해본 경험에 의하면 딱 2종류의 예제를 실행시켜 볼 수 있었다. 하나는 AI 영상 분석 결과를 텍스트 형식으로 Confidence 확률을 출력해 볼 수 있으며 나머지 모델에서는 차량을 대상으로 Detection과 아울러 번호판을 감지할 수 있었다. 물로 윈도우즈10 데스크 톱에 OpenCV 및 카메라 설치가 불가능한 것은 아니겠으나 아주 쉬운 오픈소스 튜토리얼 자체가 없는 듯하다.

 

 

한편 실시간 카메라 연동이 가능한 작은 보드 모델로서 2019년 초에 출시된 NVIDIA의 Jetson Nano 보드를 들 수 있다. 작다고는 하지만 라즈베리 파이 보다는 상대적으로 사이즈가 큰 보드인데 AI World 튜토리얼 예제를 해보면 Face Recognition, Object Detection 및 Semantic Segmentation 까지 실시간 카메라 연동 인식 시스템이 지원 되고 있다. 이에 비해서 Intel의 NCS2도 2018년 말에 출시되었음에도 불구하고 OpenVINO를 사용하여 실시간 카메라 연동 AI 시스템을 구성하기는 거의 불가능해 보인다.

하지만 AI 분야에서 이미지와 영상 처리는 너무나 흥미로운 분야이므로 PiCamera 와 NCS2를 사용하는 실시간 AI 영상인식 시스템의 가능성을 찾아보지 않을 수 없었다. Intel Neural Compute Stick2 설치 튜토리얼을 자세히 읽어 보면 라즈베리 파이 보드의 Raspbian OS를 대상으로 NCS2를 설치하는 예제 튜토리얼이 있어 그 내용을 아래 블로그에서처럼 이미 살펴보았다.

 

 

 

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

http://blog.daum.net/ejleep1/905

 

 

 

하지만 궁극적으로 PiCamera NCS2가 실시간 연동이 되어 AI 인식이 가능한 코드는 아니었다. 반면에 라즈베리 파이를 대상으로 Computer Vision 인터넷 강의를 주로 하는 Adrian의 블로그에서 이 문제를 오픈소스 차원에서 심층적으로 다루고 있어 참고를 하게 되었다. Adrian2018년 블로그에 의하면 인텔의 Neural Compute Stick 이 없이 인텔의 OpenCV 만을 사용하여 라즈베리파이 보드의 CPU 성능이 AI 영상 처리가 다소 빈약하긴 하였지만 웬만큼 AI 영상인식의 가능성은 다 보여 주었다. 아울러 NCS2까지 출현하게 됨에 따라 별도의 Raspbian OS에서 NCS2를 사용하는 튜토리얼 블로그도 게재가 되었다.

 

OpenVINO, OpenCV, and Movidius NCS on the Raspberry Pi: By Adrian Rosebrock on April 8, 2019 in Deep Learning, Embedded, IoT, Movidius, Raspberry Pi, Tutorials

https://www.pyimagesearch.com/2019/04/08/openvino-opencv-and-movidius-ncs-on-the-raspberry-pi/

 

Adrian의 블로그를 따라 라즈베리파이+3B OpenVINO를 설치해 본 결과 게재 내용은 윈도우즈 10 데스크톱이나 Ubuntu 16.04를 사용하는 노트북에서의 설치 과정과는 다소 다른 점이 있음을 지적하고자 한다. AdrianC++ 보다는 파이선을 사용하면서 동시에 가상환경 설치 방법을 선호하는 듯하다. 가상환경은 윈도우즈10 데스크 톱에 TensorFlow 또는 PyTorch를 사용하여 알고리듬 코드를 실행시킬 수 있는 아나콘다 Backend 설치에서도 사용되는 중요한 기법이다. 즉 한 PC 내의 아나콘다에서 TensorFlow PyTorch를 동시 설치가 안되는데 각각이 사용하는 라이브러리 모듈들간의 충돌 문제인 듯하다. 따라서 따로 가상환경을 설치해야 한다. 라즈베리 파이 보드를 사용해 보던 2017년 초창기에 가상환경이 아주 생소하게 느껴졌는데 2018년에 아나콘다와 TensorFlow PyTorch를 설치해 보고서야 그 중요성을 인식하게 되었다. 한편으로 2019년 중반에 GPU 지원이 되는 구글의 Colaboratory 클라우드 서비스를 사용해 보니 이 시스템에선 가상환경 문제가 없었다. 하지만 우리가 사용해야 하는 시스템이 아주 작은 경우 가상환경은 나름대로 유용하다고 볼 수 있다.

 

라즈베리파이 보드에 Intel Neural Compute Stick2Adrian 의 방식에 따라 설치해 보기로 하자. 준비물은 다음과 같다. 한 가지 문제점은 Raspbian OS 로서 지금 현재의 Buster 버전이 아닌 2018년의 Stretch를 사용한다는 점이다. 다운받기 위해 찾아보니 이미 사라져 버린 상태였다. 다행히 2018년에 준비해 둔 Stretch 버전 SD카드 2장이 준비되어 있어 사용하였다. Buster 버전도 한번 시도해 보았지만 OS 시스템에 손상이 가는 듯 하며 아직 성공하지는 못했다.

 

다음의 영문 내용은 필요한 준비물이다. 라즈베리파이3 B(+B), 파이 카메라 V2, NCS2, 32GB 이상의 SD카드 가 필요하다. 모니터는 사용 중인 PC 모니터를 잠깐 활용해도 무방하다. 특히 VNC를 설치하게 되면 PC에서도 볼 수 있으므로 굳이 모니터가 없어도 무방하다.

 

 

앞서 URL 주소와 함께 언급했던 블로그(OpenVINO, OpenCV, and Movidius NCS on the Raspberry Pi)를 그대로 따라 하기로 해보자.

Step#0에서 메모리 사용을 체크하고 raspi-config 모드에서 Expand File System을 실행한다. 아우러 Camera 도 enable 로 설정되어 있는지 확인한 후 재부팅한다.

 

Step#1에서 매쓰매티카와 워드를 지워 메모리를 확장하는데 이 부분은 안해도 그만이다.

 

Step#2에서 update 및 upgrade를 실시한다. 현재 라즈베리파이 OS는 2018년의 Stretch 버전에서 Buster 로 넘어옴에 따라 업데이트는 시간이 많이 걸리지 않지만 업그레이드는 상당한 시간이 요구된다. 업그레이드 과정에서 탈이 나는 일은 없으므로 엔터 키를 친 후 충분한 시간 경과 후에 돌아오면 된다. Cmake 는 C/C++ 라이브러리 포함 코드들을 컴파일 빌드하는데 필요하다. 하지만 Adrian의 블로그 특성 상 거의 파이선 중심이므로 실제로 Cmake를 사용하지는 않는 듯하다.  NCS2를 라즈베리 OS에서 실행시키는 이유 중에 가장 큰 것이 라즈베리 파이의 CPU 부담을 덜 수 있도록 AI 연산을 가속화시키고자 함이다. 업데이트 및 업그레이드를 시작으로 츠맏 설치에 이어 실시간으로 Pi Camera 기능을 활성화할 수 있도록 라이브러리 모듈을 설치한다. 그밖에 GTK3은 에러는 아니지만 GUI 관련하여 계속 발생할 수 있는 warning을 억제하도록 한다. gfortran 은 GNU fortran으로서 수치계산에 도움을 주는 컴파일러이다.

 

 

 

이어서 가정 중요한 파이선3(3.5)을 설치하도록 하자. Stretch버전에서는 python3.5가 설치되는데 Buster 버전에서는 설치 후 확인해 보면 python3.7이 설치되어 이어지는 작업이 불가능했다. python3.5 버전은 OpenCV를 불러오는 내용과 밀접히 연동되어 있어 반드시 지켜져야 한다. Root 디렉토리의 /usr/lib/에서 살펴보면 python2.7, python3, python3.5 폴더가 설치되어 있음을 알 수 있다.

 

 

 

Step#4에서 OpenVINO를 다운받아 압축을 해제하여 설치하자. openvino toolkit 버전 R5인 듯한데 버전이 문제가 되지는 않는 듯하다.

 

 

 

Step#5에서는 openvino/inference_engine_vpu_arm/bin/폴더에 들어 있는 setupvars.sh 파일을 수정하도록 하자. command line 편집 명령 nono를 사용하든지 아니면 라즈베리 파이의 text editor 르 사용하도록 한다. setupvars.sh 파일을 열어 보면 #설명이 끝나는 header 영역 첫줄에 INSTALLDIR=<INSTALLDIR>가 있음을 알 수 있다. 여기서 <INSTALLDIR>/home/pi/openvino/inference_engine_vpu_arm 으로 경로를 수정해 주도록 한다.

 

 

 

.bashrc 파일을 수정해 주어야 한다. . 이 붙은 파일명은 파일 아이콘의 보기에서 숨김 파일표시를 클릭해주면 볼 수 있다. 이 파일을 nano tezt editor로 열어서 끝 부분에 source ~/∙∙∙ 내용을 편집해 넣어 두도록 한다. 그 기능은 매번 터미널을 열 때마다 즉 bash가 일어날 때마다 setupvars.sh 가 실행되어 openvino 변수들이 초기화 된다.

 

 

위 작업이 완료되면 다시 source ~/.bashrc 명령을 실행하여 자동으로 .bashrc 하도록 만들어 둔다.

 

 

Step#6에서는 NCS2 USB 형태의 임베디드 시스템이므로 USB Rule을 설정하도록 한다.

라즈베리에 로그인한 사용자를 Group 에 등록하도록 한다. 또 다른 사용자가 자신의 ID로 로그인하여 openvino를 사용하려면 마찬가지로 등록을 해야 하며, 완료 후 재부팅 시킨다.

 

 

재부팅 후 아래와 같이 명령을 실행하고 마지막에 Successfully installed를 확인하자.

 

Step#7에서는 OpenVINO 가상환경을 설정하도록 하자. 이 방법은 저자인 Adrian 이 즐겨 쓰는 괜찮은 방법이므로 익숙해지도록 하자. 팩키지 설치 매니저인 pip을 먼저 깔도록 하자. pip을 이용하여 virtualenv를 설치한다.

 

 

 

가상환경이 설치 되었으면 다시 nano ~/.bashrc 편집 명령을 사용하여 가상환경과 python3를 함께 묶어 즉 아래의 export∙∙∙, ecport ∙∙∙, source ∙∙∙ .bashrc 파일을 업데이트 하도록 하자. nano를 사용하거나 아니면 라즈베리파이의 text editor를 사용해도 된다.

 

 

 

 

nano 편집기에서 본 그 결과는 다음과 같다.

 

 

 

항상 .bashrc를 업데이트 후 반드시 source ~/.bashrc 명령을 실행해 두어야 한다. 가상환경(virtualenv)을 만든 후 openvino python3 python3.5를 설치하고 workon 명령을 사용하여 가상환경으로 들어가면

 

 

아래와 같이 (openvino)가 프롬프트에 나타남을 볼 수 있다.

 

 

 

Step#8에서 OpenVINO 환경에 라이브러리(numpy, picamera[arrays],imutils)을 설치하자.

Pi Camera를 설치하지만 실제로 imutils 에 내재된 video streaming 기능이 사용됨에 유의하자. 이는 Jetson Nanogstream_pipeline 루틴과 유사하다.

 

Step#8 다음이 Step#9가 아닌 다시 Step#6에서 시작하는데 Adrian 이 다른 블로그에 작성했던 부분을 끌어다 쓰는 것 같으며 트린 번호 자제가 별 문제가 되지는 않는다.
다음과 같이 find ∙∙∙ 명령을 실행하면 ∙∙∙-gnuebihf.so가 출력된다. 이부분은 반드시 확인을 해야 한다. ∙∙∙-gnuebihf.so가 없으면 안된다.

 

 

 

openvino 가상환경 하의 site-packages 폴더에서 ln s ∙∙∙명령을 실행하여 OpenCVOpenVINO 사이의 sym-link를 형성하는 과정이다. 가장 중요한 부분으로서 이 부분이 제대로 되어야 예제 실행이 가능하다.

 

 

 

Step#7에서는 지금까지의 작업을 통해 제대로 설치가 이루어졌는지 확인하도록 하자. 2019openvino 버전이 4.1.2 로 출력된다.

 

 

이로서 Adrian 블로그의 OpenVINO 설치 작업이 완료되었으며 카메라와 연동되는 파이선 예제 문제를 고려해 보자.

원래 인텔의 Getting Started에 따르면 cmake make를 실행하여 파일을 준비하는 것으로 되어 있으나 Adrian은 이 과정을 사용하지 않고 미리 다른 곳에서 준비한 결과물을 가져다 사용한다.

 

 

 

xopenvino 폴더에 MobileNetSSD_deploy.prototxt, MobileNetSSD_deploy.caffemodel openvino_real_time_object_detection.py 가 있음을 알 수 있다. 3 파일은 Adrian으로부터 이메일로 신청하여 받을 수 있다.

 

파이선 실행 파일인 openvino_real_time_object_detection.py 에 대해서 살펴보자.

필요한 라이브러리 모듈들의 import에 이어서 argument parsing 작업이 필요하다. 파이선 IDLE를 사용할 경우에는 단순히 파이선 파일의 RUN 만이 가능하지만 command line 명령을 사용할 경우에는 즉 puthon + 파이선 파일 + 알파 형식의 명령 수행이 가능하다. 알파 부분에 해당하는 내용이 바로 argumnet parsing 의 대상이며 여기서는 첫째 MobileNet_SSD_deploy.prototxt 파일이며 둘째로 MobileNetSSD_deploy.caffemodel 이다.

prototxt 파일을 열어보면 CNN 알고리듬 유사한 내용이 들어 있음을 알 수 있다. caffemodel은 열어 볼 수 가 없는데 아마도 pre-trained 된 웨이트와 바이아스 값들이 들어 있는 듯하다.

 

 

 

OpenCV에서 Caffe 모델을 불러 detection 알고리듬을 실행 시키며 아울러 디바이스 명칭이 MYRIADNCS2를 연동시킨다.

 

 

 

(openvino) 가상환경에서 다음과 같이 python openvino_real_time_object_detection.py prototxt MobileNetSSD_deploy.prototxt model MobileNetSSD_deploy.caffemodel 명령을 실행 시키면 23초 후 카메라 화면이 나타난다. 화면에 나타난 오브젝트들의 수가 적을 때와 많을 때 시간 당 frame 수 차이가 변동적으로 나타난다.

 

 

 

Adrian에 의하면 NCS2를 사용할 경우 초당 8.3 frame까지 성능이 올라가며 NCS2가 없을 경우에는 1.0 frame 도 채 안 된다는 점을 알 수 있다.

 

 

 

상당히 긴 과정이긴 하나 AdrianOpenCV 설치 과정 경험이 있다면 그다지 어려울 것은 없어 보인다. 우리 글로 작성한 번역성 튜토리얼이므로 세밀하게 읽어 본 후 Adrian 의 블로그를 열어서 Copy Paste 작업을 하면 될 것이다.

 

비록 인공지능(머신러닝)분야에서 알고리듬을 비롯하여 배워야 할 것들이 많겠지만 설사 그런 것들을 모르는 상태에서도 직접 이 시점부터 실시간 AI 시스템을 구성해 보는 것도 AI를 연구를 시작하기 좋은 시점이 될 수 있을 것이다.