OCR - teoria działania

0

Witam

Zajmuje się aktualnie zagadnieniem odczytywania liter z obrazków. Bez problemu jestem w stanie wyciągnąć litery z obrazka oraz ustawić je pionowo. Zawsze rozpoznanie wykonywałem poprzez rozpoznawanie cech charakterystycznych lub dopasowania do wzorca. Aktualnie chciałbym wykorzystać sieci, gdyż obydwie metody bardzo zawodzą. Czytam od kilku dni publikacje na temat sieci neuronowych jednak nadal nie mogę zrozumieć zasady ich uczenia i rozpoznawania. Czy jest ktoś w stanie przedstawić w przystępny sposób takie zagadnienie:

  • Po podaniu na wejście danych (piksele lub elementy obszaru litery) muszę je przemnożyć przez wagi i co dalej ? W jaki sposób mam wiedzieć która wartość na które wyjście ma zostać podana
  • Uczenie sieci - po błędnym rozpoznaniu skąd program ma wiedzieć którą/e wagi zmienić i w jaki sposób (zmniejszyć czy zwiększyć)

Z góry bardzo dziękuje za pomoc
D.B.

0

W przypadku rozpoznawania tekstu to sieć powinna mieć tyle wyjść ile liter. Wynikiem jest litera, której przypisana jest najwyższe wyjście. Przykładowym wyjściem danych treningowych dla A byłoby (1 0 0 ...). Jest wiele technik uczenia sieci, w tym przypadku zacząłbym od propagacji wstecznej, jest chyba najpopularniejsza i w miarę prosta (http://en.wikipedia.org/wiki/Backpropagation).

PS wagi same wynikają w procesie uczenia, ogólnie podczas niego minimalizujesz funkcję błędu.

0

A więc sieć powinna mieć 60 wejść oraz 10 wyjść zakładając, że każda liczba składa się z 60 pikseli a jest ich 10. A co z wagami i kwestią uczenia itd. ?

Edit. Ślicznie dziękuje za ten link z przykładem w php, za momencik spróbuje coś napisać :)

0

Piksele są złym wyborem jako dana wejściowa do interpretacji obrazów. Ja bym spróbował zrobić funkcję jakiś parametrów wyznaczonych z tych obrazów. Od wag ważniejsza jest struktura sieci, przed uczeniem wagom możesz przypisać losowe wartości. Spróbuj ogarnąć ten kurs http://www.ml-class.org/course/auth/welcome , jako jedno zadań programistycznych jest właśnie rozpoznawanie cyfr za pomocą sieci neuronowych. Dodatkowo da Ci to trochę podstaw (sam się zacząłem z tego uczyć, ale musiałem naukę przyspieszyć, do czerwca bym się chciał z magisterką wyrobić). PHP może nie być najlepszym językiem do tych zagadnień, radziłbym albo Matlaba/Octave'a, albo Pythona+numpy.

0

Muszę zobaczyć, aktualnie php świetnie się sprawdzało w tego typu zagadnieniach. Musi to być aplikacja działająca na hostingach dlatego wybór padł na tej język. Jakieś propozycje jakie dane podać na wejście sieci ?

0

Do rozpoznawania znaków świetnie nada się sieć Kohonena. Robiłem kiedyś program do rozpoznawania znaków ale gdzieś mi się zapodział. generalnie neuronów powinno być trochę więcej niż liter alfabetu, ponieważ na pewno się zdarzy, że kilka neuronów będzie się pobudzało na ten sam znak(ale inaczej napisany). Sama procedura uczenia sieci Kohonena jest prostsza od backpropa. Poza tym backprop jest bardzo wolno zbieżny i często grzęźnie w minimach lokalnych. Jeżeli już się uparłeś na sieć feedforward to przynajmniej zmodyfikuj backprop na momentowy(jeden współczynnik więcej, efekt znacznie lepszy), lub zastosuj inny algorytm(np. algorytm Levenberga-Marquardta, który jest znacznie szybciej zbieżny).

0

Nie wybrałem jeszcze metody, dopiero robię rozeznanie czego można użyć i co uda mi się zrozumieć, dlatego wszelkie propozycje i przykłady są mile widziane :)

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