Rozpoznawanie pisma - reprezentacja znaków

0

Musiałem ostatnio napisać aplikację do rozpoznawania liter (OCR).

W zasadzie to wszystko mam gotowe - sieć neuronową, konwersje itd. Działa jak działa - jednak jestem średnio zadowolony z rezultatów.

Niewielkie odstępstwa od normy powodują, że litery nie są rozpoznawane. Przyczyną jest oczywiście zła reprezentacja litery.

Dajmy na to, że mamy zastosowaną bitmapę 20x20 pixeli. Celem jest konwersja na tablice double[] (C#). Zastosowałem zwykłą tablicę o rozmiarze 20*20. Są to po kolei piksele czytane liniami.

Jestem w stanie sobie uświadomić, że taka reprezentacja jest do kitu. Wystarczy, że linia pisma jest niżej niż oczekiwana, i wszystkie wartości się przesuwają o 20 pozycji.

Lepsza byłaby reprezentacja taka, gdzie niewielkie odstępstwa na osi x lub y zmieniają również (w niewielkim stopniu!) wektor "jednowymiarowy".

Myślałem nad podwójnymi koorynatami oraz kodem Gray'a .. ale nic nie udało mi się jeszcze zaimplementować.

Czy ktoś z was spotkał się z takim problemem?

Szukałem na google odpowiedzi, ale wszelkie artykuły stosują również moją reprezentację :/

0

Najlepszą możliwą reprezentacją jest pojedyńczy char. Rozumiem że konwersja do takiego formatu danych może być dość trudna... (ale osiągalna).

Przede wszystkim: na początku zawsze masz jakąś tablice pixeli (np 20x20). Pierwsze czynności które bym wykonał na takiej bitmapce to zwiększenie kontrastu i usunięcie szumu. Następnie "normalizacja" tej bitmapki. Tak jak powiedziałeś jeśli literka będzie niżej o 1px zmieni o diametralnie wygląd wektora który masz zamiar wpuścić do sieci (a co dopiero jesli bedzie przesunięcie o 2px w pionie i 3 w poziomie) dlatego wyznaczyłbym środek ciężkości tej bitmapki (pixel czarny waży 1 biały 0 - przy tekście czarne na białym) a następnie dokonałbym przesunięcia całej bitmapki w taki sposób aby środek cięzkości był w punkcie (10,10). Na podobnej zasadzie dokonałbym zmian w szerokości, wysokości i "skośności" wejściowej bitmapki. Po takim zbajerowaniu wejścia te same litery powinny wyglądać mniej-więcej podobnie (I myślę że takie coś można by już porównywać ze wzorcami lub wpuścić do sieci neuronowej). Możesz też dla każdego piksela obliczyć odległość do najbliższego czarnego pixela (lub obliczyć odległość do najbliższego pixela którego jasność jest < 0,8 + jasność tego pixela) i tą wartość wsadzić w sieć (wyniki na 95,68% będą lepsze).

0

Mozesz tez sie zastanowic nad tym zeby na wejscie sieci podawac nie obraz, a pewne wskazniki opisujace obraz i w takim przypadku mozesz uzyc wskaznikow niezaleznych od rozmiaru, jak np. momenty geometryczne czy wspolczynniki opisujace ksztalt obiektu.

0

dokladnie wiecej informacji dla sieci neuronowej bo inaczej bedzie sie dalej mylić

1 użytkowników online, w tym zalogowanych: 0, gości: 1