Làm thế nào để trăn phát hiện khuôn mặt của con người?

Trong hướng dẫn khám phá OpenCV của tôi, chúng tôi đã học 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

Dự án này đã được thực hiện với “Thư viện thị giác máy tính mã 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à hệ điều hành] và Python, nhưng tôi cũng đã thử mã trên máy Mac của mình và nó cũng hoạt động tốt

"Để chạy nó trên máy Mac, có một số thay đổi cần được thực hiện trên mã. Đừng lo lắng, tôi sẽ bình luận về nó "

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 theo thời gian thực bằng máy ảnh

3 giai đoạn

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

  • Nhận diện khuôn mặt và thu thập dữ liệu
  • Huấn luyện người nhận dạng
  • Nhận dạng khuôn mặt

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

2. 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 Raspbian [Stretch] mới nhất, 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 căng. 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

Khi bạn đã 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 ta 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

source ~/.profile

Tiếp theo, hãy tham gia 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 cô lập 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 trang web của cv sẽ không có sẵn cho bản 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

python

và xác nhận rằng bạn đang chạy 3. 5 [hoặc cao hơn] phiên bản

Bên trong trình thông dịch [dấu “>>>” sẽ xuất hiện], nhập thư viện OpenCV

import cv2

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

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

cv2.__version__

3. 3. 0 sẽ xuất hiện [hoặc 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 đó

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

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

Tôi giả định rằng bạn đã cài đặt và bậ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

import numpy as 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.flip[frame, -1] # Flip camera vertically
gray = cv2.cvtColor[frame, cv2.COLOR_BGR2GRAY]

cv2.imshow['frame', frame]
cv2.imshow['gray', gray]

k = cv2.waitKey[30] & 0xff
if k == 27: # press 'ESC' to quit
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, ở chế độ Màu BGR và Màu 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 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. đơn giảnCamTest. py

Để thực thi tập lệnh, 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. Kích 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ố người gặp sự cố khi cố gắng mở máy ảnh và nhận được 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 quá trình cài đặt OpenCv và do đó, trình điều khiển máy ảnh không được cài đặt chính xác. Để sửa, sử dụng lệnh

________số 8

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. đang tải -video-python-opencv-tutorial

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

Tất nhiên, nhiệm 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 hết, bạn phải “chụp” một khuôn mặt [Giai đoạn 1] để nhận dạng khuôn mặt đó, khi so sánh với 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 khuôn mặt [hoặc bất kỳ đối tượng nào] là sử dụng “Haar Cascade classifier”

Phát hiện đối tượng bằng cách sử dụng các trình phân loại theo 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ả do Paul Viola và Michael Jones đề xuất trong bài báo của họ, “Phát hiện đối tượng nhanh bằng cách sử dụng một tầng các tính năng đơn giản được tăng cường” vào năm 2001. Đó là một cách tiếp cận dựa trên máy học, trong đó chức năng xếp tầng đượ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 nhận diện khuôn mặt. Ban đầu, thuật toán cần rất nhiều ảnh dương bản [ảnh có khuôn mặt] và ảnh âm bản [ả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 vui là OpenCV đi kèm với một trình huấn luyện cũng như một trình phát hiện. Nếu bạn muốn đào tạo trình 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. chi tiết đầy đủ của nó được đưa ra ở đây. Đào tạo phân loại theo tầng

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. Các tệp XML đó có thể được tải xuống từ thư mục haarcascades

Lý thuyết đủ rồi, cùng tạo bộ dò tìm khuôn mặt với OpenCV

Tải tập tin. phát hiện khuôn mặt. py từ GitHub của tôi

import numpy as 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]
faces = faceCascade.detectMultiScale[
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=[20, 20]
]
for [x,y,w,h] in faces:
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: # press 'ESC' to quit
break
cap.release[]
cv2.destroyAllWindows[]

Tin hay không thì tùy, một 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 mã đó. Lưu ý dòng dưới đây

workon cv
0

Đây là dòng tải “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

workon cv
1

Ở đâu,

  • màu xám là hình ảnh thang độ xám đầu vào
  • scaleFactor là thông số chỉ định dung lượng ảnh được giảm bao nhiêu ở mỗi tỷ lệ ảnh. Nó được sử dụng để tạo ra kim tự tháp tỷ lệ
  • 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 nên có, để giữ lại nó. Một số cao hơn cho 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 khuôn mặt

Chức năng sẽ phát hiện khuôn mặt trên hình ảnh. Tiếp theo, chúng ta phải "đánh dấu" các khuôn mặt trong ảnh, ví dụ: sử dụng 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ã

workon cv
2

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

Khi chúng tôi có được những vị trí này, chúng tôi có thể tạo “ROI” [hình chữ nhật được vẽ] cho khuôn mặt và trình bày kết quả bằng 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

workon cv
3

Kết quả

Bạn cũng có thể bao gồm các bộ phân loại để “phát hiện mắt” hoặc thậm chí là “nhận diệ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, bởi vì sẽ không có ý nghĩa gì khi phát hiện mắt hoặc nụ cười bên ngoài khuôn mặt

Lưu ý rằng trên Pi, việc có nhiều bộ phân loại trong cùng một mã sẽ làm chậm quá trình xử lý, 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

ví dụ

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

  • khuôn mặtMắtPhát Hiện. py
  • khuôn mặtNụ CườiPhát Hiện. py
  • khuôn mặtNụ cườiMắtPhát hiện. py

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

Bạn cũng có thể làm theo hướng dẫn bên dưới để hiểu rõ hơn về Face Detection

Haar Cascade Object Detection Face & Eye OpenCV Python Tutorial

5. Thu thập dữ liệu

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

NHẬN DIỆN KHUÔN MẶT BẰNG OPENCV VÀ PYTHON. HƯỚNG DẪN CHO NGƯỜI MỚI BẮT ĐẦU

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

NHẬN DIỆN KHUÔ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, hãy bắt đầu giai đoạn đầu tiên của dự án của chúng tôi. Những gì chúng tôi sẽ làm ở đây, bắt đầu từ bước cuối cùng [Nhận diện khuôn mặt], chúng tôi sẽ chỉ tạo một tập dữ liệu, nơi chúng tôi sẽ lưu trữ cho mỗi id, một nhóm ảnh có màu xám với phần được sử dụng để nhận diện khuôn mặt

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

workon cv
4

Trong thư mục này, ngoài 3 tập lệnh python mà chúng ta sẽ tạo cho dự án của mình, chúng ta phải lưu trên đó Bộ 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à “dataset”

workon cv
5

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

workon cv
6

Mã này rất giống với mã mà chúng tôi đã 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 id người dùng, đó phải là một số nguyên [1, 2, 3, v.v.]

workon cv
7

Và đối với mỗi khung hình đã chụp, chúng ta nên lưu nó dưới dạng tệp trên thư mục “bộ dữ liệu”

workon cv
8

Lưu ý để lưu file 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

workon cv
9

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ư

[cv] pi@raspberry:~$
0

như trong ảnh 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 trong đó các mẫu khuôn mặt được chụp

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 muốn tổng hợp người dùng mới [hoặc để thay đổi ảnh cho người dùng đã tồn tại]

6. 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ừ bộ dữ liệu của mình và “huấn luyện viên” Trình nhận dạng OpenCV. Đ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. 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 tôi sẽ lưu trữ dữ liệu được đào tạo

[cv] pi@raspberry:~$
1

Tải xuống từ GitHub của tôi tập lệnh python thứ hai. 02_face_đào tạo. py

[cv] pi@raspberry:~$
2

[cv] pi@raspberry:~$
9

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

[cv] pi@raspberry:~$
3

Chúng tôi sẽ sử dụng làm công cụ nhận dạng, Trình nhận dạng khuôn mặt LBPH [LOCAL 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

[cv] pi@raspberry:~$
4

Hàm “getImagesAndLabels[path]”, sẽ lấy tất cả ảnh trên thư mục. “dataset/”, trả về 2 mảng. “ID” và “khuôn 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 chúng tôi”

[cv] pi@raspberry:~$
5

Kết quả là, một tệp có tên “huấn luyện viên. yml” sẽ được lưu trong thư mục trainer mà chúng ta đã tạo trước đó

Đó là nó. Tôi đã bao gồm câu lệnh in cuối cùng nơi tôi hiển thị để xác nhận, số lượng khuôn mặt của 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

7. Nhận dạng

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

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

[cv] pi@raspberry:~$
6

Chúng tôi đang bao gồm ở đâ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ố

[cv] pi@raspberry:~$
7

Ví dụ. Marcelo sẽ người dùng có id = 1; . 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 chức năng quan trọng nhất trong đoạn mã trên

[cv] pi@raspberry:~$
8

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

Lưu ý rằng chỉ số tin cậy sẽ trả về “không” nếu nó được coi là khớ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 sẽ đặ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 % mà kết quả khớp là chính xác [“xác suất” = 100 - chỉ số tin cậy]. Nếu không, một nhãn "không biết" được đặt trên khuôn mặt

Bên dưới một gif với kết quả

Trên hình ảnh, 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

8. 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 đến với thế giới điện tử thú vị

Python phát hiện khuôn mặt trong webcam như thế nào?

.
nhập cv2 nhập sys cascPath = sys. argv[1] faceCascade = cv2. .
video_capture = cv2. Quay Video[0].
trong khi đúng. # Chụp lại từng khung hình, khung hình = video_capture. đọc[].
nếu cv2. waitKey[1] & 0xFF == ord['q']. nghỉ. .
# Khi mọi thứ đã hoàn tất, hãy nhả quay video_capture. phát hành[] cv2

Python có thể được sử dụng để nhận dạng khuôn mặt không?

được xây dựng để cung cấp cơ sở hạ tầng chung cho các thuật toán máy học và thị giác máy tính. Nó có hàng nghìn thuật toán được tối ưu hóa có thể được sử dụng cho các mục đích khác nhau như phát hiện và nhận dạng khuôn mặt, xác định đối tượng, v.v. .

AI phát hiện khuôn mặt như thế nào?

Thuật toán thường bắt đầu bằng cách tìm kiếm mắt người, tiếp theo là lông mày, mũi, miệng, lỗ mũi và mống mắt . Sau khi tất cả các đặc điểm khuôn mặt được chụp, các xác thực bổ sung sử dụng bộ dữ liệu lớn chứa cả hình ảnh dương bản và âm bản sẽ xác nhận rằng đó là khuôn mặt người.

Python tính toán độ chính xác của nhận dạng khuôn mặt như thế nào?

Bạn nên đọc về True positive và True negative, false positive và negatives. Với công thức này độ chính xác của bạn =[TP+TN]/[Tổng] . cab độ chính xác nhận dạng khuôn mặt được đo theo tỷ lệ phần trăm khuôn mặt được nhận dạng trên tổng số khuôn mặt được thử nghiệm của cùng một người.

Chủ Đề