Machine Learning กับ Embedded System สำหรับงาน Computer Vision ด้วย Raspberry PI ตอนที่ 1
ในปัจจุบันเทคโนโลยี Artificial intelligent เริ่มเข้ามามีบทบาทสำคัญมากในเกือบทุกวงการ
และโดยเฉพาะช่วงหลังกับคำว่า Machine Learning และ Deep Learning ที่เราเริ่มได้ยินคุ้นหูมากขึ้น
คำว่า Machine Learning จริงๆ เป็นเทคโนโลยีซับเซตของคำว่า Artificial Intelligence
และ Deep Learning ก็ถือว่าเป็นเทคนึคนึงที่มีการสร้าง hidden lyaer มากขึ้นและเป็นซับเซตของเทคโนโลยี Machine Learning นั่นเอง
Machine Learning vs Traditional Programming
Traditional Programming
แนวคิดแบบการเขียนโปรแกรมปกติคือการที่เรานำข้อมูลโจทย์
ใส่เข้าไปแล้วเราเขียนโปรแกรมเพื่อแก้ไขปัญหานั้น
เช่น ถ้าต้องการตรวจจับวัตถุซักชิ้น ว่าใช่สิ่งที่ต้องการหรือไม่
เราอาจจะต้องมานั่งเขียนโปรแกรมกรองภาพ หาขอบ ตรวจสอบสี รูปร่าง เอง
เรียกว่า rule-based algorithm
Machine Learning
ส่วน Machine Learning คือการที่เรานำข้อมูลที่ต้องการให้คอมพิวเตอร์ทำนาย ใส่เข้าไปแล้วสอนระบบว่าข้อมูลแบบไหนถูกหรือผิด แล้วให้คอมพิวเตอร์สร้างโมเดลที่จะใช้ในการทำนายออกมา
ดังนั้นจะเรียกได้ว่าระบบ Machine Learning คือการเรียนรู้ที่จะผสานอินพุตที่สอนระบบ เพื่อนำไปสร้างการทำนายข้อมูลที่ไม่เคยเห็นได้
แล้วทำไม Machine Learning เพิ่งมาดัง เป็นแนวคิดใหม่หรือเทคโนโลยีใหม่ ?
จริงๆ ทฤษฎีทางคณิตศาตร์ที่เป็นพื้นฐานของ Machine Learning มีมาตั้งแต่ก่อนปี 2000
อย่าง Convolutional Neural Networks จะเห็นว่าทฤษฎีมีมาตั้งแต่ปี 1995
แต่เพราะสามปัจจัยนี้ทำให้ปัจจุบัน Machine Learning มีความเป็นไปได้ในการพัฒนาได้ง่ายและเหมาะสมกว่าสมัยก่อนมาก
ฮาร์ดแวร์แรงขึ้น ข้อมูลเรามีมากขึ้น และซอฟต์แวร์ opensource พร้อมขึ้น นั่นเอง
Machine Learning สำหรับงาน Embedded System
เนื่องจาก Embedded System ในปัจจุบันประสิทธิภาพดีขึ้นมากมีการออกระบบเฉพาะด้านสำหรับประมวลผลขนาดเล็กกันมากขึ้นจากผู้ผลิตฮาร์ดแวร์
การประมวลผลที่ระดับ Edge devices เริ่มได้รับความนิยมมากขึ้น เนื่องจากการส่งภาพไปประมวลผลที่ระบบคลาวด์หรือเซอเวอร์โดยตรงทำให้เปลือง band-width และถ้าอินเตอร์เน็ตมีปัญหาอาจจะทำให้การทำงานผิดพลาดไปเลย
ตัวอย่างเช่นรถยนต์ ที่เริ่มมี AI ตรวจจับเส้นทาง คนเดินผ่านระบบจะประมวลผลเบื้องต้นที่ Edge devices ทั้งหมด ผู้ผลิตฮาร์ดแวร์เลยเริ่มทำแพลตฟอร์มสำหรับประมวลผลที่ระดับ Edge ขึ้นมา เช่น NVDIA DRIVE
https://www.nvidia.com/en-us/self-driving-cars/drive-platform/
หรือ เราอาจจะออกแบบให้งานประมวลผลเบื้องต้นอยู่ที่ Edge หรือ Embedded System แล้วงานที่ซับซ้อนขึ้นค่อยส่งไปที่เซอเวอร์ก็ได้เหมือนกัน
หรือแม้แต่ไมโครคอนโทรลเลอร์ขนาดเล็กอย่าง STM32 ยังต้องออกซอฟต์แวร์สำหรับคอนเวิตโมเดลที่เราเทรนไปไว้บนไมโครคอนโทรลเลอร์ขนาดเล็ก
https://www.st.com/en/embedded-software/x-cube-ai.html
Object detection และ classification บน Embedded System
Machine Learning เทคนิคได้รับการยอมรับว่ามีประสิทธิภาพมากโดยเฉพาะงานทางด้าน image processing เช่น object detection และ classification ทำให้เริ่มเห็นการประยุกต์นำ ML ไปใช้กับกล้องตรวจจับ กล้องวิเคราะห์ระบบต่างๆ มากมาย
บทความได้รับจุดเริ่มสนใจมาจาก
Adding Machine Learning based Image Processing to your Embedded Product
เนื่องจากผู้เขียนเป็นโปรเจคที่ค่อนข้างง่าย
แต่จุดน่าสนใจตรงวิธีการ implement บน Embedded System
เราเลยจะลองออกแบบมาใช้กับบอร์ด Raspberry PI ที่ประสิทธิภาพต่ำกว่ามาก และที่น่าสนใจที่สุดคือแสดงให้เห็นว่า ML เอามาทำงานพื้นฐานของ Image processing แบบนี้ได้เหมือนกัน
แต่ถ้าเราเขียนแบบใช้ python เปิดกล้องโหลดโมเดล หาวัตถุทั้งหมดในรูป
แล้วทำนายปกติบน Raspberry PI ฮาร์ดแวร์ที่ประมวลผลได้แค่ frame rate น้อยๆ ย่อมไม่สามารถตอบโจทย์เช่นการนับวัตถถุที่วิ่งผ่านได้แน่นอน เลยกลายมาเป็นบทความนี้กัน
ตัวอย่างโปรเจค object detection และ classified ที่เราจะลองทำออกแบบบน Embedded System
เราได้ซื้อขนมจากเซเว่น โดยจะลองทำระบบคัดแยกขนมด้วย ML ดู
โดย features ที่สำคัญของขนม ที่เรามองดูด้วยตาปล่าวจะเห็นว่ามีรูปร่าง และ สี
โดยจะมี label ที่เราต้องการดังต่อไปนี้
- butterfly green ( ผีเสื้อสีเขียว )
- butterfly yellow ( ผีเสื้อสีเหลือง )
- butterfly red (ผีเสื้อสีแดง)
- frog green (กบเขียว)
- frog yellow (กบเหลือง)
- frog red (กบแดง )
โดยโจทย์ปัญหาประเภทนี้เราจะใช้ machine learning แบบ supervised learning หรือมีข้อมูลที่ถูกต้องมาสอนนั่นเอง
จุดเด่นของ Machine Learning ถ้าเข้าใจพื้นฐานการประยุกต์ตั้งแต่เรื่องที่ดูเป็นโจทย์พื้นฐานแบบนี้ จะสามารถประยุกต์สร้างโมเดลสำหรับการ classified โจทย์ที่ซับซ้อนขึ้นได้โดยใช้องค์ความรู้เดียวกัน
Hardware Architecture & Software Architecture
รอบนี้เราจะเลือกเป็นบอร์ด Raspberry PI 3 Model B+
จุดเด่นคือเป็นบอร์ดราคาถูกที่หาซื้อได้ง่าย
แต่จุดอ่อนคือเรื่องประสิทธิภาพ เนื่องจาก GPU เป็นรุ่นเก่า และไม่มีหน่วยประมวลผลเสริมอย่าง NPU หรือ สถาปัตยกรรมที่ออกแบบมาประมวลผล ML โดยเฉพาะ
การนำ Raspberry PI ไปใช้คู่กับงาน ML จะทำได้ประสิทธิภาพค่อนข้างต่ำ โดยเฉพาะงาน computer vision
ดังนั้นบทความนี้ความลำบากเลยจะมาตกอยู่ที่ซอฟต์แวร์สถาปัตยกรรมนั่นเอง
และถ้าถามว่าบอร์ดไหนน่าสนใจ
ทางเราแนะนำบอร์ดที่เราใช้ในเชิง Embedded Product และมีประสิทธิภาพมากอีกบทความครับ เพิ่มค่าบอร์ดแต่โปรแกรมง่ายขึ้น
- Image Capture
เราจะใช้กล้อง USB สำหรับจับภาพ
กล้อง USB จะเชื่อมต่อกับราสเบอรี่ไพผ่านไดรเวอร์ของ linux ที่ชื่อว่า V4L2 ซึ่งปกติเป็นไดรเวอร์ที่มีบนบอร์ดเลยโดยที่เราไม่ต้องทำอะไรเพิ่ม
ข้อดีของราสเบอรี่ไพคือ ตัวถอดรหัสวีดีโอทำได้ค่อนข้างสมบูรณ์ทำให้เราสามารถใช้ Video Core GPU ของราสเบอรี่ไพเข้ามาช่วยในการดึงภาพและถอดมาประมวลผลได้โดยใช้ฮาร์ดแวร์
และแยกกันประมวลผลแบบ multiprocessing คอนเซปจะคล้ายๆ ที่เราเคยทำ Line follower Robot เมื่อ 5 ปีที่แล้วจะเห็นว่า framerate สูงมากอยู่ที่ ~80fps โดยที่ตอนนั้นบอร์ดประสิทธิภาพต่ำกว่าปัจจุบันพอสมควร
https://www.youtube.com/watch?v=lRAYeKNKvdk
Get Kritsada Arjchariyaphat’s stories in your inbox
Join Medium for free to get updates from this writer.
2. BLOB DETECTION ( OPENCV )
ขั้นตอนการทำ BLOB Detection ถ้าฮาร์ดแวร์ของเราค่อนข้างมีประสิทธิภาพสูงเราสามารถใช้เทคนิคของ Machine Learning เข้ามาทำได้เลยและยังสะดวกด้วย
แต่ข้อเสียคือกระบวนการ CNN นี้จะกินประสิทธิภาพของฮาร์ดแวร์ค่อนข้างเยอะ
จากโจทย์เนื่องจากเราต้องการคัดแยกบนภาพพื้นหลังที่คงที่
ดังนั้นการใช้เทคนิค Image Processing ปกติสามารถคัดแยกภาพในส่วนนี้ได้โดยใช้ CPU น้อยกว่า ML มาก
แต่ถ้าพื้นหลังของวัตถุที่เราต้องการตรวจจับมีโอกาสเปลี่ยนแปลงมาก การไปใช้ ML
สำหรับงานนี้จะเหมาะสมกว่าการเขียน Image Processing เอง
3. Image Classification
ตรงนี้จะใช้ ML เข้าแยกชนิดของเยลลี่ที่เป็นโจทย์นั่นเอง
4. GUI Display
ตั้งใจว่าจะใช้ Qt ในการแสดงผลบน Raspberry PI เนื่องจากเป็นไลบรารี่แสดงผลแบบ cross platform ที่ค่อนข้าง native กับการ์ดจอของ Raspberry PI จึงน่าจะเหมาะสมที่สุด
Train Images
สิ่งสำคัญที่สุดของงาน Machine Learning คือข้อมูลนั่นเอง
สำหรับงานนี้ทางเราจะเตรียมข้อมูลทั้งหมดหกชุดสำหรับกระบวนการสอน โดยทำบนคอมพิวเตอร์ก่อน
- ข้อมูลที่ใช้ในการสอน
สำหรับข้อมูลที่ใช้ในการสอนจะถูกสร้างขึ้นจากการใช้โทรศัพท์มือถือถ่ายโดยต้องจำแนกออกเป็น 6 ประเภทตามที่เราต้องการเพื่อบอกระบบว่า รูปแบบนี้คืออะไร
2. ข้อมูลที่ใช้ในการทดสอบ
จะใช้วิธีเหมือนกับข้อมูลที่ใช้ในการสอน โดยถ่ายรูปจากโทรศัพท์มือถือ แต่ห้ามเป็นรูปเดียวกับข้อมูลที่ใช้ในการสอน
3. โปรแกรมสำหรับเทรนและการนำไปใช้งาน
สำหรับงานการพัฒนาซอฟต์แวร์ Machine Learning จะแบ่งออกเป็นสองด้านได้แก่
3.1 TRAINING
ขั้นตอนการเทรนจะเขียนด้วยภาษาไพธอน
โดยใช้ keras ที่ใช้ tensorflow backend เหตุผลเนื่องจาก API เป็น high level ที่เข้าใจง่าย และยังสามารถเลือก backend เป็น TensorFlow หรือ Theano ได้ด้วย
โมเดลเริ่มต้นเราจะลองสร้างโดยใช้ CNN ขึ้นมาเองก่อน
โดยโมเดลของเราจะเป็นประมาณนี้
หลังจากนั้นจะทดสอบกับโมเดลสำเร็จรูปเช่น MobileNet เพื่อดูประสิทธิภาพและความแม่นยำ โดยเรื่องนี้จะแสดงให้ดูตอนที่ 2
โดยในขั้นตอนนี้เราได้ percent ความถูกต้องมาประมาณ 98% โดยวิเคราะห์ผลลัพธ์ด้วย tool ที่ชื่อว่า tensorboard แล้วลองนำโมเดลมาใช้โดยการเซพเป็นไฟล์ออกมา
ไฟล์นี้เราจะนำไปใช้กับฝั่งที่ prediction และบน Raspberry PI
3.2 INFERENCE
ส่วนขั้นตอนนี้คือการนำโมเดลที่ได้มาไปใช้งานโดยการทำนายข้อมูลนั่นเองสำหรับเนื่องจากโมเดลของเราอยู่ในรูปแบบของ TensorFlow Format
ซอฟต์แวร์ที่ใช้ใน deploy มีหลายทางเลือก ตัวอย่างได้แก่
- Library TensorFlow ตัวเดียวกับที่ใช้ในการเทรน
- JavaScript ด้วย TensorFlow.js
- Swift ( Beta )
- Tensor Flow Lite สำหรับ iOS, Android หรือ Embedded Devices
ข้อสุดท้าย TensorFlow Lite นี่น่าสนใจที่สุดและออกแบบมาเพื่อ Embedded Devices เลยแต่เนื่องจากงานนี้เราใช้ Blob detector ที่เขียนขึ้นมาด้วย OpenCV และต้องการใช้ภาษา C++ ในการจัดการเรื่องของ Multiprocess เราเลยจะเลือกใช้ OpenCV DNN ที่มาพร้อมกับ OpenCV Library
Inference Software Pipeline
จากที่เกริ่นมาข้างต้นว่า Embedded System โดยเฉพาะ Raspberry PI ของเราไม่มี การ์ดจอแรงๆ หรือหน่วยประมวลผล neural โดยเฉพาะทำให้การออกแบบซอฟต์แวร์จำเป็นต้องลดภาระการประมวลผล ออกไปบ้างเราจึงจะสรุป pipeline ออกมาได้ดังรูปต่อไปนี้
Blob detection กับ Prediction
เราวาด bounding box รอบจุดที่เราสนใจก่อน ในกรณีนี้เราจะหาเฉพาะ เยลลี่ที่เราต้องการทดสอบเท่านั้น ไลบรารี่ที่เราจะใช้คือ OpenCV C++ ไลบรารี่ประมวลผลภาพที่เกือบทุกท่านรู้จักนั่นเอง
หลังจากนั้นไฟล์ model.pb จะถูกนำไปใช้งานด้วยไลบรารี่ตัวเดียวกันนั่นเองคือ OpenCV โดยที่ OpenCV จะมีโมดูลที่ชื่อว่า Deep Neural Networks
( dnn module ) ทำให้เราสามารถที่จะโหลด model ของ tensorflow เข้ามาใช้ได้เลยไม่ต้องไปลงไลบรารี่เสริม
ดังนั้นเราจึงสามารถ ตรวจหาเยลลี่ ส่งรูปให้ dnn ประมวลผลออกมาได้เลย
หลังจากนั้นได้เวลาทดสอบโปรแกรมกันแล้ว
ผิดเพียบ !!!! ยังสับสนระหว่าง กบ กับ ผีเสื้อเป็นส่วนใหญ่
ในกรณีนี้เราก็จะปรับจูนกันนิดนึง ตัวอย่างเช่น
- เพิ่มข้อมูลที่ใช้สอน
- ลองปรับ dropout ของโมเดลดู
แล้วเอาโมเดลใหม่มาทดสอบ
ถูกแล้ว จุดที่น่าสนใจคือ กบไม่เต็มตัวระบบอ่านได้ว่าเป็น Frog Green ด้วย
Machine Learning-based software สำหรับงาน Computer vision
โดยโจทย์ครั้งนี้เราออกแบบเพื่องาน factory automation บน Embedded system เพื่อคัดแยกและนับจำนวนวัตถุ โดยมีจุดที่น่าสนใจดังนี้
- แก้ไขปัญหาการประมวลผลภาพที่ค่อนข้างยากด้วย rules-based algorithms ( หรือแบบ traditional programming นั่นเอง ) ตัวอย่างเช่นถ้าเราต้องการจะตรวจจับ แตงกวา กล้วย เป็นต้น
- แก้ไขปัญหาเรื่อง พื้นหลัง มีความน่าสับสนกับวัตถุเป้าหมายหรือเปลี่ยนแปลงบ่อยได้
- ภาพที่มีคุณภาพต่ำจะวิเคราะห์ได้ดีกว่า rules-based algorithms
- แอพพลิเคชั่นไม่จำเป็นต้องพัฒนาใหม่ อาจจะใช้วิธีการสอนสิ่งที่ต้องการใหม่
- อัพเดตุปรับปรุงแอพพลิเคชั่นได้โดยการสอนเพิ่ม หรือ สอนใหม่
- สามารถใช้ได้โดยผู้ที่ไม่จำเป็นต้องเชี่ยวชาญเรื่อง computer vision
แล้วพบกันตอนหน้า เอาโค้ดทั้งหมดไปลง Raspberry PI แล้วมาดูกันว่าจะเร็วจริงไหมแต่อาจจะเปลี่ยนโจทย์ให้ดูสถานการณ์จริงกันมากขึ้นครับ โดยไม่แก้โครงสร้างโค้ดเลย อาจจะแก้ข้อมูลกับโมเดลอย่างเดียว










