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:34JaBoJaWitam w drugiej części wykładu o filtrach antyspamowych na stronach internetowych.
20:35JaBoJaDzisiaj nauczymy się instalować niektóre z takich filtrów, jak również wspomniane będzie jak one działają.
20:35JaBoJaPokażę też w jaki sposób można łamać CAPTCHA.
20:35JaBoJaZacznę od filtru Sblam!
20:36JaBoJaGeneralnie 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:36JaBoJaserwer łączy się z serwerem Sblam! przesyłając mu otrzymane nagłówki http
20:37JaBoJaSerwer z kolei korzystając z różnych filtrów określa czy wiadomość to spam.
20:37JaBoJaI zwraca liczbę która określa czy to spam, czy dobra wiadomość, albo że filtr nie potrafi tego stwierdzić
20:38JaBoJaZazwyczaj gdy wiadomość jest rozpoznana jako spam jej dodanie zostaje zablokowane.
20:39JaBoJaSkuteczność filtru jest bardzo wysoka i generalnie spamu nie przepuszcza
20:39JaBoJaMa natomiast dwie wady:
20:39JaBoJaJeśli napiszemy na forum wiadomość z dużą ilością linków, istnieje wysokie prawdopodobieństwo że filtr ją rozpozna jako spam.
20:40JaBoJaOraz druga wada: nie zawsze można się połączyć z serwerem Sblam!
20:41JaBoJaA jeśli filtr nie może się połączyć to przepuszcza wiadomość.
20:41JaBoJaTo znaczy jest tak w standardowych wtyczkach dostępnych na stronie projektu
20:42JaBoJaDlatego 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:42JaBoJaPrzejdźmy jednak do sedna sprawy, czyli instalacji wtyczki na własnej stronie:
20:43JaBoJaPodstawowe wtyczki (ogólna biblioteka dla PHP, oraz wtyczka do phpBB) dostępne są na stronie Sblam:
20:43JaBoJahttp://sblam.com/
20:44JaBoJaW dziale "Opis instalacji" dostępne są też inne wtyczki
20:44JaBoJaWtyczki dostępne są na stronie Sblam
20:44JaBoJahttp://sblam.com/instalacja.html
20:45JaBoJaPo ściągnięciu pliku ZIP z wtyczkami znajdziemy w nim 3 pliki biblioteki oraz folder z wtyczką dla phpBB
20:45JaBoJaWtyczki tej nie będę omawiał, bo jej instalacja przebiega w podobny sposób jak innych wtyczek dla tego forum.
20:46JaBoJaJeśli natomiast mamy niestandardowy skrypt i chcemy wzbogacić go o filtr Sblam! to interesować będą nas dwa pliki:
20:46JaBoJasblamtest.php - zawierający właściwą wtyczkę
20:47JaBoJasblam.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:48JaBoJaOprócz wgrania tych dwóch plików na nasz serwer musimy jeszcze stworzyć sobie tzw. klucz API
20:49JaBoJaJest 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:49JaBoJaAby go utworzyć wchodzimy na stronę:
20:49JaBoJahttp://sblam.com/key.html
20:50JaBoJaZ 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:51JaBoJaNastępnie w pliku odpowiedzialnym za dodawanie nowych wiadomości do bazy danych czynimy co następuje:
20:51JaBoJaDołączamy bibliotekę poprzez require_once('sblamtest.php');
20:52JaBoJaW miejscu gdzie skrypt już wie że wysłano wiadomość, ale jeszcze jej nie dodał do bazy dodajemy kod:
20:53JaBoJa$i = sblamtestpost(null, 'naszkluczapi');
20:53JaBoJazamiast null możemy dodać też tablicę z nazwami pól formularza, jeśli są niestandardowe
20:54JaBoJa(szczególy są na stronie filtru)
20:54JaBoJaW tym momencie w zmiennej $i mamy ocenę wiadomości
20:55JaBoJajeśli jest dodatnia oznacza to że jest spamowa i warto ją wyciąć
20:55JaBoJapowinniśmy dodać coś w stylu:
20:55JaBoJaif ($i>0) {
20:56JaBoJashow_error('Wiadomosc rozpoznana jako spam. Jesli filtr sie pomylil <a href="'.sblamreporturl().'">kliknij tu</a>.');
20:56JaBoJareturn false;
20:56JaBoJa}
20:57JaBoJaTo jest najbardziej standardowe uzycie fltru
20:58JaBoJaW ten sposób działa on we wtyczce phpBB, a także we wtyczce do Phorum (notabene mojego autorstwa).
20:59JaBoJaDla zainteresowanych podaję adres z wtyczką do Phorum:
20:59JaBoJahttp://www.phorum.org/phorum5/read.php?58,123919
20:59JaBoJaCo mogę jeszcze doradzić ewentualnym użytkownikom to dodanie mozliwosci wyslania postu odrzuconego przez filtr po podaniu kodu z obrazka.
21:00JaBoJaBo pomylki sie jednak zdarzaja.
21:00JaBoJaNo i wspomnianej juz wczesniej moderacji.
21:00JaBoJaSą pytania?
21:01JaBoJaSkoro nie, to przejdźmy dalej.
21:02JaBoJaKolejną linią obrony przed spamem są filtry działające nim w ogóle uruchomiony zostanie jakikolwiek skrypt PHP.
21:02JaBoJaOpiszę tu dwa takie filtry:
21:02JaBoJaCzarną listę ze strony Sblam oraz BadBehavior
21:02JaBoJaCzarna lista jest po prostu listą adresów IP z których filtr Sblam! otrzymywał tylko i wyłącznie spam.
21:03JaBoJaJest aktualizowana codziennie, więc jak ktoś ma taką możliwość to warto dodać sobie taką aktualizację do cron'a.
21:04JaBoJaDostępna jest w dwóch wersjach: zwykłego pliku tekstowego z jednym IP na linię oraz pliku .htaccess
21:04JaBoJaOczywiście dla nas bardziej przydatny będzie .htaccess
21:04JaBoJaWchodzimy więc na stronę: http://sblam.com/czarnalista.html
21:04JaBoJaI ściągamy z niej ten plik
21:04JaBoJaA następnie wgrywamy na serwer zawierający naszą stronę
21:05JaBoJaW tym momencie obciążenie serwera przez najbardziej natrętne spam-boty powinno znacznie spaść.
21:05JaBoJaPodobny efekt daje BadBehavior
21:06JaBoJaktó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:07JaBoJaJest on dostępny na stronie: http://www.bad-behavior.ioerror.us/
21:08JaBoJaDo 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:08JaBoJaDo pełnego wykorzystania jego możliwości warto jednak dać mu dostęp do bazy danych
21:09JaBoJaTo 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:09JaBoJaNa szczęście jednak dla CMSów takich jak WordPress dostępne są gotowe wtyczki na których można się wzorować.
21:10JaBoJaW każdym razie lektura dokumentacji będzie wskazana ;).
21:11JaBoJaZapewne jednak ciekawi was jak te wszystkie filtry działają, a może nawet chcieli byścia napisać własny?
21:11lidiaba ;>
21:13JaBoJaSpytam 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:13JaBoJaAny questions?
21:14JaBoJaŁadny opis filtru Bayesa znajduje się na stronie http://www.gazeta-it.pl/2,14,111,index.html
21:14JaBoJaNa czym jednak opiera się ta idea?
21:14JaBoJaJest to swego rodzaju rozszerzenie wykrywania spamu na podstawie słów kluczowych.
21:15JaBoJaFiltr 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:16JaBoJaGdy przychodzi nowa wiadomość dzielona jest na słowa i dla każdego z nich pobrane zostaje z bazy prawdopodobieństwo.
21:16JaBoJaSłowa których brak w bazie dostają, zgodnie z w/w artykułem, prawdopodobieństwo 0,4
21:17JaBoJa(ja osobiście dał bym troszkę ponad 0,5 aby od razu wycinać wiadomości w obcych językach)
21:17JaBoJaPotem liczone jest prawdopodobieństwo dla całej wiadomości:
21:18JaBoJaZałóżmy że wiadomość składa się z dwóch słów o prawdopodobieńśtwach odpowiednio A i B
21:18JaBoJaPrawdopodobieństwo że wiadomość to spam obliczmy ze wzoru:
21:19JaBoJaP = ( P(A) * P(B) ) / ( P(A)*P(B) + P(nie A)*P(nie B) )
21:19JaBoJaczyli:
21:20JaBoJa$p = ($a*$b) / ($a*$b + (1-$a)*(1-$b));
21:20JaBoJaanalogicznie postępujemy dla większej ilości słów
21:21JaBoJaFiltr 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:22JaBoJaOsoby zainteresowane szczegółami odsyłam jednak do wspomnianego artykułu:
21:22JaBoJahttp://www.gazeta-it.pl/2,14,111,index.html
21:22JaBoJaTo tyle w temacie filtrów. Czy coś było niejasne?
21:24JaBoJaSkoro brak pytań to przejdę do drugiej części wykładu czyli testów Turinga zwanych CAPTCHA.
21:24JaBoJaNa początek nauczymy się instalować takowe na własnej stronie
21:24JaBoJaO 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:25JaBoJaWybrałem system reCAPTACHA bo przy okazji robi coś dla ludzkości, a mianowicie pomaga przenosić książki do postaci cyfrowej
21:26JaBoJabo dostajemy dwa słowa: jedno znane systemowi, a drugie z książki, a którego nie mógł odczytać OCR.
21:27JaBoJaNajsampierw oczywiscie (:() musimy zarejstrować się na stronie reCAPTCHA:
21:27JaBoJahttp://recaptcha.net/
21:28JaBoJaPrzy rejestracji podajemy adres strony na której chcemy zainstalować filtr, co ma służyć kwestiom bezpieczeństwa.
21:28JaBoJa(zapewne utrudnić łamanie kapcz metodą pornograficzną)
21:29JaBoJaGdy już zarejestrujemy się na stronie i podamy na niej adres naszej strony, otrzymujemy dwa klucze:
21:29JaBoJaprywatny i publiczny
21:29JaBoJamusimy je podać w kodzie skryptu, aby system mógł nas poprawnie zidentyfikować
21:30JaBoJaW tym momencie możemy też pobrać pliki ze skryptami PHP niezbędnymi do użycia reCAPTCHA
21:30JaBoJaUżycie skryptu na stronie jest banalnie proste
21:31JaBoJaNa serwer musimy wgrać plik recaptchalib.php
21:31JaBoJaI daje on nam dwa narzędzia:
21:31JaBoJaCAPTCHA'ę jako taką
21:31JaBoJaukrywacz adresów e-mail
21:31JaBoJaten drugi podowuje że adres pojawia się dopiero po podaniu kodu z kapczy
21:32JaBoJaNas najprawdopodobniej interesuje jednak przede wszystkim CAPTCHA
21:33JaBoJaNa stronie na której ma się pojawić okienko z tekstem do rpzepisania dołączamy przez require_once skrypt recaptchalib.php
21:34JaBoJaA kod HTML okienka z kapczą uzyskujemy wywołując funkcję recaptcha_get_html($klucz_publiczny)
21:34JaBoJamożemy je wyświetlić chociażby przez echo, acz zwykle będziemy zapewne chcieli przekazać je do jakiegoś systemu szablonów
21:34JaBoJaecho recaptcha_get_html($klucz_publiczny);
21:35JaBoJaNastępnie w miejscu gdzie skrypt odbiera dane z formularza musimy:
21:35JaBoJaDołączyć skrypt recaptchalib.php, jeśli jeszcze tego nie zrobiliśmy.
21:36JaBoJawywołać funkcjęrecaptcha_check_answer($klucz_prywatny, $_SERVER["REMOTE_ADDR"])
21:36JaBoJa(oj, skleiło się - jeszcze raz)
21:37JaBoJa$resp = recaptcha_check_answer ($klucz_prywatny, $_SERVER["REMOTE_ADDR"]
21:38JaBoJa$_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
21:38JaBoJaif ($resp->is_valid) {
21:39JaBoJashow_error('Podałeś zły kod!');
21:39JaBoJareturn false;
21:39JaBoJa}
21:40JaBoJaMamy też do dyspozycji zmienną $resp->error, zawierającą komunikat reCAPTCHA'y.
21:40JaBoJaI ot cała instalacja CAPTCHA'y na stronie.
21:41JaBoJaPrzypomnę tylko jeszcze raz złote reguły którymi powinniśmy się kierować przy użyciu CAPTCHA:
21:41JaBoJa1. 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:43JaBoJa2. 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:43JaBoJaDrugim ciekawym rozwiązeniem CAPTCHA o jakim chciałbym dziś wspomnieć jest "Did You Pass Math?"
21:43JaBoJaNiestety oryginalny skrypt działa tylko z WordPressem.
21:44JaBoJaInstalacja jest tu banalna i sprowadza się do wgrania wtyczki na serwer i aktywowania jej w WordPressie.
21:45JaBoJaChciałbym jednak powiedzieć jak to działa, a właściwie jak napisać takie coś samemu.
21:45JaBoJaDla przypomnienia z poprzedniego wykładu:
21:45JaBoJaAdres wtyczki: http://www.herod.net/dypm/
21:46JaBoJaZasada działania: podajemy wynik działania które dostajemy sformuowane słownie (aby boty nie mogły użyć np. funkcji "eval()").
21:46JaBoJaWłaściwie cała wtyczka opiera się na tym słownym formuowaniu zadania.
21:46JaBoJaDla stworzenia takiego CAPTCHA warto zacząć od:
21:47JaBoJastworzenia bazy szablonów pytań, np.:
21:47JaBoJaIle to jest %s?
21:47JaBoJaJaki jest wynik działania, %s?
21:47JaBoJaitp.
21:47JaBoJaMożna również bardziej złożone:
21:48JaBoJaJaka jest wartość sumy liczb %i oraz %i?
21:48JaBoJaSkrypt powinien zawierać też nazwy działań (chyba że będą one częścią pytań)
21:49JaBoJa%i dodać %i
21:49JaBoJasuma %i i %i
21:49JaBoJa%i plus %i
21:49JaBoJa%i dodane do %i
21:49JaBoJaitp.
21:49JaBoJaanalogicznie dla innych działań
21:50JaBoJaliczby oczywiście losujemy i zapamiętujemy w sesji (ale po jednokrotnym przesłaniu bezwzględnie je z niej usuwamy!)
21:50JaBoJanie wolno ich przekazywać w ukrytych polach formularza, nawet w postaci zaszyfrowanej
21:51JaBoJabo inaczej skuteczność filtru będzie podobna jak skuteczność zwykłego checkboxa z napisame "zaznacz aby potwierdzić że wiadomość to nie spam"
21:51JaBoJawarto też liczby podawać słownie
21:52JaBoJaacz dla wygody użytkownika możemy pozostać przy cyfrach
21:52JaBoJagdy już mamy pytanie możemy je od razu wyświetlić na stronie
21:52JaBoJaale aby dodać kolejną trudność warto podać je w formie obrazka
21:53JaBoJaautor bota oczywiście nadal może jakoś to złamać, ale musi już przebrnąć przez kilka etapów:
21:54JaBoJaużyć OCR do przeczytania pytania
21:55JaBoJaskonstruować bazę z szablonami pytań (tak więc nie warto publikować jej jako OpenSource :P)
21:55JaBoJana podstawie tej bazy przetłumaczyć działanie na postać zrozumiałą dla komputera
21:55JaBoJaobliczyć, co już będzie trywialne w obliczu powyższych trudności z dojściem do tego etapu
21:57JaBoJaFiltr 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:57JaBoJaSą jakieś pytania?
21:59diabelw sumie to nei
21:59diabela to juz koniec ?
21:59JaBoJaNie, jeszcze łamanie kapcz zostało :> ;)
22:00JaBoJaTylko wkleję gdzieś kod programu, aby go pokazać
22:00mith<spam>nopaste.pl</spam>
22:00diabelmith: znowu
22:00diabelz tymi swoimi
22:00diabeladsense ?
22:00mithwyjdz
22:00diabelhahaha
22:01diabelwiedzialem
22:01diabel:D
22:01JaBoJaKod programu znajduje się tutaj:
22:01JaBoJahttp://nopaste.gamedev.pl/?&id=1432
22:02JaBoJaJak widać jest to dość prymitywny program w C++ korzystający z biblioteki Allegro.
22:02JaBoJaW przykładzie użyję orbazka wygenerowanego przez CAPTCHA na stronach Wirtualnej Polski.
22:04JaBoJa
22:05JaBoJaWydawało by się że obrazek wtapia się w tło
22:05JaBoJanic bardziej mylnego
22:05JaBoJaUruchamiamy program
22:05JaBoJapierwszy filtr jaki zastosuje to progowanie.
22:06JaBoJaustalamy pewien próg aby przerobić obraz na czerń i biel
22:06JaBoJaLiterki jakie otrzymujemy są dosyć ostre, tylko krawędzie są nieco poszarpane i wokół jest trochę śmieci w postaci pojedynczych pikseli.
22:08JaBoJa--img--- http://img443.imageshack.us/img443/1941/44476435xs0.png
22:08JaBoJaOto ^^^ rezultat.
22:09JaBoJaDo czego jednak dążymy, to rozdzielenie poszczególnych liter i szum nieco nam przeszkadza
22:09JaBoJabo uzyskali byśmy wiele jednopikselowych "liter".
22:10JaBoJaNie jest to jednak problem, bo możemy sobie napisać kolejny filtr.
22:10JaBoJaPrzeglądamy obraz punkt po punkcie
22:10JaBoJai dla każdego punktu liczymy sąsiadów
22:10JaBoJaJeśli liczba sąsiadów o tym samym kolorze jest mniejsza od jakiegoś progu, np. 2, to zmianiemy kolor punktu
22:11JaBoJaW ten sposób zostają wycięte pojedyncze czarne piksele na białym tle et vice versa.
22:11JaBoJa(no, może w tym przypadku akurat tło jest szare, ale to nie ma znaczenia)
22:11JaBoJa
22:11JaBoJaTak to wygląda w tym momencie
22:12JaBoJaJak widzimy nie wszystko udało nam się wyciąć
22:12JaBoJaJest spowodowane to tym że filtr jest dość prosty
22:12JaBoJaJeśli ktoś chce może więc wyciąć w ogóle zwarte obszary składające się z mniej niż iluś tam pikseli.
22:13JaBoJaAlbo, 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:14JaBoJaTo wszystko jednak wymaga własnej implementacji funkcji flood_fill, tak aby dopuszczała ona 1-2 pikselowe "dziury" w obszarach.
22:14JaBoJaCo widać w powyższym przykładzie w literze "j" która ma poziomą szparę, którą taki floof_fill powinien przeskoczyć.
22:15JaBoJa(notabene to jest też argument za stosowaniem małych lub wręcz zerowych odległości m-dzy literami we własnych kapczach)
22:16JaBoJaJa jednak nie stosowałem własnej funkcji flood_fill toteż musiałem pozbyć się tych szumów w inny sposób
22:16JaBoJaUżyłem w tym celu rozmycia
22:16JaBoJaCo nam ono daje?
22:16JaBoJaOtórz małe obszary zrobią się szare, a nie czarne, a szpary trochę poczernieją od sąsiadującej z nimi czerni
22:17JaBoJaPotem możemy po raz wtóry zastosować na obrazku progowanie, przez co uzyskamy litery bez dziurek
22:18JaBoJaNiestety będą one troche mniej kształtne
22:18JaBoJaTo efekt uboczny rozmycia
22:19JaBoJaZobaczmy więc jak będzie zmieniał się nasz obrazek po użyciu rozmycia i progowania:
22:19JaBoJaRozmycie:
22:23JaBoJa
22:23JaBoJaOraz progowanie:
22:23JaBoJa
22:24JaBoJaW tym miejscu mój programik jeszcze raz próbuje odciąć szumy, ale szczerze mówiąc nie wiem czy to konieczne.
22:24JaBoJa
22:25JaBoJaNo i finał rozdzielania liter:
22:25JaBoJa
22:26JaBoJaTu użyłem po prostu ich kolorowania, aby pokazać że już dają się rozdzielić, i jak program je dzieli.
22:26JaBoJaW praktyce jednak koniczene będzie użycie jakiegoś algorytmu dzielącego obrazek na mniejsze - zawierające poszczególne literki.
22:26JaBoJaCo możemy zrobić dalej?
22:26JaBoJaNa pewno musimy użyć jakiegoś filtru rozpoznającego litery.
22:27JaBoJaMożemy np. spróbować skonstruować sieć neuronową.
22:27JaBoJaWtedy 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:28JaBoJaTym którzy chcieli by napisać OCR tą metodą polecam poszukać informacji na temat komórkowych sieci neuronowych
22:29JaBoJa(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:29JaBoJa(lub 4 w innej wersji)
22:30JaBoJaArtykuł na ten temat ukazał się w "Software 2.0" z lutego 2002 roku
22:30JaBoJaMamy jednak jeszcze dwie inne możliwości
22:31JaBoJaJeś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:31JaBoJaa następnie dopasowywać je po kolei sprawdzając które najmniej się różnią.
22:32JaBoJaW sumie sieć neuronowa wewnętrznie robiła by coś podobnego.
22:32JaBoJaNatomiast jeśli literki są bardzo powyginane, to sprawa jest trudniejsza.
22:32JaBoJaMożemy natomiast spróbować przekształcić je na krzywe.
22:32JaBoJaA następnie rozpoznawać w następujący sposób:
22:33JaBoJaIle zamkniętych obszarów zawierają?
22:33JaBoJajeśli dwa to może to być duże B albo cyfra 8
22:34JaBoJajeśli jeden to jedna z cyfr bądź liter 4690QROPADqeopadgb
22:34JaBoJajeśli zero to któraś z pozostałych
22:35JaBoJapomocna może też być kropka, ale w tym celu musieli byśmy umieć przyporządkować ją jednej z liter
22:35JaBoJamożna szukać na etapie usówania szumu punktów o średnicy podobnej do grubości liter, a znajdujących się powyżej liter
22:35JaBoJaco dalej możemy zrobić?
22:36JaBoJasprawdzić ile "antenek" (wierzchołków grafu z których wychodzi dokładnie jedna krawędź) ma litera
22:36JaBoJalitery takie jak na przykład T albo y mają trzy "antenki"
22:37JaBoJaa ma jedną (ten mały pypeć na dole się nie liczy bo mieści się w granicy szumu :P)
22:37JaBoJaI ma dwie
22:37JaBoJaL też
22:37JaBoJai tu dochodzimy do kolejnej odróżniającej cechy
22:38JaBoJamożemy wykrywać punkty w których linia pod dużym kątem się wygina
22:38JaBoJai będą to wierzchołki stopnia 2
22:38JaBoJastosując nomenklaturę teorii grafów
22:39JaBoJai 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:40JaBoJaw ten sposób liczba pomyłek spada
22:41JaBoJaniestety zawsze zostają takie trudne glify jak j-i-l-1, o-0-Q itp.
22:41JaBoJaale tak na prawdę to jeśli tekst jest znacznie zdeformowany to i ludzie mogą mieć z nimi trudności ;)
22:42JaBoJaI tym oto sposobem doszliśmy do końca materiału przewidzianego na dzisiejszy wykład.
22:42JaBoJaKto ma pytania?
22:43ant_ja: nikt nie sluchal?
22:43ant_JaBoJa: przykro mi ;>
22:43JaBoJazawsze trafi do logów :P
22:44ant_i jeszcze jedno mam
22:44ant_o czym to bylo?
22:44ant_;-)
22:44ant_nvm.
22:44JaBoJao zabezpieczaniu stron przed spamem