noprianto
noprianto
. 12 min read

Installasi Neural Compute Stick 2 Raspberry Pi 3 B+

Persiapan peralatan
Neural Compute Stick 2

Bismillah,
Neural Computer Stick atau yang biasa disingkat NCS merupakan perangkat usb keluaran intel yang bertujuan untuk mempercepat proses deploy dan prototype aplikasi Deep Neural Network(DNN), intel mengatakan di dalam perangkat ini dibenamkan sebuah Intel® Movidius™ Myriad™ X VPU. Versi NCS saat ini 2, dikabarkan 8x lebih cepat dari pendahulunya Intel® Movidius™ Neural Compute Stick (NCS).

Prototype and deploy deep neural network (DNN) applications smarter and more efficiently with a tiny, fanless, deep learning development kit designed to enable a new generation of intelligent devices.
The new, improved Intel® Neural Compute Stick 2 (Intel® NCS 2) features Intel’s latest high-performance vision processing unit: the Intel® Movidius™ Myriad™ X VPU. With more compute cores and a dedicated hardware accelerator for deep neural network inference, the Intel® NCS 2 delivers up to eight times the performance boost compared to the previous generation Intel® Movidius™ Neural Compute Stick (NCS)

Diambil dari website Intel

Selain Intel mengeluarkan perangkat untuk kebutuhan computer vision, Intel juga menyediakan platformnya juga yaitu OpenVINO. OpenVINO yang merupakan kepanjangan dari Open Visual Inferencing and Neural Network Optimization didesign khusus untuk mempercepat dalam proses inferencing seperti classification dan object detection. Beberapa pokok bahasan yang akan dibahas adalah sebagai berikut

Test Perangkat Neural Compute Stick 2

Sebelumnya menggunakan NCS ke penggunaan yang lebih komplek, kita testing terlebih dahulu perangkat tersebut. Beberapa paket yang dibutuhkan adalah sebagai berikut

sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libatlas-base-dev git automake byacc lsb-release cmake libgflags-dev libgoogle-glog-dev liblmdb-dev swig3.0 graphviz libxslt-dev libxml2-dev gfortran python3-dev python-pip python3-pip python3-setuptools python3-markdown python3-pillow python3-yaml python3-pygraphviz python3-h5py python3-nose python3-lxml python3-matplotlib python3-numpy python3-protobuf python3-dateutil python3-skimage python3-scipy python3-six python3-networkx python3-tk

Selanjutnya kita perlu download NCSDK ke dalam raspberry, ketikkan perintah di bawah ini pada terminal Anda

cd ~
mkdir workspace
cd workspace
git clone https://github.com/movidius/ncsdk

Kemudian kita butuh compile dan install NCSDK API framework, gunakan perintah di bawah ini untuk melakukan hal tersebut

cd ~/workspace/ncsdk/api/src
make

Ketika dijalankan output yang dihasilkan kurang lebih seperti di bawah ini, yang menandakan paket-paket yang dibutuhkan sudah berhasil dipasang

cc -O2 -Wall -pthread -fPIC -MMD -MP -I. -I../include -I/usr/include/libusb-1.0  -c usb_boot.c -o obj-armv7l/usb_boot.o
cc -O2 -Wall -pthread -fPIC -MMD -MP -I. -I../include -I/usr/include/libusb-1.0  -c usb_link_vsc.c -o obj-armv7l/usb_link_vsc.o
cc -O2 -Wall -pthread -fPIC -MMD -MP -I. -I../include -I/usr/include/libusb-1.0  -c mvnc_api.c -o obj-armv7l/mvnc_api.o
cc -shared obj-armv7l/usb_boot.o obj-armv7l/usb_link_vsc.o obj-armv7l/mvnc_api.o -o obj-armv7l/libmvnc.so.0 -lpthread -lusb-1.0 -ldl
ln -fs obj-armv7l/libmvnc.so.0 libmvnc.so
ln -fs obj-armv7l/libmvnc.so.0 libmvnc.so.0
NCSDK FW successfully installed

Untuk melakukan installasi jalankan perintah di bawah ini

sudo make install

Output pada terminal Anda normalnya adalah di bawah ini

NCSDK FW successfully installed
mkdir -p /usr/local/include/
mkdir -p /usr/local/lib/
cp obj-armv7l/libmvnc.so.0 /usr/local/lib/
ln -fs libmvnc.so.0 /usr/local/lib/libmvnc.so
cp ../include/*.h /usr/local/include/
mkdir -p /usr/local/lib/mvnc
cp mvnc/MvNCAPI.mvcmd /usr/local/lib/mvnc/
mkdir -p /etc/udev/rules.d/
cp 97-usbboot.rules /etc/udev/rules.d/
mkdir -p /usr/local/lib/python3.5/dist-packages
mkdir -p /usr/local/lib/python2.7/dist-packages
cp -r ../python/mvnc /usr/local/lib/python3.5/dist-packages/
cp -r ../python/mvnc /usr/local/lib/python2.7/dist-packages/
udevadm control --reload-rules
udevadm trigger
ldconfig

Langkah yang terakhir setelah paket-paket berhasil diinstal, selanjutnya kita akan mencobanya menggunakan contoh kode dari NC App Zoo. Ketikkan baris perintah di bawah ini pada terminal

cd ~/workspace
git clone https://github.com/movidius/ncappzoo
cd ncappzoo/apps/hello_ncs_py
python3 hello_ncs.py

Dan ternyata output yang dihasilkan adalah "Error - no NCS devices detected, verify an NCS device is connected.", harusnya jika normal adalah sebagai berikut

Hello NCS! Device opened normally. 
Goodbye NCS! Device closed normally. 
NCS device working.

Setelah baca-baca forum movidius ternyata raspberry pi 3+ belum disupport untuk NCS 2 menggunakan NCSDK.

I will tell you the same thing again.
“Neural Compute Stick 2” = “NCS2” = “MvNCAPI-ma2480.mvcmd” = Intel does not support NCS2 with NCSDK.
“Neural Compute Stick” = “NCS1” = “MvNCAPI-ma2450.mvcmd” = It is officially supported.
In order to use “Neural Compute Stick 2”, you need to use OpenVINO instead of NCSDK.
And, OpenVINO does not work with ARM processors.
That is, “Neural Compute Stick 2” can not be used with “RaspberryPi 3 B+”.
OpenVINO runs only on “x86/64” series Intel processors.
Intel’s engineers have officially replied that they are fully aware of the need for OpenVINO’s support for ARM processors.
We expect to have to wait for several months to a year.

Salah satu diskusi dari forum movidius [source]

Dari beberapa pembahasan di atas, NCSDK hanya disupport oleh NCS1 sedangkan NCS2 belum disupport. Kemudian yang dapat dilakukan adalah mencoba menggunakan platform OpenVINO.

Installasi OpenVINO Toolkit Raspberry

Beberapa platform yang didukung oleh OpenVINO salah satunya adalah raspberry, silakan download terlebih dahulu OpenVINO toolkitnya di sini. Selanjutnya ketikkan perintah di bawah ini pada terminal

cd ~
mkdir openvino
cd openvino
tar -xf l_openvino_toolkit_raspbi_p_2019.1.144.tgz
$ nano openvino/inference_engine_vpu_arm/bin/setupvars.sh

Kemudian hal yang perlu dilakukan adalah memodifikasi file konfigurasi setupvars.sh agar mengarahkan ke direktori installasi OpenVINO toolkit, ketik baris perintah di bawah ini

sudo sed -i "s|<INSTALLDIR>|~/openvino/inference_engine_vpu_arm|" ~/openvino/inference_engine_vpu_arm/bin/setupvars.sh

Tool selanjutnya yang dibutuhkan adalah build tool, untuk build contoh aplikasi yang disertakan oleh OpenVINO toolkit. Jika pada raspberry sudah terinstall, langkah ini boleh dilewati.

sudo apt install cmake

Untuk memberikan pengaruh karena file setupvars.sh sudah terjadi perubahan perlu menjalankan perintah di bawah ini

source ~/openvino/inference_engine_vpu_arm/bin/setupvars.sh

Jika tidak ada yang error konfigurasi yang dibuat, pada layar terminal akan menampilkan pesan seperti berikut

[setupvars.sh] OpenVINO environment initialized

Kemudian agar setiap Anda login dan membuka terminal baru perlu melakukan konfigurasi automatis OpenVINO toolkit, langkah yang dapat dilakukan dengan menambahkan baris perintah pada file ~/.bashrc

echo "source ~/openvino/inference_engine_vpu_arm/bin/setupvars.sh" >> ~/.bashrc

Konfigurasi yang terakhir adalah terkait dengan rule pada NCS, jalankan beberapa baris perintah di bawah ini pada terminal

cd ~/openvino
sudo usermod -a -G users "$(whoami)"
sh inference_engine_vpu_arm/install_dependencies/install_NCS_udev_rules.sh

Output yang tertampil pada layar terminal seharusnya seperti ditunjukkan seperti di bawah ini

Update udev rules so that the toolkit can communicate with your neural compute stick
[install_NCS_udev_rules.sh] udev rules installed

Sebelum melakukan percobaan untuk contoh aplikasi yang terdapat pada OpenVINO toolkit, kita perlu build dulu agar nanti contoh aplikasi bisa dijalan sebagaimana mestinya. Jalankan perintah di bawah ini

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" /home/pi/openvino/inference_engine_vpu_arm/deployment_tools/inference_engine/samples

Jika semuanya normal sebagaian output yang dihasilkan adalah sebagai berikut

-- The C compiler identification is GNU 6.3.0
-- The CXX compiler identification is GNU 6.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
...
...
...
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/openvino/build

Langkah terakhir yang dipersiapkan adalah dengan compile salah contoh yang akan digunakan, misalnya adalah object_detection_sample_ssd.

make -j2 object_detection_sample_ssd

Output yang dihasilkan adalah sebagai berikut, jika misalkan terdapat warning bukan error nggak masalah artinya diabaikan saja. Jika sudah selesai outputnya akan menunjukkan proses sampai 100% seperti ditunjukkan di bawah ini

Scanning dependencies of target gflags_nothreads_static
Scanning dependencies of target ie_cpu_extension
[  3%] Building CXX object thirdparty/gflags/CMakeFiles/gflags_nothreads_static.dir/src/gflags.cc.o
[  6%] Building CXX object ie_cpu_extension/CMakeFiles/ie_cpu_extension.dir/ext_argmax.cpp.o
[ 10%] Building CXX object ie_cpu_extension/CMakeFiles/ie_cpu_extension.dir/ext_base.cpp.o
[ 13%] Building CXX object thirdparty/gflags/CMakeFiles/gflags_nothreads_static.dir/src/gflags_reporting.cc.o
[ 13%] Building CXX object ie_cpu_extension/CMakeFiles/ie_cpu_extension.dir/ext_ctc_greedy.cpp.o
[ 13%] Building CXX object thirdparty/gflags/CMakeFiles/gflags_nothreads_static.dir/src/gflags_completions.cc.o
...
...
...
[100%] Linking CXX executable ../armv7l/Release/object_detection_sample_ssd
[100%] Built target object_detection_sample_ssd

Test Installasi OpenVINO

Ujicoba yang akan dilakukan adalah untuk mendeteksi wajah pada seseorang, beberapa yang dibutuhkan adalah sebuah model pre-trained. Silakan ketikkan baris perintah di bawah ini untuk melakukan proses download, format model inference yang lain dapat Anda dapatkan di sini.

wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.bin
wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.xml

Selajutnya siapkan dataset yang akan dilakukan ujicoba, kemudian dapat menjalankan perintah di bawah ini. Dataset yang digunakan dalam contoh adalah sebagai berikut

Input gambar
Input gambar
./armv7l/Release/object_detection_sample_ssd -m face-detection-adas-0001.xml -d MYRIAD -i linux-torvald.jpeg

Ketika dijalankan output yang dapat ditampilkan pada terminal seharusnya seperti di bawah ini

[ INFO ] InferenceEngine:
        API version ………… 1.6
        Build ……………… 23780
Parsing input parameters
[ INFO ] Files were added: 1
[ INFO ]     linux-torvald.jpeg
[ INFO ] Loading plugin
        API version ............ 1.6 
        Build .................. 23780 
        Description ....... myriadPlugin
[ INFO ] Loading network files:
     face-detection-adas-0001.xml
     face-detection-adas-0001.bin
...
...
...
[122,1] element, prob = 0.0258789    (45,22)-(60,40) batch id : 0
[ INFO ] Image out_0.bmp created!
total inference time: 108.278
Average running time of one iteration: 108.278 ms
Throughput: 9.2355 FPS
[ INFO ] Execution successful

File linux-torvald.jpeg silakan disesuaikan, fungsi perintah tersebut untuk melakukan deteksi sebuah wajah dari sebuah citra gambar seseorang. Selanjutnya dalam direktori yang sama akan menghasilkan file out_0.bmp, jika dilihat gambar tersebut pada bagian wajah ada sebuah persegi berwarna ungu. Kira-kira gambar yang dihasilkan adalah sebagai berikut

Hasil face detection OpenVINO
Hasil face detection OpenVINO

Menjalankan Inference Engine Face Detection OpenCV

Jika pada contoh yang sebelumnya menggunakan C++, selanjutnya dicontohkan menggunakan OpenCV. Beberapa hal yang perlu disiapkan sama dengan contoh yang sebelumnya yaitu model pre-trained, file face-detection-adas-0001.bin dan face-detection-adas-0001.xml. Data yang akan ditest adalah data yang masih sama ketika menggunakan C++, buatlah kode python seperti berikut ini. Saya sarankan menggunakan virtualenv, install opencv-python menggunakan perintah pip jika belum ada paket tersebut.

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('linux-torvald.jpeg')
# 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('out.png', frame)

Path file *.bin dan *.xml serta data yang akan ditest silakan disesuaikan pada path raspberry Anda. Seharusnya jika semuanya normal akan terbentuk file out.png, gambar tersebut pada bagian wajah akan ditandai dengan kotak berwarna hijau. cv.dnn.DNN_TARGET_MYRIAD menandakan bahwa ketika menjalankan script memanfaatkan perangkat Neural Compute Stick 2. Kebutuhan-kebutuhan di atas dapat didapatkan di sini.

Silakan Neural Compute Stick 2 yang menancap pada raspberry dilepas, kemudian jalankan kembali script python yang telah Anda buat, Apa yang terjadi?

Harusnya nanti menampilkan pesan seperti di bawah ini

E: [ncAPI] [ 142305] ncDeviceOpen:672 Failed to find suitable device, rc: X_LINK_DEVICE_NOT_FOUND
Traceback (most recent call last):
File “face-detection-vino.py”, line 13, in
out = net.forward()
cv2.error: OpenCV(4.1.0-openvino) /home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/op_inf_engine.cpp:747: error: (-215:Assertion failed) Failed to initialize Inference Engine backend: Can not init USB device: NC_ERROR in function ‘initPlugin’

Anda dapat menancapkan kembali agar tidak terjadi error.

Demikianlah tulisan saya tentang cara installasi Neural Compute Stick 2 pada raspberry pi 3 B+ kesayangan Anda, semoga bermanfaat bagi yang baru belajar raspberry seperti saya. Saran dan kritik sangat diharapkan untuk memperbaiki tulisan dan blog ini, silakan tinggal komentar pada kolom yang telah disediakan. 🙂

References

comments powered by Disqus