Wrocław, 9 czerwca 2008r.

Raport opracowany na zaliczenie przedmiotu: ARE3513 "Metody i algorytmy sztucznej inteligencji".

Autor: Filip Romanowski, nr albumu 140401, specjalność Robotyka (ARR).

Rozpoznawanie niektórych znaków polskiego jednoręcznego alfabetu palcowego




Wroclaw, June 9 2008

This report has been prepared as a requirement for the course: ARE3513 "Methods and algorithms of artificial intelligence."

Author: Filip Romanowski.

Identification several letters of polish sign language



Abstract

The aim of this research study was to build a vision-based hand gesture recognizer. I have implemented one simple method - recognizing using artificial neural network with monocular camera image input. Whole thing works quite simply: the resolution of captured image is changed form 320x240 to 30x20 (that gives us 30*20 = 660 input neurons) and this image is transformed from BGR to gray-scale. That image (image can be represented by a matrix) is connected to an input layer of artificial neural network - each of 660 pixels is attached to one of 660 inputs of the network. For image processing I have choosen OpenCV library, and for artificial neural network implementation, I have choosen FANN library.


Spis Treści

1. Cel projektu.

2. W kilku słowach o sztucznych sieciach neuronowych - biblioteka FANN.

3. Zwięźle o bibliotece OpenCV.

4. Krótko o polskim jednoręcznym alfabecie palcowym.

5. Sposób realizacji.

6. Eksperymentalne obieranie architektury sieci.

7. Eksperymenty i wnioski.

8. Literatura i przydatne linki.

9. Zdjęcia stanowiska do badań.






1. Cel projektu.

Projekt miał za zadanie stworzenie aplikacji do rozpoznawania gestów niektórych znaków polskiego jednoręcznego alfabetu palcowego w układzie wizyjnym. Aplikacja potrafi:

2. W kilku słowach o sztucznych sieciach neuronowych - biblioteka FANN.

Całą wiedzę teoretyczną na temat sztucznych sieci neuronowych można zdobyć korzystając z zasobów sieci (patrz odnośniki na końcu niniejszego raportu), wiec nie będę jej w tym miejscu przytaczał. FANN (Fast Artificial Neural Network) jest to biblioteka, napisana w języku C, implementująca sztuczną sieć neuronową. Biblioteka ma zaimplementowany algorytm uczenia z propagacją wsteczną (odmiany: RPROP, Quickprop, Batch, Incremental). Całość jest łatwa w użyciu (zaledwie kilka instrukcji by tworzyć, trenować czy testować sieć). Sieć posiada kilka rodzajów funkcji aktywacji. Bardzo przydatną funkcją jest możliwość wczytywania i zapisywania całej sieci w jednym pliku tekstowym (możliwość podglądu zawartości). Ponadto w wersji FANN 2.1 dostępny jest także interfejs graficzny pozwalający wizualizować powstałą sieć. Program został napisany przy użyciu środowiska DEV C++. Pojawił się problem z załączaniem plików nagłówkowych do programu, który rozwiązałem przez bezpośrednie dołączenie zawartości biblioteki do programu (instrukcją #include "lib/doublefann.c").

3. Zwięźle o bibliotece OpenCV.

OpenCV, czyli Open Source Computer Vision Library, to biblioteka napisana w C/C++, która znacznie ułatwia projekty związane z przetwarzaniem obrazów. Jest ona zoptymalizowana pod kątem operacji w czasie rzeczywistym. Posiada własny system zarządzania okienkami, niezależny od systemu operacyjnego. Biblioteka posiada wiele przydatnych funkcji, pozwalających m.in. na:

4. Krótko o polskim jednoręcznym alfabecie palcowym.

W mojej aplikacji wykorzystałem tylko 6 znaków. Nauczona siec neuronowa potrafiła rozpoznawać znaki
'A', 'C', 'L', 'O', 'R', 'W',
co daje w rezultacie umiejętność wypisania na ekranie np. słowa 'WROCLAW'.

Użyte znaki: (obrazki pochodzą ze strony link)

5. Sposób realizacji.

Aplikacja została stworzona z myślą o testowaniu samej sieci neuronowej, nie rozwijałem interfejsu graficznego, gdyż w tym projekcie jest to całkowicie zbędne. Zrezygnowałem też z kłopotliwego problemu dowolnego tła, pozostając przy tle stałym, czarnym. Etapy działanie programu: Obróbka obrazu: obraz z kamery internetowej (320x240) jest wyświetlany na ekranie, a następnie poddawany zmianie rozdzielczości na rozdzielczość 30x22 co daje 660 punktów na klatkę. Tak spróbkowany obraz BGR (kolejność kolorów w OpenCV jest odwrotna niż na ogół) jest zamieniany na obraz w skali szarości. Tak przetworzona klatka obrazu podawana jest na wejście sieci neuronowej (tak więc na wejścia sieci podawane są wartości z zakresu 0 - 255). Jeśli znak jest rozpoznawany przez sieć, na jednym z jej sześciu wyjść (6 wyjść dlatego że sieć potrafi rozpoznać 6 znaków) pojawi się wartość 1, a na pozostałych -1. Program interpretuje ciąg wartości na wyjściu sieci i wyświetla odpowiednią, wcześniej przypisaną literkę. W kodzie programu zmieniać można parametry sieci neuronowej. Schemat działania aplikacji przedstawia poniższy rysunek.


Do uczenia sieci trzeba przygotować po jednym wzorcu dla każdego z rozpoznawanych znaków. Podawanie więcej niż jednego wzorca nie przyniosło spodziewanych rezultatów - sieć trudno było wtedy dobrze nauczyć, prawie zawsze się myli. Po zapisaniu pliku uczącego można przystąpić do uczenia. Wskazujemy z którego pliku sieć ma się uczyć, sieć robi to sama aż do osiągnięcia zadanego jej błędu (u mnie 0.00000001).

6. Eksperymentalne obieranie architektury sieci.

Po napisaniu prototypowego programu, przystąpiłem do fazy testów sieci. Na początku stworzyłem układ próbny, który rozpoznawał białe figury geometryczne na czarnym tle. Obraz po zmianie rozdzielczości oraz zmianie na skalę szarości poddawany był także binaryzacji. Na wejście sieci podawane były dane dwuwartościowe {-1,1}. W wersji końcowej aplikacji z binaryzacji zrezygnowano i na wejście sieci podawałem obraz w skali szarości. Sieć neuronowa miała ustawione następujące parametry: Tak przygotowana sieć potrafiła rozpoznać większość podanych na wejście figur, jednak często myliła ze sobą podobne figury. Już na tym etapie zauważyłem, że faza uczenia sieci jest fazą kluczową dla działania całej aplikacji - niewłaściwie nauczona sieć (niestarannie przygotowane dane uczące), bardzo często myli ze sobą figury.

Do aplikacji wprowadzono więc kilka zmian: Zmieniono także parametry samej sieci neuronowej. Sieć po zmianach: Dla tak przygotowanego programu przeprowadziłem ostateczne testy.

7. Eksperymenty i wnioski.

Eksperymenty przeprowadzono dla następującej sieci: Wnioski:

8. Literatura i przydatne linki.

Literatura:

Przydatne linki:

9. Zdjęcia stanowiska do badań.

Widok stanowiska do testów (jako czarne tło zaadaptowano ring do walk robotów minisumo):



Widok pulpitu podczas testów:


Valid HTML 4.01 Transitional