Face RecognitionMachine LearningPython

การทำ Face Detection บน Video ด้วย Python และ OpenCV

เทคนิคการทำ Face Detection ด้วย Python และ OpenCV ในการจับใบหน้าคนที่ปรากฏบนไฟล์ Video

บทเรียนต่อไปนี้คือเทคนิคการทำ Face Detection ด้วย Python และ OpenCV ในการจับใบหน้าคนที่ปรากฏบนไฟล์ Video

บทเรียนก่อนหน้านี้:

สำหรับบทเรียนนี้นอกจากการจับภาพจาก WebCam หรือ USB Camera ที่เรานิยมใช้กับแบบ Real-Time แล้วจะเป็นการสอนการจับภาพ หรือประมวลผลใบหน้าจากไฟล์ Video นามสกุล mp4 เป็นหลัก โดยไฟล์ Video ที่เราจะใช้นั้นให้เซฟ แล้วดาวน์โหลดไว้ที่ โฟลเดอร์ images ใน Path เดียวกับ Source ของ Python ที่เราจะเขียน

ผมจะใช้ไฟล์ movie.mp4 ในโฟลเดอร์ images เป็น video ที่จะนำมาทดสอบ เรียก Header มาใช้เลยคือ:

import cv2
import face_recognition

cap = cv2.VideoCapture( r'images/movie.mp4',0)

เรียก face_recognition มาใช้งานหลังจากนั้นสร้าง Landmark ของใบหน้าไว้เป็น Array สำหรับวนหาใบหน้า

face_locations = []

หลังจากนั้นให้เราเขียนคำสั่งต่อไปนี้:

while True:
    ret, frame = cap.read()
    rgb_frame = frame[:, :, ::-1]
    face_locations = face_recognition.face_locations(rgb_frame)
    for top, right, bottom, left in face_locations:
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 4)

    frame = cv2.resize(frame, (600, 340))     
    cv2.imshow('Video', frame)

การทำงานคือ จับ Frame ของ Video ทีละ Frame โดย

ret, frame = cap.read()

หลังจากนั้นแปลงภาพจาก Frame ที่เป็น OpenCV ประมวลผลแบบ BGR Color ให้เป็น RGB

rgb_frame = frame[:, :, ::-1]

ในแต่ละ Frame จะทำการค้นหาใบหน้าทั้งหมดที่ปรากฏในภาพ Frame

face_locations = face_recognition.face_locations(rgb_frame)

ทำการวาดสี่เหลี่ยมสีเขียวลงบนหน้าที่ตรวจจับได้:

for top, right, bottom, left in face_locations:
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 4)

ทำการย่อขนาดของหน้าต่าง video ตัว output แล้วแสดงผลลัพธ์ออกมา

frame = cv2.resize(frame, (600, 340))     
    cv2.imshow('Video', frame)

เขียนคำสั่งด Enter แล้วปิดหน้าต่าง:

if cv2.waitKey(25) == 13:
        break

และสุดท้ายถ้าประมวลผลเสร็จสิ้นให้ทิ้ง Task ที่กำลังทำงานอยู่ออกไปให้หมด

cap.release()
cv2.destroyAllWindows()

จะเห็นว่าไฟล์ Python ของเราจะเป็นดังนี้

import cv2
import face_recognition

cap = cv2.VideoCapture( r'images/movie.mp4',0)
face_locations = []

while True:
    ret, frame = cap.read()
    rgb_frame = frame[:, :, ::-1]
    face_locations = face_recognition.face_locations(rgb_frame)
    for top, right, bottom, left in face_locations:
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 4)

    frame = cv2.resize(frame, (600, 340))     
    cv2.imshow('Video', frame)
    
    if cv2.waitKey(25) == 13:
        break

cap.release()
cv2.destroyAllWindows()

ทดสอบก็จะได้ผลลัพธ์ตามนี้:

ทีนี้ลองเอา ระบบ Face Reconition มาใช้แต่ต้องเปลี่ยนวีดีโอเล็กน้อยที่คมชัดเพราะวีดีโอข้างต้นมันขึ้น Unknown หมดเลยทุกคน

ใส่ code นี้ไปเลย:

import cv2
import face_recognition

cap = cv2.VideoCapture( r'images/movie.mp4',0)
database_image = face_recognition.load_image_file("images/banyapon.jpg")
data_base_encoding = face_recognition.face_encodings(database_image)[0]

person_face_encodings = [data_base_encoding]
person_face_names = ["BANYAPON"]

data_locations = []
data_encodings = []
data_names = []
frameProcess = True

while True:
    ret, frame = cap.read()
    rgb_frame = frame[:, :, ::-1]
    data_locations = face_recognition.face_locations(rgb_frame)
    for top, right, bottom, left in data_locations:
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 4)
        data_encodings = face_recognition.face_encodings(rgb_frame, data_locations)
        data_names = []
        for dc in data_encodings:
            matches = face_recognition.compare_faces(person_face_encodings, dc)
            name = "UNKNOWN"
            if True in matches:
                first_match_index = matches.index(True)
                name = person_face_names[first_match_index]

            data_names.append(name)
            cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (26, 174, 10), cv2.FILLED)
            font = cv2.FONT_HERSHEY_DUPLEX
            cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    frame = cv2.resize(frame, (600, 340))     
    cv2.imshow('Video', frame)
    
    if cv2.waitKey(25) == 13:
        break

cap.release()
cv2.destroyAllWindows()

ทดสอบไฟล์ mp4 แบบใบหน้าเดียว

ทดสอบไฟล์ mp4 แบบหลายๆ ใบหน้า ก็ไม่ค่อยแม่นเท่าไรอ่ะนะจะจับได้บางมุมอยู่ที่ความชัดของ Video นั่นแหละครับ

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน