Autorzy: Natalia Nowak, Jakub Gruszka
Raport z projektu: Metody i algorytmy sztucznej inteligencji, ARE3513
Prowadzący: dr inż. Witold Paluszyński
Data: 4 czerwca 2008r.
Prezentacja problemu.
Celem zadania jest opracowanie algorytmu rozpoznającego numer konta bankowego
pobranego z druku przelewu/wpłaty. Rozpoznawanie pisma ręcznego jest zagadnieniem
bardzo skomplikowanym i możemy je podzielić na następujące etapy:
wycięcie całego ciągu cyfr z przekazu bankowego,
zamiana obrazu kolorowego na obraz w skali szarości,
rozdzielenie cyfr z całego numeru konta bankowego,
wydobycie cech z obrazu,
klasyfikacja danego obrazu.
Metody rozwiązania problemu.
Analiza problemu.
W znalezionych przez nas materiałach było bardzo dużo informacji na temat rozpoznawania
pisma maszynowego, natomiast algorytmów rozpoznawania pisma ręcznego było niewiele.
Jedna z nich proponuje podzielenie cyfry na obszar o wymiarach 5x5.
Jednak zaprezentowany algorytm służy do rozpoznawania liter arabskich.
W przypadku cyfr arabskich założyliśmy, że lepsze jest podzielenie cyfry na
obszar o wymiarach 7x5 (cyfry są zazwyczaj wyższe niż szersze).
Co do metod selekcji pojedynczych cyfr nie znaleźliśmy dobrych algorytmów. Z tego
powodu zdecydowaliśmy się na opracowanie własnej metody rozwiązującej problem
wyodrębniania cyfr z ciągu.
Wycięcie numeru konta z druku przelewu.
Nowoczesne skanery mają możliwość automatycznego przycinania skanowanego obrazu.
Dlatego założyliśmy, iż cały obraz będzie zawierał już wykadrowany druk wpłaty.
Ułatwiło to znacznie implementację programu. Pozostał jednak problem jak dobrać
"ramkę", która wytnie tylko numer konta. Został on wyznaczony empirycznie
jako prostokąt:
W celu poprawnej identyfikacji cyfr musimy je najpierw oddzielić od tła.
Druki przelewów mają czerwony kolor tła. Fakt ten został wykorzystany
do zamiany pikseli na kolor biały, jeśli na obrazie dominował kolor czerwony za pomocą formuły:
R>B*1.4+1, gdzie R - wartość obrazu na kanale czerwonym, B - wartość na kanale
niebieskim.
Na samym początku prowadzone zostały także symulacje nad możliwością rozpoznawania
cyfr pisanych niebieskim oraz czarnym tuszem. Problemy związane z brakiem
powtarzalności kolorów zdjęć robionych aparatem cyfrowym (nie posiadamy skanera)
uniemożliwiły dobrą selekcję cyfr niebieskich z czerwonego tła. Nasz program
rozpoznaje numer rachunku pisany czarnym atramentem.
Jeśli suma R+G+B < 220, to obraz jest uznawany za czarny (wstawiana jest wartość 0),
jeśli jest R+G+B > 550, wtedy piksel jest klasyfikowany jako biały (tło).
Obraz następnie poddawany jest przetwarzaniu za pomocą filtru medianowego,
minimalnego oraz maksymalnego. Ma to na celu usunięcie pojedynczych punktów,
które zostały sklasyfikowane jako cyfra (kolor czarny).
Mając już obraz w skali szarości możemy przystąpić do rozdzielenia poszczególnych
cyfr. Algorytm zawiera następujące funkcje:
idzWprawo - powoduje przesunięcie indeksu obrazu (odpowiedzialnego za
numer kolumny obrazu wejściowego) w lewo, aż do napotkania trzech linii (kolumn obrazu),
które zawierają więcej niż dwa piksele czarnego obrazu.
idzWzdluzCyfry - powoduje przesunięcie indeksu obrazu w lewo, aż do napotkania
trzech linii, które zawierają mniej niż dwa piksele czarnego obrazu.
Algorytm działa w następujący sposób:
- najpierw wykonywana jest funkcja idzWprawo, która znajduje nam lewy kraniec
pierwszej cyfry,
- następnie wykonywana jest punkcja idzWzdluzCyfry, która znajduje nam prawy kraniec
cyfry,
- później następuje wycięcie danej cyfry i zapisanie jej do oddzielnego pliku
w katalogu o nazwie wyniki,
- algorytm ten powtarzany jest w pętli 26 razy za każdym razem przypisując do
indeksu początkowego wartość indeksu końcowego + 2.
Należało także rozbudować ten algorytm, gdyż zachodziła czasami sytuacja taka, że cyfry
nachodziły na siebie (zwłaszcza długi daszek cyfry 5). Dodaliśmy dodatkowe założenie
polegające na sprawdzeniu, czy szerokość cyfry jest większa od wysokości. Jeśli tak,
to obraz jest dzielony na pół.
Wydobycie cech z obrazu.
W naszym projekcie wykorzystaliśmy metodę wydobycia cech obrazu pisma ręcznego
zaproponowaną przez dr inż. Mirosława Gajera z Katedry Automatyki AGH.
Proces ekstrakcji cech obrazu polega na tym,
że prostokąt (obraz), w który wpisany został obraz znaku, zostaje podzielony na np.
35 prostokątnych sektorów o identycznych wymiarach. W zależności od kształtu
rozpoznawanego znaku pisma, w pewnych sektorach pikseli czarnych będzie stosunkowo
dużo, a w innych sektorach będzie ich mniej, bądź mogą nie występować tam wcale.
Wartość pojedynczego sektora jest normowana od 0 do 1 (w celu uniezależnienia wartości
cech od wielkości obrazu). Przykładowy efekt pokazany jest na rysunku poniżej.
Klasyfikacja danego obrazu.
Program zawiera bazę już rozpoznanych (nauczonych) cyfr. Za jej pomocą można starać
się sklasyfikować nowy obraz. Służy do tego celu wskaźnik Q definiowany następująco:
gdzie:
j - ilość wzorców w bazie,
cyfra_do_rozpoznania(i) - i-ta cecha cyfry, która jest rozpoznawana.
Tak znaleziony wskaźnik jest podstawą do rozpoznawania cyfr.
Rozwiązaniem jest cyfra, która najmniej różni się od wzorca.
Implementacji programowa.
Program do wydobywania cyfr został napisany w Javie z wykorzystaniem pakietu
graficznego imageJ. Klasyfikator został napisany w Matlabie 7.0. Okno klasyfikatora
zostało pokazane poniżej.
Przeprowadzone eksperymenty.
Najpierw trzeba było stworzyć bazę wzorcowych cyfr. Baza zawiera ok. 500 cyfr
i ich cech. Później przeprowadziliśmy eksperymenty na ok. 30 druczkach.
Wyniki badań:
Cyfry
0
1
2
3
4
5
6
7
8
9
Liczba błędnych rozpoznań
8
5
9
11
2
9
12
1
9
14
Liczba błędnych rozpoznań [%]
7
6
9
10
5
22
30
3
23
28
Wnioski:
Jak wynika z przeprowadzonych badań, skuteczność rozpoznawania cyfry
przedstawioną metodą zależy od rozpoznawanej cyfry. Bardzo dużą skuteczność
uzyskaliśmy dla cyfr 4 oraz 7.
Cyfry 6 i 9 mają najmniejszą skuteczność rozpoznawania. Powodem tego jest
fakt, iż cyfra 9 jest bardzo podoba do cyfry 3 (aż 7 błędów z tym znakiem).
6 najczęściej była mylona z 0.
Rozpoznawanie pisma ręcznego jest bardzo skomplikowanym problemem i bardzo
zależy od charakteru pisma człowieka. Dlatego też skuteczność jego rozpoznawania
jest dużo mniejsza od skuteczności rozpoznawania pisma maszynowego.
Bibliografia:
"Systemy optycznego rozpoznawania znaków pisma",
dr inż. Mirosław Gajer, Katedra Automatyki AGH,
Pomiary Automatyka Robotyka, 4/2008,