STDIO Bài viết ứng dụng OpenCV để tự động nhận dạng các khuôn mặt có trong bức ảnh để giảm bớt thời gian và hao phí sức khỏe của con người. Ở những tổ chức, cá nhân khác nhau sẽ sử dụng để phục vụ tiêu chí khác nhau.
Nội dung bài viết

Giới thiệu

Một nhóm lập trình viên nước ngoài phát triển về trí tuệ nhân tạo đã nhận định rằng: Để đưa ra quyết định thực hiện một việc gì đó thì trước tiên phải nhận dạng được các vật chất xung quanh thế nên chúng tôi đã miệt mài học toán và thuật toán nhằm tối ưu nhất có thể nhận ra một vật thể, cũng là một con mèo nhưng lúc thì nó nhảy, lúc thì nó nằm và còn có lúc nó bị một vật gì đó cản một nửa khuôn mặt thế cho nên rất khó để mà nhận dạng ra được khuôn mặt cúa chúng, thay vào việc mãi mê nghiên cứu và phát triển thuật toán thì chúng tôi đã sử dụng một lượng hình ảnh/dữ liệu về con mèo nạp vào chương trình, cùng là một chi phí hoặc có khả năng thấp hơn nhưng kết quả lại tốt hơn rất nhiều. Bài viết này giới thiệu đến bạn đọc sử dụng OpenCV với ngôn ngữ mô tả là Python cùng với tệp tin XML Haarcascade để nhận diện khuôn mặt trong một bức ảnh.

Môi trường thử nghiệm

  • Python phiên bản 3.6.5.
  • OpenCV phiên bản 3.4.1.

Các thư viện cần thiết

Sử dụng cửa sổ Command Promt và thực viện dòng lệnh sau đây

pip install opencv-python

Sử dụng OpenCV trong bài toán nhận diện khuôn mặt

Phần giới thiệu tôi đã có nói đến dùng hình ảnh/dữ liệu để giảm chi phí cho việc nghiên cứu thuật toán và những dữ liệu này đã được đúc kết thành tệp tin xml.

Haar Cascade là dữ liệu được sử dụng phổ biến nhất. Tôi sẽ chỉ sử dụng riêng một tệp tin trong bộ Haar Cascade là haarcascade_frontalface_default.xml. Ngoài ra còn có các tệp tin về phát hiện mắt, miệng, hình dáng cơ thể trong bộ Haar Cascade.

Đầu tiên tôi khai báo những thư viện sau

import cv2

Bước 1: Đầu vào sẽ là bức ảnh và tệp tin xml

image        = cv2.imread("images/Bill Gates.jpg")
face_cascade = cv2.CascadeClassifier("Haar Cascade/haarcascade_frontalface_default.xml")

Bước 2: Tạo một bức ảnh xám từ bức ảnh gốc

grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Bước 3: Sử dụng phương thức detectMultiScale để phát hiện khuôn mặt trong bức ảnh xám

faces = faceCascade.detectMultiScale(
    grayImage,
    scaleFactor  = 1.1,
    minNeighbors = 5
)
  • Tham số thứ nhất là nguồn/bức ảnh xám.
  • scaleFactor: độ scale sau mỗi lần quét, tính theo 0.01 = 1%. Nếu như để scaleFactor = 1 thì tấm ảnh sẽ giữ nguyên
  • minNeighbors: scale và quét ảnh cho đến khi không thể scale được nữa thì lúc này sẽ xuất hiện những khung ảnh trùng nhau, số lần trùng nhau chính là tham số minNeighbors để quyết định cho việc có chọn khung ảnh này là khuôn mặt hay không.

Ngoài ra còn có các tham số như là maxScale, minScale để cho kích thước khung ảnh bắt đầu và kích thước khung ảnh kết thúc.

Có thể hiệu chỉnh tham số scaleFactor, minNeighbors, minScale, maxScale để có kết quả như mong muốn.

Bước 4: Sau khi tính toán thì dữ liệu các khuôn mặt đã có trong biến faces, để muốn xác thực chúng ta vẽ nó lên bức ảnh gốc và phác họa ra màn hình

# Draw
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
# Show
cv2.imshow("Faces found", image)

Kết thúc chương trình với

cv2.waitKey(0)
cv2.destroyAllWindows()

Kết quả khi chạy chương trình

result

Source code đầy đủ

Bill%20Gates

import cv2

# Bước 1: Tấm ảnh và tệp tin xml
face_cascade = cv2.CascadeClassifier("Haar Cascade/haarcascade_frontalface_default.xml")
image = cv2.imread("images/Bill Gates.jpg")

# Bước 2: Tạo một bức ảnh xám
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Bước 3: Tìm khuôn mặt
faces = face_cascade.detectMultiScale(
    grayImage,
    scaleFactor  = 1.1,
    minNeighbors = 5,
)

# Bước 4: Vẽ các khuôn mặt đã nhận diện được lên tấm ảnh gốc
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

# Bước 5: Vẽ lên màn hình
cv2.imshow("Faces found", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

Tải mã nguồn tại đây.

THẢO LUẬN
Đo lường tiến độ lập trình bằng cách xem xét từng dòng code thì cũng như đo lường tiến độ chế tạo máy bay bằng trọng lượng. Bill Gates
ĐÓNG