CorgiDude บอร์ด ตรวจจับใบหน้า และ Mask ด้วย Yolo2 Face Mask Detection

สวัสดีครับ สำหรับบอร์ด CorgiDude ที่อยากจะทำ Face mask detection นั้น ครับ บทความนี้จะมาสอนใช้โมเดลที่เทรนมาแล้วนะครับ โดยก็จะมีหลักการ อยู่ 2 ข้้นตอนครับ 1 ผมนำรูปมา detection หาใบหน้าก่อนครับ ก็จะรันโมเดล Face detection จากบทความอันเก่าครับที่เคยเขียนมาครับ 2 ตัดรูปหน้าที่ detection เจอจากข้อ 1 เอามาทำ Image Clssification อีกรอบครับ ซึ่งดูๆ จะเห็นได้ว่าผมรัน 2 โมเดลต่อกัน

ก่อนอื่นก็ต้องมี โมเดลก่อนครับ ลิ้งโหลดด้านล่างครับ

โมเดล Face detection

(https://github.com/AiDude-io/CorgiDude/blob/master/models/Face_detection/facedetect.kmodel)[https://github.com/AiDude-io/CorgiDude/blob/master/models/Face_detection/facedetect.kmodel]

โมเดลนี้ Flash ไปที่ตำแหน่ง 0x300000 เลยครับ(นับ0ให้ครบนะครับถ้าใส่ผิดมีโอกาศพังครับ)

โมเดล mask

(https://github.com/AiDude-io/CorgiDude/blob/master/08 - Face Detection/f_mask.kmodel)[https://github.com/AiDude-io/CorgiDude/blob/master/08 - Face Detection/f_mask.kmodel]

โมเดลนี้ Flash ไปที่ตำแหน่ง 0x600000 เลยครับ(นับ0ให้ครบนะครับถ้าใส่ผิดมีโอกาศพังครับ)

ต่อไปก็ทำการ Flash model ที่ได้โหลดมาครับ หรือใคร Flash model ไม่เป็น ไปทำตามบทความตามลิ้งต่อไปนี้ครับ

(https://www.aiiotshop.com/b/5)[https://www.aiiotshop.com/b/5]

หลังจากที่ Flash โมเดลเสร็จ ก็รับสคิปต่อไปนี้เลยครับ

import uos
import sensor
import image
import lcd
import KPU as kpu
from fpioa_manager import fm
from machine import I2C
from board import board_info
from Maix import GPIO

lcd.init(type=2, freq=20000000, color=lcd.BLACK)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
#sensor.set_windowing((224, 224))
sensor.set_vflip(1)
sensor.run(1)

fm.register(21, fm.fpioa.GPIOHS0, force=True)
fm.register(22, fm.fpioa.GPIOHS1, force=True)

D21 = GPIO(GPIO.GPIOHS0, GPIO.OUT)
RED = GPIO(GPIO.GPIOHS1, GPIO.OUT)


RED.value(0)
D21.value(1)


task = kpu.load(0x300000)

tid = kpu.load(0x600000)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            xx = i.x()-10
            yy = i.y()-10
            ww  =  i.w()+15
            hh = i.h()+10
            face_cut=img.cut(xx,yy,ww,hh)
            face_cut=face_cut.resize(128,128)
            a = face_cut.pix_to_ai()
            a = kpu.set_outputs(tid,0,1,1,2)
            fmap = kpu.forward(tid,face_cut)
            plist=fmap[:]
            pmax=max(plist)
            max_index=plist.index(pmax)
            print(plist)

            if plist[0] >= 0.94 :
                a = img.draw_rectangle(xx, yy, ww, hh, color=(255,0,0), thickness=4)
            elif plist[1] >= 0.98 :
                a = img.draw_rectangle(xx, yy, ww, hh, color=(0,255,0), thickness=4)
            else :
                a = img.draw_rectangle(xx, yy, ww, hh, color=(0,0,255), thickness=4)

    else :
        RED.value(0)
        D21.value(1)
    a = lcd.display(img)
a = kpu.deinit(task)

ผลการทดสอบก็เป็นไปตามรูปต่อไปนี้ครับ

Last updated