| | Temat wykladu: |
| | Spam: Używanie i łamanie CAPTCHA i filtrów antyspamowych (by JaBoJa, 2007-11-30) @ wyklady.net |
| | Komentarze: http://forum.wyklady.net/index.php?topic=123.0 |
20:34 | JaBoJa | Witam w drugiej części wykładu o filtrach antyspamowych na stronach internetowych. |
20:35 | JaBoJa | Dzisiaj nauczymy się instalować niektóre z takich filtrów, jak również wspomniane będzie jak one działają. |
20:35 | JaBoJa | Pokażę też w jaki sposób można łamać CAPTCHA. |
20:35 | JaBoJa | Zacznę od filtru Sblam! |
20:36 | JaBoJa | Generalnie jego zasada działania osadza się na tym, że w momencie gdy użytkownik wysyła komentarz do artykułu bądź post na forum |
20:36 | JaBoJa | serwer łączy się z serwerem Sblam! przesyłając mu otrzymane nagłówki http |
20:37 | JaBoJa | Serwer z kolei korzystając z różnych filtrów określa czy wiadomość to spam. |
20:37 | JaBoJa | I zwraca liczbę która określa czy to spam, czy dobra wiadomość, albo że filtr nie potrafi tego stwierdzić |
20:38 | JaBoJa | Zazwyczaj gdy wiadomość jest rozpoznana jako spam jej dodanie zostaje zablokowane. |
20:39 | JaBoJa | Skuteczność filtru jest bardzo wysoka i generalnie spamu nie przepuszcza |
20:39 | JaBoJa | Ma natomiast dwie wady: |
20:39 | JaBoJa | Jeśli napiszemy na forum wiadomość z dużą ilością linków, istnieje wysokie prawdopodobieństwo że filtr ją rozpozna jako spam. |
20:40 | JaBoJa | Oraz druga wada: nie zawsze można się połączyć z serwerem Sblam! |
20:41 | JaBoJa | A jeśli filtr nie może się połączyć to przepuszcza wiadomość. |
20:41 | JaBoJa | To znaczy jest tak w standardowych wtyczkach dostępnych na stronie projektu |
20:42 | JaBoJa | Dlatego jeśli mamy forum z możliwością wymagania akceptacji postów przed ich wyświetleniem warto napisać własną wtyczkę, która w niepewnych przypadkach będzie właśnie tak postępować. |
20:42 | JaBoJa | Przejdźmy jednak do sedna sprawy, czyli instalacji wtyczki na własnej stronie: |
20:43 | JaBoJa | Podstawowe wtyczki (ogólna biblioteka dla PHP, oraz wtyczka do phpBB) dostępne są na stronie Sblam: |
20:43 | JaBoJa | http://sblam.com/ |
20:44 | JaBoJa | W dziale "Opis instalacji" dostępne są też inne wtyczki |
20:44 | JaBoJa | Wtyczki dostępne są na stronie Sblam |
20:44 | JaBoJa | http://sblam.com/instalacja.html |
20:45 | JaBoJa | Po ściągnięciu pliku ZIP z wtyczkami znajdziemy w nim 3 pliki biblioteki oraz folder z wtyczką dla phpBB |
20:45 | JaBoJa | Wtyczki tej nie będę omawiał, bo jej instalacja przebiega w podobny sposób jak innych wtyczek dla tego forum. |
20:46 | JaBoJa | Jeśli natomiast mamy niestandardowy skrypt i chcemy wzbogacić go o filtr Sblam! to interesować będą nas dwa pliki: |
20:46 | JaBoJa | sblamtest.php - zawierający właściwą wtyczkę |
20:47 | JaBoJa | sblam.js.php - skrypt JavaScript, który powinien być dołączony pod formularzem na stronie (jeśli go nie dodamy prawdopodobieństwo że filtr wytnie wszystkie wiadomości z linkami rośnie diametralnie :P) |
20:48 | JaBoJa | Oprócz wgrania tych dwóch plików na nasz serwer musimy jeszcze stworzyć sobie tzw. klucz API |
20:49 | JaBoJa | Jest to losowy ciąg identyfikujący naszą stronę w systemie i dający nam pewność że tylko my będziemy mieli dostęp do statystyk filtru (bo takowe istnieją) |
20:49 | JaBoJa | Aby go utworzyć wchodzimy na stronę: |
20:49 | JaBoJa | http://sblam.com/key.html |
20:50 | JaBoJa | Z tej samej strony możemy się zalogować (podając tenże klucz) aby zobaczyć jakie wpisy były analizowane ostatnio przez filtr i jak zostały sklasyfikowane |
20:51 | JaBoJa | Następnie w pliku odpowiedzialnym za dodawanie nowych wiadomości do bazy danych czynimy co następuje: |
20:51 | JaBoJa | Dołączamy bibliotekę poprzez require_once('sblamtest.php'); |
20:52 | JaBoJa | W miejscu gdzie skrypt już wie że wysłano wiadomość, ale jeszcze jej nie dodał do bazy dodajemy kod: |
20:53 | JaBoJa | $i = sblamtestpost(null, 'naszkluczapi'); |
20:53 | JaBoJa | zamiast null możemy dodać też tablicę z nazwami pól formularza, jeśli są niestandardowe |
20:54 | JaBoJa | (szczególy są na stronie filtru) |
20:54 | JaBoJa | W tym momencie w zmiennej $i mamy ocenę wiadomości |
20:55 | JaBoJa | jeśli jest dodatnia oznacza to że jest spamowa i warto ją wyciąć |
20:55 | JaBoJa | powinniśmy dodać coś w stylu: |
20:55 | JaBoJa | if ($i>0) { |
20:56 | JaBoJa | show_error('Wiadomosc rozpoznana jako spam. Jesli filtr sie pomylil <a href="'.sblamreporturl().'">kliknij tu</a>.'); |
20:56 | JaBoJa | return false; |
20:56 | JaBoJa | } |
20:57 | JaBoJa | To jest najbardziej standardowe uzycie fltru |
20:58 | JaBoJa | W ten sposób działa on we wtyczce phpBB, a także we wtyczce do Phorum (notabene mojego autorstwa). |
20:59 | JaBoJa | Dla zainteresowanych podaję adres z wtyczką do Phorum: |
20:59 | JaBoJa | http://www.phorum.org/phorum5/read.php?58,123919 |
20:59 | JaBoJa | Co mogę jeszcze doradzić ewentualnym użytkownikom to dodanie mozliwosci wyslania postu odrzuconego przez filtr po podaniu kodu z obrazka. |
21:00 | JaBoJa | Bo pomylki sie jednak zdarzaja. |
21:00 | JaBoJa | No i wspomnianej juz wczesniej moderacji. |
21:00 | JaBoJa | Są pytania? |
21:01 | JaBoJa | Skoro nie, to przejdźmy dalej. |
21:02 | JaBoJa | Kolejną linią obrony przed spamem są filtry działające nim w ogóle uruchomiony zostanie jakikolwiek skrypt PHP. |
21:02 | JaBoJa | Opiszę tu dwa takie filtry: |
21:02 | JaBoJa | Czarną listę ze strony Sblam oraz BadBehavior |
21:02 | JaBoJa | Czarna lista jest po prostu listą adresów IP z których filtr Sblam! otrzymywał tylko i wyłącznie spam. |
21:03 | JaBoJa | Jest aktualizowana codziennie, więc jak ktoś ma taką możliwość to warto dodać sobie taką aktualizację do cron'a. |
21:04 | JaBoJa | Dostępna jest w dwóch wersjach: zwykłego pliku tekstowego z jednym IP na linię oraz pliku .htaccess |
21:04 | JaBoJa | Oczywiście dla nas bardziej przydatny będzie .htaccess |
21:04 | JaBoJa | Wchodzimy więc na stronę: http://sblam.com/czarnalista.html |
21:04 | JaBoJa | I ściągamy z niej ten plik |
21:04 | JaBoJa | A następnie wgrywamy na serwer zawierający naszą stronę |
21:05 | JaBoJa | W tym momencie obciążenie serwera przez najbardziej natrętne spam-boty powinno znacznie spaść. |
21:05 | JaBoJa | Podobny efekt daje BadBehavior |
21:06 | JaBoJa | który mimo że jest skryptem PHP, to z powodu odcięcia dostępu do strony botom nim odbiorą chociażby bajt kodu strony zmniejsza obciążenie serwera, miast zwiększać (jak to by mogło się na pierwszy rzut oka wydawać) |
21:07 | JaBoJa | Jest on dostępny na stronie: http://www.bad-behavior.ioerror.us/ |
21:08 | JaBoJa | Do podstawowego działania wystarczy że wgramy go na serwer i dołączymy w jakimś pliku PHP wywoływanym przez wszystkie skrypty (np. common.php) |
21:08 | JaBoJa | Do pełnego wykorzystania jego możliwości warto jednak dać mu dostęp do bazy danych |
21:09 | JaBoJa | To niestety wymaga już trochę pracy z naszej strony i różni się w zależności od tego jak działają nasze skrypty, toteż nie podam tu gotowej recepty. |
21:09 | JaBoJa | Na szczęście jednak dla CMSów takich jak WordPress dostępne są gotowe wtyczki na których można się wzorować. |
21:10 | JaBoJa | W każdym razie lektura dokumentacji będzie wskazana ;). |
21:11 | JaBoJa | Zapewne jednak ciekawi was jak te wszystkie filtry działają, a może nawet chcieli byścia napisać własny? |
21:11 | lidia | ba ;> |
21:13 | JaBoJa | Spytam więc dla pewności, czy są jakieś pytania, a jeśli nie to przejdę do opsiu zasady działania filtru Bayesa, na którym osadza się m.in. Sblam! (jak również filtry antyspamowe Mozilli Thunderbird i nie tylko) |
21:13 | JaBoJa | Any questions? |
21:14 | JaBoJa | Ładny opis filtru Bayesa znajduje się na stronie http://www.gazeta-it.pl/2,14,111,index.html |
21:14 | JaBoJa | Na czym jednak opiera się ta idea? |
21:14 | JaBoJa | Jest to swego rodzaju rozszerzenie wykrywania spamu na podstawie słów kluczowych. |
21:15 | JaBoJa | Filtr posiada bazę słów, ale zamiast wartości binarnych spam/nie spam przechowuje prawdopodobieństwa że dane słowo występuje w wiadomości która jest spamem (lub dobrą wiadomością - kwestia implementacji) |
21:16 | JaBoJa | Gdy przychodzi nowa wiadomość dzielona jest na słowa i dla każdego z nich pobrane zostaje z bazy prawdopodobieństwo. |
21:16 | JaBoJa | Słowa których brak w bazie dostają, zgodnie z w/w artykułem, prawdopodobieństwo 0,4 |
21:17 | JaBoJa | (ja osobiście dał bym troszkę ponad 0,5 aby od razu wycinać wiadomości w obcych językach) |
21:17 | JaBoJa | Potem liczone jest prawdopodobieństwo dla całej wiadomości: |
21:18 | JaBoJa | Załóżmy że wiadomość składa się z dwóch słów o prawdopodobieńśtwach odpowiednio A i B |
21:18 | JaBoJa | Prawdopodobieństwo że wiadomość to spam obliczmy ze wzoru: |
21:19 | JaBoJa | P = ( P(A) * P(B) ) / ( P(A)*P(B) + P(nie A)*P(nie B) ) |
21:19 | JaBoJa | czyli: |
21:20 | JaBoJa | $p = ($a*$b) / ($a*$b + (1-$a)*(1-$b)); |
21:20 | JaBoJa | analogicznie postępujemy dla większej ilości słów |
21:21 | JaBoJa | Filtr powinien jednak umieć uczyć się z otrzymywanych wiadomości, dlatego też prawdopodobieńśtwa powinny być modyfikowane na podstawie słów w danej wiadomości (gdy już wiemy czy jest dorba czy zła) |
21:22 | JaBoJa | Osoby zainteresowane szczegółami odsyłam jednak do wspomnianego artykułu: |
21:22 | JaBoJa | http://www.gazeta-it.pl/2,14,111,index.html |
21:22 | JaBoJa | To tyle w temacie filtrów. Czy coś było niejasne? |
21:24 | JaBoJa | Skoro brak pytań to przejdę do drugiej części wykładu czyli testów Turinga zwanych CAPTCHA. |
21:24 | JaBoJa | Na początek nauczymy się instalować takowe na własnej stronie |
21:24 | JaBoJa | O tym dlaczego nie warto tego robić pisałem w poprzednim wykładzie. Jeśli ktoś jednak czuje że niezbędnie ich potrzebuje to zaraz podam gotowca ;). |
21:25 | JaBoJa | Wybrałem system reCAPTACHA bo przy okazji robi coś dla ludzkości, a mianowicie pomaga przenosić książki do postaci cyfrowej |
21:26 | JaBoJa | bo dostajemy dwa słowa: jedno znane systemowi, a drugie z książki, a którego nie mógł odczytać OCR. |
21:27 | JaBoJa | Najsampierw oczywiscie (:() musimy zarejstrować się na stronie reCAPTCHA: |
21:27 | JaBoJa | http://recaptcha.net/ |
21:28 | JaBoJa | Przy rejestracji podajemy adres strony na której chcemy zainstalować filtr, co ma służyć kwestiom bezpieczeństwa. |
21:28 | JaBoJa | (zapewne utrudnić łamanie kapcz metodą pornograficzną) |
21:29 | JaBoJa | Gdy już zarejestrujemy się na stronie i podamy na niej adres naszej strony, otrzymujemy dwa klucze: |
21:29 | JaBoJa | prywatny i publiczny |
21:29 | JaBoJa | musimy je podać w kodzie skryptu, aby system mógł nas poprawnie zidentyfikować |
21:30 | JaBoJa | W tym momencie możemy też pobrać pliki ze skryptami PHP niezbędnymi do użycia reCAPTCHA |
21:30 | JaBoJa | Użycie skryptu na stronie jest banalnie proste |
21:31 | JaBoJa | Na serwer musimy wgrać plik recaptchalib.php |
21:31 | JaBoJa | I daje on nam dwa narzędzia: |
21:31 | JaBoJa | CAPTCHA'ę jako taką |
21:31 | JaBoJa | ukrywacz adresów e-mail |
21:31 | JaBoJa | ten drugi podowuje że adres pojawia się dopiero po podaniu kodu z kapczy |
21:32 | JaBoJa | Nas najprawdopodobniej interesuje jednak przede wszystkim CAPTCHA |
21:33 | JaBoJa | Na stronie na której ma się pojawić okienko z tekstem do rpzepisania dołączamy przez require_once skrypt recaptchalib.php |
21:34 | JaBoJa | A kod HTML okienka z kapczą uzyskujemy wywołując funkcję recaptcha_get_html($klucz_publiczny) |
21:34 | JaBoJa | możemy je wyświetlić chociażby przez echo, acz zwykle będziemy zapewne chcieli przekazać je do jakiegoś systemu szablonów |
21:34 | JaBoJa | echo recaptcha_get_html($klucz_publiczny); |
21:35 | JaBoJa | Następnie w miejscu gdzie skrypt odbiera dane z formularza musimy: |
21:35 | JaBoJa | Dołączyć skrypt recaptchalib.php, jeśli jeszcze tego nie zrobiliśmy. |
21:36 | JaBoJa | wywołać funkcjęrecaptcha_check_answer($klucz_prywatny, $_SERVER["REMOTE_ADDR"]) |
21:36 | JaBoJa | (oj, skleiło się - jeszcze raz) |
21:37 | JaBoJa | $resp = recaptcha_check_answer ($klucz_prywatny, $_SERVER["REMOTE_ADDR"] |
21:38 | JaBoJa | $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); |
21:38 | JaBoJa | if ($resp->is_valid) { |
21:39 | JaBoJa | show_error('Podałeś zły kod!'); |
21:39 | JaBoJa | return false; |
21:39 | JaBoJa | } |
21:40 | JaBoJa | Mamy też do dyspozycji zmienną $resp->error, zawierającą komunikat reCAPTCHA'y. |
21:40 | JaBoJa | I ot cała instalacja CAPTCHA'y na stronie. |
21:41 | JaBoJa | Przypomnę tylko jeszcze raz złote reguły którymi powinniśmy się kierować przy użyciu CAPTCHA: |
21:41 | JaBoJa | 1. Wymagać jej wpisywania jak najrzadziej. Najlepiej nie pokazywać jej jeśli użytkownik jest zalogowany, a jeśli już raz pokarzemy to pamiętać fakt poprawnego jej podania w sesji. |
21:43 | JaBoJa | 2. Jeśli to możliwe stosować filtry antyspamowe. Najlepiej gdyby CAPTCHA była tylko ich uzupełnieniem pojawiającym się gdy np. filtr nie może połączyć się z serwerem, bądź aby dać szansę użytkownikowi którego wiadomość została omyłkowo uznana za spam. |
21:43 | JaBoJa | Drugim ciekawym rozwiązeniem CAPTCHA o jakim chciałbym dziś wspomnieć jest "Did You Pass Math?" |
21:43 | JaBoJa | Niestety oryginalny skrypt działa tylko z WordPressem. |
21:44 | JaBoJa | Instalacja jest tu banalna i sprowadza się do wgrania wtyczki na serwer i aktywowania jej w WordPressie. |
21:45 | JaBoJa | Chciałbym jednak powiedzieć jak to działa, a właściwie jak napisać takie coś samemu. |
21:45 | JaBoJa | Dla przypomnienia z poprzedniego wykładu: |
21:45 | JaBoJa | Adres wtyczki: http://www.herod.net/dypm/ |
21:46 | JaBoJa | Zasada działania: podajemy wynik działania które dostajemy sformuowane słownie (aby boty nie mogły użyć np. funkcji "eval()"). |
21:46 | JaBoJa | Właściwie cała wtyczka opiera się na tym słownym formuowaniu zadania. |
21:46 | JaBoJa | Dla stworzenia takiego CAPTCHA warto zacząć od: |
21:47 | JaBoJa | stworzenia bazy szablonów pytań, np.: |
21:47 | JaBoJa | Ile to jest %s? |
21:47 | JaBoJa | Jaki jest wynik działania, %s? |
21:47 | JaBoJa | itp. |
21:47 | JaBoJa | Można również bardziej złożone: |
21:48 | JaBoJa | Jaka jest wartość sumy liczb %i oraz %i? |
21:48 | JaBoJa | Skrypt powinien zawierać też nazwy działań (chyba że będą one częścią pytań) |
21:49 | JaBoJa | %i dodać %i |
21:49 | JaBoJa | suma %i i %i |
21:49 | JaBoJa | %i plus %i |
21:49 | JaBoJa | %i dodane do %i |
21:49 | JaBoJa | itp. |
21:49 | JaBoJa | analogicznie dla innych działań |
21:50 | JaBoJa | liczby oczywiście losujemy i zapamiętujemy w sesji (ale po jednokrotnym przesłaniu bezwzględnie je z niej usuwamy!) |
21:50 | JaBoJa | nie wolno ich przekazywać w ukrytych polach formularza, nawet w postaci zaszyfrowanej |
21:51 | JaBoJa | bo inaczej skuteczność filtru będzie podobna jak skuteczność zwykłego checkboxa z napisame "zaznacz aby potwierdzić że wiadomość to nie spam" |
21:51 | JaBoJa | warto też liczby podawać słownie |
21:52 | JaBoJa | acz dla wygody użytkownika możemy pozostać przy cyfrach |
21:52 | JaBoJa | gdy już mamy pytanie możemy je od razu wyświetlić na stronie |
21:52 | JaBoJa | ale aby dodać kolejną trudność warto podać je w formie obrazka |
21:53 | JaBoJa | autor bota oczywiście nadal może jakoś to złamać, ale musi już przebrnąć przez kilka etapów: |
21:54 | JaBoJa | użyć OCR do przeczytania pytania |
21:55 | JaBoJa | skonstruować bazę z szablonami pytań (tak więc nie warto publikować jej jako OpenSource :P) |
21:55 | JaBoJa | na podstawie tej bazy przetłumaczyć działanie na postać zrozumiałą dla komputera |
21:55 | JaBoJa | obliczyć, co już będzie trywialne w obliczu powyższych trudności z dojściem do tego etapu |
21:57 | JaBoJa | Filtr ma też dodatkową zaletę: oprócz botów filtruje dzieci neostrady (wystrczy dać zadania z potęgami, aby odciąć dostęp zbyt młodym używkownikom :P). |
21:57 | JaBoJa | Są jakieś pytania? |
21:59 | diabel | w sumie to nei |
21:59 | diabel | a to juz koniec ? |
21:59 | JaBoJa | Nie, jeszcze łamanie kapcz zostało :> ;) |
22:00 | JaBoJa | Tylko wkleję gdzieś kod programu, aby go pokazać |
22:00 | mith | <spam>nopaste.pl</spam> |
22:00 | diabel | mith: znowu |
22:00 | diabel | z tymi swoimi |
22:00 | diabel | adsense ? |
22:00 | mith | wyjdz |
22:00 | diabel | hahaha |
22:01 | diabel | wiedzialem |
22:01 | diabel | :D |
22:01 | JaBoJa | Kod programu znajduje się tutaj: |
22:01 | JaBoJa | http://nopaste.gamedev.pl/?&id=1432 |
22:02 | JaBoJa | Jak widać jest to dość prymitywny program w C++ korzystający z biblioteki Allegro. |
22:02 | JaBoJa | W przykładzie użyję orbazka wygenerowanego przez CAPTCHA na stronach Wirtualnej Polski. |
22:04 | JaBoJa | |
22:05 | JaBoJa | Wydawało by się że obrazek wtapia się w tło |
22:05 | JaBoJa | nic bardziej mylnego |
22:05 | JaBoJa | Uruchamiamy program |
22:05 | JaBoJa | pierwszy filtr jaki zastosuje to progowanie. |
22:06 | JaBoJa | ustalamy pewien próg aby przerobić obraz na czerń i biel |
22:06 | JaBoJa | Literki jakie otrzymujemy są dosyć ostre, tylko krawędzie są nieco poszarpane i wokół jest trochę śmieci w postaci pojedynczych pikseli. |
22:08 | JaBoJa | --img--- http://img443.imageshack.us/img443/1941/44476435xs0.png |
22:08 | JaBoJa | Oto ^^^ rezultat. |
22:09 | JaBoJa | Do czego jednak dążymy, to rozdzielenie poszczególnych liter i szum nieco nam przeszkadza |
22:09 | JaBoJa | bo uzyskali byśmy wiele jednopikselowych "liter". |
22:10 | JaBoJa | Nie jest to jednak problem, bo możemy sobie napisać kolejny filtr. |
22:10 | JaBoJa | Przeglądamy obraz punkt po punkcie |
22:10 | JaBoJa | i dla każdego punktu liczymy sąsiadów |
22:10 | JaBoJa | Jeśli liczba sąsiadów o tym samym kolorze jest mniejsza od jakiegoś progu, np. 2, to zmianiemy kolor punktu |
22:11 | JaBoJa | W ten sposób zostają wycięte pojedyncze czarne piksele na białym tle et vice versa. |
22:11 | JaBoJa | (no, może w tym przypadku akurat tło jest szare, ale to nie ma znaczenia) |
22:11 | JaBoJa | |
22:11 | JaBoJa | Tak to wygląda w tym momencie |
22:12 | JaBoJa | Jak widzimy nie wszystko udało nam się wyciąć |
22:12 | JaBoJa | Jest spowodowane to tym że filtr jest dość prosty |
22:12 | JaBoJa | Jeśli ktoś chce może więc wyciąć w ogóle zwarte obszary składające się z mniej niż iluś tam pikseli. |
22:13 | JaBoJa | Albo, alternatywnie, obliczyć średnią bądź medianę z położenia punktu w pionie i usunąć obszary które nie zawierają punktów znajdujących się w jej okolicach |
22:14 | JaBoJa | To wszystko jednak wymaga własnej implementacji funkcji flood_fill, tak aby dopuszczała ona 1-2 pikselowe "dziury" w obszarach. |
22:14 | JaBoJa | Co widać w powyższym przykładzie w literze "j" która ma poziomą szparę, którą taki floof_fill powinien przeskoczyć. |
22:15 | JaBoJa | (notabene to jest też argument za stosowaniem małych lub wręcz zerowych odległości m-dzy literami we własnych kapczach) |
22:16 | JaBoJa | Ja jednak nie stosowałem własnej funkcji flood_fill toteż musiałem pozbyć się tych szumów w inny sposób |
22:16 | JaBoJa | Użyłem w tym celu rozmycia |
22:16 | JaBoJa | Co nam ono daje? |
22:16 | JaBoJa | Otórz małe obszary zrobią się szare, a nie czarne, a szpary trochę poczernieją od sąsiadującej z nimi czerni |
22:17 | JaBoJa | Potem możemy po raz wtóry zastosować na obrazku progowanie, przez co uzyskamy litery bez dziurek |
22:18 | JaBoJa | Niestety będą one troche mniej kształtne |
22:18 | JaBoJa | To efekt uboczny rozmycia |
22:19 | JaBoJa | Zobaczmy więc jak będzie zmieniał się nasz obrazek po użyciu rozmycia i progowania: |
22:19 | JaBoJa | Rozmycie: |
22:23 | JaBoJa | |
22:23 | JaBoJa | Oraz progowanie: |
22:23 | JaBoJa | |
22:24 | JaBoJa | W tym miejscu mój programik jeszcze raz próbuje odciąć szumy, ale szczerze mówiąc nie wiem czy to konieczne. |
22:24 | JaBoJa | |
22:25 | JaBoJa | No i finał rozdzielania liter: |
22:25 | JaBoJa | |
22:26 | JaBoJa | Tu użyłem po prostu ich kolorowania, aby pokazać że już dają się rozdzielić, i jak program je dzieli. |
22:26 | JaBoJa | W praktyce jednak koniczene będzie użycie jakiegoś algorytmu dzielącego obrazek na mniejsze - zawierające poszczególne literki. |
22:26 | JaBoJa | Co możemy zrobić dalej? |
22:26 | JaBoJa | Na pewno musimy użyć jakiegoś filtru rozpoznającego litery. |
22:27 | JaBoJa | Możemy np. spróbować skonstruować sieć neuronową. |
22:27 | JaBoJa | Wtedy musieli byśmy popomniejszać nieco literki, do jakiegoś rozmiaru w którym będą rozpoznawalne, ale nie będą wymagały zbyt wielu nauronów w sieci. |
22:28 | JaBoJa | Tym którzy chcieli by napisać OCR tą metodą polecam poszukać informacji na temat komórkowych sieci neuronowych |
22:29 | JaBoJa | (działa to w ten sposób, że dla każdego piksela tworzymy neuron i każdy taki piksel-neuron jest połączony ze swoim sąsiadem (w sumie 8 sąsiadów). |
22:29 | JaBoJa | (lub 4 w innej wersji) |
22:30 | JaBoJa | Artykuł na ten temat ukazał się w "Software 2.0" z lutego 2002 roku |
22:30 | JaBoJa | Mamy jednak jeszcze dwie inne możliwości |
22:31 | JaBoJa | Jeśli mamy do czynienia z prymitywną kapczą nie obracającą liter i kożystającą zawsze z tej samej czcionki o tym samym rozmiarze (jak np. ta w phpBB) to możemy przygotować sobie obrazki wszystkich liter |
22:31 | JaBoJa | a następnie dopasowywać je po kolei sprawdzając które najmniej się różnią. |
22:32 | JaBoJa | W sumie sieć neuronowa wewnętrznie robiła by coś podobnego. |
22:32 | JaBoJa | Natomiast jeśli literki są bardzo powyginane, to sprawa jest trudniejsza. |
22:32 | JaBoJa | Możemy natomiast spróbować przekształcić je na krzywe. |
22:32 | JaBoJa | A następnie rozpoznawać w następujący sposób: |
22:33 | JaBoJa | Ile zamkniętych obszarów zawierają? |
22:33 | JaBoJa | jeśli dwa to może to być duże B albo cyfra 8 |
22:34 | JaBoJa | jeśli jeden to jedna z cyfr bądź liter 4690QROPADqeopadgb |
22:34 | JaBoJa | jeśli zero to któraś z pozostałych |
22:35 | JaBoJa | pomocna może też być kropka, ale w tym celu musieli byśmy umieć przyporządkować ją jednej z liter |
22:35 | JaBoJa | można szukać na etapie usówania szumu punktów o średnicy podobnej do grubości liter, a znajdujących się powyżej liter |
22:35 | JaBoJa | co dalej możemy zrobić? |
22:36 | JaBoJa | sprawdzić ile "antenek" (wierzchołków grafu z których wychodzi dokładnie jedna krawędź) ma litera |
22:36 | JaBoJa | litery takie jak na przykład T albo y mają trzy "antenki" |
22:37 | JaBoJa | a ma jedną (ten mały pypeć na dole się nie liczy bo mieści się w granicy szumu :P) |
22:37 | JaBoJa | I ma dwie |
22:37 | JaBoJa | L też |
22:37 | JaBoJa | i tu dochodzimy do kolejnej odróżniającej cechy |
22:38 | JaBoJa | możemy wykrywać punkty w których linia pod dużym kątem się wygina |
22:38 | JaBoJa | i będą to wierzchołki stopnia 2 |
22:38 | JaBoJa | stosując nomenklaturę teorii grafów |
22:39 | JaBoJa | i tak np. litera W to wierzchołek stopnia 1 ("antenka") w górnym lewym rogu, potem wierzchołek stopnia 2 poniżej połowy wysokości, wierzchołek stopnia 2 powyżej połowy wysokości, wierzchołek stopnia 2 poniżej połowy wysokości i wierzchołek stopnia 2 (kolejna antenka) w prawym górnym rogu |
22:40 | JaBoJa | w ten sposób liczba pomyłek spada |
22:41 | JaBoJa | niestety zawsze zostają takie trudne glify jak j-i-l-1, o-0-Q itp. |
22:41 | JaBoJa | ale tak na prawdę to jeśli tekst jest znacznie zdeformowany to i ludzie mogą mieć z nimi trudności ;) |
22:42 | JaBoJa | I tym oto sposobem doszliśmy do końca materiału przewidzianego na dzisiejszy wykład. |
22:42 | JaBoJa | Kto ma pytania? |
22:43 | ant_ | ja: nikt nie sluchal? |
22:43 | ant_ | JaBoJa: przykro mi ;> |
22:43 | JaBoJa | zawsze trafi do logów :P |
22:44 | ant_ | i jeszcze jedno mam |
22:44 | ant_ | o czym to bylo? |
22:44 | ant_ | ;-) |
22:44 | ant_ | nvm. |
22:44 | JaBoJa | o zabezpieczaniu stron przed spamem |