โปรเจกต์ Automatic Face Ban: Solution การ Streaming ที่เน้น Privacy สำหรับ IoT
โปรเจกต์นี้สาธิตวิธีการเซ็นเซอร์ (ban) ใบหน้าแบบ Automatic ใน Live Video Stream เพื่อความปลอดภัยด้าน Privacy โดยใช้ Portenta H7 และ Portenta Vision Shield
โปรเจกต์นี้สาธิตวิธีการเซ็นเซอร์ (ban) ใบหน้าแบบ Automatic ใน Live Video Stream เพื่อความปลอดภัยด้าน Privacy โดยใช้ Portenta H7 และ Portenta Vision Shield
Project Supporter Team
โพสต์โดย
โปรเจกต์นี้แสดงให้เห็นถึงการเซ็นเซอร์ใบหน้าอัตโนมัติ (Banning) ในวิดีโอสตรีมสดเพื่อรักษาความเป็นส่วนตัว โดยใช้ TensorFlow Lite FOMO (Fast Object Detection Model) บน Portenta H7 ที่จับคู่กับ Portenta Vision Shield (รุ่น Ethernet หรือ LoRa®) โดยจะมีการวางภาพ Overlay ขนาดใหญ่ทับลงไปเมื่อตรวจพบใบหน้าเพื่อปกปิดลักษณะเฉพาะตัว วิธีการนี้มีความสำคัญอย่างยิ่งสำหรับสภาพแวดล้อมที่มีข้อกำหนดด้านความเป็นส่วนตัวที่เข้มงวด เช่น โรงเรียน โรงพยาบาล และสถานที่สาธารณะ
โปรเจกต์นี้มีความสำคัญเนื่องจากประเด็นหลักดังต่อไปนี้:
ฮาร์ดแวร์:
ซอฟต์แวร์:
ความรู้พื้นฐานที่จำเป็น:
3.1 การประกอบ Portenta H7 + Portenta Vision Shield:

3.2 การติดตั้ง/อัปเดต OpenMV Firmware:
3.3 การจัดระเบียบไฟล์โปรเจกต์
สำหรับโปรเจกต์นี้บน Portenta H7 คุณไม่จำเป็นต้องเพิ่มโมเดล TensorFlow Lite FOMO ด้วยตนเอง เนื่องจาก OpenMV Firmware สำหรับ Portenta มีโมเดลตรวจจับใบหน้าในตัวชื่อ " fomo_face_detection " มาให้แล้ว ดังนั้นการโหลดผ่าน ml.Model("fomo_face_detection") จะสามารถใช้งานได้ทันที
อย่างไรก็ตาม มีไฟล์ภายนอกหนึ่งไฟล์ที่คุณควรเพิ่มลงในระบบไฟล์ภายในของบอร์ด:
face.pbm และวางไว้ใน Root Directory ของ Internal Flash ของ Portenta H7 โดย Script ของโปรเจกต์จะเรียกใช้เส้นทางนี้เป็นค่าเริ่มต้น: 
3.4 ข้อมูล Wi-Fi® (เฉพาะรุ่น Portenta Vision Shield LoRa ® ):
ในตัวอย่าง Script ที่ให้มาสำหรับ Portenta Vision Shield รุ่น LoRa® คุณต้องอัปเดตบรรทัดต่อไปนี้ให้ตรงกับเครือข่าย Wi-Fi® ของคุณก่อนรัน Script:

กำหนดค่า SSID และ KEY ของเครือข่าย Wi-Fi® ของคุณก่อนทำการทดสอบและรัน Script
ในส่วนนี้ เราจะเน้นไปที่ Script เวอร์ชัน Wi-Fi® คือ portenta_faceban_streaming_wifi.py โดยจะแบ่งออกเป็นส่วนย่อยๆ เพื่ออธิบายว่าแต่ละส่วนช่วยในกระบวนการพรางใบหน้าอัตโนมัติได้อย่างไร หากคุณต้องการการเชื่อมต่อแบบใช้สาย สามารถใช้ Script เวอร์ชัน Ethernet คือ portenta_faceban_streaming_eth.py แทนได้ ซึ่งจะมีโครงสร้างเหมือนกันแต่เปลี่ยนการตั้งค่าเครือข่ายไร้สายเป็นอินเทอร์เฟซ Ethernet ( network.LAN() ) นอกเหนือจากการเริ่มต้นระบบเครือข่ายแล้ว ตรรกะสำหรับการตรวจจับใบหน้า การปรับขนาด Overlay และการสตรีม MJPEG จะยังคงเหมือนเดิมเกือบทั้งหมดในทั้งสอง Script
ด้านล่างนี้คือการตรวจสอบส่วนสำคัญของ Script เวอร์ชัน Wi-Fi® โดยแต่ละส่วนจะตามด้วยคำอธิบายบทบาทในการจับภาพเฟรม, การตรวจจับใบหน้า, การใช้ Overlay และการสตรีมผลลัพธ์สุดท้ายแบบ Real-time
4.1 การ Import และการตั้งค่า Global
ใน Code Snippet ต่อไปนี้ มีการ Import Module ต่างๆ เพื่อควบคุม Camera ( sensor ), ประมวลผล Image ( image ), ทำ Machine Learning Inference ( ml , NMS ) และจัดการ Networking ( network , socket ) จากนั้นจึงกำหนดค่า Wi-Fi® ( SSID และ KEY ) และกำหนดค่า TCP Server บน Port 8080
พารามิเตอร์การตรวจจับ MIN_CONFIDENCE , ENLARGEMENT_FACTOR และ HOLD_TIME_MS จะเป็นตัวกำหนดระดับความเชื่อมั่นที่ระบบต้องมีเพื่อระบุใบหน้า, ขนาดของ Overlay ที่ใช้ในการพรางตัว และระยะเวลาที่ Overlay จะยังคงปรากฏอยู่หลังจากตรวจไม่พบใบหน้าแล้ว

4.2 การเริ่มต้น Camera และ Model
ใน Code Snippet ต่อไปนี้ Camera จะถูกรีเซ็ตเพื่อจับภาพแบบ Grayscale ที่ความละเอียด QVGA จากนั้นจะถูก Crop เป็น 240×240 โดยใช้ฟังก์ชัน set_windowing เพื่อให้ตรงกับขนาด Input ที่โมเดล FOMO ต้องการ การหน่วงเวลาสั้นๆ ( skip_frames(time=2000) ) จะช่วยให้ Sensor ปรับเทียบค่าได้ จากนั้น Script จะโหลดโมเดลชื่อ " fomo_face_detection " และรูปภาพ Overlay ชื่อ " /face.pbm " โดยตัวแปร threshold_list จะแปลง MIN_CONFIDENCE เป็นช่วงตัวเลขเพื่อใช้กับการตรวจจับ Blob

4.3 การทำ Post-Processing แบบกำหนดเองสำหรับ FOMO
ในฟังก์ชัน fomo_post_process FOMO จะส่งออกชุดข้อมูล "Heatmaps" (หนึ่งรายการต่อคลาส) แต่ละรายการจะถูกปรับสเกลเป็น 0–255 และส่งผ่านฟังก์ชัน find_blobs() เพื่อระบุพื้นที่ที่อยู่เหนือเกณฑ์ที่กำหนด NMS (Non-Maximum Suppression) จะช่วยลดจำนวน Box ที่ซ้อนทับกันให้เหลือเพียงการตรวจจับเดียว ฟังก์ชันนี้จะส่งคืน Bounding Boxes พร้อมพิกัด (x1, y1, x2, y2) และคะแนนความเชื่อมั่น (Confidence Score)
4.4 การตั้งค่า Wi-Fi และ Socket
ใน Script เวอร์ชัน Wi-Fi® ที่แสดงด้านล่าง อินเทอร์เฟซ Station บนบอร์ด Portenta H7 จะถูกเปิดใช้งานโดยใช้ฟังก์ชัน network.WLAN(network.STA_IF) จากนั้นอุปกรณ์จะเชื่อมต่อกับเครือข่ายที่ระบุโดย SSID และ KEY โดยรอจนกว่าจะมีการเชื่อมต่อที่ถูกต้องและเสถียร เมื่อเชื่อมต่อแล้ว บอร์ดจะสร้าง TCP Socket โดยเชื่อมโยงกับ HOST (อินเทอร์เฟซใดๆ ที่พร้อมใช้งาน) และ PORT 8080 สำหรับการสตรีม MJPEG

สำหรับ เวอร์ชัน Ethernet จะใช้ตรรกะเดียวกัน ยกเว้นคุณต้องเปลี่ยนส่วนนี้เป็นการกำหนดค่าอินเทอร์เฟซแบบใช้สาย โดยทั่วไปจะใช้ eth = network.LAN() ตามด้วย eth.ifconfig('dhcp') หรือการตั้งค่า Static IP ส่วนที่เหลือของ Code สำหรับการสร้าง Socket และการรอรับข้อมูลบน Port 8080 จะยังคงเหมือนเดิมเกือบทั้งหมด ยกเว้นการอ้างอิงถึง eth.isconnected() แทน wlan.isconnected() คุณสามารถสลับระหว่างโซลูชัน Wi-Fi® และ Ethernet ได้อย่างราบรื่นโดยเปลี่ยนเฉพาะส่วนการเริ่มต้นเครือข่ายเท่านั้น
4.5 การติดตามการตรวจจับล่าสุดที่ทราบ
เพื่อใช้งานฟีเจอร์ "Hold Time" ซึ่ง Overlay จะยังคงอยู่ครู่หนึ่งแม้ว่าใบหน้าจะหายไป ตัวแปร Global สองตัวจะทำหน้าที่จัดเก็บ Bounding Boxes ล่าสุดและบันทึกเวลาล่าสุดที่มีการอัปเดต

4.6 ฟังก์ชันการสตรีมหลัก
ภายในฟังก์ชัน start_streaming(s) Script จะรับการเชื่อมต่อจาก Client ที่เข้ามา ส่ง HTTP Headers สำหรับ MJPEG Stream และเข้าสู่ Loop เพื่อจับภาพเฟรม หลังจากทำการตรวจจับใบหน้า ( model.predict() ) Bounding Box ของแต่ละใบหน้าที่ตรวจพบจะถูกขยายตาม ENLARGEMENT_FACTOR และวาง Overlay ทับลงบนรูปภาพต้นฉบับโดยใช้ฟังก์ชัน img.draw_image(face_image, x_new, y_new, ...) หากไม่ตรวจพบใบหน้าแล้ว Script จะตรวจสอบว่าเวลาที่กำหนด (Hold Time) ผ่านไปหรือยัง หากยังไม่ผ่าน จะยังคงวาด Bounding Boxes ก่อนหน้าต่อไปเพื่อป้องกันการกะพริบ
ในขั้นตอนสุดท้าย แต่ละเฟรมที่ประมวลผลแล้วจะถูกแปลงเป็น JPEG และส่งไปยัง Client พร้อมกับตัวระบุขอบเขต -openmv โดย Browser หรือโปรแกรมดูที่รองรับ MJPEG จะสามารถแสดงเฟรมวิดีโอแบบ Real-time ได้
หลังจากบันทึกหรือโหลด Code ลงในบอร์ด Portenta H7 ของคุณผ่าน OpenMV IDE แล้ว ให้คลิกปุ่ม Start ของ IDE เพื่อรัน Script

ตรวจสอบ Serial Terminal ของ IDE เพื่อดูว่าบอร์ดของคุณเชื่อมต่อกับเครือข่าย Wi-Fi® สำเร็จและแสดง IP Address หรือไม่

เมื่อเชื่อมต่อแล้ว ให้เปิด Web Browser บนอุปกรณ์ที่อยู่ในวงเครือข่าย (Subnet) เดียวกัน และไปที่ที่อยู่ http://<Portenta_IP>:8080 ในภาพที่แสดงด้านบน ที่อยู่จะเป็น http://192.168.204.10:8080 ตอนนี้คุณควรจะเห็นวิดีโอ Feed สีเทาที่มีความหน่วงต่ำ

ใบหน้าใดๆ ที่ปรากฏในเฟรมจะถูกพรางหรือทับด้วยรูปภาพ face.pbm ซึ่งจะถูกขยายขนาดตามตัวคูณที่คุณระบุไว้ใน Script

หากคุณต้องการปรับความแม่นยำในการตรวจจับ ให้ลองปรับตัวแปร MIN_CONFIDENCE ใน Script หากต้องการเปลี่ยนขนาดของ Overlay "Ban" ให้แก้ไขตัวแปร ENLARGEMENT_FACTOR ในทำนองเดียวกัน การเพิ่ม HOLD_TIME_MS จะช่วยให้ Overlay คงอยู่บนหน้าจอนานขึ้นหลังจากใบหน้าหายไป
หากไม่มีวิดีโอปรากฏใน Browser ของคุณ ให้ตรวจสอบว่าการตั้งค่า Firewall อนุญาตให้ Traffic ผ่าน Port 8080 หรือไม่ และตรวจสอบว่าบอร์ด Portenta H7 ของคุณอยู่ในเครือข่ายเดียวกับอุปกรณ์ที่คุณใช้ดูวิดีโอหรือไม่
หาก Console แสดงว่า Wi-Fi® เชื่อมต่อแล้วแต่การตรวจจับไม่ทำงานและไม่มี Overlay ปรากฏขึ้น ให้ตรวจสอบว่าไฟล์ face.pbm อยู่ในเส้นทางที่ถูกต้อง (โดยปกติคือ Root Directory)
ปัญหาด้านประสิทธิภาพอาจเกิดขึ้นได้หากกล้องอยู่ในสภาพแสงน้อยหรือการเชื่อมต่อ Wi-Fi® อ่อน การลดคุณภาพ JPEG หรือลดขนาดเฟรมสามารถช่วยให้การตอบสนองดีขึ้นได้
จากการผสมผสานการจัดการกล้องของ OpenMV, การทำ TensorFlow Lite FOMO Inference และ MJPEG Streaming Server ที่มีน้ำหนักเบา ตอนนี้คุณมีโซลูชันที่ใช้งานได้จริงสำหรับการทำให้ใบหน้าไม่สามารถระบุตัวตนได้โดยตรงบนอุปกรณ์ โปรเจกต์นี้ช่วยให้คุณปฏิบัติตามกฎระเบียบด้านความเป็นส่วนตัวโดยการเซ็นเซอร์ข้อมูลส่วนบุคคลและลักษณะที่ระบุตัวตนได้ก่อนที่วิดีโอ Feed จะออกจากบอร์ด Portenta H7 ไม่ว่าจะเป็นในสภาพแวดล้อมโรงเรียน สถานพยาบาล หรือบริบทอื่นๆ ที่ต้องการการปกป้องความเป็นส่วนตัว แนวทางนี้จะช่วยให้ข้อมูลที่ละเอียดอ่อนถูกเก็บไว้ในพื้นที่และอยู่ภายใต้การควบคุมโดยตรง
คุณสามารถสำรวจการปรับปรุงเพิ่มเติมได้ เช่น การรักษาความปลอดภัยของสตรีมด้วย TLS หรือ VPN หรือการรวม Sensor และตรรกะเพิ่มเติมเพื่อรองรับแอปพลิเคชันที่กว้างขึ้น (เช่น การตรวจจับวัตถุอื่นนอกเหนือจากใบหน้า) ด้วยสถาปัตยกรรมที่ยืดหยุ่นที่แสดงที่นี่ คุณสามารถพัฒนาโปรเจกต์ Automatic Face Ban ต่อไปเพื่อให้เหมาะกับความต้องการด้านความเป็นส่วนตัวและ IoT ที่เปลี่ยนแปลงไป
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย