Łamanie captcha – Tesseract OCR
Tesseract
Najpierw należy ściągnąć odpowiednią wersję instalacyjną Tesseract’a oraz program do edycji plików BOX np. jTessBoxEditor. Na podstawie bazy treningowej w postaci obrazków captcha i przy użyciu narzędzi Tesseract, wygenerujemy odpowiednie pliki w celu utworzenia pliku treningowego. Na podstawie tego pliku, Tesseract będzie starał się przetworzyć obrazek i rozpoznać znajdujące się na nim znaki. Jeśli tło captchy jest skomplikowane, możemy postarać się je oczyścić np. za pomocą programu ImageMagick i dołączonego w nim narzędzia convert.
Baza treningowa
Pliki BOX zawierają znaki oraz ich pozycje w analizowanym obrazku treningowym. Na podstawie bazy próbek captcha (np. 20) wygenerujemy pliki BOX oraz poprawimy wyniki działania mechanizmu OCR, aby jak najlepiej przygotować dane treningowe.
Generacja plików BOX
Pierwszym etapem jest utworzenie plików BOX dla każdego obrazka w naszej bazie. Tesseract spróbuje rozpoznać znaki z obrazka i zapisze ich reprezentacje (znak, pozycje, wymiary) do tego pliku. Polecenie, które generuje plik BOX wygląda następująco:
tesseract eng.captchalang.exp1.bmp eng.captchalang.exp1 batch.nochop makebox
Należy przestrzegać podanego nazewnictwa plików [Język].[Czcionka].exp[Numer]. W przeciwnym razie, w dalszej części mogą wystąpić błędy.
Przy dużej ilości danych treningowych warto napisać sobie skrypt powłoki, który wykona odpowiednie komendy dla wszystkich obrazków.
Edycja plików BOX
Następnym krokiem jest poprawienie wyników OCR. W zależności od poziomu trudności captchy, skuteczność na tym etapie może być różna. Do edycji użyję jTessBoxEditor. Każdy plik BOX należy sprawdzić i poprawić ewentualne błędy. Dostępne są operacje scalania (np. kropka nad i), rozdzielania itd.
Uczenie
Mając poprawnie przygotowane pliki BOX można przystąpić do utworzenia plików TR (train) oraz pozostałych niezbędnych plików do wygenerowania zagregowanego pliku treningowego.
Pliki TR
Komenda na wygenerowanie pliku TR na podstawie obrazka oraz BOX wygląda następująco (uwaga na schemat nazewnictwa):
tesseract eng.captchalang.exp1.bmp eng.captchalang.exp1 box.train
Należy ją wywołać dla wszystkich plików BOX.
Plik Unicharset
Następnym krokiem jest utworzenie pliku, który zawiera wszystkie możliwe znaki z bazy treningowej. Należy w jednej komendzie podać wszystkie pliki BOX oddzielając spacją. Komenda wygląda następująco:
unicharset_extractor eng.captchalang.exp1.box eng.captchalang.exp2.box ...
Plik font_properties
Plik opisujący naszą czcionkę, którą uczymy. Należy go stworzyć ręcznie. Jego zawartość może wyglądać następująco:
captchalang 1 0 0 1 0
Łączenie
Mając przygotowane dane treningowe, można je połączyć aby wygenerować charakterystykę rozpoznawanej czcionki. W tym celu wykonaj następujące komendy:
shapeclustering -F font_properties -U unicharset eng.captchalang.exp1.tr eng.captchalang.exp2.tr ...
mftraining -F font_properties -U unicharset -O unicharset eng.captchalang.exp1.tr eng.captchalang.exp2.tr ...
cntraining eng.captchalang.exp1.tr eng.captchalang.exp2.tr ...
Finalizacja
Przed połączeniem plików, należy zmienić nazwy wygenerowaych plików: inttemp, unicharset, shapetable, normproto, pffmtable dodając prefix captchalang. Czyli w efekcie: captchalang.inttemp itd. Nastepnie wywołaj komendę:
combine_tessdata captchalang.
Efektem działania będzie plik treningowy captchalang.traineddata, który należy skopiować do folderu tessdata w głównym katalogu programu Tesseract.
Użycie
Mając zainstalowany plik treningowy, możemy sprawdzić jego działanie na łamanej captchy. W tym celu dodamy parametr l, w którym podamy nazwę naszego pliku treningowego – captchalang.
tesseract captcha.png captcha.txt -l captchalang
Podsumowanie
Na podstawie utworzonego pliku treningowego, osiągnąłem skuteczność rozpoznawania captchy na poziomie ~30%.
Strona Internetowa
Potrzebujesz ładnej strony internetowej? Zobacz demo na: tej stronie
Komentarze