Złożoność maszyn wzrosła na przestrzeni lat, a komputery nie są wyjątkiem. Komputery pomogły ludzkości rozwiązać wiele problemów i wykonać wiele trudnych zadań. Dawno minęły czasy, w których wszystkie komputery to proste operacje arytmetyczne, komputery napędzają świat.
Komputery stały się tak złożone, że są szkolone, aby myśleć jak ludzie.
Tak!
W tym artykule zrobimy coś z tego rodzaju. Jako ludzie, rozpoznanie twarzy innych ludzi jest prostym zadaniem i pomimo umiejętności dzisiejszych komputerów nie jest tak łatwe dla komputera, więc musimy go wyszkolić, aby móc zrobić to samo.
Wiele artykułów, które można by tam zobaczyć, zatrzyma się przy prostym wykryciu twarzy, ale w tym artykule obejmowałoby nie tylko wykrywanie twarzy, ale także rozpoznawanie twarzy.
Oznacza to, że jeśli komputer otrzyma dwa moje zdjęcia, nie tylko rozpoznałoby to, jaką część obrazu jest moja twarz, ale także rozpoznałoby, że ja również na obu zdjęciach.
Na początek musielibyśmy najpierw zainstalować OpenCV na naszych maszynach, co można zrobić tylko wtedy, gdy masz zainstalowany Python. Instalacja Pythona nie jest celem tego artykułu, więc jeśli nie masz go jeszcze na komputerze, możesz zainstalować Python ze strony internetowej Python.
Aby zainstalować otwarte CV, możemy to zrobić za pomocą polecenia PIP.
PIP Instaluj OpenCV-PythonW tym artykule będziemy również korzystać z pakietu Numpy, który należy zainstalować obok openCV za pomocą powyższego polecenia.
Jeśli Numpy nie zainstalował, możesz to łatwo zrobić, używając poniższego polecenia:
PIP Instaluj NumpyAby potwierdzić, że Twój OpenCV jest zainstalowany, gdy aktywujesz interaktywne środowisko Pythona, spróbuj go zaimportować za pomocą:
Importuj CV2Jeśli nie otrzymasz błędu, możesz kontynuować.
Aby przeprowadzić rozpoznanie twarzy, pisalibyśmy trzy skrypty. Jeden do utworzenia zestawu danych obrazów, drugi do wyszkolenia tych obrazów, a następnie ostatniego, który rozpozna twarze w oparciu o wyniki szkolenia, przez które przechodzi komputer.
Potrzebowalibyśmy kaskady Haar dostarczonej przez Open CV. Ten plik można uzyskać z katalogu OpenCV, który jest CV2/data/haarcascade_frontalface_default.xml na moim komputerze powinien być również taki sam na twoim komputerze. Skopiuj plik do folderu, w którym chcesz wykonać rozpoznanie twarzy.
Teraz przejdźmy do gęstości rzeczy.
Staralibyśmy się zdobyć naszą kamerę internetową, aby uzyskać zdjęcia potrzebne do zestawu danych.
Aby wyjaśnić, co robi każdy wiersz kodu:
Importuj CV2Oto polecenie, które każe Pythonowi dołączyć bibliotekę zewnętrzną do użycia w tym kodzie, w tym przypadku jest otwarta CV.
vid_cam = cv2.Videokapture (0)Ten kod wywołuje importowaną otwartą bibliotekę CV, aby rozpocząć przechwytywanie, a kamera internetowa jest inicjowana w tym momencie. Jeśli otwarty CV nie obsługuje Twojej kamery internetowej, kod nie powiedzie.
Face_detector = CV2.Cascadeclassifier ('haarcascade_frontalface_default.xml ')Abyśmy mogli wykonać wykrywanie obrazu, ten kod jest potrzebny. Otwórz CV używa „haarcascade_frontalface_default.xml 'do klasyfikacji kaskadowej. Powstały obiekt jest następnie przechowywany w zmiennej Face_detector.
Face_id = 1Oto przypadek ustawienia numeru ID twarzy, więc pierwsza twarz otrzymuje identyfikator 1.
Count = 0Będziemy robić kilka zdjęć, ponieważ otwarty CV musi szkolić obrazy, aby móc rozpoznać twarze, zmienna liczby służy jako liczba obrazów.
While (vid_cam.jest otwarty()):To pozwala na kontynuowanie następujących operacji, pod warunkiem, że kamera wideo jest otwarta. Metoda ISOPED () zwraca prawda lub fałsz.
ret, image_frame = vid_cam.Czytać()Tutaj, vid_cam.Read () patrzy na przechwytywanie wideo, a następnie przechwytuje ramkę, która jest przechowywana w zmiennej image_frame, jeśli operacja się powiodła, boolean true jest zwracana i przechowywana w zmiennej ret
Gray = CV2.cvtcolor (image_frame, cv2.Color_bgr2gray)Metoda cvtcolor () służy do konwersji ramki obrazu na żądany typ koloru. W takim przypadku przekonwertowaliśmy go w skalę szarościową.
Faces = Face_Detector.detectMultiscale (Gray, 1.3, 5)Kontrola ramek o różnych rozmiarach i próbuje ustawić je na skal.
Dla (x, y, w, h) na twarzach:Tutaj zapętamy twarze i ich wymiary, gdzie x i y stoją na współrzędnych, a W i H są odpowiednio szerokości i wysokości.
CV2.Rectangle (image_frame, (x, y), (x+w, y+h), (255,0,0), 2)Pamiętaj, że nadal pracujemy z kamerą wideo, kamera wideo przyciąga potrzebę części obrazu zgodnie z powyższymi wymiarami.
Count += 1Natychmiast, co się dzieje, zmienna zliczania, która stanowi licznik, wówczas przyrosta.
CV2.imwrite („Zestaw danych/użytkownik.„ + Str (Face_id) +”.' + str (Count) + ".jpg ", Gray [y: y+h, x: x+w])Obraz przycięty jest zapisany z nazwą użytkownika (Face_id).(liczyć).JPG i umieść w folderze o nazwie Zestaw danych.
CV2.Imshow („ramka”, image_frame)Po zapisaniu ten kod zapewnia, że obraz jest wyświetlany ramka wideo z prostokątem na twarzy jednostki po wykonaniu wykrywania twarzy.
Jeśli CV2.Waitkey (100) i 0xff == ord („q”):Po każdym zdjęciu użytkownik może powstrzymać program przed zrobieniem więcej zdjęć, które można zrobić, naciskając „Q” na klawiaturze przez co najmniej 100 ms.
Elif Count> 100:To, co robi ten kod, aby powstrzymać film przed działaniem momentu, w którym zrobiono 100 zdjęć, niezależnie od tego, czy użytkownik chce wziąć więcej, czy nie.
vid_cam.uwolnienie()Tutaj kamera internetowa jest zamknięta i nie tylko przestała robić zdjęcia.
CV2.DestroyallWindows ()Wtedy wszystkie otwarto Windows OpenCV zostały zniszczone, a kod przechodzi do wniosku.
Teraz, gdy już się z tym skończyliśmy, możemy następnie wyszkolić zestaw danych obrazu:
Importuj CV2, OSChodźmy też i wyjaśnijmy ten kod:
Importuj CV2, OSPodobnie jak drugi kod, tutaj importujemy OpenCV i OS, których potrzebujemy ścieżki plików.
importować Numpy jako NPImportujemy również bibliotekę Numpy, która byłaby używana do obliczeń macierzy (matryca to tylko układ tablic).
Z obrazu Importu PILImportujemy bibliotekę obrazów Python, a następnie z niej otrzymujemy również bibliotekę obrazów z tego pakietu.
Rozpoznawanie = CV2.twarz.createLbphFaceReCognizer ()To robi zastosowanie metody CreateLbphFaceReCognizer () do CV2.twarz, pomogłoby to ułatwić rozpoznanie twarzy, ponieważ nie musimy wymyślać własnego zestawu algorytmów.
Detector = CV2.Cascadeclassifier („haarcascade_frontalface_default.xml ");Gdybyś śledził samouczek, natknąłbyś się na to wcześniej. Pomaga w wykryciu twarzy za pomocą „haarcascade_frontalface_default.xml ”dla klasyfikacji kaskady.
def getImagesandLabels (ścieżka):Teraz wkrótce rozpoczniemy trening obrazu, więc tworzymy funkcję.
Imagpaths = [OS.ścieżka.dołącz (ścieżka, f) dla F w systemie OS.Listdir (ścieżka)]Niniejszy kod sprawdza się w bieżącym katalogu pliku i sprawdza pliki obrazu, a następnie dodaje je do tej listy.
FACESSAMPLIPPLES = []To inicjuje listę próbek, w tym momencie jest pusta, ale twarze zostaną dodane w miarę uruchomienia kodu.
ids = []Zainicjuj listę identyfikatorów, która jest początkowo pusta.
dla ImagePath w imagpaths:Pamiętaj o kodzie, który sprawdził pliki obrazu w katalogu? Tak? Teraz zamierzamy zapętlić każdy z tych plików i przeprowadzić na nich operacje.
PIL_IMG = obraz.Otwórz (ImagePath).Konwertuj („L”)Teraz pierwszą rzeczą, którą robimy z obrazem, jest konwersja go na skalę szarościową, a ten kod to robi.
IMG_NUMPY = NP.tablica (pil_img, „uint8”)Obraz w skali szarości to tylko seria liczb w jednym miejscu, więc tworzymy z nich tablicę Numpy i przypisujemy ją do zmiennej.
id = int (OS.ścieżka.split (imagpath) [-1].podział(".") [1])Jeśli przypomnisz sobie plik, który otrzymuje obrazy, pamiętasz, że nazwaliśmy pliki użytkownika (Face_ID).liczyć.jpg. Więc tutaj dzielimy nazwiska „.”A następnie wyodrębniamy TACE_ID i przypisujemy tutaj zmienną. Potrzebowalibyśmy identyfikatora uznania.
Faces = detektor.detectMultiscale (IMG_NUMPY)Z tablicy Numpy metoda detectMultiscale () będzie próbowała wykryć twarze na podstawie wzoru, który znajduje w tablicy Numpy. Następnie przypisuje wartości w zmiennej twarzy.
Dla (x, y, w, h) na twarzach:Tutaj zapętwamy wartości przypisane do zmiennej. Wartości tutaj to współrzędne x i y, które moglibyśmy uznać za pochodzenie, a następnie W i H stoją odpowiednio na szerokość i wysokość.
Twarz.append (img_numpy [y: y+h, x: x+w])Wcześniej stworzyliśmy listę próbek twarzy, ale była pusta. Tutaj możemy dodać twarze do tej listy i dodajemy Y do H, aby uzyskać dwie wartości współrzędnych Y i to samo jest wykonane do x.
IDS.Dodatek (id)Mamy teraz twarz na liście próbek twarzy, więc otrzymujemy jego identyfikator i dołączamy również do listy identyfikatorów.
powrót do twarzy, identyfikatoryPotem zwracamy listę próbek twarzy i listę identyfikatorów.
Faces, ids = getImagesandLabels („zestaw danych”)Pamiętaj, że getImagesandLabels () to tylko funkcja. Możemy więc wywołać funkcję tutaj, a wartości zwrotne są zapisywane na zmiennych twarzy i ids.
rozpoznawanie.Pociąg (Faces, NP.tablica (IDS))Tutaj dzieje się prawdziwy trening. Zastosowaliśmy metodę CreateLbphFaceReCognizer () kiedyś wcześniej i przypisaliśmy do zmiennej rozpoznawania. Czas treningu!
rozpoznawanie.Save („Trener/trener.yml ')Po szkoleniu możemy uratować wyniki z treningu.
Po uruchomieniu kodu tworzy plik o nazwie Trainer.YML, który byłby następnie używany przez kod rozpoznawania twarzy.
Oto kod rozpoznawania twarzy:
Importuj CV2Jeśli śledziłeś artykuł od samego początku, zrobiliśmy to wcześniej. Jeśli nie uprzejmie to zrobiłeś.
rozpoznawanie.Ładowanie („Trener/trener.yml ')Pamiętaj, że przeszkoliliśmy rozpoznawcę i zapisaliśmy plik? Tak? Ładujemy teraz ten plik.
cascadepath = "haarcascade_frontalface_default.xml "Pracujemy z plikiem Haarcascade i tutaj przypisaliśmy nazwę pliku do zmiennej.
# Utwórz klasyfikator z modelu wstępnie zbudowanegoTutaj możemy przeprowadzić klasyfikację Cascade w pliku Haarcascade.
czcionka = CV2.Font_hershey_simplexUstawiamy typ czcionki, który byłby używany, gdy kod rozpozna twarz na obrazie i wyświetli nazwę.
CAM = CV2.Videokapture (0)Byliśmy tu wcześniej, ale tym razem nadszedł czas, aby rozpoznać twarze. Jeśli nie wiesz, co robi ten kod, uruchamia kamerę internetową.
Choć prawda:Wszystko to zostało zrobione wcześniej, uprzejmie sprawdź kod używany do zapisywania obrazów, jeśli nie wiesz, co robi kod.
CV2.prostokąt (IM, (X-20, Y-20), (X+W+20, Y+H+20), (0,255,0), 4)Pomaga to więc w kamerze internetowej wykryć, gdzie są twarze i umieszcza prostokąt, aby wskazać twarz.
Id = rozpoznanie.Przewiduj (Gray [y: y+h, x: x+w])Orrerady załadowaliśmy plik pociągu do rozpoznawania, więc jest on teraz w stanie rozpoznać twarz.
if (id == 1):Po próbie rozpoznania, jaka jest twarz, sprawdza identyfikator i widzi, czy istnieje. Tutaj wartością identyfikatora byłby nazwa tego, kto był właścicielem, w obliczu takiego identyfikatora, gdy tworzono zestaw danych obrazu.
CV2.prostokąt (IM, (X-22, Y-90), (X+W+22, Y-22), (0,255,0), -1)Kod po znalezieniu właściciela identyfikatora, rysuje prostokąt wokół twarzy i umieszcza nazwisko właściciela twarzy. Twarz rozpoznana!
CV2.imshow („im”, im)Tutaj ramka wideo jest wyświetlana z ograniczonym prostokątem.
Jeśli CV2.Waitkey (10) i 0xff == ord („q”):Więc po zakończeniu możesz zatrzymać program, naciskając klawisz „Q” i zatrzymuje kamerę internetową i zamyka ją.
Tam, twoja kamera internetowa może teraz rozpoznać twarze i możesz z niej korzystać, gdy tylko chcesz. Odmawianie za pomocą kamery internetowej możesz również załadować obraz, jednak wymaga to innych kroków niż te wykonane w tym artykule.