THUẬT TOÁN NHẬN DIỆN KHUÔN MẶT OPENCV

I. Introduction

Nhận dạng mặt fan (Face recognition) là một nghành nghề nghiên cứu giúp của ngành Computer Vision, với cũng được xem là một nghành nghề dịch vụ nghiên cứu của ngành Biometrics (tương tự như dìm dạng vân tay – Fingerprint recognition, hay thừa nhận dạng mống mắt – Iris recognition). Xét về hình thức chung, thừa nhận dạng mặt có sự tương đồng rất cao với nhận dạng vân tay cùng nhận dạng mống mắt, mặc dù sự khác hoàn toàn nằm ở cách trích chọn đặt trưng (feature extraction) của từng lĩnh vực.

Bạn đang xem: Thuật toán nhận diện khuôn mặt opencv

Trong khi dìm dạng vân tay cùng mống đôi mắt đã đạt tới mức độ chín, tức là có thể áp dụng trên thực tế một cách rộng rãi thì nhận dạng khía cạnh người vẫn còn đó nhiều thách thức và vẫn là một nghành nghiên cứu thú vị với nhiều người. So với thừa nhận dạng vân tay và mống mắt, dìm dạng mặt có nguồn dữ liệu đa dạng mẫu mã hơn (bạn hoàn toàn có thể nhìn thấy mặt tín đồ ở bất kể tấm ảnh, video đoạn phim nào tương quan tới con người trên mạng) với ít đòi hỏi sự can dự có điều hành và kiểm soát hơn (để thực hiện nhận dạng vân tay xuất xắc mống mắt, tài liệu input đem từ con người đòi hỏi có sự bắt tay hợp tác trong môi trường thiên nhiên có kiểm soát).

Hiện nay các phương pháp nhận dạng khía cạnh được tạo thành nhiều hướng theo các tiêu chuẩn khác nhau: dấn dạng với tài liệu đầu vào là hình ảnh tĩnh 2d (still image based FR) là thịnh hành nhất, tuy nhiên tương lai có lẽ rằng sẽ là 3 chiều FR (vì việc bố trí nhiều camera 2 chiều sẽ cho dữ liệu 3D với đem lại hiệu quả tốt hơn, tin cậy hơn), cũng có thể có thể chia thành 2 phía là: có tác dụng với dữ liệu ảnh và làm với dữ liệu video.

Trên thực tế người ta hay phân chia các phương thức nhận dạng mặt ra làm cho 3 loại: phương pháp tiếp cận toàn bộ (global, như Eigenfaces-PCA, Fisherfaces-LDA), phương thức tiếp cận dựa trên những đặc điểm cục bộ (local feature based, như LBP, Gabor wavelets) và phương thức lai (hybrid, là sự kết hợp của hai phương pháp toàn cục và local feature). Cách thức dựa trên các đặc điểm cục bộ đã được chứng tỏ là ưu việt hơn khi thao tác trong những điều kiện không có điều hành và kiểm soát và nói theo một cách khác rằng lịch sử vẻ vang phát triển của thừa nhận dạng khía cạnh (A never ending story) là việc phát triển của các phương pháp trích chọn đặc thù (feature extractrion methods) được áp dụng trong các hệ thống dựa trên feature based.

Xem thêm: Mơ Thấy Con Heo Số Mấy ? Đánh Con Nào Dễ Chúng ? Mơ Thấy Lợn Đánh Đề Số Mấy

Các ứng dụng ví dụ của dấn dạng mặt dựa trên 2 quy mô nhận dạng: identification (xác định danh tính, việc 1-N), cùng verification (xác thực danh tính, vấn đề 1-1). Trong việc identification, ta cần xác định danh tính của hình ảnh kiểm tra, còn trong việc verification ta cần khẳng định 2 ảnh có thuộc thuộc về một người hay không.

II. Phần mềm nhận dạng khuôn mặt đơn giản với Python và OpenCV

1. Cài đặt đặt

Ở nội dung bài viết này mình đang sử dụng phương thức nhận diện khuôn mặt dễ dàng Haar-cascade Detection .Đầu tiên bọn họ cần setup Python 2.7 và OpenCV

*

*

Sau khi thiết đặt Python 2.7 với OpenCV ta copy tệp tin cv2.pyd từ thư mục face detectionopencvuildpython2.7Copy vào folder Python27Libsite-packagesCài đặt numpyVào folder Python27Scripts chạy lệnh

pip install numpy pip install pillow bọn họ sẽ sử dụng haarcascade_frontalface_default.xml từ opencvsourcesdatahaarcascadesCopy vào thư mục của dự án

Cài để sqlite

*

Tạo cơ sở dữ liệu FaceBase cùng với bảng People

*

OK họ đã sẵn sàng chuẩn bị .

2. Viết mã nguồn

Ở bài biết này mình vẫn tạo ứng dụng nhận diện khuôn mặt phẳng 3 bước đơn giản dễ dàng :

Bước 1 mình sẽ tạo nên dataSet dùng để làm nhận diệnBước 2 mình sẽ tạo nên dataTraning áp dụng để traning dữ liệuBước 3 mình sẽ khởi tạo lớp detector dể nhấn diệnKết nối sqlite nhằm tạo/cập nhật record

def insertOrUpdate(Id,Name): conn=sqlite3.connect("FaceBase.db") cmd="SELECT * FROM People WHERE ID="+str(Id) cursor=conn.execute(cmd) isRecordExist=0 for row in cursor: isRecordExist=1 if(isRecordExist==1): cmd="UPDATE People phối Name="+str(Name)+"WHERE ID="+str(Id) else: cmd="INSERT INTO People(Id,Name) Values("+str(Id)+","+str(Name)+")" conn.execute(cmd) conn.commit() conn.close()Mã nguồn cần sử dụng camera để có thể chụp hình dữ liệuid=raw_input("enter your id")name=raw_input("enter your name")insertOrUpdate(id,name)sampleNum=0while(True): ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.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) #incrementing sample number sampleNum=sampleNum+1 #saving the captured face in the dataset folder cv2.imwrite("dataSet/User."+id +"."+ str(sampleNum) + ".jpg", gray) cv2.imshow("frame",img) #wait for 100 miliseconds if cv2.waitKey(100) & 0xFF == ord("q"): break # break if the sample number is morethan đôi mươi elif sampleNum>20: breakcam.release()cv2.destroyAllWindows()Ở đây mình giới hạn ở đôi mươi tấm , dữ liệu ảnh càng đa dạng chủng loại thì độ đúng đắn càng cao

*

*

Dữ liệu giữ vào sqlite

*

dataSetCreator tương đối đầy đủ :

import cv2import sqlite3cam = cv2.VideoCapture(0)detector=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")#insert/update data lớn sqlitedef insertOrUpdate(Id,Name): conn=sqlite3.connect("FaceBase.db") cmd="SELECT * FROM People WHERE ID="+str(Id) cursor=conn.execute(cmd) isRecordExist=0 for row in cursor: isRecordExist=1 if(isRecordExist==1): cmd="UPDATE People set Name="+str(Name)+"WHERE ID="+str(Id) else: cmd="INSERT INTO People(Id,Name) Values("+str(Id)+","+str(Name)+")" conn.execute(cmd) conn.commit() conn.close() id=raw_input("enter your id")name=raw_input("enter your name")insertOrUpdate(id,name)sampleNum=0while(True): #camera read ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.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) #incrementing sample number sampleNum=sampleNum+1 #saving the captured face in the dataset thư mục cv2.imwrite("dataSet/User."+id +"."+ str(sampleNum) + ".jpg", gray) cv2.imshow("frame",img) #wait for 100 miliseconds if cv2.waitKey(100) & 0xFF == ord("q"): break # break if the sample number is morethan đôi mươi elif sampleNum>20: breakcam.release()cv2.destroyAllWindows()3.Tạo lớp traning dữ liệuLoad băng thông và file trong thư mục dataSet

path="dataSet"imagePaths= bóc tách ID tự tên file ảnh

ID=int(os.path.split(imagePath)<-1>.split(".")<1>) Convert hình ảnh và địa chỉ cửa hàng vào mảng faces với IDđối với bàn toán classfication tại đây thì Feature là ảnh còn Label chính là id fan dùng

faceImg=Image.open(imagePath).convert("L");faceNp=np.array(faceImg,"uint8")faces.append(faceNp)Traning và lưu vào file

recognizer.train(faces,np.array(Ids))recognizer.save("recognizer/trainningData.yml")

*

Traning code vừa đủ :

import cv2,osimport numpy as npfrom PIL import Imagerecognizer = cv2.face.LBPHFaceRecognizer_create()path="dataSet"def getImagesAndLabels(path): #get the path of all the files in the folder imagePaths= faces=<> IDs=<> for imagePath in imagePaths: faceImg=Image.open(imagePath).convert("L"); faceNp=np.array(faceImg,"uint8") #split lớn get ID of the image ID=int(os.path.split(imagePath)<-1>.split(".")<1>) faces.append(faceNp) print ID IDs.append(ID) cv2.imshow("traning",faceNp) cv2.waitKey(10) return IDs, facesIds,faces=getImagesAndLabels(path)#trainningrecognizer.train(faces,np.array(Ids))recognizer.save("recognizer/trainningData.yml")cv2.destroyAllWindows()4.Lớp detector nhận diện khuôn mặt sẽ traningLấy tin tức user từ Database

#get data from sqlite by IDdef getProfile(id): conn=sqlite3.connect("FaceBase.db") cmd="SELECT * FROM People WHERE ID="+str(id) cursor=conn.execute(cmd) profile=None for row in cursor: profile=row conn.close() return profileSử dụng camera để thừa nhận diện :

ret,img=cam.read();gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)faces=faceDetect.detectMultiScale(gray,1.3,5);Hiển thị tin tức User bằng text

for(x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) id,conf=rec.predict(gray) profile=getProfile(id) if(profile!=None): cv2.putText(img, "Name: " + str(profile<1>), (x,y+h+30), fontface, fontscale, fontcolor ,2) cv2.putText(img, "Age: " + str(profile<2>), (x,y+h+60), fontface, fontscale, fontcolor ,2) cv2.putText(img, "Gender: " + str(profile<3>), (x,y+h+90), fontface, fontscale, fontcolor ,2)Tèn tén ten .

*

Full code detector

import cv2import numpy as npfrom PIL import Imageimport pickleimport sqlite3faceDetect=cv2.CascadeClassifier("haarcascade_frontalface_default.xml");cam=cv2.VideoCapture(0);rec=cv2.face.LBPHFaceRecognizer_create();rec.read("recognizer\trainningData.yml")id=0#set text stylefontface = cv2.FONT_HERSHEY_SIMPLEXfontscale = 1fontcolor = (203,23,252)#get data from sqlite by IDdef getProfile(id): conn=sqlite3.connect("FaceBase.db") cmd="SELECT * FROM People WHERE ID="+str(id) cursor=conn.execute(cmd) profile=None for row in cursor: profile=row conn.close( return profilewhile(True): #camera read ret,img=cam.read(); gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) faces=faceDetect.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) id,conf=rec.predict(gray) profile=getProfile(id) #set text to window if(profile!=None): #cv2.PutText(cv2.fromarray(img),str(id),(x+y+h),font,(0,0,255),2); cv2.putText(img, "Name: " + str(profile<1>), (x,y+h+30), fontface, fontscale, fontcolor ,2) cv2.putText(img, "Age: " + str(profile<2>), (x,y+h+60), fontface, fontscale, fontcolor ,2) cv2.putText(img, "Gender: " + str(profile<3>), (x,y+h+90), fontface, fontscale, fontcolor ,2) cv2.imshow("Face",img) if cv2.waitKey(1)==ord("q"): break;cam.release()cv2.destroyAllWindows()Hết !Cảm ơn các bạn đã thân mật và theo dõi.

Leave a Reply

Your email address will not be published. Required fields are marked *