OpenCV- wykrywanie stanu oczu, część 1

 In Technicznie

Dziś jeden z pierwszych technicznych wpisów na blogu, powstał on w wyniku prac przy jednym z projektów dla klienta. Otóż jednym z wymagań w aplikacji internetowej i mobilnej było zadanie rozpoznawania stanu oczu osoby siedzącej przez komputerem oraz smarfonem. Należało ustalić w czasie rzeczywistym  czy użytkownik ma  zamknięte czy otwarte oczy i w zależności od automatycznie wykrytego stanu podjąć stosowną akcję.

Ponadto podsystem rozpoznawania powinien być wystawiony jako REST API i umożliwiać komunikację  zarówno z aplikacją mobilną jak i z serwisem internetowym. Cały serwer API wykonaliśmy w frameworku Flask Python a do manipulowania obrazem zdecydowaliśmy się na wykorzystanie biblioteki OpenCV.

Wyszczególniliśmy kilka etapów procesu klasyfikacji:

  • wydzielenie obszaru twarzy
  • wydzielenie obszaru każdego z oczu
  • detekcję, czy dane oko jest zamknięte czy otwarte.

Przeanalizujmy na przykładowym obrazie poniżej (http://tinyurl.com/ps5lkl9) jak można tego dokonać.

Rozpoznawanie oczu z OpenCV

 

Po pierwsze do wydzielenia obszaru twarzy oraz oczu wykorzystaliśmy dostępne w bibliotece OpenCV kaskady HAAR. Do wykrycia twarzy użyliśmy  haarcascade_frontalface_default.xml, a do wykrycia pozycji oczu –  haarcascade_eye.xml.  Kod na listingu poniżej prezentuje ten etap:

Na początku wczytujemy kaskady oraz tworzymy kopię obrazu z pliku w skali szarości. Następnie używamy na nim kaskady wykrywającej twarz.  W pętli for dla wszystkich znalezionych twarzy rysujemy wokół nich prostokąt. Efekt:

flickr_opencv_przyklad_wykryta_twarz

Kolejnym krokiem jest wyznaczenie obszaru oczu. Na zaznaczonym obszarze wykorzystamy kaskadę haarcascade_eye. Dla każdej twarzy znalezionej na obrazie, sprawdzamy go kaskadą dla oczu i jeżeli wykryjemy oczy to rysujemy zielone prostokąty dookoła każdego oka.

W efekcie otrzymujemy obraz taki jak poniżej.

flickr_opencv_przyklad_wykryte_oczy

Pierwsza część zadania za nami udało nam się wykryć na zdjęciu oboje oczu, jednak wciąż pozostaje kwestia detekcji ich stanu. Do tego stworzyliśmy własne rozwiązanie bazujące ma metodach uczenia maszynowego. Wykorzystaliśmy w tym celu jeden z wiodących algorytmów klasyfikacji – Support Vector Machines (SVM). O trenowaniu i wykorzystaniu własnego SVM’a  napiszę w kolejnej części tego artykułu.

Recent Posts