Mục lục:

Nhận dạng khuôn mặt trong thời gian thực: một dự án từ đầu đến cuối: 8 bước (có hình ảnh)
Nhận dạng khuôn mặt trong thời gian thực: một dự án từ đầu đến cuối: 8 bước (có hình ảnh)

Video: Nhận dạng khuôn mặt trong thời gian thực: một dự án từ đầu đến cuối: 8 bước (có hình ảnh)

Video: Nhận dạng khuôn mặt trong thời gian thực: một dự án từ đầu đến cuối: 8 bước (có hình ảnh)
Video: Bài 8.2: Nhận dạng khuôn mặt Part 2 - Nhận dạng qua webcam, video - face detection python 2024, Tháng bảy
Anonim
Nhận dạng khuôn mặt thời gian thực: một dự án từ đầu đến cuối
Nhận dạng khuôn mặt thời gian thực: một dự án từ đầu đến cuối

Trong hướng dẫn cuối cùng khám phá OpenCV, chúng ta đã học cách THEO DÕI ĐỐI TƯỢNG TẦM NHÌN TỰ ĐỘNG. Bây giờ chúng tôi sẽ sử dụng PiCam của mình để nhận dạng khuôn mặt trong thời gian thực, như bạn có thể thấy bên dưới:

Hình ảnh
Hình ảnh

Dự án này được thực hiện với "Thư viện Thị giác Máy tính Nguồn Mở" tuyệt vời này, OpenCV. Trong hướng dẫn này, chúng tôi sẽ tập trung vào Raspberry Pi (vì vậy, Raspbian làm hệ điều hành) và Python, nhưng tôi cũng đã thử nghiệm mã trên máy Mac của tôi và nó cũng hoạt động tốt. OpenCV được thiết kế cho hiệu quả tính toán và tập trung mạnh vào các ứng dụng thời gian thực. Vì vậy, nó hoàn hảo để nhận dạng khuôn mặt thời gian thực bằng máy ảnh.

Để tạo một dự án hoàn chỉnh về Nhận dạng khuôn mặt, chúng tôi phải làm việc trên 3 giai đoạn rất riêng biệt:

  1. Nhận diện khuôn mặt và thu thập dữ liệu
  2. Huấn luyện công cụ nhận dạng
  3. Nhận dạng khuôn mặt

Sơ đồ khối dưới đây tiếp tục các giai đoạn đó:

Hình ảnh
Hình ảnh

Bước 1: Hội đồng quản trị - Hóa đơn nguyên vật liệu

Phần chính:

  1. Raspberry Pi V3 - US $ 32,00
  2. 5 Megapixel 1080p Sensor 1080p Mô-đun video máy ảnh mini OV5647 - US $ 13,00

Bước 2: Cài đặt Gói OpenCV 3

Cài đặt gói OpenCV 3
Cài đặt gói OpenCV 3

Tôi đang sử dụng Raspberry Pi V3 được cập nhật lên phiên bản mới nhất của Raspbian (Stretch), vì vậy cách tốt nhất để cài đặt OpenCV là làm theo hướng dẫn tuyệt vời do Adrian Rosebrock phát triển: Raspbian Stretch: Cài đặt OpenCV 3 + Python trên Raspberry Pi của bạn.

Tôi đã thử một số hướng dẫn khác nhau để cài đặt OpenCV trên Pi của mình. Hướng dẫn của Adrian là tốt nhất. Tôi khuyên bạn nên làm như vậy, làm theo hướng dẫn của anh ấy từng bước một.

Sau khi hoàn thành hướng dẫn của Adrian, bạn sẽ có một môi trường ảo OpenCV sẵn sàng để chạy các thử nghiệm của chúng tôi trên Pi của bạn.

Hãy vào môi trường ảo của chúng tôi và xác nhận rằng OpenCV 3 đã được cài đặt chính xác.

Adrian khuyên bạn nên chạy lệnh "nguồn" mỗi khi bạn mở một thiết bị đầu cuối mới để đảm bảo các biến hệ thống của bạn đã được thiết lập chính xác.

nguồn ~ /.profile

Tiếp theo, hãy nhập vào môi trường ảo của chúng tôi:

workon cv

Nếu bạn thấy văn bản (cv) trước lời nhắc của mình, thì bạn đang ở trong môi trường ảo cv:

(cv) pi @ raspberry: ~ $Adrian lưu ý rằng môi trường ảo cv Python hoàn toàn độc lập và được tách biệt khỏi phiên bản Python mặc định có trong bản tải xuống Raspbian Stretch. Vì vậy, bất kỳ gói Python nào trong thư mục gói trang web toàn cầu sẽ không có sẵn cho môi trường ảo cv. Tương tự, bất kỳ gói Python nào được cài đặt trong gói site của cv sẽ không có sẵn cho cài đặt toàn cầu của Python

Bây giờ, hãy nhập trình thông dịch Python của bạn:

con trăn

và xác nhận rằng bạn đang chạy phiên bản 3.5 (hoặc cao hơn)

Bên trong trình thông dịch (">>>" sẽ xuất hiện), nhập thư viện OpenCV:

nhập cv2

Nếu không có thông báo lỗi nào xuất hiện, OpenCV đã được cài đặt chính xác TRÊN MÔI TRƯỜNG VIRTUAL PYTHON CỦA BẠN.

Bạn cũng có thể kiểm tra phiên bản OpenCV đã cài đặt:

cv2._ phiên bản_

3.3.0 sẽ xuất hiện (hoặc một phiên bản cao cấp hơn có thể được phát hành trong tương lai). Terminal PrintScreen ở trên hiển thị các bước trước đó.

Bước 3: Kiểm tra máy ảnh của bạn

Kiểm tra máy ảnh của bạn
Kiểm tra máy ảnh của bạn

Sau khi bạn đã cài đặt OpenCV trong RPi của mình, hãy kiểm tra để xác nhận rằng máy ảnh của bạn đang hoạt động bình thường.

Tôi giả định rằng bạn đã cài đặt PiCam trên Raspberry Pi của mình.

Nhập mã Python bên dưới vào IDE của bạn:

nhập numpy dưới dạng np

import cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while (True): ret, frame = cap.read () frame = cv2. lật (khung, -1) # Lật máy ảnh theo chiều dọc màu xám = cv2.cvtColor (khung, cv2. COLOR_BGR2GRAY) cv2.imshow ('khung', khung) cv2.imshow ('xám', xám) k = cv2.waitKey (30) & 0xff if k == 27: # nhấn 'ESC' để thoát break cap.release () cv2.destroyAllWindows ()

Đoạn mã trên sẽ ghi lại luồng video sẽ được tạo bởi PiCam của bạn, hiển thị cả hai, ở màu BGR và chế độ Xám.

Lưu ý rằng tôi đã xoay máy ảnh của mình theo chiều dọc do cách lắp ráp máy ảnh. Nếu đó không phải là trường hợp của bạn, hãy bình luận hoặc xóa dòng lệnh "lật".

Ngoài ra, bạn có thể tải xuống mã từ GitHub của tôi: simpleCamTest.py

Để thực thi, hãy nhập lệnh:

python simpleCamTest.py

Để kết thúc chương trình, bạn phải nhấn phím [ESC] trên bàn phím.

Nhấp chuột vào cửa sổ video, trước khi nhấn [ESC]

Hình trên cho thấy kết quả.

Một số nhà sản xuất đã tìm thấy sự cố khi cố gắng mở máy ảnh (thông báo lỗi "Xác nhận không thành công"). Điều đó có thể xảy ra nếu máy ảnh không được bật trong khi cài đặt OpenCv và do đó, trình điều khiển máy ảnh không cài đặt đúng cách. Để sửa, hãy sử dụng lệnh:

sudo modprobe bcm2835-v4l2

Bạn cũng có thể thêm bcm2835-v4l2 vào dòng cuối cùng của tệp / etc / modules để trình điều khiển tải khi khởi động.

Để biết thêm về OpenCV, bạn có thể làm theo hướng dẫn: loading -video-python-opencv-tutorial

Bước 4: Nhận diện khuôn mặt

Phát hiện khuôn mặt
Phát hiện khuôn mặt
Phát hiện khuôn mặt
Phát hiện khuôn mặt

Tất nhiên, tác vụ cơ bản nhất trên Nhận diện khuôn mặt là "Nhận diện khuôn mặt". Trước bất cứ điều gì, bạn phải "chụp" một khuôn mặt (Giai đoạn 1) để nhận ra nó, khi so sánh với một khuôn mặt mới được chụp trong tương lai (Giai đoạn 3).

Cách phổ biến nhất để phát hiện một khuôn mặt (hoặc bất kỳ đối tượng nào), là sử dụng "Bộ phân loại Haar Cascade"

Phát hiện đối tượng bằng cách sử dụng bộ phân loại tầng dựa trên tính năng Haar là một phương pháp phát hiện đối tượng hiệu quả được đề xuất bởi Paul Viola và Michael Jones trong bài báo của họ, "Phát hiện đối tượng nhanh chóng bằng cách sử dụng tầng tăng cường các tính năng đơn giản" vào năm 2001. Đây là một phương pháp tiếp cận dựa trên máy học, trong đó a chức năng cascade được đào tạo từ rất nhiều hình ảnh tích cực và tiêu cực. Sau đó, nó được sử dụng để phát hiện các đối tượng trong các hình ảnh khác.

Ở đây chúng ta sẽ làm việc với tính năng nhận diện khuôn mặt. Ban đầu, thuật toán cần rất nhiều ảnh dương (ảnh có khuôn mặt) và ảnh âm (ảnh không có khuôn mặt) để huấn luyện bộ phân loại. Sau đó, chúng ta cần trích xuất các tính năng từ nó. Tin tốt là OpenCV đi kèm với một trình đào tạo cũng như một máy dò. Nếu bạn muốn đào tạo bộ phân loại của riêng mình cho bất kỳ đối tượng nào như ô tô, máy bay, v.v., bạn có thể sử dụng OpenCV để tạo một bộ phân loại. Chi tiết đầy đủ của nó được cung cấp tại đây: Đào tạo Cascade Classifier.

Nếu bạn không muốn tạo bộ phân loại của riêng mình, OpenCV đã chứa nhiều bộ phân loại được đào tạo trước cho khuôn mặt, mắt, nụ cười, v.v. Bạn có thể tải xuống các tệp XML đó từ thư mục haarcascades.

Lý thuyết đủ rồi, hãy cùng OpenCV tạo ra một máy dò tìm khuôn mặt!

Tải xuống tệp: faceDetection.py từ GitHub của tôi.

nhập numpy dưới dạng np

import cv2 faceCascade = cv2. CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while True: ret, img = cap.read () img = cv2.flip (img, -1) gray = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) face = faceCascade.detectMultiScale (xám, scaleFactor = 1.2, minNeighbors = 5, minSize = (20, 20)) cho (x, y, w, h) trong các khuôn mặt: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w] cv2.imshow ('video', img) k = cv2.waitKey (30) & 0xff if k == 27: # nhấn 'ESC' để thoát break cap.release () cv2.destroyAllWindows ()

Tin hay không thì tùy, vài dòng mã ở trên là tất cả những gì bạn cần để phát hiện khuôn mặt, sử dụng Python và OpenCV.

Khi bạn so sánh với mã cuối cùng được sử dụng để kiểm tra máy ảnh, bạn sẽ nhận ra rằng một số bộ phận đã được thêm vào đó. Lưu ý dòng bên dưới:

faceCascade = cv2. CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml')

Đây là dòng tải "trình phân loại" (phải nằm trong thư mục có tên "Cascades /", trong thư mục dự án của bạn).

Sau đó, chúng tôi sẽ đặt máy ảnh của mình và bên trong vòng lặp, tải video đầu vào của chúng tôi ở chế độ thang độ xám (giống như chúng tôi đã thấy trước đây).

Bây giờ chúng ta phải gọi hàm phân loại của mình, chuyển cho nó một số tham số rất quan trọng, như hệ số tỷ lệ, số lượng lân cận và kích thước tối thiểu của khuôn mặt được phát hiện.

face = faceCascade.detectMultiScale (màu xám, scaleFactor = 1,2, minNeighbors = 5, minSize = (20, 20))

Ở đâu,

  • màu xám là hình ảnh thang độ xám đầu vào.
  • scaleFactor là tham số chỉ định mức độ giảm kích thước hình ảnh ở mỗi tỷ lệ hình ảnh. Nó được sử dụng để tạo ra kim tự tháp quy mô.
  • minNeighbors là một tham số chỉ định số lượng hàng xóm mà mỗi hình chữ nhật ứng viên phải có, để giữ lại nó. Số cao hơn cho kết quả dương tính giả thấp hơn.
  • minSize là kích thước hình chữ nhật tối thiểu được coi là một mặt.

Chức năng sẽ nhận diện khuôn mặt trên ảnh. Tiếp theo, chúng ta phải "đánh dấu" các khuôn mặt trong hình ảnh, ví dụ, sử dụng một hình chữ nhật màu xanh lam. Điều này được thực hiện với phần này của mã:

for (x, y, w, h) in the face:

cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w]

Nếu các khuôn mặt được tìm thấy, nó sẽ trả về vị trí của các khuôn mặt được phát hiện dưới dạng hình chữ nhật với góc lên bên trái (x, y) và có "w" là Chiều rộng và "h" là Chiều cao của nó ==> (x, y, w, NS). Vui lòng xem hình trên.

Khi chúng ta có được những vị trí này, chúng ta có thể tạo một "ROI" (hình chữ nhật được vẽ) cho khuôn mặt và trình bày kết quả với hàm imshow ().

Chạy Tập lệnh python ở trên trên môi trường python của bạn, sử dụng Rpi Terminal:

python faceDetection.py

Kết quả:

Hình ảnh
Hình ảnh

Bạn cũng có thể bao gồm các bộ phân loại cho "phát hiện mắt" hoặc thậm chí "phát hiện nụ cười". Trong những trường hợp đó, bạn sẽ bao gồm chức năng phân loại và vẽ hình chữ nhật bên trong vòng lặp khuôn mặt, vì sẽ không có ý nghĩa gì khi phát hiện một ánh mắt hoặc nụ cười bên ngoài khuôn mặt.

Lưu ý rằng trên Pi, có nhiều bộ phân loại cùng một mã sẽ làm chậm quá trình xử lý, một khi phương pháp phát hiện này (HaarCascades) sử dụng một lượng lớn sức mạnh tính toán. Trên máy tính để bàn, việc chạy nó dễ dàng hơn.

Trên GitHub của tôi, bạn sẽ tìm thấy các ví dụ khác:

faceEyeDetection.py

faceSmileDetection.py

faceSmileEyeDetection.py

Và trong hình trên, bạn có thể thấy kết quả.

Bạn cũng có thể làm theo hướng dẫn dưới đây để hiểu rõ hơn về tính năng Nhận diện khuôn mặt:

Haar Cascade Phát hiện đối tượng bằng khuôn mặt và mắt Hướng dẫn sử dụng Python OpenCV

Bước 5: Thu thập dữ liệu

Thu thập dữ liệu
Thu thập dữ liệu
Thu thập dữ liệu
Thu thập dữ liệu

Trước hết, tôi phải cảm ơn Ramiz Raja vì công trình tuyệt vời của anh ấy về Nhận dạng khuôn mặt trên ảnh:

NHẬN BIẾT KHUÔN MẶT SỬ DỤNG OPENCV VÀ PYTHON: HƯỚNG DẪN BẮT ĐẦU

và cả Anirban Kar, đã phát triển một hướng dẫn rất toàn diện bằng video:

NHẬN DIỆN MẶT - 3 phần

Tôi thực sự khuyên bạn nên xem cả hai hướng dẫn.

Nói vậy, chúng ta hãy bắt đầu giai đoạn đầu tiên của dự án của chúng ta. Những gì chúng ta sẽ làm ở đây, bắt đầu từ bước cuối cùng (Nhận diện khuôn mặt), chúng ta sẽ chỉ cần tạo một tập dữ liệu, nơi chúng ta sẽ lưu trữ cho mỗi id, một nhóm ảnh màu xám với phần được sử dụng để phát hiện khuôn mặt.

Đầu tiên, hãy tạo một thư mục nơi bạn phát triển dự án của mình, ví dụ: FacialRecognitionProject:

mkdir FacialRecognitionProject

Trong thư mục này, bên cạnh 3 tập lệnh python mà chúng tôi sẽ tạo cho dự án của mình, chúng tôi phải lưu trên đó Trình phân loại khuôn mặt. Bạn có thể tải xuống từ GitHub của tôi: haarcascade_frontalface_default.xml

Tiếp theo, tạo một thư mục con, nơi chúng tôi sẽ lưu trữ các mẫu khuôn mặt của mình và đặt tên là "tập dữ liệu":

tập dữ liệu mkdir

Và tải xuống mã từ GitHub của tôi: 01_face_dataset.py

nhập cv2

import os cam = cv2. VideoCapture (0) cam.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Cho mỗi người, nhập một id khuôn mặt số face_id = input ('\ n nhập id người dùng end nhấn ==>') print ("\ n [INFO] Đang bắt đầu chụp khuôn mặt. Nhìn vào máy ảnh và đợi…") # Khởi tạo đếm khuôn mặt lấy mẫu riêng lẻ = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # lật hình ảnh video theo chiều dọc màu xám = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) face = face_detector.detectMultiScale (màu xám, 1,3, 5) cho (x, y, w, h) trong các khuôn mặt: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) count + = 1 # Lưu hình ảnh đã chụp vào thư mục tập dữ liệu cv2.imwrite ("tập dữ liệu / Người dùng." + str (face_id) + '.' + str (count) + ".jpg", gray [y: y + h, x: x + w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Nhấn 'ESC' để thoát video nếu k == 27: break elif count> = 30: # Lấy mẫu 30 khuôn mặt và dừng ngắt video # Làm ab nó của bản in dọn dẹp ("\ n [INFO] Đang thoát chương trình và nội dung dọn dẹp") cam.release () cv2.destroyAllWindows ()

Mã này rất giống với mã mà chúng ta đã thấy để nhận diện khuôn mặt. Những gì chúng tôi đã thêm, là một "lệnh đầu vào" để nắm bắt một id người dùng, đó phải là một số nguyên (1, 2, 3, v.v.)

face_id = input ('\ n nhập id người dùng kết thúc nhấn ==>')

Và đối với mỗi một trong các khung đã chụp, chúng ta nên lưu nó dưới dạng tệp trên thư mục "tập dữ liệu":

cv2.imwrite ("dataset / User." + str (face_id) + '.' + str (count) + ".jpg", gray [y: y + h, x: x + w])

Lưu ý rằng để lưu tệp trên, bạn phải nhập thư viện "os". Tên của mỗi tệp sẽ tuân theo cấu trúc:

User.face_id.count.jpg

Ví dụ: đối với người dùng có face_id = 1, tệp mẫu thứ 4 trên tập dữ liệu / thư mục sẽ giống như sau:

Người dùng.1.4.jpg

như thể hiện trong bức ảnh trên từ Pi của tôi. Trên mã của tôi, tôi đang chụp 30 mẫu từ mỗi id. Bạn có thể thay đổi nó trên "elif" cuối cùng. Số lượng mẫu được sử dụng để phá vỡ vòng lặp nơi các mẫu mặt được bắt.

Chạy tập lệnh Python và chụp một vài id. Bạn phải chạy tập lệnh mỗi khi bạn muốn tổng hợp một người dùng mới (hoặc để thay đổi ảnh cho một người đã tồn tại).

Bước 6: Huấn luyện viên

Huấn luyện viên
Huấn luyện viên

Trong giai đoạn thứ hai này, chúng tôi phải lấy tất cả dữ liệu người dùng từ tập dữ liệu của mình và "đào tạo" OpenCV Recognizer. Điều này được thực hiện trực tiếp bởi một hàm OpenCV cụ thể. Kết quả sẽ là một tệp.yml sẽ được lưu trên thư mục "trainer /".

Vì vậy, hãy bắt đầu tạo một thư mục con nơi chúng ta sẽ lưu trữ dữ liệu đã đào tạo:

huấn luyện viên mkdir

Tải xuống từ GitHub của tôi tập lệnh python thứ hai: 02_face_training.py

nhập cv2

import numpy as np from PIL import Image import os # Path for face image database path = 'dataset' Recogzer = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # hàm lấy hình ảnh và dữ liệu nhãn def getImagesAndLabels (path): imagePaths = [os.path.join (path, f) for f in os.listdir (path)] faceSamples = ids = for imagePath trong imagePaths: PIL_img = Image.open (imagePath).convert ('L') # chuyển nó thành thang độ xám img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [- 1]. split (".") [1]) face = detector.detectMultiScale (img_numpy) cho (x, y, w, h) trong các khuôn mặt: faceSamples.append (img_numpy [y: y + h, x: x + w]) ids.append (id) return faceSamples, id print ("\ n [INFO] Đào tạo các khuôn mặt. Sẽ mất vài giây. Chờ …") khuôn mặt, ids = getImagesAndLabels (đường dẫn) Recogzer.train (khuôn mặt, np.array (id)) # Lưu mô hình vào trainer / trainingr.yml Recogzer.write ('trainer / trainr.yml') # Recogzer.save () hoạt động trên Mac, nhưng không hoạt động trên Pi # In số khuôn mặt được đào tạo và in kết thúc chương trình ("\ n [INFO] {0} khuôn mặt được huấn luyện. Đang thoát chương trình".format (len (np.unique (ids))))

Xác nhận xem bạn đã cài đặt thư viện PIL trên Rpi của mình chưa. Nếu không, hãy chạy lệnh dưới đây trong Terminal:

pip cài đặt gối

Chúng tôi sẽ sử dụng làm công cụ nhận dạng, Bộ nhận dạng khuôn mặt LBPH (ĐỊA PHƯƠNG BINARY PATTERNS HISTOGRAMS), được bao gồm trong gói OpenCV. Chúng tôi làm điều này trong dòng sau:

Recogzer = cv2.face. LBPHFaceRecognizer_create ()

Hàm "getImagesAndLabels (path)", sẽ lấy tất cả ảnh trên thư mục: "dataset /", trả về 2 mảng: "Id" và "mặt". Với các mảng đó làm đầu vào, chúng tôi sẽ "đào tạo trình nhận dạng của mình":

Recogzer.train (khuôn mặt, id)

Do đó, một tệp có tên "trainr.yml" sẽ được lưu trong thư mục giảng viên đã được chúng tôi tạo trước đó.

Đó là nó! Tôi đã bao gồm báo cáo in cuối cùng nơi tôi hiển thị để xác nhận, số khuôn mặt Người dùng mà chúng tôi đã đào tạo.

Mỗi khi bạn thực hiện Giai đoạn 1, Giai đoạn 2 cũng phải được chạy

Bước 7: Bộ nhận dạng

Nhận dạng
Nhận dạng
Nhận dạng
Nhận dạng

Bây giờ, chúng tôi đã đến giai đoạn cuối cùng của dự án. Tại đây, chúng tôi sẽ chụp một khuôn mặt tươi trên máy ảnh của mình và nếu người này đã được chụp và đào tạo khuôn mặt trước đó, trình nhận dạng của chúng tôi sẽ đưa ra "dự đoán" trả về id và chỉ số của người đó, cho thấy mức độ tin cậy của người nhận với trận đấu này.

Hãy tải xuống tập lệnh python giai đoạn 3 từ GitHub: 03_face_recognition.py của tôi.

nhập cv2

import numpy as np import os Recogzer = cv2.face. LBPHFaceRecognizer_create () Recogzer.read ('trainer / trainr.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2. CascadeClassifier (cascadePath); font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # tên liên quan đến id: example ==> Marcelo: id = 1, etc names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z ',' W '] # Khởi tạo và bắt đầu quay video thời gian thực cam = cv2. VideoCapture (0) cam.set (3, 640) # set video widht cam.set (4, 480) # set video height # Xác định kích thước cửa sổ tối thiểu được nhận dạng là một khuôn mặt minW = 0,1 * cam.get (3) minH = 0,1 * cam.get (4) trong khi True: ret, img = cam.read () img = cv2.flip (img, -1) # Lật theo chiều dọc màu xám = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) face = faceCascade.detectMultiScale (xám, scaleFactor = 1.2, minNeighbors = 5, minSize = (int (minW), int (minH)),) for (x, y, w, h) trong các khuôn mặt: cv2.rectangle (img, (x, y), (x + w, y + h), (0, 255, 0), 2) id, trust = Recogzer.p Dự đoán (xám [y: y + h, x: x + w]) # Kiểm tra xem độ tin cậy thấp hơn 100 ==> "0" có khớp hoàn hảo không nếu (độ tin cậy <100): id = names [id] trust = "{0}% ".format (round (100 - trust)) else: id = "nown" trust = "{0}%". format (round (100 - conf idence)) cv2.putText (img, str (id), (x + 5, y-5), font, 1, (255, 255, 255), 2) cv2.putText (img, str (trust), (x + 5, y + h-5), phông chữ, 1, (255, 255, 0), 1) cv2.imshow ('camera', img) k = cv2.waitKey (10) & 0xff # Nhấn 'ESC' để thoát video nếu k == 27: break # Thực hiện một chút bản in dọn dẹp ("\ n [INFO] Thoát chương trình và nội dung dọn dẹp") cam.release () cv2.destroyAllWindows ()

Chúng tôi đang đưa vào đây một mảng mới, vì vậy chúng tôi sẽ hiển thị "tên", thay vì id được đánh số:

names = ['Không có', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

Vì vậy, ví dụ: Marcelo sẽ là người dùng với id = 1; Paula: id = 2, v.v.

Tiếp theo, chúng tôi sẽ phát hiện một khuôn mặt, giống như chúng tôi đã làm trước đây với bộ phân loại haasCascade. Có một khuôn mặt được phát hiện, chúng ta có thể gọi hàm quan trọng nhất trong đoạn mã trên:

id, trust = Recogzer.p Dự đoán (phần màu xám của khuôn mặt)

Nhận dạng.p Dự đoán (), sẽ lấy làm tham số là một phần được chụp của khuôn mặt sẽ được phân tích và sẽ trả về chủ sở hữu có thể xảy ra của nó, cho biết id của nó và mức độ tin cậy của trình nhận dạng liên quan đến trận đấu này.

Lưu ý rằng chỉ số tin cậy sẽ trả về "không" nếu nó được tính là một kết quả phù hợp hoàn hảo

Và cuối cùng, nếu trình nhận dạng có thể dự đoán một khuôn mặt, chúng tôi đặt một văn bản lên hình ảnh với id có thể xảy ra và "xác suất" tính bằng% là kết quả khớp đúng là bao nhiêu ("xác suất" = 100 - chỉ số tin cậy). Nếu không, một cái mác "chưa biết" sẽ được dán lên mặt.

Dưới đây là một-g.webp

Hình ảnh
Hình ảnh

Trên hình trên, tôi hiển thị một số thử nghiệm được thực hiện với dự án này, nơi tôi cũng đã sử dụng ảnh để xác minh xem trình nhận dạng có hoạt động hay không.

Bước 8: Kết luận

Phần kết luận
Phần kết luận

Như mọi khi, tôi hy vọng dự án này có thể giúp những người khác tìm đường vào thế giới điện tử đầy thú vị!

Để biết chi tiết và mã cuối cùng, vui lòng truy cập kho lưu ký GitHub của tôi: OpenCV-Face-Recognition

Để biết thêm các dự án khác, vui lòng truy cập blog của tôi: MJRoBot.org

Dưới đây là một cái nhìn sơ lược về hướng dẫn trong tương lai, nơi chúng ta sẽ khám phá "tính năng theo dõi khuôn mặt tự động và các phương pháp khác để nhận diện khuôn mặt":

Hình ảnh
Hình ảnh

Saludos từ phía nam của thế giới!

Hẹn gặp bạn trong hướng dẫn tiếp theo của tôi!

Cảm ơn bạn, Marcelo

Đề xuất: