การตรวจจับและจำแนกวัตถุด้วย Yolo2 ร่วมกับ Intel Movidius และ Raspberry Pi

เขียนโดย ดร.จักรกฤษณ์  แสงแก้ว วันที่ 19 ตุลาคม 2561

กล่าวนำ

Intel Movidius เป็นหน่วยประมวลผลภาพ VPU (Vision Processing Unit) มีความโดดเด่นคือ เร่งความเร็วในงาน Deep Learning และ Neual Network ประมวลผลได้ที่ 100 GFLOPS โดยกินไฟเพียง 1 วัตต์ ราคา $80
ปล. ได้รับการสนับสนุนจากงบวิจัยส่วนบุคคล

อุปกรณ์ Intel Movidius

ก่อนอื่น สั่งซื้อ Intel Movidius ได้ที่ online shopping ครับ
ปล. รอสินค้าประมาณ 2-3 สัปดาห์

อุปกรณ์ Raspberry Pi

สำหรับงานนี้จะใช้งาน Intel Movidius กับ Raspberry Pi ดังนั้น ต้องเตรียมความพร้อม Raspberry PI ให้เรียบร้อยก่อนครับ (ต้องใช้งาน RPI เป็นก่อนครับ )
- Raspberry Pi 3 B+
- SD Card 
- โมดูลกล้อง ฯลฯ 
- โมดูลจอแสดงผล (กรณีต้องการจอแสดงผล)

จากนั้น เขียน OS Image ลงบนแผ่น SD Card และบูต RPI

กำหนดขนาด Swap File จากเดิม 100MB เป็น 1024MB

$ sudo /etc/init.d/dphys-swapfile stop
แก้ 
/etc/dphys-swapfile
เปลี่ยน CONF_SWAPSIZE=1024 ขยาย swap memory เป็น 1GB

$ sudo /etc/init.d/dphys-swapfile start

เคลียส์โปรแกรมที่ไม่ได้ใช้งานออกจาก OS

$ sudo apt-get purge wolfram-engine
$ sudo apt-get purge libreoffice*
$ sudo apt-get clean
$ sudo apt-get autoremove

ติดตั้ง NCSDK

ปัจจุบัน NCSDK มี 2 เวอร์ชั่น 1 และ 2 มีวิธีการติดตั้งดังนี้

NCSDK 2.x : INSTALL !!
$ git clone -b ncsdk2 https://github.com/movidius/ncsdk.git
$ cd ncsdk
$ sudo make install

ปล. ใช้เวลาคอมไพล์และติดตั้งประมาณ 3-4 ชั่วโมงครับ

ติดตั้ง OpenCV

$ sudo pip3 install opencv-python

สำหรับปัญหาที่เกิดขึ้นให้แก้ไขเป็นกรณีไปนะครับ เช่น ระบบปฏิบัติการที่ผมใช้ต้องการ libqtgui4 และ libqt4-test ผมก็ติดตั้งเพิ่มดังนี้
$ sudo apt-get install libqtgui4
$ sudo apt-get install libqt4-test

การเปิดใช้งานกล้อง RPI

กรณีต่อกล้องแล้ว ให้เปิดใช้งานกล้องด้วยครับ
ปล. กล้องที่ว่านี้เป็นสายสัญญาณ CSI นะครับไม่ใช่ กล้องเว็บแคมที่ใช้สาย usb ครับ
$ sudo raspi-config

เสียบ Intel Movidius เข้าที่ช่อง USB ของ Raspberry Pi

จากนั้นเขียนโค๊ดเพื่อทดสอบติดต่อกับ Movidius (VPU) ตัวนี้ ดังนี้
from mvnc import mvncapi
device_list = mvncapi.enumerate_devices()
device = mvncapi.Device(device_list[0])
device.open()

สรุปว่า : ตอนนี้สามารถติดต่อกับ VPU ได้แล้วครับ


ทดสอบกับไพธอน 3 สามารถใช้งานได้เช่นกันครับ

ทดสอบรัน hello_ncs_py.py

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

ทดสอบรัน Image-Classifier

1. อ่าน README 
ไปยังไดเร็คทอรี่ ncappzoo/app/image-classifier
$ cd ~/movidius/ncappzoo/apps/image-classifier

2. คอมไพล์ 
$ make run

พบว่าเกิดปัญหา : แจ้งว่า module compiled against API version 0xc but this version of numpy is 0xb

แก้ปัญหา numpy 0xb

พยายาม : สืบค้นเพื่อแก้ปัญหาดังกล่าว มีคนแนะนำให้ใช้คำสั่งต่อไปนี้
sudo pip install numpy --upgrade --ignore-installed

และคอมไพล์ใหม่อีกครั้งด้วยคำสั่ง
$ make run

พบว่าแก้ไขปัญหาได้ : ขอบคุณ คุณ a20
ที่มา : https://stackoverflow.com/questions/33859531/runtimeerror-module-compiled-against-api-version-a-but-this-version-of-numpy-is

ข้อมูลภาพใน ncappzoo

ข้อมูลของ ncappzoo เก็บภาพสำหรับทดสอบไว้ที่ ncappzoo/data/images แสดงดังนี้

ในไฟล์ image-classifier.py เป็นการเปิดไฟล์ data/images/cat.jpg และจัดหมวดหมู่ภาพดังกล่าวไว้ในกลุ่มของ "แมว" ด้วยความเชื่อมั่น 40.5%

เข้าถึงไฟล์ผ่าน sftp

แนะนำให้เข้าถึงไฟล์ใน raspberry pi ผ่าน sftp จะช่วยลดการใช้คำสั่ง command line ไปได้เยอะ สะดวกในการอ่านและเข้าถึงไฟล์ในตัว RPI ครับ :)
ปล. ผมใช้โปรแกรมที่ชื่อว่า Files ซึ่งติดมากับ Ubuntu เมื่อเปิดโปรแกรมแล้วให้กด Ctrl + l (คอนโทรล ตามด้วย ตัวแอล) จะแสดงช่องระบุพาร์ทด้านบน ให้พิมพ์

sftp://pi@192.168.34.64
และป้อนรหัสผ่านลงของ User Pi จากนั้นจะสามารถเข้าถึงผ่านโปรแกรม Files และใช้งานไฟล์ของ RPI ได้อย่างสะดวกครับ :)

ปล. IP และ Username ขึ้นกับการตั้งค่าภายในของ OS ที่ Raspberry pi กำลังใช้งาน

คำสั่ง mvNCCompile

mvNCCompile เป็นคำสั่งสำหรับแปลงโมเดล (weight) ที่อยู่ในรูปแบบ caffemodel ให้เป็นรูปแบบกราฟ (graph) เพื่อใช้งานใน intel movidius VPU เช่น 

nvNCCompile ./yolo.prototxt -w ./yolo.caffemodels -s 12

เมื่อ prototxt เป็นการกำหนดโครงสร้างโมเดล
weights เป็นน้ำหนักของแต่ละเลเยอร์ ซึ่งได้จากการ train

1. ดาวน์โหลดซอร์สโค๊ด Yolo จาก https://github.com/duangenquan/YoloV2NCS.git ด้วยคำสั่ง

$ git clone https://github.com/duangenquan/YoloV2NCS.git

2. แปลง weight เป็น graph เพื่อใช้กับ movidius
cd YoloV2NCS
mvNCCompile ./models/caffemodels/yoloV2Tiny20.prototxt -w ./models/caffemodels/yoloV2Tiny20.caffemodel -s 12

3. ได้กราฟออกมาแล้ว

รัน yolo2 ร่วมกับ intel movidius

ตอนนี้สามารถรัน image classifier ด้วย yolo2 บน movidius ได้แล้วครับ

การเลือกเลนส์


ใส่จอให้​ RPI​

- สั่งจอแสดงผลที่ Lazda ค้นด้วย TFT LCD 3.2 inch + Raspberry Pi
- ติดตั้งตามคู่มือ ต่อไปนี้ https://www.waveshare.com/wiki/3.2inch_RPi_LCD_(B)

ผลลัพธ์การใช้งาน RPI ร่วมกับ Intel Movidius

สรุป

วันนี้ได้เรียนรู้การตรวจจับวัตถุ โดยใช้ Intel Movidius (Vision Processing Unit: VPU) เป็นความรู้ที่ทันสมัยมาก ๆ แต่ทั้งนี้หน่วยประมวลผล VPU ตัวนี้ เหมาะกับงาน inference (การอนุมาน) เท่านั้น (พยากรณ์และจัดหมวดหมู่) ไม่เหมาะกับการ Train (สอน) หากต้องการสอนให้คอมพิวเตอร์เรียนรู้ข้อมูลควรใช้ GPU อาทิ Nvidia Geforce ครับ :)
การตรวจจับและจำแนกวัตถุด้วย Yolo2 ร่วมกับ Intel Movidius และ Raspberry Pi