Sztuczna inteligencja AI


Rozpoznawanie kształtów

Autor: T. Szczuciński

Nie zawsze jest możliwość stosowania markerów, a mimo to pragniemy w jakś sposób określić położenie obiektu. Wówczas niezbędna jest umiejętnośc rozpoznawania krawędzi obiektów. Rozpoznanie krawędzi obiektów jest kluczowe do rozpoznawania kształtu. Poniżej zaprezentowano przykład rozpoznawania figury złożonej tj. trójkąta wpisanego w kwadrat. Biblioteki openCV dają całkiem niezły efekt.


Rozpoznawanie markerów

Autor: T. Szczuciński

Często w zastosowaniach tz. metod sztucznej inteligencji zachodzi potrzeba rozpozanwania specjalnych markerów celem np. pozycjonowania elementów dla maszyn czy robotów. Poniżej przedstawiono przykład zastosowania gotowych bibliotek openCV do rozpoznawania markerów z kamery komputera w czasie rzeczywistym. Widzimy, że stworzone biblioteki bardzo dobrze radzą sobie ze skalowaniem oraz obrotem markerów. Kod samego programu nie jest skąplikowany i łatwy do implementacji we własnych rozwiązaniach.


Algorytmy ewolucyjne

Autor: T. Szczuciński

Algorytmy ewolucyjne często znane jako algorytmy genetyczne nawiązują swym działaniem do naśladowania natury. Tworzymy zbiór organizmów numerycznych (pewną populację) o pewnym losowym genotypie (kodzie DNA), gdzie poszczególna wartość oznacza pewne zachowanie w naszym ekosystemie numerycznym. Następnie nasze organizmy, tak jak w życiu poddawane są próbie. Słabe organizmy giną, a lepsze mają możliwość prokreacji (krzyżowania własnego DNA z innymi). Powstaje kolejne pokolenie które jest lepiej dostosowane (uzyskuje lepszy wynik według zadanych kryteriów). Kolejne pokolenie znów przechodzi dalej – lepiej adoptuje się do warunków (kryteriów). Kolejne pokolenie znów poddawane próbie i tak można w nieskończoność. W pewnym momencie zauważymy, że system oparty o algorytm ewolucyjny zaadoptuje (z optymalizuje) się bardzo dobrze. Sama implementacja algorytmów numerycznych na komputerach jest stosunkowo prosta i uniwersalna dla praktycznie nieograniczonej liczby zadań. Działanie grup tych algorytmów jest praktycznie nie do przewidzenia, ale przy dużej populacji i wielu pokoleniach system oparty na ewolucji daję naprawdę bardzo dobre rezultaty. Moją one zastosowanie w obszarach, gdzie złożoność jest tak wielka, że ogarnięcie tematu wydaje się niemożliwe. Poniżej film z pokazem działania algorytmu genetycznego do stabilizacji pręta pionowego:


Regresja przykłady algorytmów

Autor: T. Szczuciński

Poniżej przedstawiono kilka filmów z zastosowaniem kilku różnych algorytmów do poszukiwania optymalnego modelu, każda iteracja to jedna klatka. Od lewej strony algorytm Adam dla Ir=0.01, Adam Ir=0.1, Batch Ir=0.0003, Momentum Ir=0.0009, SGD Ir=0.0003:


Regresja liniowa i wielomianowa w CodeBlock

Autor: M. Zdyrski

Poniżej udostępniono kolejny przykład regresji liniowej w środowisku CodeBlock. Program umożliwia wygenerowanie losowych punktów o zadanej ilości oraz na znalezienie modelu opisanego wielomianem o zadanym stopniu. Program działa prawidłowo dla wielomianów do 11 stopnia. Dla wyższych potęg pojawia się problem rozdzielczości liczb zmiennoprzecinkowych.


Regresja liniowa i wielomianowa

Autor: T. Szczuciński

Regresja liniowa jest powszechnie stosowaną metodą sztucznej inteligencji do wyznaczania przybliżonej wartości na podstawie funkcji modelującej przy zadanych parametrach wejściowych. Poszukiwanie funkcji modelującej nie jest proste, gdyż wymaga to dobrania odpowiedniego kształtu funkcji oraz opisania tej funkcji konkretnym równaniem. Dobranie odpowiedniego modelu funkcji wymaga optymalizacji błędu całkowitego pomiędzy wartościami uczącymi (modelującymi), a wartością rzeczywistą. Metoda regresji pozwala na stosowanie dowolnych funkcji modelujących(również nieliniowych), które można zwiększając wymiar przestrzeni sprowadzić do zagadnienia liniowego. Całkowity błąd przybliżenia funkcją liniowa charakteryzuję się specyficzną właściwością – posiadaniem jednego minimum będącego jednocześnie minimum globalnym. Jest wiele metod optymalizacyjnych pozwalających na wyznaczanie liniowej funkcji modelującej. Poniżej zaprezentowano wyniki wyznaczania modelu przy pomocy gradientu i wzoru na globalne minimum dla modelu liniowego i wielomianu siódmego stopnia.


K Mean

Autor: T. Szczuciński

W metodach sztucznej inteligencji w algorytmach poszukiwania i uczenia się bez nadzorcy często wykorzystuję się badanie tak zwanych skupisk. Badanie skupisk to nic innego jak pogrupowanie na zadaną ilość zbiorów elementów w przestrzeni wielowymiarowej. Pojedynczy wymiar przestrzeni to nic innego jak kolejny parametr opisujący dany element. Do grupowania wykorzystuje się różne metody, a jedną z najpopularniejszych jest metoda najbliższego sąsiedztwa (odległości) zwana K Mean. Poniżej przedstawiono program który przy pomocy tego algorytmu grupuje losowo wygenerowane elementy dwuwymiarowe na płaszczyźnie. Dalszym przedmiotem prac nad skupiskami będzie zastosowanie tego algorytmu to grupowania tekstu.


Fraktale

Autor: M. Zdyrski

Fraktale to często proste regułowe systemy pozwalające na otrzymywanie złożonych struktur poprzez wielokrotne zastosowanie tej samej reguły (iteracji). Charakterystyką fraktali jest samopodobieństwo mniejszych części do całości. Poniżej przedstawiono program do generowania kilku popularnych fraktali na płaszczyźnie oraz możliwość wygenerowania własnego obiektu poprzez wprowadzenie własnej reguły i ilości iteracji. Na rysunku poniżej można zobaczyć kolejno od lewej strony: Trójkąt Sierpińskiego, płatek śniegu Kocha, krzywą Hilberta, krzywą Moor’a, krzywą Peano, smoka Highway’a, smoka Levy’ego, pentadendryt, dwie struktury drzewiaste oraz własny fraktal przypominający swym wyglądem drona – dron Zdyrskiego. Ponadto można zauważyć związek pomiędzy automatem Wolframa reguła 90, a trójkątem Sierpińskiego.


Maszyna Wolframa

Autor: P. Brzeziński

Maszyna Wolframa jest przykładem automatu o bardzo prostych regułach (jednowymiarowych), który pozwala na generowanie rożnego rodzaju ciągów. Ciągi te w zależności od reguły mogą być w pełni przewidywalne (reguła 222) lub całkowicie nieprzewidywalne (reguła 110). Taki automat pokazuję, że nawet stosowanie bardzo prostych reguł w procesie ewolucji może prowadzić do bardzo skomplikowanych rezultatów - wręcz niemożliwych do przewidzenia bez uruchomienia kolejnej iteracji - pokolenia.


Automatyczna analiza planu lekcji

Autor: T. Szczuciński

Przedmiotem tych badań jest implementacja automatu (bota - robota programowego), który ma za zadanie połączyć się z serwerem szkoły na którym został zamieszczony pod pewnym linkiem podział godzin. Kolejnym zadaniem bota jest pobranie go i odpowiednie zapisanie we własnej bazie danych SQL. Logika automatu ma za zadanie odnalezienie podziału godzin, wyszukania odpowiednich relacji pomiędzy godzinami lekcyjnymi w odpowiednich dniach tygodnia, przedmiotami nauczania, oddziałami i grupami klasowymi, nauczycielami oraz salami lekcyjnymi. Wszystkie wcześnie wspomniane relacje są odzwierciedlone w bazie danych. Wygenerowana baza danych jest z automatu aktualizowana przez bota po połączeniu się do serwera przy pomocy FTP. Zastosowanie takie rozwiązania umożliwia wyświetlenie na telebimie w holu szkoły informacji o bieżących zajęciach odbywających się w placówce. Do wyświetlania informacji służy prosta aplikacja w PHP będąca tak naprawdę wizualizacją wygenerowanej bazy danych. Na stronie Grupy Naukowej ETI zamieszczony został poniżej link do podglądu bieżącej sytuacji w szkole. Uniwersalność tego rozwiązania polega na tym, że bot jest kompletnie niezależny od zewnętrznych programów i baz danych oraz może współpracować praktycznie z każdym podziałem godzin zamieszonym w Internecie w kodzie HTML. Poniżej widok okna po dokonaniu generacji bazy danych SQL oraz link do bieżącego rozkładu zajęć.


Połączenie TCP/IP

Autorzy: T. Szczuciński, K. Paterek

Często w systemach sztucznej inteligencji zachodzi potrzeba łączenia się z zewnętrznym światem w celu pobrania informacji lub jej wymiany. Poniżej przedstawiono w języku C (Code Block biblioteka WinSock) proste przykłady aplikacji typu klient (podłączanie do serwera zewnętrznego) oraz serwer (oczekiwanie na połączenie z zewnątrz). Przykład ten demonstruję proste połączenie gdzie program serwerowy oczekuję na zadanym porcie na połączenie, a program kliencki łączy się z zadanym adresem IP i portem TCP. Po nawiązaniu połączenia jest możliwość przesyłanie tekstu wprowadzanego przy pomocy klawiatury.


Kompresja metodą Huffmana

Autorzy: T. Szczuciński, K. Paterek

Algorytm kompresji metodą Huffmana pozwala na zmniejszenie objętości informacji kosztem jej nadmiarowości z zachowaniem pełnej informacji (kompresja bezstratna). Zasada działania polega na przeliczeniu wszystkich symboli w tekście z osobna, a następnie najczęściej powtarzającym się symbolom przyporządkowanie najkrótszego ciągu binarnego. Dodatkową zaletą tak zakodowanej informacji jest brak konieczności stosowania separatorów pomiędzy symbolami i z tego wynikająca automatyczna synchronizacja dekodowania w przypadku wystąpienia błędu.


Poszukiwanie drogi w labiryncie

Autorzy: T. Szczuciński, J. Woźniak

Typowym zadaniem z zagadnień AI jest przeszukiwanie przestrzeni stanów w celu osiągnięcia optymalnego rozwiązania problemu. Jednym z tych problemów jest wyznaczanie optymalnej drogi w labiryncie. Jest wiele algorytmów pozwalających na przeszukiwanie różnych przestrzeni stanów. W naszym rozwiązaniu zastosowaliśmy algorytm wagowy, często zwany rozpływowym, gdzie sąsiednie pole otrzymuje najmniejszą wartość spośród swoich sąsiadów powiększoną o jeden. Wyznaczenie optymalnej drogi polega na wyborze kolejnych najmniejszych wartości od celu do początku drogi. Poniżej przykłady działania algorytmu.


Rozpoznawanie znaków graficznych

Autorzy: K. Paterek, T. Szczucinski

Do rozpoznawania znaków graficznych 8x8 pikseli została wykorzystana pamięć skojarzeniowa BAM (Bidirectional Associative Memory), często zwana dwukierunkową predefiniowaną rekurencyjną siecią neuronową. Zasada działania tej pamięci jest bardzo podobna do pracy mózgu i polega ona na poszukiwaniu najbardziej odpowiedniego (najbliższemu wzorcu) stanu wyjścia na zadane wejście. Wejście i wyjście stanowią wektory, a pojęcie wejścia/wyjścia jest umowne, gdyż wejście może pełnić rolę wyjścia i vice versa (dwukierunkowość). Pamięć skojarzeniowa wymaga wcześniejszej konfiguracji, która polega na zakodowaniu w niej wzorców (w naszym przypadku matryc znaków 8x8 pikseli). Kodowanie to polega na sumowaniu i mnożeniu wektorów i macierzy, dzięki temu łatwo można ją zaimplementować na maszynach liczących. Odczyt informacji z BAM zasadniczo różni się od odczytu typowej pamięci powszechnie stosowanych w urządzeniach elektronicznych, gdzie dane są jednoznacznie poszufladkowane, a każdej szufladce jest przypisany unikatowy adres. Dodatkowo podczas uczenia sieci wzorcami matryc znaków 8x8 (64 bit wektorów) użyto kodowania 1 z N jako wyjścia, czyli ciąg 64 bitów wyglądu znaku odpowiada ciągowi 64 bitów w którym tylko jedna unikatowa wartość bitu jest ustawiona na 1, a pozostałe na -1 (logiczne 0). Takie kodowanie pozwala określić stopień podobieństwa poszczególnych znaków wzorców do zadanego testowego znaku. Poniżej przykłady programów wykorzystujących pamięci BAM do rozpoznawania znaków.