Face Detection

จาก Morange Wiki

ตรวจจับใบหน้าด้วย Haar Cascades

วัตถุประสงค์

  • รู้พื้นฐานในการพัฒนาซอฟต์แวร์ ตรวจจับ ใบหน้า ด้วย Haar Cascade Classifier
  • เรียนรู้การตรวจจับอย่างอื่นด้วยเช่น ตา , จมูก , ปาก และ อื่นๆ

ทำรู้จักกับการตรวจจับวัตถุด้วย Haar Cascade

  • Haar feature-based cascade classifier ได้ถูกคิดค้นและพัฒนาขึ้นโดย Paul Viola และ Micheal Jones ในปี 2001 ตามกลไกลเรื่องของ Machine Learning โดยเรียนรู้จากภาพเชิงลบและภาพเชิงบวก
  • ในการใช้งานจำเป็นต้องมีไฟล์ที่ได้รับการเรียนและแยกประเภทหรือมีข้อมูลการเรียนรู้แล้วว่า วัตถุนั้นหรือ สิ่งเหล่านั้นคืออะไร โดยไฟล์จะมีนามสกุล .XML

เริ่มต้นเขียนแบบง่ายๆ

  • โดยในที่นี้ ทาง OpenCV จะมีไฟล์ XML มาให้อยู่แล้วใน Library หรือสามารถดาวน์โหลดเพิ่มได้ที่


การทำงานร่วมกับรูปภาพ

  • การตรวจจับใบหน้านั้น จำเป็นต้องทำให้รูปหรือ วิดีโอที่นำมา เข้าไปอยู่ในรูปแบบของโหมดสีเทา (Grayscale mode)
  • ในการตรวจจับใบหน้านั้น เราสามารถเลือกได้ว่าตรวจจับผ่าน อุปกรณ์ใด หรือ ชนิดของมัลติมีเดียแบบใดก็ได้ เช่น Video , Webcam , รูปภาพ ในตัวอย่างต่อไปนี้ จะเป็นการใช้รูปภาพในการตรวจหาใบหน้า ด้วยรูปตัวอย่างต่อไปนี้


FaceDetection.jpg


โหลดภาพเข้าตัวแปรและแปลงภาพให้เป็นโหมดสีเทา

  • สร้างไฟล์ Python เพื่อทดลองใช้งาน (eg. sampleDetection.py) และนำไฟล์ haarcascade_frontalface_default.xml , haarcascade_eye.xml ที่ดาวน์โหลดมา นำมาไว้กับ PATH เดียวกันกับ sampleDetection.py รวมแล้วจะได้ 3 ไฟล์
  • นำรูปภาพมาที่ต้องการตรวจจับภาพมาไว้ด้วยกันเพื่อให้หาไฟล์ได้ง่ายขึ้น รวมแล้วทั้งหมด 4 ไฟล์ (eg. FaceDetection.jpg)
  • Code ตัวอย่างการโหลดรูปภาพมาใส่ตัวแปรเพื่อนำไปประมวลผลภาพ
import numpy as np
import cv2
 
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
 
img = cv2.imread('FaceDetection.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

การตรวจจับ

  • ต่อจากนั้น จะนำรูปที่ผ่านการเข้าโหมด GRAYSCALE แล้วนั้น มาตรวจหาวัตถุตามไฟล์ XML ที่มีมาให้แล้วนั้น
    • โดยขั้นตอนคือ
      • 1. โหลดภาพ
      • 2. นำภาพเข้าสู่โหมดสีเทา
      • 3. ตรวจหาใบหน้า | จากไฟล์ haarcascade_frontalface_default.xml
      • 4. เมื่อเจอใบหน้าแล้ว จะทำการตรวจหาลูกตาทั้งสองข้างด้วย | จากไฟล์ haarcascade_eye.xml
  • Code ตัวอย่างการตรวจจับใบหน้าและหาตำแหน่งของหน้า
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ผลลัพธ์

FaceDetected.png

Source Code แบบเต็ม

import numpy as np
import cv2
 
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
 
img = cv2.imread('FaceDetection.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()