Wszyscy myślą, że rozpoznawanie twarzy to skomplikowany koncept nieosiągalny dla „zwykłego człowieka”. Nic bardziej mylnego, Python oraz jego community przygotowali materiały które pozwalają osiągnąć ten efekt bez większego wysiłku.

W następnych artykułach po kolei opisane będą takie przykłady jak:

  • rozpoznawanie twarzy
  • rozpoznawanie punktów charakterystycznych tzw. face encodings
  • identyfikacja twarzy konkretnej osoby
  • manipulacja obrazem na podstawie znalezionych twarzy.

Dzięki tym przykładom zobaczymy, że jak najbardziej osiągalne jest zbudowanie własnoręcznie na przykład programu który na ściągniętych zdjęciach z internetu rozpozna wszystkie zdjęcia na których jest Brad Pitt. Na własny użytek możesz rozpoznawać Twoją twarz i odblokowywać swoje pliki, bądź stworzyć skrypt który przywita się z Tobą jeśli pojawisz się na ekranie. Idąc krok dalej jeśli wykorzystasz urządzenie zewnętrzne jak kamerka która przymocujesz nad drzwiami możesz sprawdzić i zbudować proste urządzenie które będzie wpuszczać tylko zapisane osoby do pokoju itd. itd. Napiszcie oczywiście w komentarzach co wam udało się zbudować i jak wy wykorzystaliście bibliotekę face_recognition. Zacznijmy od samego początku

Wstęp i instalacja

instalacją powinna być prosta i wymagać jedynie wywołania komendy do instalacji w pythonie

pip install face-recognition

Natomiast biblioteka ta wykorzystuję sporo pośrednich bibliotek, plików instalacyjnych czy kompilatorów. Stąd jeśli ta prosta metoda nie rozwiąże problemu korzystania z biblioteki i plików które będą pokazane w tym artykule można skorzystać ze środowiska które jest załączone na GitHubie już bezpośrednio z całym projektem. Jeśli nadal masz problem z odtworzeniem napisz na kanale na slacku, ktoś z zespołu na pewno Cię wesprze i pokaże jak dokładnie przeprowadzić ten proces.

Rozpoznawanie twarzy to jest skomplikowana matematycznie i technologicznie koncepcja. Natomiast jako, że ten problem został już w dużej mierzenie rozwiązany, należy nauczyć się jedynie z niego korzystać i temu właśnie się przyjrzymy. Dzięki czemu każdy z nas będzie wstanie tworzyć swoje własne rozwiązania oparte o rozpoznawanie twarzy. Zacznijmy od importu biblioteki face_recognition oraz pillow, która oznaczy nam kwadratem znalezione twarze (jeśli korzystasz z udostępnionego już skonfigurowanego środowiska, nie ma potrzeby instalacji, w innym wypadku wykorzystaj „pip install Pillow”):

import PIL.Image
import PIL.ImageDraw
import face_recognition

Wyszukanie twarzy

Weźmy dla przykładu taki oto obraz z 6 różnymi osobami. Wyszukiwanie twarzy polega na znalezieniu obiektów na zdjęciu które są twarzą, dzięki czemu jesteśmy w stanie określić na przykład ilość osób na zdjęciu oraz wykonać kolejne czynności czyli na przykład identyfikację osoby, bądź rozpoznanie już konkretnego elementu twarzy takiego jak oczy czy nos. Biblioteka face_recognition wystawia nam jedną prostą funkcję która zwraca nam wszystkie znalezione twarze na zdjęciu:

# wczytanie obrazu
image = face_recognition.load_image_file("people.jpg")

# znalezienie wszystkich lokalizacji twarzy na zdjęciu i zapisanie do listy
face_locations = face_recognition.face_locations(image)

# wypisanie ilości twarzy 
number_of_faces = len(face_locations)
print("I found {} face(s) in this photograph.".format(number_of_faces))

Wypisaliśmy ilość osób znalezionych na zdjęciu, w kolejnym kroku chcielibyśmy oznaczyć znalezione twarze na tym samym zdjęciu oraz wyświetlić efekt końcowy. Możemy skorzystać z zapisu lokalizacji twarzy w liście face_locations oraz za pomocą biblioteki PILLOW narysować czerwone kwadraty w tych miejscach:

# załaduj do zmiennej zdjęcie na którym będziemy rysować
pil_image = PIL.Image.fromarray(image)

for face_location in face_locations:

    # Wypisz lokalizacje twarzy na obrazie, każda zmienna przechowuje wartości (top, right, bottom, left).
    top, right, bottom, left = face_location
    print("Twarz znajduję się w lokalizacji pikseli Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))

    # rysowanie kwadratu dookoła twarzy
    draw = PIL.ImageDraw.Draw(pil_image)
    draw.rectangle([left, top, right, bottom], outline="red")

# Pokazanie efektu końcowego
pil_image.show()

Podsumowanie

Jedynie w 27 linijek kodu udało nam się wczytać zdjęcie z wieloma twarzami, rozpoznać ich lokalizację, narysować na nich kwadrat pokazujący dokładne ułożenie twarzy praktycznie bez wysiłku. Czy teraz widzicie jak może być to proste do zrealizowania w praktyce mimo, że samo zagadnienie jest bardzo skomplikowane? W kolejnych materiałach zajmiemy się identyfikacją charakterystycznych punktów na twarzy takich jak (oczy, nos, usta itd.) oraz identyfikacją konkretnych osób. Pamiętacie funkcję FB, która oznaczała twarze znajomych na zdjęciu i pytała kto to jest ?