6 กันยายน 2558

Published 9/06/2558 by with 0 comment

สร้างระบบจดจำใบหน้าเฉพาะบุคคลด้วย 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

[python]
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
[/python]

ระบบจะทำการจับใบหน้าและบันทึกรูปภาพเป็นไฟล์ .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

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

[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")
[/python]

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





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

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

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)