Networks Business Online Việt Nam & International VH2

Python: Nhận dạng khuôn mặt với dưới 25 dòng mã Python

Đăng ngày 07 November, 2022 bởi admin

Mục lục bài viết:

Trong bài viết này, tất cả chúng ta sẽ xem xét một cách đơn thuần nhất để mở màn với việc nhận dạng khuôn mặt bằng Python và thư viện nguồn mở OpenCV .

Trước khi bạn đặt bất kể câu hỏi nào thì :

  1. Đừng bỏ qua bài viết và chỉ cần cố gắng chạy code. Bạn phải hiểu những gì code đã làm, không chỉ để chạy nó đúng cách mà còn để khắc phục sự cố.
  2. Đảm bảo sử dụng OpenCV v2.
  3. Có một webcam hoạt động để tập lệnh này có thể hoạt động bình thường.
  4. Xem lại các nhận xét (comment) và câu hỏi khác, vì câu hỏi của bạn có thể đã được giải quyết.

Cảm ơn bạn .

Lưu ý : Ngoài ra, hãy xem hướng dẫn update về nhận diện khuôn mặt bằng Python .

OpenCV

OpenCV là thư viện phổ cập nhất cho thị giác máy tính. Ban đầu được viết bằng C / C + +, giờ đây nó phân phối những ràng buộc cho Python .OpenCV sử dụng thuật toán máy học để tìm kiếm khuôn mặt trong ảnh. Bởi vì khuôn mặt rất phức tạp, không có một bài kiểm tra đơn thuần nào cho bạn biết nó có tìm thấy khuôn mặt hay không. Thay vào đó, có hàng ngàn mẫu nhỏ và những tính năng phải được khớp với nhau. Các thuật toán chia nhỏ trách nhiệm nhận dạng khuôn mặt thành hàng nghìn trách nhiệm nhỏ hơn, có kích cỡ vừa phải, mỗi trách nhiệm đều dễ xử lý. Các tác vụ này còn được gọi là bộ phân loại .Đối với một cái gì đó như khuôn mặt, bạn hoàn toàn có thể có 6.000 bộ phân loại trở lên, tổng thể đều phải khớp để phát hiện một khuôn mặt ( tất yếu là trong số lượng giới hạn lỗi ). Nhưng yếu tố nằm ở chỗ : để nhận diện khuôn mặt, thuật toán khởi đầu ở trên cùng bên trái của một bức ảnh và chuyển dời xuống trên những khối tài liệu nhỏ, nhìn vào từng khối, liên tục hỏi, “ Đây có phải là khuôn mặt không ? … Đây có phải là một khuôn mặt ? … Đây có phải là một khuôn mặt không ? ” Vì có 6.000 bài kiểm tra trở lên cho mỗi khối, bạn hoàn toàn có thể có hàng triệu phép tính để thực thi, điều này sẽ khiến máy tính của bạn ngừng hoạt động giải trí .Để xử lý yếu tố này, OpenCV sử dụng những tầng. Tầng ( cascade ) là gì ? Câu vấn đáp tốt nhất hoàn toàn có thể được tìm thấy trong từ điển : ” a waterfall or series of waterfalls. “Giống như một loạt waterfall, tầng trong OpenCV chia yếu tố phát hiện khuôn mặt thành nhiều tiến trình. Đối với mỗi khối, nó thực thi một bài kiểm tra rất khó khăn vất vả và nhanh gọn. Nếu điều này được vượt qua, thì nó sẽ triển khai một bài kiểm tra chi tiết cụ thể hơn một chút ít, v.v. Thuật toán hoàn toàn có thể có 30 đến 50 trong số những tiến trình hoặc tầng này và nó sẽ chỉ phát hiện một khuôn mặt nếu tổng thể những quá trình đều vượt qua .Ưu điểm là phần đông hình ảnh sẽ trả về âm trong vài quá trình tiên phong, có nghĩa là thuật toán sẽ không tiêu tốn lãng phí thời hạn để kiểm tra tổng thể 6.000 tính năng trên đó. Thay vì mất hàng giờ, nhận diện khuôn mặt giờ đây hoàn toàn có thể được thực thi trong thời hạn thực .

Tầng trong thực tế

Tuy triết lý nghe có vẻ như phức tạp nhưng trên thực tiễn thì khá thuận tiện. Bản thân những tầng chỉ là một loạt những tệp XML chứa tài liệu OpenCV được sử dụng để phát hiện những đối tượng người tiêu dùng. Bạn khởi tạo mã của mình với tầng mà bạn muốn, và sau đó nó triển khai việc làm cho bạn .

Vì nhận diện khuôn mặt là một trường hợp thông dụng, nên OpenCV đi kèm với một số ít tầng tích hợp để phát hiện mọi thứ từ khuôn mặt, mắt cho đến tay và chân. Thậm chí có những tầng dành cho những thứ không phải của con người. Ví dụ, nếu bạn điều hành quản lý một shop chuối và muốn theo dõi những người ăn trộm chuối, bạn đã thiết kế xây dựng một shop cho điều đó !

Cài đặt OpenCV

Trước tiên, bạn cần tìm đúng file setup cho hệ điều hành quản lý của bạn .Tôi thấy rằng setup OpenCV là phần khó nhất của trách nhiệm. Nếu bạn gặp những lỗi lạ không hề lý giải được, đó hoàn toàn có thể là do xung đột thư viện, sự độc lạ 32/64 bit, v.v. Tôi thấy đơn thuần nhất là chỉ cần sử dụng một máy ảo Linux và setup OpenCV từ đầu .Sau khi hoàn tất thiết lập, bạn hoàn toàn có thể kiểm tra xem nó có hoạt động giải trí hay không bằng cách kích hoạt phiên Python và nhập :

>>> import cv2
>>> 

Nếu bạn không gặp bất kể lỗi nào, bạn hoàn toàn có thể chuyển sang phần tiếp theo .

Tìm hiểu về mã lệnh

Hãy chia nhỏ mã thực tiễn mà bạn hoàn toàn có thể tải xuống từ repo. Lấy script face_detect. py, ảnh abba.png pic, và file XML haarcascade_frontalface_default. xml .

# Nhận các giá trị do người dùng cung cấp
imagePath = sys.argv[1]
cascPath = sys.argv[2]

Trước tiên, bạn chuyển vào hình ảnh và tên tầng ( cascade ) dưới dạng đối số dòng lệnh. Chúng ta sẽ sử dụng hình ảnh ABBA cũng như tầng mặc định để phát hiện khuôn mặt do OpenCV cung ứng .

# Tạo tầng haar
faceCascade = cv2.CascadeClassifier(cascPath)

Bây giờ tất cả chúng ta tạo tầng và khởi tạo nó với tầng khuôn mặt của tất cả chúng ta. Thao tác này sẽ tải dòng khuôn mặt vào bộ nhớ để nó chuẩn bị sẵn sàng sử dụng. Hãy nhớ rằng, tầng chỉ là một tệp XML chứa tài liệu để phát hiện khuôn mặt .

# Đọc ảnh
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Ở đây tất cả chúng ta đọc hình ảnh và quy đổi nó sang thang độ xám ( grayscale ). Nhiều hoạt động giải trí trong OpenCV được thực thi ở thang độ xám .

# Nhận diện khuôn mặt trong ảnh
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)

Chức năng này phát hiện khuôn mặt thực và là phần quan trọng của mã của chúng ta, vì vậy chúng ta hãy xem xét các tùy chọn sau:

  1. Hàm detectMultiScale là một hàm tổng quát để phát hiện các đối tượng. Vì ta đang gọi nó trên tầng khuôn mặt, nên đó là những gì nó phát hiện.

  2. Tùy chọn đầu tiên là hình ảnh thang độ xám.
  3. Thứ hai là scaleFactor. Vì một số khuôn mặt có thể gần máy ảnh hơn, nên chúng sẽ xuất hiện lớn hơn so với các khuôn mặt ở phía sau. Scaler factor sẽ bù đắp cho điều này.
  4. Thuật toán phát hiện sử dụng một cửa sổ chuyển động để phát hiện các đối tượng. minNeighbors sẽ xác định có bao nhiêu đối tượng được phát hiện gần đối tượng hiện tại trước khi nó khai báo khuôn mặt được tìm thấy. Trong khi đó thì minSize sẽ cung cấp kích thước của mỗi cửa sổ.

Lưu ý : Tôi đã lấy những giá trị thường được sử dụng cho những trường này. Trong thực tiễn, bạn sẽ thử nghiệm với những giá trị khác nhau cho size hành lang cửa số, thông số tỷ suất, v.v. cho đến khi bạn tìm thấy giá trị tương thích nhất với mình .

Hàm trả về một list những hình chữ nhật mà nó tin rằng nó đã tìm thấy một khuôn mặt. Tiếp theo, tất cả chúng ta sẽ lặp lại nơi nó nghĩ rằng nó đã tìm thấy thứ gì đó .

print "Found {0} faces!".format(len(faces))

# Vẽ một hình chữ nhật quanh các khuôn mặt
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

Hàm này trả về 4 giá trị: vị trí x và y của hình chữ nhật, chiều rộng và chiều cao của hình chữ nhật (wh).

Chúng ta sử dụng các giá trị này để vẽ một hình chữ nhật bằng cách sử dụng hàm có sẵn là rectangle().

cv2.imshow("Faces found", image)
cv2.waitKey(0)

Cuối cùng, ta hiển thị hình ảnh và chờ người dùng nhấn một phím .

Kiểm tra kết quả

Hãy thử so sánh với ảnh ABBA :

$ python face_detect.py abba.png haarcascade_frontalface_default.xml

Điều đó đã hiệu suất cao. Còn so với ảnh này :

Bạn thấy rằng có một hình chữ nhật đang không được vẽ quanh một khuôn mặt. Hãy thử lại lần nữa. Tôi đã thay đổi các thông số và thấy rằng việc đặt scaleFactor thành 1,2 đã loại bỏ khuôn mặt sai.

Chuyện gì đã xảy ra?

Ta thấy rằng bức ảnh đầu tiên được chụp khá cận cảnh bằng máy ảnh chất lượng cao. Bức thứ hai dường như được chụp từ xa và có thể bằng điện thoại di động. Đây là lý do tại sao scaleFactor phải được sửa đổi. Như tôi đã nói, bạn sẽ phải thiết lập thuật toán trên cơ sở từng trường hợp để tránh “dương tính giả”.

Hãy cảnh báo rằng vì điều này dựa trên máy học, nên kết quả sẽ không bao giờ chính xác 100%. Bạn sẽ nhận được kết quả đủ tốt trong hầu hết các trường hợp, nhưng đôi khi thuật toán sẽ xác định các đối tượng không chính xác là khuôn mặt.

Mã ở đầu cuối hoàn toàn có thể được tìm thấy ở đây .

Mở rộng sang Webcam

Nếu bạn muốn sử dụng webcam thì sao ? OpenCV lấy từng khung hình từ webcam và sau đó bạn hoàn toàn có thể phát hiện khuôn mặt bằng cách giải quyết và xử lý từng khung hình .

Cập nhật : Bài viết tiếp theo được phát trực tiếp. Kiểm tra tính năng Nhận diện khuôn mặt trên Webcam bằng Python !

Source: https://vh2.com.vn
Category : Tin Học