Skip to content

สร้างระบบจดจำใบหน้าเฉพาะบุคคลด้วย OpenCV กับภาษาไพทอน

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปสร้างระบบจดจำใบหน้าเฉพาะบุคคลด้วย OpenCV กับภาษาไพทอนกันครับ

บทความนี้ผมจะขอใช้ระบบปฎิบัติการ Windows 32 bit เป็นหลักในการสร้างข้อมูล Haar-like Classifier ครับ (ผมขอแนะนำให้ทำใน Windows จะสะดวกกว่าระบบปฎิบัติการอื่น เฉพาะเรื่องนี้ครับ)


คำเตือน !

บทความนี้หากต้องการความถูกต้องสูง ไม่แนะนำให้อ่านบทความนี้ เพราะ OpenCV ต้องการข้อมูลจำนวนมากเพื่อความแม่นยำ แนะนำให้อ่านบทความ "ตรวจจับใบหน้าโดยเครือข่ายประสาทเทียมด้วย OpenFace"

แนะนำให้ใช้บทความนี้ในการตรวจจับวัตถุเท่านั้น


สร้างข้อมูล Haar-like Classifier ให้กับ OpenCV ใน Windows

ผมไม่ขออธิบายหลักการของ Haar-like Classifier เพื่อลดความยาวของหน้าเว็บและเพื่อไม่ให้สับสนกับความรู้ที่ผู้อ่านมีครับ
อ่านได้ที่ http://docs.opencv.org/2.4.9/modules/objdetect/doc/cascade_classification.html

ในการสร้าง Haar-like Classifier จะต้องมีรูปภาพที่ใช้เป็นฐานข้อมูล Haar-like Classifier มี 2 ส่วนดังนี้

  • positive images เป็นรูปภาพของวัตถุที่ต้องการนำมาสร้าง Haar-like Classifier เช่น ใบหน้า ตา และอื่น ๆ
  • negatives images เป็นรูปภาพของวัตถุที่ไม่เกี่ยวข้องกับ positive images เช่น พื้นหลัง เป็นต้น

เรามาลงมือสร้าง Haar-like Classifier กันครับ

1.ให้กับการโหลดไฟล์บีบอัดจาก https://www.dropbox.com/s/yh4nloobe7a1qc3/haartraining2.zip?dl=0
2.แตกไฟล์แล้วเข้าไปในโฟลเลอร์ที่แตกไฟล์ออกมา ให้เข้าไปยังโฟลเลอร์ positive - > โฟลเลอร์ rawdata
3.ต่อมา ผมเขียนโค้ดสำหรับถ่ายภาพใบหน้าแล้วบันทึกลงเฉพาะใบหน้าที่ตรวจจับพบ

(ในกรณีที่ผู้อ่านไม่ต้องการทำระบบตรวจจับใบหน้า ไม่ต้องรันโค้ดนี้ครับ ให้ทำการถ่ายรูปเอง โดยถ่ายรูปวัตถุที่ต้องการแล้ว crop เอาเฉพาะวัตถุที่ต้องการแล้วบันทึกเป็นไฟล์ .bmp ครับ)

ให้ทำการคลิกเพื่อรันโปรแกรม maker.bat ได้เลยครับ
โค้ดภายในไฟล์ maker.bat

python maker.py

โค้ดภายในไฟล์ maker.py

import cv2

def num(i):
	i+=1
	return i
cam = cv2.VideoCapture(0)

name = "Face"

hc = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")

cv2.namedWindow(name, cv2.WINDOW_AUTOSIZE)

while True:
	i = 0
	s, img = cam.read()
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
	faces = hc.detectMultiScale(gray, 1.3, 5)
	for (x,y,w,h) in faces:
		img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
		save = img[y:y+h,x:x+w]
		filename = 'img'+str(x+y)+'.bmp'
		cv2.imwrite(filename,save)
	
	cv2.imshow(name, img)
	k = cv2.waitKey(10)
	if k == 27:
		cv2.destroyWindow("Detect")
		break

ระบบจะทำการจับใบหน้าและบันทึกรูปภาพเป็นไฟล์ .bmp ลงเรื่อย ๆ เมื่อได้ข้อมูลมากพอประมาณ ให้ทำการหยุดรันโค้ด
4.เสร็จแล้วให้กลับมายังโฟลเลอร์ positive ทำการรันโปรแกรม objectmarker.exe (โปรแกรมนี้รันได้เฉพาะ 32 บิตเท่านั้น) จะมีหน้าต่างขึ้นมาให้ทำการลากคุมวัตถุที่ต้องนำไปสร้าง Haar-like Classifier
โดยกดปุ่ม Space Bar เพิ่มข้อมูลส่วนที่ทำการลากคุมวัตถุ
กดปุ่ม Enter เพิ่มบันทึกข้อมูลและโหลดข้อมูลถัดไป
ทำจนครบจะได้ไฟล์ info.txt
5.กลับยังโฟลเลอร์หลักที่แตกไฟล์ออกมา ให้เข้าไปยังโฟลเลอร์ negative ทำการเพิ่มข้อมูลรูปภาพ .jpg ที่ไม่เกี่ยวข้องกับข้อมูล positive images เช่น ภาพพื้นหลังที่อยู่หลังภาพใบหน้าของเรา เป็นต้น แล้วทำการรันไฟล์ create_list.bat
โค้ดภายในไฟล์ create_list.bat

dir /b *.jpg >bg.txt

จะได้ไฟล์ bg.txt
6.กลับยังโฟลเลอร์หลักที่แตกไฟล์ออกมา ให้ทำการรันไฟล์
โค้ดภายในไฟล์ createsamples.bat

createsamples.exe -info positive/info.txt -vec vector/vector.vec -num 204 -w 24 -h 24

รอสักครู่ขึ้นอยู่กับปริมาณไฟล์ข้อมูลและประสิทธิภาพของเครื่องคอมพิวเตอร์ จะได้ไฟล์ vector.vec ในโฟลเลอร์ vector
7.ทำการรันไฟล์ haarTraining.bat
โค้ดภายในไฟล์ haarTraining.bat

haartraining.exe -data cascades -vec vector/vector.vec -bg negative/bg.txt -npos 200 -nneg 

200 -nstages 15 -mem 1024 -mode ALL -w 24 -h 24 

rem -nonsym

รอสักครู่ขึ้นอยู่กับปริมาณไฟล์ข้อมูลและประสิทธิภาพของเครื่องคอมพิวเตอร์ จะได้ข้อมูล Haar-like Classifier ในโฟลเลอร์ cascades แต่ยังนำไปใช้งานไม่ได้นะครับ ต้องแปลงให้เป็นไฟล์ XML ก่อนครับ
8.ทำการ copy ลากคุมข้อมูลทั้งหมดในโฟลเลอร์ cascades แล้วนำไปวางในโฟลเลอร์ cascade2xml\data เสร็จกลับมาที่โฟลเลอร์ cascade2xml ทำการรันไฟล์ convert.bat
โค้ดภายในไฟล์ convert.bat

haarconv.exe data myfacedetector.xml 24 24

จะได้ไฟล์ myfacedetector.xml ซึ่งเป็นไฟล์ข้อมูล Haar-like Classifier พร้อมนำไปใช้งานต่อกับ OpenCV ได้เลยครับ


เขียนระบบจดจำใบหน้าเฉพาะบุคคลเข้าสู่ระบบด้วยใบหน้าด้วย OpenCV กับภาษาไพทอน

หลังจากที่เราไปสร้างข้อมูล Haar-like Classifier ใบหน้าของเรากันไปแล้วครับ คราวนี้เราจะนำเอาข้อมูล Haar-like Classifier คือ ไฟล์ myfacedetector.xml นำไปเป็นฐานข้อมูลระบบเข้าสู่ระบบด้วยใบหน้ากันครับ
จากบทความที่แล้ว ทำระบบตรวจจับใบหน้าด้วย OpenCV กับภาษา Python

เรามาลองเขียนโค้ดกันดูครับ
ตัวอย่างเช่น

import cv2

def num(i):
	i+=1
	return i
cam = cv2.VideoCapture(0)

name = "login your face"

hc = cv2.CascadeClassifier("myfacedetector.xml")

cv2.namedWindow(name, cv2.WINDOW_AUTOSIZE)

while True:
	i = 0
	login = 0
	s, img = cam.read()
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
	faces = hc.detectMultiScale(gray, 1.3, 5)
	for (x,y,w,h) in faces:
		img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
		print("Welcome to My Boss")
		login = 1
	cv2.imshow(name, img)
	if login==1:
		cv2.destroyWindow("name")
		break
	cv2.waitKey(10)
print("Ok")

หลักการ คือ ถ้ายังตรวจสอบไม่พบใบหน้าในฐานข้อมูลทำให้ค่าตัวแปร login เท่ากับ 0 อยู่ ไม่เข้าเงื่อนไข login==1 แต่เมื่อตรวจสอบพบใบหน้าในฐานข้อมูล เป็นจริงตามเงื่อนไข login==1 ให้ทำการปิดหน้าต่างตรวจสอบใบหน้าและออกจากการลูปเพื่อทำคำสั่งถัดไป

ลองนำไปศึกษาต่อและเขียนโค้ดประยุกต์กันเอานะครับ อาจจะปรับเปลี่ยนจากใบหน้าไปเป็นการตรวจจับป้ายทะเบียนรถยนต์ หากตรงกับฐานข้อมูลให้เปิดประตูเข้าออกครับ
ผมขอเตือนว่าโค้ดตรวจจับข้างบน ถึงแม้จะมีการสร้างข้อมูล Haar-like Classifie ขึ้นมาเอง แต่ยังไม่ปลอดภัยอยู่ เช่น กรณีนำภาพใบหน้าของคนที่อยู่ในฐานข้อมูลมาโชว์ที่กล้อง เป็นต้น ให้ทำการเพิ่มระบบความปลอดภัยเพิ่มขึ้นไปอีกครับ เช่น ระบบตรวจจับการมีชีวิต ให้กะพริบตา หรือเพิ่มระบบความปลอดภัยอื่น ๆ ขึ้นมา อันนี้เป็นโจทย์ที่ผู้อ่านต้องหาทางศึกษาต่อเองครับ


เอกสารอ้างอิง

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

Published on Categories ไม่มีหมวดหมู่Tags

About wannaphong

วรรณพงษ์ ภัททิยไพบูลย์ ผู้ดูแลเว็บ wannaphong.com และผู้เขียนบทความบล็อกนี้ นักศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย

9 thoughts on “สร้างระบบจดจำใบหน้าเฉพาะบุคคลด้วย OpenCV กับภาษาไพทอน

  1. Arisara

    ถ้าหนูต้องการตรวจจับป้ายทะเบียนรถยนต์
    หนูควรหาภาพตัวอย่างจากไหนคะ ?
    หนูควรแก้โค้ด createsamples.bat , haarTraining.bat ,convert.bat ในส่วนของ w=22 h=10 (อัตราส่วนป้ายทะเบียน) แค่นี้พอไหมคะ ?

    Reply
    1. wannaphong

      หารูปภาพป้ายทะเบียนรถยนต์จากอินเทอร์เน็ต หรือถ่ายเองได้ครับ ตัดเอารูปเฉพาะส่วนที่เราต้องการครับ ข้อมูลยิ่งมากยิ่งแม่นยำครับ
      ส่วนของ w=22 h=10 (อัตราส่วนป้ายทะเบียน) ให้แก้ไขตามที่ต้องการครับ

      Reply
  2. Apisit Bunanan

    มันขึ้นอย่างนี้อ่ะครับ รบกวนด้วยครับ
    Traceback (most recent call last):
    File "C:\Users\Apisit\Desktop\python\save\faceball.py", line 19, in
    faces = hc.detectMultiScale(gray, 1.3, 5)
    error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

    Reply
  3. Bodin

    คลิ๊ก objectmarker.exe แล้วไม่ขึ้นอะไรเลย ต้องลงอะไรเสริมหรือป่าวครับ

    Reply
  4. palakron

    ถ้าผมจะทำระบบตรวจจับดวงตาตอนหลับตา ผมต้อง crop เอาเฉพาะส่วนบริเวณดวงตาตอนหลับตาลงใช่มั้ยครับ แล้วต้องใช้ข้อมูลเยอะมากมั้ยครับ เพราะตอนนี้ผมใช้ libary ตรวจจับหน้า แล้วก็ดวงตาครับ แต่มันไม่สามารถตรวจจับเวลาเราหลับตาได้ คือผมลองทำระบบตรวจจับการหลับบในครับ

    Reply
  5. palakron

    ถ้าผมจะทำระบบตรวจจับดวงตาตอนหลับตา ผมต้อง crop เอาเฉพาะส่วนบริเวณดวงตาตอนหลับตาลงใช่มั้ยครับ แล้วต้องใช้ข้อมูลเยอะมากมั้ยครับ เพราะตอนนี้ผมใช้ libary ตรวจจับหน้า แล้วก็ดวงตาครับ แต่มันไม่สามารถตรวจจับเวลาเราหลับตาได้ คือผมลองทำระบบตรวจจับการหลับบในครับ[email protected]

    Reply
    1. wannaphong

      ใช่ครับ ส่วนปริมาณข้อมูลที่ใช้อันนี้ผมระบุแน่ชัดไม่ได้ครับ ข้อมูลมากและครอบคุม ช่วยให้แม่นยำมากขึ้นครับ ตัวอย่างปริมาณข้อมูล Web Faces มีจำนวนรูปภาพใบหน้าจำนวน 10,000 กว่ารูปครับ http://www.vision.caltech.edu/Image_Datasets/Caltech_10K_WebFaces/

      Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *