Lập trình công cụ phát hiện khuôn mặt bằng Python

Nhận diện khuôn mặt Python không khó như nhiều người vẫn nghĩ. Dưới đây là cách code nhận diện khuôn mặt Python đơn giản cho người mới bắt đầu.

Có bao giờ bạn tự hỏi làm thế nào mà các bộ lọc (filter) của Snapchat, Messenger lại vừa khít với khuôn mặt của bạn? Smartphone của bạn dùng phép thuật để mở khóa bằng khuôn mặt? Không phải đâu, chỉ đơn giản là bạn đang chứng kiến công nghệ nhận dạng khuôn mặt hoạt động trong thực tế.

Thị giác máy tính là gì?

Chúng ta hiện đang sống trong thời đại cách mạng AI, được đánh dấu bởi những tiến bộ ấn tượng trong lĩnh vực deep learning (học sâu). Trong suốt năm nay, chúng ta đã chứng kiến những thành tựu tuyệt vời của ứng dụng trí tuệ nhân tạo khiến cả thế giới phải bất ngờ khi chúng tạo ra những tác phẩm nghệ thuật chân thực, vượt qua kỳ thi sát hạch, thậm chí, viết code Python để tạo trang web.

Thị giác máy tính là một ứng dụng học sâu, là trung tâm của cuộc cách mạng này. Nó cho phép máy tính hiểu rõ hơn dữ liệu trực quan nhập vào như hình ảnh và tệp video. Những ví dụ điển hình về thị giác máy tính bao gồm nhận diện khuôn mặt, nhận dạng khuôn mặt, ước tính tư thế con người và phát hiện chướng ngại vật.

Ở bài viết này, hãy cùng Quantrimang.com học cách làm công cụ nhận dạng khuôn mặt Python. Đây là một trong số ngôn ngữ lập trình phổ biến nhất hiện nay. Nó có nhiều ứng dụng trong thực tế và nhận diện khuôn mặt chỉ là một ví dụ điển hình nhất.

Nhận dạng khuôn mặt là một công nghệ trí tuệ nhân tạo có thể xác định khuôn mặt của con người trong ảnh hoặc video kỹ thuật số. Trong bài viết này, Quản Trị Mạng sẽ cùng các bạn tìm hiểu cách xây dựng một công cụ nhận dạng khuôn mặt thời gian thực chỉ trong khoảng dưới 25 dòng code với thuật toán Haar Cascade huyền thoại.

Haar Cascade là gì?

Haar Cascade là thuật toán phát hiện đối tượng được giới thiệu bởi Paul Viola và Michael Jones nhằm phát hiện khuôn mặt trong ảnh hoặc video. Một chức năng phân tầng được đào tạo bằng cách sử dụng nhiều bức ảnh âm và dương, sau này có thể được sử dụng để xác định bất kỳ đối tượng hoặc khuôn mặt nào. Các file được đào tạo sẵn này có sẵn trong repo OpenCV GitHub.

Sử dụng phương thức tiếp cận cửa sổ trượt, một cửa sổ có kích thước cố định sẽ lặp lại hình ảnh từ trái sang phải, từ trên xuống dưới. Ở mỗi giai đoạn, cửa sổ dừng lại và phân loại xem khu vực có chứa khuôn mặt hay không.

OpenCV, một công cụ thị giác máy, hoạt động với mô hình Haar Cascade được huấn luyện trước để phân loại các đối tượng. Mỗi giai đoạn kiểm tra 5 đối tượng, hai đối tượng cạnh, hai đối tượng đường thẳng và một đối tượng bốn ô đan xen.

Các đối tượng kiểu cửa sổ trượt

Khi quan sát, vùng mắt có vẻ sẫm màu hơn vùng má trong khi vùng mũi sáng hơn vùng mắt. Bạn có thể hình dung các đối tượng trong hình bên dưới đây:

Mô hình lý thuyết của khuôn mặt

Sử dụng các đối tượng này và tính toán các pixel, thuật toán xác định hơn 100.000 điểm dữ liệu. Sau đó, bạn có thể sử dụng thêm thuật toán Adaboost để cải thiện độ chính xác và loại bỏ các đối tượng không liên quan. Qua nhiều lần lặp đi lặp lại, cách tiếp cận này giảm thiểu tỷ lệ lỗi và tiếp tục điều chỉnh đối tượng để đạt độ chính xác chấp nhận được.

Tuy nhiên, kỹ thuật cửa sổ trượt sẽ dừng lại nếu một trường hợp thử nghiệm cụ thể không thành công và nó đắt về mặt tính toán. Để giải quyết vấn đề này, bạn có thể áp dụng khái niệm Cascade of Classifier. Thay vì áp dụng tất cả các đối tượng trong một cửa sổ duy nhất, phương pháp này phân nhóm và áp dụng chúng theo từng giai đoạn.

Nếu cửa sổ thất bại ở giai đoạn đầu tiên, quá trình sẽ loại bỏ nó, nếu không nó sẽ tiếp tục. Điều này dẫn tới việc giảm thiểu đáng kể số lượng các thao tác phải thực hiện và giúp nó có thể được dùng cho các ứng dụng thời gian thực.

Quy trình phát hiện khuôn mặt

Đây là quy trình mà bạn cần thực hiện để xây dựng một công cụ nhận diện khuôn mặt:

  1. Tải Thuật toán Haar Cascade Frontal Face
  2. Khởi tạo camera
  3. Đọc khung hình từ camera
  4. Chuyển đổi hình ảnh sang thang độ xám
  5. Lấy tọa độ khuôn mặt
  6. Vẽ một hình chữ nhật và đặt thông điệp thích hợp
  7. Hiển thị đầu ra

OpenCV là gì?

OpenCV là một thư viện thị giác máy mã nguồn mở và machine learning. Nó có hơn 2.500 thuật toán đã được tối ưu cho rất nhiều ứng dụng. Trong đó bao gồm nhận dạng, phát hiện khuôn mặt/đối tượng, phân loại...

Rất nhiều công ty lớn như Google, IBM và cả Yahoo đã sử dụng OpenCV trong ứng dụng của họ. Dẫu vậy, trước khi bắt đầu bạn cũng nên cân nhắc về việc đảm bảo an toàn cho dữ liệu riêng tư của mình.

Để cài đặt OpenCV trong Python, sử dụng câu lệnh sau:

pip install opencv-python

Lập trình công cụ phát hiện khuôn mặt bằng Python

Bạn cần thực hiện các bước sau để lập trình một công cụ phát hiện khuôn mặt bằng Python:

  • Tải file Haar Cascade Frontal Face Default XML và đặt nó vào chung vị trí với chương trình Python của bạn.
  • Nhập thư viện OpenCV:
# importing the required libraries
import cv2
  • Lưu file thuật toán Haar Cascade Frontal Face để dễ tham khảo
# loading the haar case algorithm file into alg variable
alg = "haarcascade_frontalface_default.xml"
  • Sử dụng lớp CascadeClassifier để tải một file XML vào OpenCV:
# passing the algorithm to OpenCV
haar_cascade = cv2.CascadeClassifier(alg)
  • Lấy video từ camera. Đưa giá trị 0 vào hàm VideoCapture() để sử dụng camera chính của bạn. Nếu bạn có thêm nhiều camera, bạn có thể sử dụng những con số tiếp theo như 1, 2... để chỉ định camera.
# capturing the video feed from the camera
cam = cv2.VideoCapture(0)
  • Thiết lập vòng lặp vô hạn để đọc từng frame của đầu vào camera. Hàm read() trả về hai tham số. Giá trị đầu tiên là kiểu boolean để cho biết hoạt động có thành công thứ hai. Tham số thứ hai chứa khung thực tế mà bạn sẽ làm việc. Lưu khung này trong biến img.
while True:
    _, img = cam.read()
  • Cài đặt văn bản thông báo mặc định là Face not detected. Khi phát hiện ra khuôn mặt thì cập nhật giá trị vào biến đó.
    text = "Face not detected"
  • Đầu vào từ thế giới thực có nhiều màu sắc nhưng trong định dạng BGR. BGR là viết tắt của blue, green và red (xanh, xanh lá và đỏ). Điều này sẽ khiến ứng dụng thị giác máy phải xử lý rất nhiều thứ. Do vậy, để giảm bớt khối lượng quy trình, chúng ta sử dụng định dạng màu xám.
  # convert each frame from BGR to Grayscale
    grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Đưa các khung hình và mã chuyển đổi định dạng, COLOR_BGR2GRAY, vào cvtColor() để thay đổi từng khung hình của video từ màu sắc sang xám.

  • Sử dụng detectMultiScale() để phát hiện khuôn mặt. Phương thức này sử dụng ba tham số làm đầu vào. Đầu tiên là nguồn ảnh, grayImg. Tham số tứ hai là scaleFactor. Nó chỉ định mức độ bạn phải giảm kích thước ảnh ở mỗi tỷ lệ ảnh. Sử dụng giá trị mặc định 1.3 làm hệ số tỷ lệ. Hệ số tỷ lệ càng cao thì tốc độ thực hiện càng nhanh do càng ít bước cần thực hiện. Tuy nhiên, khả năng thiếu khuôn mặt cũng cao hơn. Tham số thứ ba là minNeighbors. Tham số này chỉ định số lượng hàm xóm mà mỗi hình chữ nhật phải có để giữ lại nó. Giá trị càng cao thì khả năng phát hiện sai khuôn mặt càng thấp nhưng cũng có tỷ lệ bỏ lỡ các khuôn mặt không rõ ràng cao hơn.
  # detect faces using Haar Cascade 
    face = haar_cascade.detectMultiScale(grayImg, 1.3, 4)
  • Khi bạn phát hiện ra khuôn mặt, bạn sẽ nhận được 4 tọa độ. x đại diện cho tọa độ x, y đại diện cho tọa độ y, w đại diện cho chiều rộng và h đại diện cho chiều cao. Cập nhật thông báo văn bản là Face Detected và vẽ hình chữ nhật dựa trên các tọa độ đó. Màu sắc của hình chữ nhật là green (theo định dạng BGR) và độ dày đường viền hình chữ nhật là 2 pixel.
  # draw a rectangle around the face and update the text to Face Detected
    for (x, y, w, h) in face:
        text = "Face Detected"
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
  • Tùy chọn in văn bản trên bảng điều khiển đầu ra. Hiển thị văn bản trên màn hình bằng cách sử dụng khung hình đã chụp làm nguồn, văn bản thu thập được trong văn bản trên, kiểu font chữ của FONT_HERSHEY_SIMPLEX, hệ số tỷ lệ font chữ là 1, màu xanh lam, độ dày 2 pixel và kiểu dòng AA.
# display the text on the image
    print(text)
    image = cv2.putText(img, text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
  • Hiển thị cửa sổ với tiêu đề Face Detection và hình ảnh. Sử dụng phương thức waitkey() để hiển thị cửa sổ trong 10 mili giây và kiểm tra một lần nhấn phím. Nếu người dùng nhấn phím Esc (Giá trị ASCII 27), hãy thoát khỏi vòng lặp.
# display the output window and press escape key to exit
    cv2.imshow("Face Detection", image)
    key = cv2.waitKey(10)
 
    if key == 27:
        break
  • Cuối cùng, giải phóng đối tượng camera khỏi chương trình Python và đóng tất cả các cửa sổ.
cam.release()
cv2.destroyAllWindows()

Chạy thử chương trình nhận dạng khuôn mặt lập trình bằng Python

Khi khuôn mặt trong khung hình, bạn sẽ nhìn thấy kết quả đầu ra như thế này:

Công cụ phát hiện khuôn mặt

Còn khi không có khuôn mặt, bạn sẽ nhận được thông điệp như thế này:

Khi không có khuôn mặt

Cắt và lưu khuôn mặt được nhận diện bằng Python

Để cắt và lưu khuôn mặt được nhận diện trong một ảnh, bạn có thể làm theo các bước bên dưới:

  • Nhập thư viện được yêu cầu. Phần lớn trường hợp, thư viện Python thường yêu cầu OpenCV. Vì thế, đảm bảo bạn đã cài nó.
  • Đọc ảnh nhập vào bằng cv2.imread(). Xác định đầy đủ đường dẫn ảnh. Chuyển đổi ảnh nhập vào sang thang màu xám.
  • Khởi tạo đối tượng phân loại theo tầng Haar face_cascade = cv2.CascadeClassifier() để nhận diện khuôn mặt. Chuyển đường dẫn đầy đủ của file Haar Cascade. Bạn có thể dùng file haarcascade_frontalface_alt.xml để phát hiện khuôn mặt trong ảnh.
  • Phát hiện khuôn mặt trong ảnh nhập vào bằng face_cascade.detectMultiScale(). Nó trả về tọa độ của khuôn mặt đã phát hiện ở định dạng (x,y,w,h).
  • Lặp qua tất cả khuôn mặt đã phát hiện. Tìm image[y:y+h, x:x+w] là khuôn mặt đã cắt và gán cho nó một biến mới, báo face. Lưu khuôn mặt đã cắt bằng cv2.imwrite().
  • Tùy chọn, hiện khuôn mặt đã cắt cho mục đích trực quan hóa dữ liệu.

Những giới hạn của công cụ nhận dạng khuôn mặt sử dụng thuật toán Haar Cascade

Trong khi thuật toán này rất nhẹ với kích thước mẫu nhỏ, hoạt động nhanh thì nó có các nhược điểm sau:

  • Trong video thực tế, khuôn mặt cần nằm thẳng thắn và trong tầm nhìn chuẩn của camera. Nếu nằm quá xa, quá gần hoặc quá nghiêng, thuật toán sẽ thất bại trong việc xác định các đối tượng.
  • Đây là thuật toán xác định khuôn mặt chính diện nên không thể phát hiện góc nghiêng của khuôn mặt.
  • Tỷ lệ nhận dạng sai rất cao. Nó thường xuyên xác định một khu vực là khuôn mặt mặc dù không hề có khuôn mặt nào hiện diện ở đó.
  • Cần tối ưu điều kiện ánh sáng. Độ chính xác của thuật toán sẽ giảm đáng kể trong điều kiện ánh sáng quá mức hoặc lờ mờ.

Nhận dạng khuôn mặt được ứng dụng trong nhiều lĩnh vực

Hiện tại, công nghệ nhận dạng khuôn mặt đang được ứng dụng trong rất nhiều lĩnh vực khác nhau. Bạn có thể sử dụng nó cho việc mở khóa smartphone, nhà, phương tiện và xác nhận tại sân bay... Nhận dạng khuôn mặt hiện còn được trang bị cho các hệ thống camera theo dõi, các bộ lọc trên mạng xã hội và công nghệ tự động theo dõi khuôn mặt trong ngành điện ảnh....

Thứ Sáu, 29/09/2023 16:23
4,48 👨 8.948
0 Bình luận
Sắp xếp theo
    ❖ Học Python