- Wymagane składniki
- Instalowanie OpenCV w Raspberry Pi
- Jak wykryć części twarzy za pomocą dlib
- Programowanie Raspberry Pi do wykrywania twarzy
- Testowanie narzędzia do rozpoznawania części twarzy
Wykrywanie punktów orientacyjnych na twarzy to proces wykrywania różnych części twarzy, takich jak brwi, oczy, nos, usta i szczęka. Istnieje wiele aplikacji wykorzystujących techniki wykrywania punktów orientacyjnych twarzy.
Wcześniej budowaliśmy system rozpoznawania twarzy przy użyciu OpenCV, dziś użyjemy tego samego OpenCV z Raspberry Pi do wykrywania punktów orientacyjnych twarzy. Wstępnie wyszkolony moduł wykrywania punktów orientacyjnych twarzy z biblioteki dlib zostanie użyty do wykrycia lokalizacji kluczowych struktur twarzy na twarzy, a do wizualizacji wykrytych części twarzy zostanie użyty Python OpenCV.
Wymagane składniki
Komponenty sprzętowe
- Raspberry Pi 3
- Moduł kamery Pi
Oprogramowanie i usługi online
- OpenCV
- Dlib
- Python3
Przed przystąpieniem do tego wykrywania Raspberry Pi 3 Facial Landmark Detection , najpierw musimy zainstalować OpenCV, imutils, dlib, Numpy i kilka innych zależności w tym projekcie. OpenCV jest tutaj używany do cyfrowego przetwarzania obrazu. Najpopularniejsze zastosowania cyfrowego przetwarzania obrazu to wykrywanie obiektów, rozpoznawanie twarzy i licznik osób.
Aby dowiedzieć się więcej o tym, jak połączyć kamerę Pi z Raspberry Pi, postępuj zgodnie z naszymi poprzednimi samouczkami.
Instalowanie OpenCV w Raspberry Pi
Tutaj biblioteka OpenCV zostanie wykorzystana do skanera QR Raspberry Pi. Aby zainstalować OpenCV, najpierw zaktualizuj Raspberry Pi.
sudo apt-get update
Następnie zainstaluj wymagane zależności do zainstalowania OpenCV na swoim Raspberry Pi.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
Następnie zainstaluj OpenCV w Raspberry Pi za pomocą poniższego polecenia.
pip3 zainstaluj opencv-contrib-python == 4.1.0.25
Wcześniej używaliśmy OpenCV z Raspberry pi i stworzyliśmy wiele tutoriali na jego temat.
- Instalowanie OpenCV na Raspberry Pi przy użyciu CMake
- Rozpoznawanie twarzy w czasie rzeczywistym za pomocą Raspberry Pi i OpenCV
- Rozpoznawanie tablic rejestracyjnych przy użyciu Raspberry Pi i OpenCV
- Szacowanie wielkości tłumu przy użyciu OpenCV i Raspberry Pi
Stworzyliśmy również serię samouczków OpenCV, zaczynając od poziomu początkującego.
Instalowanie imutils : imutils jest używany do wykonywania kilku niezbędnych funkcji przetwarzania obrazu, takich jak tłumaczenie, obrót, zmiana rozmiaru, tworzenie szkieletu i wyświetlanie obrazów Matplotlib w OpenCV. Więc zainstaluj imutils za pomocą poniższego polecenia:
pip3 zainstaluj imutils
Instalowanie dlib: dlib to nowoczesny zestaw narzędzi, który zawiera algorytmy uczenia maszynowego i narzędzia do rozwiązywania rzeczywistych problemów. Użyj poniższego polecenia, aby zainstalować plik dlib.
pip3 zainstaluj dlib
Instalowanie NumPy : NumPy to podstawowa biblioteka do obliczeń naukowych, która zawiera potężny n-wymiarowy obiekt tablicy, zapewnia narzędzia do integracji C, C ++ itp.
Pip3 zainstaluj numpy
Jak wykryć części twarzy za pomocą dlib
Zamierzamy użyć wstępnie wyszkolonego detektora punktów orientacyjnych twarzy biblioteki dlib, aby wykryć położenie współrzędnych 68 (x, y), które są mapowane na struktury twarzy na twarzy. dlib predyktor punktu orientacyjnego twarzy jest szkolony na zestawie danych iBUG 300-W. Obraz zawierający indeksy 68 współrzędnych podano poniżej:
Programowanie Raspberry Pi do wykrywania twarzy
Kompletny kod Pythona do rozpoznawania części twarzy z wstępnie wyszkolonym detektorem punktów orientacyjnych twarzy jest podany na końcu strony. Tutaj wyjaśniamy kilka ważnych części kodu dla lepszego zrozumienia.
Tak więc, jak zwykle, uruchom kod, dołączając wszystkie wymagane biblioteki.
z imutils import face_utils import numpy as np import argparse import imutils import dlib import cv2 z picamera.array import PiRGBArray from picamera import PiCamera
Następnie zainicjuj obiekt kamery i ustaw rozdzielczość na (640, 480) i liczbę klatek na 30 fps
kamera = PiCamera () kamera.resolution = (640, 480) kamera.framerate = 30
Teraz w następnych wierszach użyj parsera argumentów, aby podać ścieżkę do predyktora punktu orientacyjnego twarzy.
ap = argparse.ArgumentParser () ap.add_argument ("- p", "--shape-predictor", required = True, help = "ścieżka prognozy punktu orientacyjnego twarzy") args = vars (ap.parse_args ())
W następnych wierszach zainicjuj wstępnie wyszkolony detektor twarzy oparty na HOG dlib i załaduj wstępnie wyszkolony predyktor punktu orientacyjnego twarzy.
detektor = dlib.get_frontal_face_detector () predictor = dlib.shape_predictor (args)
Następnie użyj funkcji capture_continuous, aby rozpocząć przechwytywanie klatek z kamery Raspberry Pi.
dla ramki w camera.capture_continuous (rawCapture, format = "bgr", use_video_port = True): image = frame.array cv2.imshow ("Frame", image) key = cv2.waitKey (1) & 0xFF rawCapture.truncate (0)
Użyj klawisza klawiatury „S”, aby uchwycić określoną klatkę. Następnie zmień rozmiar przechwyconego obrazu i przekonwertuj go na skalę szarości.
if key == ord ("s"): image = imutils.resize (obraz, szerokość = 400) gray = cv2.cvtColor (obraz, cv2.COLOR_BGR2GRAY)
Użyj funkcji detektora biblioteki dlib, aby wykryć twarze na przechwyconym obrazie.
rects = detektor (szary, 1)
Zrób zdjęcie, na którym wykonano wykrywanie twarzy, określ punkty orientacyjne twarzy i zamień 68 punktów na tablicę NumPy. Pętla osobno nad każdym obszarem twarzy.
for (i, rect) in enumerate (rects): shape = predictor (grey, rect) shape = face_utils.shape_to_np (shape)
Następnie weź kopię oryginalnego obrazu i użyj jej jako pętli, aby narysować nazwę części twarzy na obrazie. Kolor tekstu będzie czerwony, możesz go zmienić na inny kolor, zmieniając wartości RGB.
for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items (): clone = image.copy () cv2.putText (clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0 255), 2)
Teraz przejdziemy do wykrytych części twarzy i użyjemy funkcji rysowania OpenCV, aby narysować okręgi na tych częściach twarzy. Możesz śledzić ten dokument OpenCV, aby uzyskać więcej informacji na temat funkcji rysowania
for (x, y) in shape: cv2.circle (clone, (x, y), 1, (0, 0, 255), -1)
Teraz w następnych wierszach wyodrębnimy każdą część twarzy jako oddzielny obraz, obliczając prostokąt ograniczający współrzędnych określonej części twarzy. Wyodrębniony obraz zostanie przeskalowany do 250 pikseli.
(x, y, w, h) = cv2.boundingRect (np.array (])) roi = image roi = imutils.resize (roi, width = 250, inter = cv2.INTER_CUBIC)
Teraz w ostatnich liniach kodu wyświetl części twarzy wraz z ich nazwami i oddzielnym obrazem tej części. Użyj klawisza ESC, aby zmienić obszar twarzy.
cv2.imshow ("ROI", roi) cv2.imshow ("Obraz", klon) cv2.waitKey (0)
Testowanie narzędzia do rozpoznawania części twarzy
Aby przetestować projekt, utwórz katalog i przejdź do niego za pomocą poniższych poleceń:
mkdir detektor części twarzy cd detektor części twarzy
Teraz pobierz plik shape_predictor_68_face_landmarks.dat z tego łącza, a następnie wyodrębnij i skopiuj plik shape_predictor_68_face_landmarks.dat do tej biblioteki, a następnie otwórz nowy plik o nazwie Detect.py i wklej podany poniżej kod.
Teraz uruchom kod Pythona za pomocą poniższego polecenia:
python3 detection.py --shape-predictor shape_predictor_68_face_landmarks.dat
Zobaczysz okno pokazujące podgląd na żywo z kamery. Następnie naciśnij klawisz „S”, aby wybrać klatkę z transmisji na żywo. Zobaczysz czerwone kropki w okolicy ust. Użyj klawisza ESC, aby zobaczyć inne części twarzy.
Pełny kod Pythona i film demonstracyjny są podane poniżej.