HAAR CASCADE LÀ GÌ

  -  

Giới thiệu về cách phát hiện khuôn mặt trong hình ảnh và video bằng Python OpenCV

Gần đây tôi đang khám phá mô-đun phát hiện đối tượng Haar Cascade của OpenCV cho một dự án phụ cá nhân. Mặc dù có rất nhiều tài liệu kỹ thuật trên internet về lĩnh vực này, nhưng trọng tâm của tôi trong bài viết này là giải thích các khái niệm dễ hiểu. Tôi hy vọng điều này sẽ giúp những người mới bắt đầu hiểu thư viện OpenCV của Python một cách đơn giản.

Bạn đang xem: Haar cascade là gì

Trong bản demo này, chúng tôi sẽ lấy một hình ảnh và tìm kiếm các khuôn mặt người trong đó. Chúng tôi sẽ sử dụng bộ phân loại được đào tạo trước để thực hiện tìm kiếm này. Tôi dự định chia sẻ thêm một số bài viết về cách chúng ta có thể đào tạo người mẫu của chính mình trong tương lai. Nhưng bây giờ, hãy bắt đầu sử dụng một mô hình được đào tạo trước.

Đối với những người chưa bắt đầu, OpenCV là một thư viện Python chủ yếu được sử dụng trong các vấn đề về thị giác máy tính khác nhau.

Ở đây, chúng tôi đang sử dụng “ haarcascade_frontalface_default.xml làm mô hình của chúng tôi từ kho lưu trữ github opencv . Bạn có thể tải xuống tệp xml này và đặt nó vào cùng đường dẫn với tệp python của bạn. Ngoài ra còn có một loạt các mô hình khác ở đây mà bạn có thể muốn thử sau (Ví dụ: - phát hiện mắt, phát hiện toàn bộ cơ thể, phát hiện khuôn mặt mèo, v.v.)

Chúng ta hãy xem xét luồng cấp cao của chương trình trước khi chuyển sang mã.


*
Sơ đồ toàn bộ quy trình được mô tả bên dưới <Đầu vào, Quy trình nhận diện khuôn mặt & Đầu ra>
Đầu vào:

Thuật toán yêu cầu hai đầu vào:

Ma trận hình ảnh đầu vào (chúng tôi sẽ đọc hình ảnh và chuyển đổi nó thành ma trận số / mảng numpy)Các đặc điểm khuôn mặt (có trong tệp haarcascade_frontalface_default.xml )

Bộ phân loại Haar Cascade của OpenCV hoạt động trên phương pháp tiếp cận cửa sổ trượt . Trong phương pháp này, một cửa sổ (kích thước mặc định 20 x 20 pixel) được trượt trên hình ảnh (từng hàng) để tìm các đặc điểm trên khuôn mặt. Sau mỗi lần lặp, hình ảnh được thu nhỏ (thay đổi kích thước) theo một yếu tố nhất định (được xác định bởi tham số " scaleFactor "). Kết quả đầu ra của mỗi lần lặp được lưu trữ và thao tác trượt được lặp lại trên hình ảnh nhỏ hơn, đã thay đổi kích thước. Có thể có kết quả dương tính giả trong các lần lặp đầu tiên sẽ được thảo luận chi tiết hơn ở phần sau của bài viết này. Quá trình thu nhỏ và mở rộng cửa sổ này tiếp tục cho đến khi hình ảnh quá nhỏ so với cửa sổ trượt. Giá trị của scaleFactor càng nhỏ thì độ chính xác càng lớn và chi phí tính toán càng cao.

Đầu ra:

Hình ảnh đầu ra của chúng tôi sẽ chứa một hình chữ nhật xung quanh mỗi khuôn mặt được phát hiện.

Mã & Giải thích:

Hãy bắt đầu với mã python. Chúng tôi sẽ yêu cầu các gói Python sau cho thử nghiệm này:

pip install numpypip install opencv-python

# File Name: face_detector.py# Import the OpenCV libraryimport cv2Chúng tôi chuẩn bị 2 đầu vào < hình ảnh đầu vàođặc điểm khuôn mặt xml > được hiển thị trong sơ đồ dòng ở trên trong phần dưới đây.

Tôi đang sử dụng bức ảnh tuyệt đẹp này của Bess Hamiti (liên kết bên dưới) làm hình ảnh đầu vào của tôi (kids.jpg).


*
Ảnh của Bess Hamiti từ Pexels

1Chúng tôi bắt đầu bằng cách tải trình phân loại xml và tệp hình ảnh đầu vào. Vì tệp đầu vào khá lớn, tôi đã thay đổi kích thước với kích thước xấp xỉ tương tự như độ phân giải gốc để chúng không bị kéo giãn. Sau đó, tôi đã chuyển đổi hình ảnh thành một hình ảnh tỷ lệ xám. Hình ảnh thang màu xám được cho là sẽ cải thiện hiệu quả của thuật toán.

Xem thêm: Đồng Nghĩa Của Ruined Là Gì Trong Tiếng Việt? Nghĩa Của Từ Ruin Trong Tiếng Việt

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")image = cv2.imread("kids.jpg")image = cv2.resize(image, (800,533))gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

print(type(gray_image))Các detectMultiScale phương pháp là một trong đó sẽ thực hiện việc phát hiện cho chúng ta. Nó có các tham số sau:

scaleFactor: Tham số này chỉ định yếu tố mà hình ảnh được thu nhỏ, ví dụ: - nếu giá trị này là 1,05, thì hình ảnh được thu nhỏ 5%. Nếu giá trị này là 1,10, thì hình ảnh được thu nhỏ 10%. ScaleFactor 1,10 sẽ yêu cầu tính toán ít hơn so với scaleFactor 1,05.

minNeighbors: Là giá trị ngưỡng chỉ định số lượng hàng xóm của mỗi hình chữ nhật để nó được đánh dấu là dương thực sự. Nói cách khác, giả sử rằng mỗi lần lặp lại đánh dấu các hình chữ nhật nhất định (tức là phân loại một phần của hình ảnh như một khuôn mặt). Bây giờ, nếu các lần lặp tiếp theo cũng đánh dấu các khu vực tương tự là một số dương, nó sẽ làm tăng khả năng khu vực hình chữ nhật đó là một số dương thực sự. Nếu một khu vực nhất định được xác định là một khuôn mặt trong một lần lặp, nhưng không phải trong bất kỳ lần lặp nào khác, chúng được đánh dấu là dương tính giả. Nói cách khác, minNeighbors là số lần tối thiểu một vùng phải được xác định như một khuôn mặt.

Hãy thực hiện một thử nghiệm để hiểu rõ hơn. Chúng tôi sẽ chạy mã của mình với các giá trị khác nhau cho tham số minNeighbors.

Đối với minNeighbors = 0,

Tất cả các hình chữ nhật đang được phát hiện là khuôn mặt. Đối với một số hình chữ nhật, có rất nhiều hình chữ nhật chồng lên nhau, điều này cho thấy rằng những hình chữ nhật đó đã được phát hiện là dương tính trong nhiều lần lặp lại. Chúng tôi đặt ngưỡng để tăng độ chính xác của thuật toán.


*
Tích cực với minNeighbors = 0 <Ảnh của Bess Hamiti từ Pexels>

minNeighbors = 2

Với minNeighbors = 2, hầu hết các hình chữ nhật chồng lên nhau không còn nữa. Tuy nhiên, chúng tôi vẫn có một vài sai lầm.


*
Tích cực với minNeighbors = 2 <Ảnh của Bess Hamiti từ Pexels>

Nếu chúng tôi tăng ngưỡng này lên 4 hoặc 5, chúng tôi có thể thấy rằng không có bất kỳ trường hợp dương tính giả nào nữa. Hãy đặt giá trị này thành 5 và tiếp tục.

faces=face_cascade.detectMultiScale(gray_image,scaleFactor=1.10,minNeighbors=5)x, y - vị trí của góc trên cùng bên trái của hình chữ nhật

w, h - chiều rộng và chiều cao của hình chữ nhật

Bây giờ chúng ta vẽ một hình chữ nhật với các kích thước này bằng màu xanh lá cây (0, 255, 0) (mã màu BGR) với độ dày đường viền = 1.

Xem thêm: Ancillary Là Gì - Ancillary Có Nghĩa Là Gì

Cửa sổ đợi trong 2 giây (2000 mili giây) và tự động đóng lại.

for x,y,w,h in faces: image=cv2.rectangle(image, (x,y), (x+w, y+h), (0, 255, 0),1) cv2.imshow("Face Detector", image) k=cv2.waitKey(2000)cv2.destroyAllWindows()

cv2.imwrite("kids_face_detected.jpeg", image)

*
Khẳng định sai với minNeighbors = 5 <Ảnh của Bess Hamiti từ Pexels>
Tôi hy vọng bài viết này giúp bạn hiểu cơ bản về cách thực hiện nhận diện khuôn mặt bằng OpenCV trong python. Chúng tôi cũng có thể mở rộng mã này để theo dõi khuôn mặt trong video. Tôi đã tải lên mã đầy đủ được thảo luận ở trên và để theo dõi khuôn mặt trong video webcam trực tiếp trong kho lưu trữ GitHub của tôi tại đây , trong trường hợp bạn quan tâm. Có một ngày tuyệt vời ở phía trước!

Xây dựng bàn phím / chuột điều khiển bằng giọng nói trong 5 phút mạng thần kinh cho người mới bắt đầu

<1> Bộ phân loại tầng, https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html

<2> Chỉ định GPU 5KK73, https://sites.google.com/site/5kk73gpu2012/assignment/viola-jones-face-detection

<3> Trang OpenCV Github, https://github.com/opencv/opencv/tree/master/data/haarcascades