AI Hunter
Member
Bạn muốn cảm giác bước về nhà, camera nhìn thấy bạn và tự động nói: "Chào mừng sếp đã về!", nhưng nếu là người lạ thì hú còi?
Hôm nay, chúng ta sẽ sử dụng thư viện `face_recognition` (được mệnh danh là thư viện nhận diện khuôn mặt đơn giản nhất thế giới) để làm điều đó.
Hệ thống hoạt động qua 3 bước:
Cài đặt các thư viện cần thiết. Lưu ý: `dlib` (thư viện lõi) cài trên Windows có thể hơi phức tạp một chút (cần cài CMake).
*Mẹo: Nếu gặp lỗi khi cài dlib, hãy tìm file .whl tương ứng với version Python của bạn để cài thủ công.*
Chuẩn bị ảnh dữ liệu:
* Tạo thư mục `faces/`.
* Chụp một tấm ảnh rõ mặt của bạn, đặt tên `admin.jpg` và bỏ vào đó.
Dưới đây là file `face_id_camera.py`.
* Chống giả mạo (Anti-Spoofing): Hiện tại code này có thể bị lừa nếu ai đó giơ tấm ảnh của bạn trước camera. Để khắc phục, cần thêm module "Liveness Detection" (Kiểm tra chớp mắt hoặc xoay đầu).
* Điểm danh tự động: Ứng dụng để điểm danh nhân viên vào file Excel mỗi sáng.
Hôm nay, chúng ta sẽ sử dụng thư viện `face_recognition` (được mệnh danh là thư viện nhận diện khuôn mặt đơn giản nhất thế giới) để làm điều đó.
1. Nguyên lý hoạt động
Hệ thống hoạt động qua 3 bước:
- Học (Encode): Bạn đưa cho máy 1 tấm ảnh chân dung của bạn. Máy sẽ đo đạc các tỉ lệ trên khuôn mặt (khoảng cách mắt, mũi, miệng...) và mã hóa thành một dãy số (vector).
- Nhìn (Detect): Camera quét khuôn mặt xuất hiện trong khung hình.
- So sánh (Compare): Máy so sánh khuôn mặt đang nhìn thấy với dữ liệu đã học. Nếu giống nhau > 90% -> Là bạn.
2. Chuẩn bị
Cài đặt các thư viện cần thiết. Lưu ý: `dlib` (thư viện lõi) cài trên Windows có thể hơi phức tạp một chút (cần cài CMake).
Mã:
pip install cmake dlib
pip install face_recognition opencv-python numpy
*Mẹo: Nếu gặp lỗi khi cài dlib, hãy tìm file .whl tương ứng với version Python của bạn để cài thủ công.*
Chuẩn bị ảnh dữ liệu:
* Tạo thư mục `faces/`.
* Chụp một tấm ảnh rõ mặt của bạn, đặt tên `admin.jpg` và bỏ vào đó.
3. Triển khai Code (Full Source)
Dưới đây là file `face_id_camera.py`.
Python:
import cv2
import face_recognition
import os
import numpy as np
# --- CẤU HÌNH ---
KNOWN_FACES_DIR = "faces" # Thư mục chứa ảnh người quen
TOLERANCE = 0.6 # Độ sai số (Càng thấp càng khắt khe)
FRAME_THICKNESS = 3 # Độ dày khung vẽ
FONT_THICKNESS = 2 # Độ dày chữ
print("⏳ Đang nạp dữ liệu khuôn mặt...")
known_face_encodings = []
known_face_names = []
# 1. Học khuôn mặt từ thư mục 'faces'
for filename in os.listdir(KNOWN_FACES_DIR):
if filename.endswith(".jpg") or filename.endswith(".png"):
# Tải ảnh
image = face_recognition.load_image_file(f"{KNOWN_FACES_DIR}/{filename}")
# Mã hóa khuôn mặt (Lấy khuôn mặt đầu tiên tìm thấy trong ảnh)
encoding = face_recognition.face_encodings(image)[0]
known_face_encodings.append(encoding)
# Tên người = Tên file bỏ đuôi (admin.jpg -> admin)
known_face_names.append(os.path.splitext(filename)[0])
print(f"✅ Đã học xong {len(known_face_names)} khuôn mặt!")
def main():
cap = cv2.VideoCapture(0) # Mở Webcam
while True:
ret, frame = cap.read()
if not ret: break
# Giảm kích thước khung hình để xử lý nhanh hơn (0.25 = 1/4 kích thước)
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# Chuyển màu từ BGR (OpenCV) sang RGB (face_recognition)
rgb_small_frame = small_frame[:, :, ::-1]
# 2. Tìm tất cả khuôn mặt trong khung hình
face_locations = face_recognition.face_locations(rgb_small_frame)
face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
# 3. So sánh
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=TOLERANCE)
name = "Stranger" # Mặc định là Người lạ
# Tính khoảng cách (độ giống nhau), chọn người giống nhất
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = known_face_names[best_match_index]
# Quy đổi lại tọa độ về kích thước gốc (nhân 4)
top *= 4
right *= 4
bottom *= 4
left *= 4
# 4. Vẽ khung & Tên
color = (0, 0, 255) # Đỏ cho người lạ
if name != "Stranger":
color = (0, 255, 0) # Xanh cho người quen
cv2.rectangle(frame, (left, top), (right, bottom), color, FRAME_THICKNESS)
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), color, cv2.FILLED)
cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_DUPLEX, 1.0, (255, 255, 255), 1)
# --- LOGIC XỬ LÝ (Nơi bạn thêm code Jarvis) ---
if name == "admin":
print("👋 Chào sếp! (Mở cửa...)")
# Thêm code: play_sound('welcome.mp3') hoặc gửi request mở khóa cửa
elif name == "Stranger":
print("🚨 Cảnh báo: Người lạ!")
cv2.imshow('Face ID Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
4. Giải thích kỹ thuật
- `face_recognition`: Thư viện này sử dụng mô hình Deep Learning đã được huấn luyện sẵn, độ chính xác lên tới 99.38%. Nó mạnh hơn nhiều so với các phương pháp Haar Cascades cũ kỹ.
- Tối ưu tốc độ: Nhận diện khuôn mặt rất nặng. Trong code, tôi đã dùng thủ thuật `resize(fx=0.25)` để thu nhỏ ảnh xuống 4 lần trước khi đưa vào AI xử lý. Điều này giúp tăng FPS (tốc độ khung hình) lên đáng kể mà vẫn giữ được độ chính xác.
- Xử lý Logic: Tại phần `if name == "admin"`, bạn có thể kết nối với Home Assistant (bài 1) để bật đèn, mở điều hòa ngay khi bạn ngồi vào bàn làm việc.
5. Thử thách nâng cao
* Chống giả mạo (Anti-Spoofing): Hiện tại code này có thể bị lừa nếu ai đó giơ tấm ảnh của bạn trước camera. Để khắc phục, cần thêm module "Liveness Detection" (Kiểm tra chớp mắt hoặc xoay đầu).
* Điểm danh tự động: Ứng dụng để điểm danh nhân viên vào file Excel mỗi sáng.
Bài viết liên quan