Published using Google Docs
Raport_integration_2
Updated automatically every 5 minutes

Biometryczne wspomaganie interakcji człowiek-komputer

Raport końcowy

Arkadiusz Antonik, TGSI, 201182

Dariusz Jędrzejczak, TGSI, 201208

Krzysztof Kubiak, TGSI, 201216

Maciej Nowicki, TGSI, 201231

Moduł analizy sygnału dźwiękowego

Arkadiusz Antonik, TGSI, 201182

Maciej Nowicki, TGSI, 201231

Cel projektu

Celem projektu było stworzenie aplikacji na komputery PC, która będzie potrafiła zidentyfikować mówcę, na podstawie wypowiedzianego słowa. Aplikacja posiada wcześniej przygotowaną bazę nagrań tego samego słowa wypowiedzianego przez różne osoby.

Użyte narzędzia

Do wykonania zadania użyliśmy języka C++ oraz Visual Studio 2013 Community Edition jako środowiska programistycznego. Dodatkowo użyliśmy trzech zewnętrznych bibliotek:

Algorytm rozpoznawania mówcy

Implementację aplikacji rozpoznającej mówcę oparliśmy na dwóch artykułach:


Dane wejściowe

Danymi wejściowymi algorytmu są pliki dźwiękowe w formacie WAV. Wczytanie plików
do pamięci oraz odpowiednie ich parsowanie jest w pełni zaimplementowane po stronie aplikacji. Implementacja powstała na podstawie ogólnodostępnych informacji o tym z jakich elementów składa się format WAV.

Dane wyjściowe

        Danymi wyjściowymi są dwa elementy:

Kroki algorytmu wyznaczania cech charakterystycznych

  1. Wczytanie pliku dźwiękowego do pamięci
  2. Podzielenie wszystkich wczytanych próbek na N fragmentów, które posiadają jednakową ilość próbek. Jeśli ostatni fragment jest niekompletny to brakujące próbki są uzupełniane wartościami 0.0
  3. Następnie każdy fragment jest poddany przemnożeniu przez funkcję okna Hamminga
  4. Kolejnym krokiem jest obliczenie N-punktowej dyskretnej transformaty Fouriera. W naszym przypadku jest to zrealizowane przez zewnętrzną bibliotekę implementującą algorytm szybkiej transformaty Fouriera
  5. Z otrzymanych wartości będących liczbami zespolonymi obliczane są ich moduły i dopiero one są przekazywane do dalszych kroków algorytmu.
  6. Następnie przeprowadzamy filtrację sygnału w dziedzinie częstotliwości, która w efekcie zwróci nam K wartości tworzących widmo amplitudowe wyrażone w melach.
  7. Otrzymany ciąg wartości logarytmujemy i poddajemy przekształceniu cosinusowemu dzięki czemu uzyskujemy F wartości, które są cechami charakterystycznymi analizowanego pliku audio.
  8. Proces powtarzamy dla każdego pliku dźwiękowego.

Dopasowania wektora cech do dostępnych wzorców

        Posiadając w bazie danych wektory cech wzorcowych plików dźwiękowych oraz wektor cech wygenerowany dla pliku rozpoznawanego, możemy przejść do implementacji dopasowania odpowiednich cech w wektorach.

Wykorzystaliśmy tutaj metodę zaproponowaną w artykule odnoszącym się do rozpoznawania mówcy, czyli porównanie cech z nieliniowym skalowaniem dziedziny czasu. Ma to poprawić wydajność rozpoznawania mówcy nawet jeśli wypowiedziane słowo będzie szybciej lub wolniej.

Założenia techniczne

W folderze z plikiem wykonywalny musi znajdować się również folder o nazwie “Content”. W nim natomiast są dwa podfoldery o nazwach: “Database” oraz “UnknownSpeaker”.

W folderze o nazwie “Database” znajdują się pliki dźwiękowe w formacie WAV, które będą użyte do stworzenia bazy wzorców dla procesu rozpoznawania. Aby pliki zostały poprawnie rozpoznane przez aplikację powinny posiadać odpowiednie nazwy stworzone według schematu:
{
NazwaRozmówcy}_{NumerIdentyfikacyjnyRozmówcy}_{IdentyfikatorProbkiDlaRozmowcy}.wav

przykładowe pliki mogą wyglądać następująco:

Woman_1_Sample1.wav, Woman_1_Sample2.wav, Man_3_Sample1.wav, Man_3_Sample2.wav

        W folderze o nazwie “UnknownSpeaker” powinien znajdować się tylko jeden plik o nazwie “UnknownSpeaker.wav”, który to plik jest próbką nagrania audio do rozpoznania przez aplikację.

Podsumowanie

Aplikacja działa poprawnie w 100% przypadków, jeśli rozpoznawaniu mówcy poddana jest próbka dźwięku wcześniej umieszczona w bazie wzorców. W przypadku jeśli analizowana próbka dźwięku nie istnieje w bazie, ale są tam umieszczone inne próbki wzorcowe, które reprezentują
to samo wypowiedziane słowo przez tę samą osobę, lecz z inną szybkością lub intonacją,
to wtedy aplikacja nie radzi sobie tak dobrze z rozpoznawaniem mówcy.

Aplikacja została tak skonstruowana aby zawsze starała się dopasować jakiegoś mówcę
z posiadanej bazy wzorców do aktualnie analizowanej próbki. Dlatego też nigdy nie zostanie stwierdzone, że mówca został nierozpoznany, ponieważ algorytm nie posiada granicy dopasowania, dlatego zawsze wybierze najbardziej podobną próbkę wzorcową ze wszystkich dostępnych w bazie.


Moduł analizy obrazów statycznych i sekwencji wideo

Dariusz Jędrzejczak, TGSI, 201208

Krzysztof Kubiak, TGSI, 201216

Streszczenie

Moduł jest aplikacją wykrywającą i odróżniającą 3 emocje na podstawie ułożenia ust. OpenCV jest używane do detekcji twarzy (metodą Viola-Jones). Następnie emocja jest wykrywana przy użyciu analizy głównych składowych (Principal Component Analysis, PCA).

Opis projektu

Aplikacja analizuje obraz z kamery podłączonej do komputera i określa emocję na podstawie ułożenia ust użytkownika. Działanie aplikacji odbywa się w trzech etapach: trening, wykrwanie twarzy, wykrywanie emocji:

Wykrywanie twarzy

Wykrywanie twarzy jest podstawowym elementem programu. Żeby wykryć emocję, potrzebujemy zlokalizować usta na obrazie. Do wykrycia twarzy wykorzystujemy algorytm Viola-Jones. Algorytm charakteryzuje się dużą szybkością i skutecznością wykrywania. Wykorzystuje koncepcję integralnego obrazu, który jest opisany za pomocą sum i różnic wartości pikseli w prostokątnych obszarach określonych specjalnymi szablonami. Algorytm określa na obrazie tzw. cechy Haaro-podobne (Haar-like features).

Analiza głównych składowych

PCA jest techniką, która umożliwia rozkład wektora danych tak, aby zmniejszyć liczbę jego składowych i pozostawienia tylko tych istotnych. Jest ona używana do rozpoznawania twarzy, czyli klasyfikacji twarzy jako podobne. W przypadku tej aplikacji nie porównujemy całych twarzy, lecz same usta.

Opis implementacji

Aplikacja jest zaimplementowana w języku C++ przy użyciu biblioteki OpenCV 2.4.11. Działanie aplikacji polega na:

  1. Wczytaniu zestawu treningowego
  1. Dla danego użytkownika (określonego numerem identyfikacyjnym podanym jako parametr programu) i dla każdej emocji wczytujemy zestaw treningowy; każdy wczytany jako macierz obraz transponujemy, spłaszczamy do wektora i umieszczamy jako kolejny wiersz i kolumna w macierzach, których użyjemy do policzenia wektorów własnych obrazów
  1. Policzeniu wektorów własnych
  2. Policzeniu macierzy projekcji
  3. Rzutowaniu zestawu treningowego na przestrzeń twarzy
  4. Rozpoczęciu rozpoznawania twarzy
  1. Wczytaniu szablonu cech Haaro-podobnych do obiektu CascadeClassifier
  2. Uruchomieniu kamery
  1. Dla każdej klatki obrazu:
  1. Wykryciu wszystkich twarzy na obrazie (metoda detectMultiScale klasy CascadeClassifier)  i obrysowaniu ich czerwonymi prostokątami
  2. Wybraniu największego prostokąta zawierającego twarz
  3. Wybraniu fragmentu twarzy zawierającego usta
  4. Rozpoznaniu emocji przez porównanie z zestawem treningowym -- znalezieniu najkrótszego wektora odległości pomiędzy bieżącym obrazem a jednym z obrazów z zestawu treningowego
  5. Wyświetleniu wyniku w postaci odpowiedniej ikony

Program w głównej pętli wczytuje z klawiatury wejście od użytkownika.


Opis sposobu korzystania z modułu

Aplikacja działa w systemie Windows.

Program należy uruchamiać podając jako parametr numer użytkownika, którego emocje będziemy rozpoznawać na podstawie próbek w bazie (próbki znajdują się w folderze data/numer_użytkownika). Dla nieznanego/dowolnego użytkownika przygotowane są uniwersalne próbki. Żeby wypróbować rozpoznawanie dowolnego użytkownika należy uruchomić program z parametrem 4 (lub uruchomić przygotowany skrypt test_unknown.bat).

Po uruchomieniu program uruchamia pierwszą dostępną kamerę w komputerze użytkownika. Jeżeli taka nie zostanie znaleziona, program się kończy, wyświetlając odpowiedni komunikat.

Po załadowaniu obrazów treningowych rozpoczyna się etap rozpoznawania twarzy. Pojawiają się 3 okna. Jedno (główne) z obrazem z kamery, na którym wykryte twarze są oznaczone czerwonymi prostokątami. Drugie z wyciętym fragmentem twarzy przedstawiającym usta z wyrównanym histogramem. Ostatnie okno przedstawia ikonę określającą wykrytą emocję.

Przyciski H, S i O powodują zrobienie zrzutu ekranu z okna z ustami dla emocji odpowiednio uśmiechniętej, smutnej i zaskoczonej i zapisanie go w folderze data aplikacji. Takich zrzutów można potem użyć do dodania do bazy nowego użytkownika (należy stworzyć podfolder z odpowiednim numerem w folderze data i umieścić tam stworzone zrzuty).

Wciśnięcie klawisza ESC kończy działanie aplikacji.


Wyniki testów

Na zrzutach poniżej widzimy przykładowe poprawne rozpoznanie poszczególnych emocji (kolejno smutek, zaskoczenie i radość):

Źródła


Integracja zadań 1 i 2

Opis sposobu integracji

Moduły są zintegrowane za pomocą prostej aplikacji napisanej w języku C++. Jej działanie polega na uruchomieniu modułu dźwiękowego, który po rozpoznaniu użytkownika zwraca wartość będącą jego numerycznym identyfikatorem określającym numer linii w pliku z bazą nazw użytkowników (user_name_db). Ten identyfikator jest przekazywany jako parametr do uruchomienia modułu analizy obrazu, który wybiera odpowiedni dla danego użytkownika zestaw próbek i na ich podstawie rozpoznaje emocje użytkownika. Kiedy użytkownik chce zakończyć rozpoznawanie, wciska klawisz ESC, co powoduje zamknięcie modułu obrazu i zwrócenie wartości będącej numerycznym identyfikatorem określającym numer linii w pliku z bazą emocji (emotion_name_db). Następnie aplikacja integrująca wyświetla komunikat zawierający nazwę rozpoznanego użytkownika i ostatnio rozpoznaną dla niego emocję.

Uruchamianie aplikacji integrującej

Aplikacja działa pod systemem Windows. Należy ją uruchamiać za pomocą przygotowanego skryptu run_integration.bat lub ew. z pliku Integration.exe podając w parametrach kolejno ścieżkę do pliku wykonywalnego modułu dźwiękowego, ścieżkę do pliku wykonywalnego modułu obrazu, ścieżkę do bazy danych nazw użytkowników oraz ścieżkę do bazy danych emocji. Przykładowe uruchomienie:

Integration.exe SpeakerRecognizer\SpeakerRecognizer.exe VideoPart\Biometric_mouth.exe user_name_db emotion_name_db

Wykorzystanie modułów w programach zewnętrznych

Moduły mogą działać niezależnie i być używane w programach zewnętrznych do uzyskiwania danych biometrycznych o użytkowniku na zasadzie identycznej, na jakiej działa aplikacja integrująca. Programy zewnętrzne mogą uruchamiać moduły i otrzymywać od nich identyfikatory skojarzone z wpisami w bazach danych. Moduły są łatwo rozszerzalne o dodatkowe funkcjonalności, takie jak rozpoznawanie większej liczby emocji.


Ponadto aplikacja integrująca może również zostać wykorzystana do współpracy modułów z innymi programami -- wystarczy podać odpowiednie ścieżki jako parametry uruchomieniowe i zapewnić zwracanie przez te zewnętrzne programy odpowiednich wartości skojarzonych z wpisami w bazach danych.