Object Detection การตรวจจับวัตถุด้วย Python & TensorFlow Lite บน Raspberry Pi 4

บอร์ด Raspberry Pi 4 Model B ที่ผมซื้อมานี้ มันคือเครื่องมินิคอมพิวเตอร์ขนาดเล็กจิ๋วเครื่องหนึ่ง มีราคาที่ประหยัดสามารถทำเกือบทุกอย่างที่คอมพิวเตอร์ Desktops ทั่วไปทำได้ เช่น การท่องอินเทอร์เน็ต การทำเป็น Web Server การทำโปรเจค รวมไปถึงการนำไปเขียนโปรแกรมต่างๆ ที่สามารถทำได้ง่ายขึ้น รองรับการติดตั้งระบบปฏิบัติการแบบ Open Source ได้หลายอย่าง เช่น Raspbian หรือ NOOBS

แต่โดยพื้นฐานแล้วตัวมันเองจะใช้ระบบปฏิบัติการ Raspbian ที่ถูกพัฒนาขึ้นมาโดยเฉพาะ บอร์ด Raspberry Pi นั้น มักมีนักประดิษฐ์นิยมเอาไปประยุกต์ทำโปรเจคหลายอย่างครับ เช่น ระบบควบคุมการผลิตอัจฉริยะ, หุ่นยนต์, ระบบรักษาความปลอดภัย, สถานีรายงานสภาพอากาศ, การตรวจจับความเคลื่อนไหว, Home Assistant, การเปิดไฟและอุปกรณ์อื่น ๆ อีกมากมายที่ผมไม่ได้พูดถึง แต่วันนี้ผมจะเอามาทำโปรเจคตัวเอง

ชื่อโปรเจค:
“Object Detection การตรวจจับวัตถุด้วย Python และ TensorFlow Lite บน Raspberry Pi 4”

วัตถุประสงค์และที่มา ของการทำโปรเจค:
ผมต้องการจะนำเอา บอร์ด Raspberry Pi 4 Model B ตัวนี้ มาลองทำเป็นโปรเจคสำหรับตรวจสอบบุคคลดูครับ เหตุผลที่ผมอยากทำโปรเจคนี้ก็เพราะว่า ผมเคยได้ยินคุณแม่ของผมซึ่งทำงานอยู่แผนกบุคคลของบริษัทเอกชนแห่งหนึ่ง เล่าให้ฟังว่าประสบปัญหาในการใช้เครื่องรูดบัตรเพื่อบันทึกเวลา เข้า-ออก งานของพนักงาน ที่มีจำนวนมากเกือบ 2 พันคน ทำให้ต้องเสียเวลาในการทำงานเพราะต้องต่อคิวเพื่อรูดบัตร เข้า-ออก งาน วันละเกือบ 10 นาที ทั้งช่วงเวลาเข้า-ออกงาน ต่อมาทางบริษัทฯ ได้พัฒนา Application ในมือถือขึ้นมาใช้เพื่อลดขั้นตอนการรูดบัตรผ่านเครื่อง ด้วยการให้พนักงานลงเวลาเข้า-ออกงาน ผ่าน Application มือถือของแต่ละคน เพื่อจัดเก็บข้อมูลประวัติ เข้าระบบของบริษัทเอง โดยจะระบุตำแหน่งพิกัด GPS ของการลงเวลาเข้า-ออกงาน อยู่ในรัศมี ไม่เกิน 40 เมตร จากตำแหน่ง ที่เครื่องแม่ข่ายของเครื่องบันทึกเวลา เข้า-ออก งาน ถูกติดตั้งเอาไว้ ปัญหาคือ บางครั้งพบว่าพนักงานคน ที่ลงเวลา เข้า-ออก งานนั้น ไม่ได้มาทำงานจริง แต่ให้คนอื่นลงเวลา เข้า-ออกงาน ให้แทน เมื่อตรวจสอบก็ไม่ยอมรับทำให้เกิดปัญหาโต้แย้งกันขึ้น

หลักการและแนวคิด
ผมเลยได้แนวคิดว่า ถ้าเราสามารถพัฒนา เอาระบบ AI แบบ Object Detection ที่สามารถแยกแยะ และตรวจสอบได้ว่า บุคคลที่ลงเวลา เข้า-ออก งานนั้นเป็นบุคคล คนเดียวกันจริงหรือไม่ ก็น่าจะช่วยให้ระบบการบันทึกเวลา เข้า-ออกงาน นั้นมีความแม่นยำ ชัดเจน ประหยัดเวลา ลดปัญหาข้อโต้แย้ง ในการลงเวลาเข้า-ออกงาน ของพนักงานที่มีจำนวนมากๆ ในองค์กร หรือบริษัทฯลงได้  โดยมีลักษณะการทำงานคล้ายๆกับ Face Timestamp Camera ที่โรงเรียนสวนกุหลาบวิทยาลัย ธนบุรี ที่ที่ผมเรียนอยู่นี้ ก็ใช้ระบบการเช็คอินเข้าโรงเรียนลักษณะคล้ายๆกันนี้ครับ แต่จะส่งข้อมูล Capture ไฟล์ภาพนิ่งของใบหน้าผม ในตอนที่ผ่านเครื่องเช็คอิน ส่งกลับไปยัง DSchool Application ของผู้ปกครองผม ที่ได้ลงทะเบียนไว้ เพื่อแจ้งเตือนให้ผู้ปกครองได้ทราบว่าผมได้เข้ามาเรียน ในโรงเรียนแล้ว ซึ่งบางครั้งมันก็ไม่ทำงาน

ประโยชน์และสิ่งที่ได้รับจากการทำโปรเจคสิ่งประดิษฐ์นี้ :
1. ได้ศึกษาเรียนรู้วิธีแก้ไขปัญหาเพื่อพัฒนาโปรเจคไปใช้ในการลงเวลาเข้า-ออกงาน ของพนักงานที่มีจำนวนมาก
2. ได้ศึกษาเรียนรู้การทำงานของ Machine Learning หรือปัญญาประดิษฐ์ (Artificial Intelligence: AI) เพื่อนำมาใช้งาน
3. ได้เรียนรู้วิธี ขั้นตอนการ นำบอร์ด Raspberry PI 4 มาประยุกต์เพื่อใช้ในการตรวจจับวัตถุ หรือบุคคลอย่างอัจฉริยะ
4. เพิ่มพูนความรู้ ประสบการณ์และพัฒนาทักษะการเขียนโปรแกรม คำสั่ง Coding ด้วยภาษา Python กับ Raspberry PI 4
5. ได้เรียนรู้การทำงานของ TensorFlow Lite ในการ Run ระบบปฏิบัติการ Linux บน Raspberry PI 4


อุปกรณ์ในการทำโปรเจค:

1. Main Board Raspberry Pi 4 Model B 4GB
2. Micro SD การ์ด 32GB พร้อมติดตั้ง Raspbian OS
3. สาย Raspberry Pi Micro HDMI to Standard HDMI Cable
4. อะแดปเตอร์ Official RPi 15W (5V/3A) USB C Power Adapter
5. Logitech C920 PHO HD WEBCAM
6. TensorFlow Lite (TFLite) Tools

หลักการทำงาน
ตัว Object Detection นั้น จะทำงานก็โดยการ Run Program ผ่านตัว Raspberry Pi โดยผ่าน ตัวกล้อง USB Webcamแล้วนำขึ้นมาแสดงที่หน้าจอ โดยที่สามารถระบุ หรือ บอกได้ว่า อะไรบ้างที่อยู่ในหน้าจอที่แสดง หรือภายในกล้อง ตัวอย่างเช่น ถ้าขึ้นว่า ในกล้องมีคนอยู่ ก็จะมีกรอบสี่เหลี่ยม วงตรงบริเวณคนที่เห็นเอาไว้ แล้วแสดงขึ้นคำว่า Person, เห็นแมว ก็วงกรอบที่แมวแล้วระบุว่า Cat เป็นต้นครับ โดยความไหลลื่นของการแสดงผลนั้น ขึ้นอยู่กับอุปกรณ์ และ Spec ของอุปกรณ์ที่เราใช้ครับ

ขั้นตอนวิธีการ Run โปรเจค (แบบละเอียด):
เราสามารถใช้ Raspberry Pi 3 หรือ Raspberry Pi 4 ก็ได้ครับในการทำโปรเจคนี้ แต่ของผมจะใช้ Raspberry Pi 4 ครับ เราต้องต่ออุปกรณ์ทั้งหมดทั้ง Mouse, Keywords, Monitor เหมือนคอมพิวเตอร์ทั่วไปให้เรียบร้อยครับ และต้องลง OS ใน SD Card ให้เรียบร้อยด้วยนะครับโดยลง Raspbian stretch หรือ Raspbian buster ครับ (OS ย่อมาจาก Operating System คือ ระบบปฏิบัติการคอมพิวเตอร์ เป็นโปรแกรมที่ทำหน้าที่ จัดการระบบ ดูแลรักษาเครื่อง แปลภาษาระดับต่ำหรือระดับสูงให้เป็นภาษาเครื่อง และเป็นตัวกลางในการติดต่อระหว่างฮาร์ดแวร์กับซอฟต์แวร์ เพื่อให้ผู้ใช้นั้นสามารถทำงานได้อย่างมีประสิทธิภาพตัวอย่างเช่น Windows, OS X, Linux)

ในส่วนของผมนั้น ผมจะใช้วิธี Remote ผ่าน VNC เชื่อมต่อมายัง บอร์ด Raspberry Pi ครับ เนื่องจากได้ทำการติดตั้ง VNC Server (Remote Desktop) บน Raspberry Pi ไว้ก่อนหน้านั้นแล้ว เมื่อเราลง OS รวมถึงตั้งค่าพื้นฐานเสร็จทั้งหมดแล้ว เราก็จะเริ่ม Project นี้กันเลย โดยมีขั้นตอนที่ผมคิดว่า มันละเอียดพอที่ใครๆ จะสามารถทำตามได้เลย ดังนี้ครับ

เริ่มต้นที่การกดไปที่ Icon Terminal พอกดเข้ามาแล้ว มันก็จะขึ้นหน้าอย่างในภาพขึ้นมาครับ

เมื่อขึ้นหน้ายังงี้มาแล้ว ให้เราพิมพ์คำสั่ง sudo apt-get update นี้ลงไป แล้วกด Enter ครับ
คำสั่งนี้จะใช้ในการอัพเกรดระบบ Raspberry Pi ของเรา ซึ่งจะปรับปรุงให้เป็นเวอร์ชั่นใหม่ล่าสุด เลยครับ

รอจนกว่าระบบ Run จนเสร็จนะครับ
ภาพที่กำลังโหลดภาพที่ Update เสร็จแล้ว
ขั้นตอนต่อมาให้พิมพ์คำสั่ง sudo apt-get upgrade จากนั้นกด Enter ไปครับ
คำสั่งนี้จะใช้ในการอัพเกรดโปรแกรมทั้งหมดในระบบของเรา ซึ่งจะปรับปรุงให้เป็นเวอร์ชั่นใหม่ล่าสุด ซึ่งมันจะอัพเกรดให้ทุกโปรแกรมในระบบของเรา เพื่อให้เป็นเวอร์ชั่นใหม่ล่าสุดครับ

เมื่อกด Enter ไปแล้ว ก็รอให้มันโหลดเสร็จครับ
ภาพที่ Upgrade เสร็จแล้วต่อไปนะครับ เราจะทำการ โหลดตัว Code การทำงานสำหรับ Object detective ครับ โดยเราจะเข้าไป Download ผ่านทาง Github ครับ แต่เราจะไม่ได้เข้าไปโหลดตรงๆ ผ่านทางเว็บ Github ใน brownser นะครับ โดยให้เราพิมคำสั่งตามนี้ครับ

git clone https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi.git

แล้วก็กด Enter ได้เลยครับ มันก็จะเริ่มโหลด
ภาพตอนที่กำลังโหลดภาพตอนที่โหลดเสร็จสังเกตุจากภาพด้านล่าง จะเห็นตัว File Manager ในส่วนของ Folder ที่ผมไฮไลท์สีเทาเอาไว้ปรากฎขึ้นมานะครับ

โดยขั้นตอนต่อไปนะครับ ผมต้องการที่จะเปลี่ยนชื่อของ Folder นี้ ให้เป็นชื่อ tflite1 ครับ เราจะพิมคำสั่งนี้ลงไปครับ
mv TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi/ tflite1

เมื่อเรา Enter แล้ว มันจะไม่ขึ้นอะไรมา ให้เราทำการพิมพ์คำสั่งนี้ต่อได้เลยครับ
cd tflite1 แล้วกด Enter

คำสั่งนี้เป็นการกำหนดว่า เวลาที่เราจะโหลดอะไรต่อจากนี้ ให้เอามาเก็บไว้ภายใน Folder นี้ทั้งหมดครับ เราจะได้ไม่ต้องไปเสียเวลาย้ายไฟล์หลายๆรอบ เมื่อกด Enter แล้ว มันจะไม่ขึ้นอะไรมาเหมือนเดิม แต่มันจะทำงานนนะครับ แม้จะไม่ขึ้นก็ตาม

ต่อไปเราจะทำการสร้างตัว Virtual environment เพื่อเก็บตัว TensorFlow Lite ให้ทำการพิมพ์คำสั่งนี้ลงไปครับ
sudo pip3 install virtualenv

แล้วพอกด Enter มันก็จะเริ่มการโหลด ให้เรารอจนโหลดเสร็จครับ

ในรูปภาพ จริงๆแล้วมันควรจะมีหลอดแถบที่โหลดครับ แต่เนื่องจากผมเคยโหลดมาแล้วครั้งหนึ่ง มันเลยไม่ขึ้น  ถ้ามันขึ้นต่างกันก็ไม่จำเป็นต้องตกใจครับ
ตัวอย่างแบบมีแถบหลอดที่โหลดครับต่อไปเราจะสร้าง Folder ที่ใช้เก็บในสิ่งที่เราโหลดมาเมื่อกี้นี้นะครับ โดนให้พิมพ์ว่า
python3 -m venv tflite1-env

เมื่อเรากด Enter ไปแล้ว ก็จะไม่มีอะไรแสดงขึ้นมา ต่อไปเราต้องให้ตัว environment มัน Activate หรือเปิดใช้งาน
ให้เราพิมพ์คำสั่ง
source tflite1-env/bin/activate

เมื่อพิมพ์แล้ว เราจะสังเกตุเห็นได้ว่า แถบด้านซ้ายสุดของเรา จะขึ้น (tflite1-env) ขึ้นมาทางด้านซ้าย

เมื่อได้ดังนี้แล้ว ให้เราทำการ ปิดหน้าต่าง Terminal แล้วเปิดขึ้นใหม่อีกครั้ง
มันก็จะขึ้นเหมือนกับครั้งแรกที่เราเปิดขึ้นมาเลย

ให้เราทำการพิมพ์คำสั่งนี้ลงไปอีกรอบครับ
cd tflite1
เพื่อเข้าไปใน Directory ของ tflite1

เมื่อเรากด Enter ไปก็จะได้ตามรูปดังนี้

เสร็จแล้วให้เราพิมพ์คำสั่ง ตามนี้อีกครั้ง
source tflite1-env/bin/activate

เมื่อเรากด Enter เราก็จะได้แถบทางด้านซ้ายมา เหมือนกับตอนก่อนเราจะปิด Terminal ไป

โดยต่อไป เราจะทำการติดตั้ง TensorFlow กับ ตัว CV ให้เราทำการพิมพ์คำสั่งนี้ลงไป
bash get_pi_requirements.sh

แล้วพอกด Enter มันก็จะทำการโหลด File เราก็รอจนกว่ามันจะโหลด File เสร็จ
เมื่อโหลดเสร็จก็จะขึ้นหน้าตาประมาณนี้
ขั้นตอนต่อไปเราจะทำการโหลด ตัว Model สำหรับโปรเจค Object detection นี้นะครับ ซึ่งผมได้ทำการ Copy Link มาให้แล้วด้านล่างนี้ครับ ให้ใส่ Link นี้ไปได้เลย

storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip

แต่ก่อนที่เราจะพิมพ์แล้วกด Run ไป ให้เราพิมพ์ wget ไปก่อนที่จะใส่ Link

wget storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip

ก่อนจะกด Enter ให้ลองดูก่อนว่า ได้ตามนี้ไหมครับ

เมื่อโหลดเสร็จ ก็จะขึ้นหน้าตาประมาณนี้

เมื่อรอจน Download เสร็จแล้ว ให้เราพิมพ์คำสั่งต่อไปนี้ เพื่อ Unzip File ที่เราโหลดมาเมื่อกี้นี้ครับ
unzip coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip -d Sample_TFLite_model

แถบสีแดง ไม่ต้องไปสนใจมันครับ มันเกิดจากการที่ผมลืมเปลี่ยนภาษาเป็นภาษาอังกฤษ พอพิมพ์ไป ปรากฎว่าเหมือนมันเกิดปัญหา หรือ “bug” ขึ้นพอดี ให้ลบไม่ได้ ผมจึง Enter ลงมาแล้วเอาแถบสีแดงปิดไว้ครับ ทุกคนไม่จำเป็นต้องกด Enter อีกรอบโดยที่ยังไม่ได้พิมพ์อะไรเหมือนผมนะครับ

กลับมาที่หลังจากพิมพ์คำสั่งแล้ว ให้เรากด Enter ได้เลย ก็จะได้หน้าตาประมาณนี้ครับ

เสร็จแล้วก็มาถึงขั้นตอนสุดท้ายแล้วครับ ให้เราพิมพ์คำสั่งนี้ลงไป
python3 TFLite_detection_webcam.py –modeldir=Sample_TFLite_model

พอเรากด Enter มันก็จะแสดงหน้าต่างที่เป็นกล้องขึ้นมา ตามภาพด้านล่างนี้เลยครับ

สรุปท้ายโปรเจค:
แม้ว่าโปรเจคนี้จะน่าสนใจมาก แต่ผมคิดว่า “มันก็ไม่ง่าย” ที่จะทำให้เป็นผลสำเร็จได้โดยเร็ว อย่างที่ตั้งใจไว้ตั้งแต่แรก  สำหรับโปรเจค “Object Detection การตรวจจับวัตถุด้วย Python และ TensorFlow Lite บน Raspberry Pi 4” มันเป็นจุดเริ่มต้นที่ดีมาก เพราะช่วยจุดประกายให้ผม ได้คิดอยากที่จะเรียนรู้เพิ่มให้มากกว่านี้ ไม่ว่าจะเป็นเรื่องเกี่ยวกับ  Face recognition, Classification, Custom Dataset, รวมทั้ง Training Model หรือการใช้ Tools อื่นๆ ที่เกี่ยวข้องกับโปรเจค รวมไปถึง Coding ที่ใช้ได้กับ Python ที่มีอยู่มากมาย ใน GitHub ที่สามารถนำมาพัฒนา ออกแบบโปรเจคต่างๆ ได้อย่างไม่มีปัญหา

อย่างไรก็ตาม โปรเจคนี้ผมจะนำไปพัฒนาต่อ มันคือ Version แรก (Version 1.0) ของผมครับ ยังมีข้อมูล รายละเอียดเกี่ยวกับเรื่องนี้อีกมากมายในโลก Internet ที่เปิดกว้าง รอให้ผมไปเรียนรู้เพื่อนำมาพัฒนาให้มันสามารถนำไปใช้งานได้จริงๆ และอย่างน้อยโปรเจคนี้ ก็ช่วยพาให้ผมได้เรียนรู้ ได้ค้นคว้า ศึกษาหาข้อมูล และได้ทดลองลงมือทำดู ด้วยตัวเอง โดยอาศัยคุณครูคือ “Google” นี่แหละครับ ช่วยสอน ช่วยอธิบาย ตอบข้อสงสัย และให้ผมได้เรียนรู้สิ่งใหม่ๆเพิ่มขึ้นไปอีกขั้นหนึ่ง เราจะเจอกันใหม่อีกครั้ง ใน Version 2.0 ขอบคุณที่เข้ามาอ่านครับ

ที่มา:
EdjeElectronics
Domingo Mery
Traversy Media
Ageitgey
Murtaza’s Workshop – Robotics and AI