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 , รูปภาพ ในตัวอย่างต่อไปนี้ จะเป็นการใช้รูปภาพในการตรวจหาใบหน้า ด้วยรูปตัวอย่างต่อไปนี้
โหลดภาพเข้าตัวแปรและแปลงภาพให้เป็นโหมดสีเทา
- สร้างไฟล์ 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()
ผลลัพธ์
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()