Trong kỷ nguyên của trí tuệ nhân tạo và thị giác máy tính, nhận diện khuôn mặt (face recognition) đang trở thành một trong những ứng dụng phổ biến nhất – từ mở khóa điện thoại đến giám sát an ninh. Nếu bạn là sinh viên ngành CNTT hoặc AI, việc làm đồ án AI nhận diện khuôn mặt bằng OpenCV không chỉ giúp bạn ứng dụng kiến thức vào thực tế mà còn dễ dàng ghi điểm với giảng viên nhờ tính ứng dụng cao.
Vậy làm thế nào để xây dựng một ứng dụng nhận diện khuôn mặt đơn giản nhưng hiệu quả, sử dụng Python và OpenCV? Bài viết này sẽ hướng dẫn bạn từ A đến Z, đảm bảo bạn có thể trình bày và demo đầy đủ trong buổi bảo vệ đồ án.
Chuẩn bị môi trường lập trình
Đầu tiên, bạn cần đảm bảo máy tính đã cài đặt:
Python 3.7 trở lên
Trình quản lý gói
pipIDE như PyCharm hoặc VS Code
Sau đó, cài đặt các thư viện cần thiết:
pip install opencv-python opencv-contrib-python numpy pillow
Giải thích:
opencv-python: thư viện chính cho xử lý ảnhopencv-contrib-python: chứa các mô hình face recognizer (LBPH, EigenFace…)numpy: để xử lý mảng ảnhpillow: hỗ trợ thao tác ảnh PIL
Phát hiện khuôn mặt bằng Haar Cascade
Đây là bước nhận diện vị trí khuôn mặt trong ảnh hoặc video. Chúng ta sẽ dùng mô hình Haar Cascade được huấn luyện sẵn (có sẵn trong OpenCV).
File: detect_face.py
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
img = cv2.imread('test.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)
cv2.imshow("Face Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Lưu ý: Bạn có thể thay test.jpg bằng tên file ảnh chứa khuân mặt của bạn hoặc tải xuống ảnh mẫu tại đây sau đó đổi tên file vừa tải thành test.jpg đặt file này cùng trong thư mục chứa file detect_face.py nhé!
Bấm nút chạy chương trình và cho ra kết quả sau:

Thu thập dữ liệu khuôn mặt (dataset)
Một hệ thống nhận diện cần được huấn luyện từ dữ liệu cụ thể. Mỗi người dùng cần có ảnh mẫu của khuôn mặt (thường là 50–100 ảnh).
Chúng ta sẽ viết một đoạn mã dùng webcam để chụp ảnh khuôn mặt và lưu vào thư mục dataset.
File: crop_face.py
import cv2
import os
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
cam = cv2.VideoCapture(0)
user_id = input("Nhập ID người dùng: ")
count = 0
if not os.path.exists("dataset"):
os.mkdir("dataset")
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
count += 1
face_img = gray[y:y + h, x:x + w]
face_img = cv2.resize(face_img, (200, 200))
cv2.imwrite(f"dataset/User.{user_id}.{count}.jpg", face_img)
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow("Collecting Data", img)
if cv2.waitKey(1) == 27 or count >= 100: # ESC hoặc đủ 100 ảnh
break
cam.release()
cv2.destroyAllWindows()
Huấn luyện mô hình nhận diện khuôn mặt
Sau khi có dữ liệu, bạn huấn luyện mô hình với thuật toán LBPH (Local Binary Pattern Histogram) – phù hợp với điều kiện ánh sáng không đồng đều, đơn giản nhưng hiệu quả.
File: train_face.py
import cv2
import numpy as np
from PIL import Image
import os
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()
def get_images_and_labels(path):
image_paths = [os.path.join(path, f) for f in os.listdir(path)]
face_samples = []
ids = []
for image_path in image_paths:
img = Image.open(image_path).convert('L')
np_img = np.array(img, 'uint8')
id = int(os.path.split(image_path)[-1].split('.')[1])
face_samples.append(np_img)
ids.append(id)
return face_samples, ids
faces, ids = get_images_and_labels(path)
recognizer.train(faces, np.array(ids))
recognizer.save('trainer.yml')
Nếu gặp lỗi vui lòng cài đặt thư viện sau:
pip install opencv-contrib-python
Sau khi huấn luyện, mô hình sẽ lưu vào file trainer.yml.
Nhận diện khuôn mặt thời gian thực
Đây là bước giúp bạn demo trực tiếp trước giảng viên. Sử dụng webcam, đọc mô hình trainer.yml và kiểm tra khuôn mặt có khớp ID nào không:
File: detect_face_run.py
import cv2
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
cam = cv2.VideoCapture(0)
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.2, 5)
for (x, y, w, h) in faces:
id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
text = f"User {id}" if confidence < 50 else "Unknown"
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(img, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Face Recognition', img)
if cv2.waitKey(1) == 27: # ESC
break
cam.release()
cv2.destroyAllWindows()Viết báo cáo và trình bày đồ án
Để hoàn chỉnh, bạn cần trình bày rõ trong báo cáo:
Mục tiêu: Nhận diện khuôn mặt bằng webcam
Công nghệ: Python, OpenCV, LBPH
Quy trình:
Phát hiện khuôn mặt
Thu thập dữ liệu
Huấn luyện
Nhận diện real-time
Ưu điểm: Nhanh, dễ triển khai, demo tốt
Giới hạn: Nhận diện trong phạm vi nhỏ, không tối ưu cho nhiều người dùng
Kết luận
Làm đồ án nhận diện khuôn mặt bằng OpenCV là một lựa chọn thông minh và thực tế dành cho sinh viên ngành Công nghệ Thông tin, đặc biệt trong lĩnh vực Trí tuệ nhân tạo và Thị giác máy tính. Chỉ với kiến thức nền tảng về Python và xử lý ảnh, bạn có thể xây dựng một hệ thống hoàn chỉnh: từ phát hiện khuôn mặt, thu thập dữ liệu, huấn luyện mô hình, đến nhận diện thời gian thực bằng webcam.









