Python: Nhận diện khuôn mặt trên Webcam bằng Python

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Nhận diện khuôn mặt trên Webcam bằng Python

 

Hướng dẫn này là phần tiếp theo của Nhận dạng khuôn mặt với 25 dòng lệnh Python, vì vậy hãy đảm bảo rằng bạn đã xem qua bài đăng đầu tiên đó.

Như đã đề cập trong bài đầu tiên, khá dễ dàng để chuyển từ phát hiện khuôn mặt trong hình ảnh sang phát hiện chúng trong video qua webcam - đó chính là những gì chúng tôi sẽ trình bày chi tiết trong bài đăng này.

Trước khi bạn đặt bất kỳ câu hỏi nào trong phần bình luận:

  1. Đừng bỏ qua bài đăng trên blog và cố gắng chạy mã. Bạn phải hiểu 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. Bạn cần một webcam hoạt động để tập lệnh này hoạt động bình thường.
  4. Xem lại các nhận xét / 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 cập nhật của chúng tôi về nhận diện khuôn mặt bằng Python.

Điều kiện tiên quyết

  1. OpenCV đã được cài đặt (xem bài đăng trong bài trước trước để biết chi tiết)
  2. Một webcam hoạt động được.

Mã lệnh

Hãy đi thẳng vào mã, được lấy từ kho này.

import cv2
import sys

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

video_capture = cv2.VideoCapture(0)

while True:
    # Capture frame-by-frame
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.cv.CV_HAAR_SCALE_IMAGE
    )

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

    # Hiển thị khung kết quả
    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Sau khi thực hiện thành công thì giải phóng ảnh
video_capture.release()
cv2.destroyAllWindows()

Bây giờ chúng ta hãy chia nhỏ nó:

import cv2
import sys

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

Điều này chắc hẳn đã quen thuộc với bạn. Chúng ta đang tạo một tầng khuôn mặt, như chúng ta đã làm trong ví dụ hình ảnh.

video_capture = cv2.VideoCapture(0)

Dòng này đặt nguồn video thành webcam mặc định mà OpenCV có thể dễ dàng chụp.

LƯU Ý : Bạn cũng có thể cung cấp tên tệp tại đây và Python sẽ đọc trong tệp video. Tuy nhiên, bạn cần phải cài đặt ffmpeg vì bản thân OpenCV không thể giải mã video nén. Ffmpeg hoạt động như giao diện người dùng cho OpenCV và lý tưởng nhất là nó phải được biên dịch trực tiếp vào OpenCV. Điều này không dễ thực hiện, đặc biệt là trên Windows.

while True:
    # Capture frame-by-frame
    ret, frame = video_capture.read()

Ở đây, chúng ta quay video. Hàm read() đọc một khung hình từ nguồn video, trong ví dụ này là webcam. Điều này sẽ trả về:

  1. Đọc khung video thực tế (một khung trên mỗi lần lặp)
  2. Một mã trả lại

Mã lệnh trả về cho chúng ta biết liệu chúng ta đã hết khung hay chưa, điều này sẽ xảy ra nếu chúng ta đang đọc từ một tệp. Điều này không quan trọng khi đọc từ webcam, vì chúng ta có thể ghi lại mãi mãi, vì vậy chúng ta sẽ bỏ qua nó.

    # Capture frame-by-frame
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.cv.CV_HAAR_SCALE_IMAGE
    )

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

    # Hiển thị khung kết quả
    cv2.imshow('Video', frame)

Một lần nữa ta thấy rằng mã lệnh này quen thuộc. Chúng ta chỉ đang tìm kiếm khuôn mặt trong khung hình đã chụp của chúng ta.

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

Chúng ta chờ phím 'q' được nhấn để thoát khỏi script.

# Khi đã hoàn thành thì giải phóng video
video_capture.release()
cv2.destroyAllWindows()

Ở đoạn code này chúng ta đơn giản chỉ là dọn dẹp.

Thử nghiệm

Theo video thử nghiệm thực tế ở trên thì tôi với bằng lái xe trên tay. Và bạn có thể thấy rằng thuật toán theo dõi cả tôi thật và ảnh của tôi. Lưu ý rằng khi tôi di chuyển chậm, thuật toán có thể theo kịp. Tuy nhiên, khi tôi đưa tay lên mặt nhanh hơn một chút, nó sẽ bị nhầm lẫn và nhầm cổ tay của tôi với khuôn mặt.

Giống như tôi đã nói trong bài trước, các thuật toán dựa trên máy học hiếm khi chính xác 100%. Chúng ta chưa ở giai đoạn mà Robocop lái mô tô của mình với tốc độ 100 dặm / giờ có thể theo dõi tội phạm bằng cách sử dụng camera CCTV chất lượng thấp….

Mã lệnh sẽ tìm kiếm khuôn mặt theo từng khung hình, vì vậy nó sẽ tốn một lượng tài nguyên CPU.

Bước tiếp theo

Đến đây thì ta đã biết cách phát hiện khuôn mặt. Nhưng điều gì sẽ xảy ra nếu ta muốn phát hiện những đối tượng như ô tô, TV hoặc đồ chơi yêu thích của bạn?

OpenCV cho phép bạn tạo các tầng của riêng mình, nhưng quá trình này không được ghi chép đầy đủ. Đây là một bài đăng trên blog hướng dẫn bạn cách huấn luyện tầng (cascade) của riêng bạn để phát hiện một quả chuối.

Nếu bạn muốn tiến thêm một bước nữa và nhận dạng từng khuôn mặt - có lẽ để phát hiện và nhận ra khuôn mặt của bạn giữa nhiều người lạ - thì nhiệm vụ này sẽ khó hơn khá nhiều. Điều này chủ yếu là do lượng lớn xử lý trước hình ảnh liên quan. Nhưng nếu bạn sẵn sàng vượt qua thử thách, bạn hoàn toàn có thể thực hiện được bằng cách sử dụng các thuật toán học máy như được mô tả ở đây.

» Tiếp: Phân đoạn hình ảnh bằng không gian màu trong OpenCV + Python
« Trước: Nhận diện khuôn mặt theo cách truyền thống với Python
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!