MENU |
Tematyka projektów indywidualnych
i zespołowych związana jest najczęściej z szeroko pojętym przetwarzaniem
obrazów (zwłaszcza pod kątem wykorzystania informacji wizyjnej do podjęcia
jakiegoś działania, a nie dla samego przetwarzania) oraz programowaniem robotów mobilnych czy manipulatorów. W
szczególności, na wyposażeniu laboratorium znajduje się kilka robotów Lego NXT,
dwa roboty Pioneer3DX, 2 manipulatory Scorboter-4u, kamery zwykłe i
stereowizyjne oraz Kinect, a także tablety i komputer jednopłytkowy Raspberry
Pi. Nie
znaczy to jednak, że tematy niezwiązane z wyżej wymienionymi zagadnieniami się zupełnie
nie zdarzają - są one jednak w mniejszości. Jeżeli Państwo macie jakiś własny
pomysł, który chcielibyście zrealizować albo już nad czymś pracujecie
i chcielibyście niejako przy okazji zaliczyć przedmiot, to proszę się ze mną skontaktować.
Jestem otwarty na wszelkie inne propozycje, które choć trochę ocierają się o moją
wiedzę i zainteresowania (o czym niektórzy zdołali się już przekonać). Wszelkie
Państwa pomysły zostaną z należytą uwagą rozważone.
Proponuję także zapoznać się z najciekawszymi zrealizowanymi projektami
oraz propozycjami prac dyplomowych, które w okrojonej wersji mogą być realizowana
jako projekty.
Do wielu projektów dostępne są u mnie materiały pomocnicze w postaci sprawozdań,
artykułów, książek, a nawet gotowego kodu - mimo to, każdy projekt powinien rozpocząć się przeszukaniem Internetu
i sprawdzeniem co w danej tematyce jest zrobione, co się robi, a co stanowi problem.
Pragnę zwrócić uwagę, że projekt NIE MUSI zakończyć się pełnym sukcesem. Robiąc
założenia co do projektu, zazwyczaj nie mamy o tym pełnej wiedzy (właśnie po to
jest projekt by ją zdobyć) i niektóre założenia mogą okazać się nierealizowalne.
Liczyć się będzie głównie wkład pracy i poziom realizacji tego, co da sie zrobić.
Poza tym tematy projektów są często formułowane dosyć ogólnie, aby dać Państwu możliwość
wyboru konkretnych problemów do rozwiązania podczas pracy.
Projekt indywidualny czy nawet zespołowy może stać się zalążkiem pracy dyplomowej
(było tak już w kilku przypadkach) - o wiele łatwiej jest napisać dobrą pracę, gdy poznało się już wcześniej dane zagadnienie i należy
je "tylko" rozwinąć.
Jako język programowania zdecydowanie preferuję C/C++, ale nie jest to warunkiem koniecznym we wszystkich
projektach. Jeśli chodzi o przetwarzenie obrazów to sugeruję wykorzystanie jednej
z najlepszych (i do tego darmowych) bibliotek do przetwarzania i analizy obrazów jaką jest OpenCV. UWAGA:
nie są wymagane wysokie umiejętności programowania w C++ czy też znajomość tajników
przetwarzania obrazów. Wystarczą jedynie podstawy, gdyż większość kodu jest realizowana
przez bibliotekę przetwarzania obrazów i nie pociąga to za sobą konieczności tworzenia
skomplikowanych aplikacji, a sam kod jest stosunkowo prosty i zbliżony bardziej
do standardowego C z elementami obiektowości.
W razie jakichkolwiek pytań zapraszam do pokoju SK-201 w
godzinach konsultacji, a także w innych porach lub o kontakt emailowy.
Tematy projektów indywidualnych i zespołowych podawane są zbiorczo, gdyż dany temat
można potraktować wężej lub szerzej - w zależności od aspiracji/czasu/chęci/umiejętności
wykonawcy (dotyczy projektów indywidualnych) lub liczby pracujących nad nim osób
(dotyczy projektów zespołowych).
Projekty indywidualne mogą być w większości przypadków realizowane przez kilka
osób jednocześnie - wówczas wspólna moża być część techniczna projektu (uruchomienie
aplikacji, urządzenia itp.), ale część badawcza pozostaje zazwyczaj niezależna.
Sugeruję także zapoznanie się z listą proponowanych tematów dyplomowych, gdyż
wiele z nich można zrealizować w zawężonym zakresie w ramach projektów
indywidualnych czy zespołowych.
Propozycje tematów
- Wykorzystanie sieci głębokiego uczenia do rozpoznawania ...
Od kilku lat rozwija się technika przetwarzania dużych ilości danych zwana głębokim uczeniem (deep learning). Opiera się ona na specjalnych sieciach neuronowych. Jednym z zastosowań tej techniki jest rozpoznawanie różnych obiektów w naturalnych scenach. To co jest szczególne, to to, że do nauczenia sieci rozpoznawania obiektów nie zastanawiamy się nad żadnymi cechami obiektów, ale dajemy po prostu przykłady tychże obiektów, a w efekcie otrzymujemy sieć, która jest w stanie rozpoznawać dość szybko WIELE różnych obiektów, a skuteczność tego rozpoznawania jest niezwykle wysoka (nie do osiągnięcia innymi, klasycznymi metodami). Nieco podobne metody istniały wprawdzie wcześniej, ale działały nieco inaczej, to znaczy wychwytując pewne, z góry zdefiniowane cechy obiektów. W efekcie otrzymywaliśmy detektor danej klasy obiektów, które to obiekty nie mogły się zbytnio różnić między sobą. Tak działa np. wykrywania twarzy w komórkach czy aparatach fotograficznych. Jest szybkie, ale wykrywa tylko twarze, no i wystarczy przekręcić głowę, aby detektor przestał widzieć to, czego się nauczył (no bo nauczył się prostej, a nie przekrzywionej głowy).
W podejściu tzw. głębokiego uczenia jest nieco inaczej. Nie wyszukujemy konkretnych, z góry zdefiniowanych cech obiektów. Tu, cały obraz jest cechą/zbiorem cech, a sieć neuronowa swego rodzaju czarną skrzynką, która dostaje na wejściu obraz, decyduje co jest w nim istotne, a co nie, a na wyjściu wypluwa współrzędne rozpoznanych obiektów oraz poziom ufności danego rozpoznania. Co się dzieje w środku w sieci - do końca nie wiadomo. Tzn. wiadomo, że sieć ustawia swoje wagi i tyle. Co ciekawe, w przeciwieństwie do wcześniejszych podejść, jedna "głęboka" sieć może wykrywać wiele obiektów za jednym razem lub wiele wariantów tego samego obiektu. Stąd ich nazwy - YOLO - You Only Look Once czy SSD - Single Shot Detection.
Aby jednak nauczyć taką sieć należy ją wytrenować na setkach, tysiącach czy nwręcz setkach tysięcy obrazów. To zajmuje masę czasu, ale wykorzystuje się do tego karty graficzne (CUDA), co znacznie przyspiesza uczenie. Oczywiście, poza samym uczeniem, żmudnym procesem jest przygotowanie zbioru danych, który najczęściej występuje w formie obrazu z zaznaczonymi na nim prostokątami obejmującymi obiekty danej klasy (np. pojazdy) albo w formie samych wyciętych prostokątów. Wyklikanie" kilku tys. zdjęć przez 1 osobę zajmie kilkanaście godzin męczącej pracy. A tyle zdjęć to wcale nie jest bardzo dużo. A jeśli chcemy rozpoznać np. przedmioty codziennego użytku, powiedzmy ze 20 różnych, to mamy klikania na tygodnie albo i miesiące. Na szczęście istnieją gotowe bazy danych obrazów i ich sekwencji, np:
http://mscoco.org/home/
a całą ich listę można znaleźć tu: http://homepages.inf.ed.ac.uk/rbf/CVonline/Imagedbase.htm
Ostatnio pojawiły się implementacje tych systemów na Androida. Można więc pomyśleć nad stworzeniem/wytrenowaniem/wykorzystaniem gotowej sieci rozpoznającej ileś tam obiektów i wykorzystaniem jej na urządzeniu mobilnym. Takie rozwiązania już istnieją, niemniej pokazanie od A do Z jak to osiągnąć i/lub porównanie 2 środowisk realizujących to samo zadanie byłoby niewątpliwie ciekawe. Niewątpliwie byłoby też niełatwe. Trzeba by jeszcze wymyślić jakieś praktyczne zastosowanie, ale to chyba najmniejszy problem.
Inną opcją, już nie mobilną, jest zajęcie się deep learningiem na komputerze. Cel podobny: pokazanie jak tego użyć, jak uczyć (tu by się przydała dobra karta graficzna) i które z wybranych środowisk daje jakie możliwości.
Proszę zerknąć na te linki:
https://groups.google.com/forum/#!forum/darknet
https://github.com/unsky/yolo-for-windows-v2
https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects
https://github.com/natanielruiz/android-yolo
https://www.tensorflow.org/
https://github.com/weiliu89/caffe/tree/ssd
Powyższe zagadnienie jest bardzo nowe, aktywnie rozwijane i niezwykle obiecujące. Możliwości zastosowań są niemal nieskończone - wszak można to wykorzystać nie tylko z obrazami, ale z dowolnymi danymi, byle dysponować odpowiednią liczbą przykładów. Sam proces uczenia, choć czaso- i zasobochłonny, nie wymaga za to specjalistycznej wiedzy od użytkownika, tylko masy danych i czasu. Jest to i dobre i złe. Dobre, bo wystarczy "wrzucić i zamieszać", aby otrzymać efekty, a złe, bo nie wiemy do końca co się w środku dzieje. Zaletą tego podejścia jest jego uniwersalność, pozwalająca na zastosowanie go dosłownie wszędzie - jest to więc mocno przyszłościowy kierunek. Jednocześnie jest to niepokojące, bo jedynie kwestią czasu jest to, że systemy komputerowe będą lepsze w rozpoznawaniu/analizowaniu czegokolwiek od człowieka. Już dziś najlepsze tego typu systemy czytają lepiej z ruchu warg niż ludzcy eksperci. Wizja komputera Hal 9000 z Odysei Kosmicznej 2001 sprzed niemal równo pół wieku, który potrafił odczytać z ruchu ust załogi, że ma zostać odłączony jest w zasadzie rzeczywistością.
Cały projekt powinien składać się z mniej więcej takich części:
1. Krótkie wprowadzenie do sieci neuronowych głębokiego uczenia - czyli teoria o deep learningu
2. Krótki opis istniejących rozwiązań - czyli jakie narzędzia są dziś dostępne
3. Opis architektury/oprogramowania wykorzystanego w projekcie - czyli co i jak zrobić, żeby sieci użyć do rozpoznawania i ewentualnie jak ją wytrenować
4. Nauczenie własnej sieci - czyli opis procesu uczenia, doboru struktury i parametrów sieci, testowanie, ewaluacja rezultatów
5. Wykorzystanie gotowej/nauczonej sieci - czyli napisanie aplikacji wykorzystującej nauczoną sieć oraz testy
To tak z grubsza. Powszechnie rozpoznawane obiekty to ludzie, pojazdy, obiekty w otoczeniu człowieka. Zastosowania to: wykrywanie/liczenie ludzi, liczenie i śledzenie pojazdów, wykrywanie różnych obiektów (dla robotów usługowych czy też w celu wspomagania niedowidzących).
Osobna sprawa, to zebranie danych do uczenia sieci. Sieci głębokie potrzebują ogromnych zbiorów danych. W przypadku np. znaków drogowych sprawa jest nieco łatwiejsza, bo można taki zbiór danych wygenerować sztucznie. Wybrane, popularne znaki bierzemy z kodeksu drogowego czy po prostu z sieci i każdy znak modyfikujemy setki razy, symulując różne kąty patrzenia, intensywność kolorów, ogólną jasność i kontrast, zaszumienie, zamglenie, rozmycie, przysłonięcie itp. i wrzucamy je na typowe tła drogowe. W ten sposób, z jednego znaku źródłowego spokojnie zrobimy tysiące wariantów za pomocą dosłownie kilku linii kodu (podpowiem jak). To powinno, jak sądzę, wystarczyć do nauczenia sieci.
Z ludźmi czy pojazdami tak łatwo już nie będzie, bo to są obiekty przestrzenne. Tu opcją jest skorzystanie z gotowej, poetykietowanej bazy rzeczywistych obiektów. Jest tego pełno w sieci, trzeba tylko poszukać.
W internecie jest też sporo gotowych, już nauczonych sieci, które można od ręki wykorzystać we własnej aplikacji.
Proponuję zacząć rozpoznanie tematu od wykładu:
https://www.youtube.com/watch?v=vq2nnJ4g6N0
w którym autor dość dokładnie pokazuje krok po kroku, co i jak. Wykład trwa 2,5 godziny, ale obejrzenie ze zrozumieniem i z równoległym zapuszczeniem uczenia, tak jak w wykładzie, zajmie pewnie ze 2 razy tyle. No ale dzięki temu będzie można, przynajmniej w jakimś podstawowym stopniu, zrealizować własną sieć rozpoznającą wasze obiekty.
Jest też taka strona: http://www.deeplearningbook.org/
I tam jest książka niby o deep learning, tylko że ona ma z 700 stron....
Najlepsza biblioteka do przetwarzania obrazów (OpenCV) od niedawna wspiera także zagadnienia głębokiego uczenia (miesiąc temu wyszła najświeższa wersja z rozszerzonym wsparciem dla głębokich sieci), ale tylko w części wykorzystania gotowych sieci - w OpenCV nie można uczyć sieci - do tego służą różne struktury ramowe dedykowane do uczenia, np. Caffe, Torch czy Tensorflow.
Proponuję zerknąć na tego bloga: https://www.pyimagesearch.com/
Jest tam sporo ciekawych i treściwych wpisów pokazujących jak w prosty sposób rozpoznawać obiekty w OpenCV. Autor używa Pythona, ale ewentualne przepisanie tego na C++ nie powinno stanowić problemu.
I jeszcze jeden ciekawy link:
https://www.mathworks.com/matlabcentral/fileexchange/60659-deep-learning-in-11-lines-of-matlab-code
oraz darmowy kurs online zajmujący około 10 godzin, nie licząc czasu poświęconego na przygotowanie oprogramowania i robienie prac domowych w ramach kursu - kurs jest dobry dla osób początkujących, nie mających większego pojęcia o głębokim uczeniu i Tensorflow. Ten kurs jest swego rodzaju bardziej szczegółową wersją wspomnianego wyżej 2,5-godzinnego wykładu o rozpoznawaniu liter. Jego rzetelne przerobienie pozwoli na pewną biegłość w temacie i nauczy jak wytrenować różnego rodzaju sieci (w trakcie kursu robi się własne sieci).
https://in.udacity.com/course/deep-learning--ud730
Jak widać, na początku jednym z większych problemów jest znalezienie punktu zaczepienia i dobrego wprowadzenia w tematykę. Dlatego też podrzucam tu ciekawe, moim zdaniem, materiały żeby ułatwić start chętnym. Teoretycznie po skończeniu w/w kursu każdy powinien umieć wytrenować głęboką sieć i użyć jej we własnej aplikacji. Niemniej, jak widać po innych linkach, nie trzeba robić takiego kursu, by nauczyć się używać wytrenowanych sieci. Możliwości jest multum.
- Odporny algorytm rozpoznawania tablic rejestracyjnych
Projekt polega na rozszerzeniu istniejącej bazy zdjęć tablic i usprawnieniu
istniejącego oprogramowania (do ściągnięcia
stąd),
tak, aby jeszcze lepiej radziło sobie z odczytywainem tablic. Istotne jest tu
zaimplementowanie odporności na wszelkiego rodzaju zabrudzenia, które są bardzo
powszechne w porzez jesienno-zimowej.
- Śledzenie obiektów w sekwencjach obrazów
Projekt polega na wszechstronnym przetestowaniu algorytmu śledzącego,
znalezieniu jego wad i próbie ich zminimalizowania.
http://info.ee.surrey.ac.uk/Personal/Z.Kalal/tld.html.
Interesujące byłoby również porównanie działania tego algorytmu z algorytmem
opracowanym w ramach pracy magisterskiej autorstwa Marcina Bzdawskiego.
- Wykrywanie samochodów przejeżdżających na czerwonym świetle
Projekt polega na napisaniu aplikacji wykorzystującej bibliotekę OpenCV do analizy
obrazu z kamery umieszczonej w pobliżu skrzyżowania. Kamera skierowana jest na sygnalizator
świetlny, rozpoznaje światła i wykrywa samochody wjeżdżające na skrzyżowanie po
zapaleniu się światła żółtego. W najprostszej wersji wystarczy wykryć zmianę obrazu
w pewnej jego części po znalezieniu w nim żółtopomarańczowego kółka. Dalsza analiza
byłaby dokonywana ręcznie (przez człowieka). Bardziej zaawansowane wersje mogą próbować
nie podnosić alarmu, gdy na pasy wejdzie pieszy (taka zmiana obrazu "pod światłami"
nie powinna być wychwytywana) czy jak samochód zjeżdża ze skrzyżowania. Kolejnym
etapem może być automatyczne rozpoznawanie rejestracji tudzież marki pojazdu. W
każdym razie potrzebnych będzie dużo zdjęć albomateriału filmowego.
- Wykrywanie pojazdów w sekwencjach obrazów
Projekt polega na wykorzystaniu biblioteki
do przetwarzania obrazów OpenCV do wyszukiwania
samochodów w sekwencjach obrazów. Mechanizm ten jest znany i zaimplementowany. Przykładem jest tu bardzo powszechne dziś wykrywanie twarzy w komórkach czy
aparatach fotograficznych. W ramach projektu należałoby zbudować odpowiedni
klasyfikator, rozpoznający samochody widziane z przodu, tyłu, boku i lekko z
góry. Sposób budowy klasyfikatora jest opisany. Jedyną trundość stanowi zebranie
odpowiednio licznego materiału zdjęciowego i wstępne jego przetworzenie. Resztą
zajmie się gotowy program. Problem polega na tym, że aby klasyfikator działał
skutecznie, należy mu "pokazać" na etapie uczenia, przynajmniej kilka tysięcy
zdjęć samochodów i jeszcze więcej innych zdjęć, nie zawierających samochodów.
Przygotowanie takiej bazy zdjęć jest więc nieco pracochłonne.
- Wyszukiwanie obrazów na podstawie obrazów
Projekt polega na napisaniu aplikacji, która znajdzie w stworzonej wcześniej
bazie obrazów, obraz najbardziej zbliżony do danego. Np. poszukujemy konkretnego
zegarka. W tym celu robimy zdjęcie tarczy zegarka, wyznaczamy pewne punkty
charakterystyczne (automatycznie) i poszukujemy podobnych punktów na wszystkich
zebranych w bazie zdjęciach zegarków. Wyświetlamy najbliższe dopasowania. W
przeciwieństwie do dwóch tematów poniżej, tu zakładamy, że obiekty na obrazach
mają wyraźne, powtarzalne cechy geometryczne, a więc odrzucamy obrazy typu
nadmorska plaża czy zachód słońca. Interesuje nas dość dokładne dopasowanie
(fragmentów) obrazów. Dla ułatwienia możemy założyć, że poszukiwany zegarek
(wraz ze wzorcami w bazie) jest fotografowany na neutralnym tle..
- Mozaika
Projekt polega na napisaniu aplikacji, która z wielu małych obrazów
ułoży jeden duży obraz. Duży obraz należy podzielić na małe fragmenty i znaleźć
możliwie podobne do nich obrazy z możliwie dużej bazy danych. Problem polega
głównie na zdefiniowaniu podobieństwa obrazów - tu możliwości jest wiele.
Istotny jest też czas przeszukiwania bazy danych i porównywania obrazów, a
raczej ich cech. Temat ten został już wprawdzie
zrealizowany,
ale można go rozszerzyć czy napisać zupełnie inaczej.
- Wyszukiwanie/sortowanie obrazów
Projekt polega na napisaniu aplikacji umożliwiającej posortowanie obrazów pod względem
ich zawartości lub znalezienie obrazów najbardziej zbliżonych do danego. Jest to
modyfikacja poprzednich tematów, ale tym razem obrazy nie muszą koniecznie mieć
wyraźnych, unikalnych cech. Interesuje nas większa generalizacja - zamiast
wyszukiwać konkretny model zegarga, wystarczy że znajdziemy wszystkie obrazy
zegarków. Obrazy bez szczególnych cech geometrycznych też powinny być tu brane
pod uwagę - np. scenka plażowa. Z tego względu, podejście tu będzie nieco inne -
analiza kolorów i ich rozkładu, analiza tekstur itp.
- Zastosowanie metod optymalizacyjnych do porównywania obrazów
Projekt polega na zastosowaniu metod optymalizacji nieliniowej w procesie porównywania
obrazów, a ściślej wyszukiwania fragmentu obrazu w całości. Standardowe podejście
zakłada przesuwanie naszego małego obrazka co piksel po całym obrazie i w każdym
miejscu wyznaczania jakiegoś współczynnika podobieństwa. Po "przeleceniu" całego
obrazu, punkt gdzie współczynnik podobieństwa osiągnął maksimum uznajemy za punkt
najlepszego dopasowania fragmentu do całości. Taka metoda jest wykorzystywana do
wyszukiwania jakichś obiektów w obrazach. Jest ona jednak bardzo czasochłonna, ale
można ją znacznie przyspieszyć wykorzystując algorytmy optymalizacji nieliniowej
(bezgradientowej). Zbliżona metoda ta została z powodzeniem zastosowana w pracy
magisterskiej wspomnianej w temacie nr 2.
- Wykrywanie ruchu w sekwencjach obrazów
Projekt polega na wykorzystaniu
i porównaniu szeregu gotowych algorytmów służących do wykrywania obiektów
ruchomych w sekwencjach obrazów. Bardzo dobrym przykładem może tu być ruch
uliczny obserowowany nieruchomą kamerą. W ramach projektu należy zbadać dostępne
algorytmy i ocenić ich jakość, wydajność itp.
- Stabilizacja obrazu w sekwencji
Projekt polega na napisaniu aplikacji wykorzystującej bibliotekę OpenCV, a konkretnie zaimplementowane w niej algorytmy
wykrywania ruchu do stabilizacji obrazu. Teoretycznie
zagadnienie polega na wyznaczeniu wektora ruchu obrazu (takie wektory zwraca np. algorytm
przepływu optycznego), który nie jest zamierzonym ruchem obrazu (np. przesuwaniem
kamery), a ruchem przypadkowym (drgania charakteryzują się zbliżoną amplitudą i
zmieniającym się znakiem) i przesunięciu obrazu o wektor przeciwny.
- Rozpoznawanie znaków drogowych
Projekt polega na napisaniu aplikacji wykorzystującej bibliotekę OpenCV do
rozpoznawania znaków drogowych sfilmowanych kamerą zamieszczoną w samochodzie.
Aplikacja miałaby za zadanie wspomaganie kierowcy, przypominanie mu o
ograniczeniach prędkości, ostrzeganie przed niebezpiecznym zakrętem czy
przejściem dla pieszych. Główna trudność zadania polega na tym, że w różnych
warunkach pogodowych znaki drogowe wyglądają bardzo różnie. Trzeba więc zrobić
szereg zdjęć wybranych znaków w różnych warunkach i próbować dobrać do tych
danych jakąś metodę rozpoznawania.
- Rozpoznawanie zegarka analogowego
Projekt polega na napisaniu aplikacji, która automatycznie znajdzie w obrazie tarczę zegara analogowego a następnie odczyta godzinę. Wykorzystać należy bibliotekę OpenCV.
- Rozpoznawanie banknotów i monet
Projekt jest kontynuacją gotowej aplikacji do rozpoznawania banknotów (do ściągnięcia
stąd). Polega na
wszechstronnym jej przetestowaniu i próbie oszukania (czyli stworzenia takiego falsyfikatu,
którego program nie rozpozna, co nie powinno być zbyt trudne), a następnie zaproponowaniu
modyfikacji uniemożliwiającej oszustwa, a także otymalizacji jej działania.
- Lokalizacja obiektów w przestrzeni
Projekt polega na wykorzystaniu gotowego oprogramowania
służącego do lokalizacji obiektów w przestrzeni na podstawie 4 znanych punktów obserwowanych przez kamerę.
Zasadnicza część projektu to zbadanie kilku różnych celów (wzorów), które obserwuje kamera
i ich wpływu na dokładność lokalizacji. Powszechnie stosuje się szachownice lub
kwadraty. Interesująca jest odpowiedź na pytanie, jaki wzór jest najłatwiejszy
do rozpoznania, jaki daje najdokładniejsze wyinki, jaki jest wykrywalny z
największej odległości itp.
- Wzbogacona rzeczywistość w OpenCV
Projekt polega na wszechstronnym przetestowaniu algorytmu wykrywania znaczników,
znalezieniu jego wad i próbie ich zminimalizowania, a także zaproponowaniu
jakiejś aplikacji z wykorzystaniem tej technologii.
http://www.uco.es/investiga/grupos/ava/node/26
- Rozpoznawanie obiektów 3D przy użyciu Point Cloud Library
Projekt polega na przetestowaniu możliwości tytułowej biblioteki.
http://pointclouds.org/
- Rozpoznawanie i interpretacja ruchów dłoni (analiza obrazów)
Projekt polega na eksperymentalnym dobraniu parametrów powszechnie stosowanej w
automatycznym rozpoznawaniu obrazów przestrzeni HSV w taki sposób, aby obraz ludzkiej skóry (rasa biała) był prawidłowo wydzielany spośród innych obiektów w różnym oświetleniu
(dzienne, żarowe, jarzeniowe itp). Kolejnym etapem byłaby próba rozpoznania kształtu
dłoni (sprowadza się to do wydzielenia kilku prostokątów oznaczających palce i środek
dłoni).
- Analiza i dekompozycja gazet
Projekt polega na napisaniu aplikacji wykorzystującej bibliotekę OpenCV do automatycznego poetykietowania strony z gazety (lub czasomisma ;), w taki sposób by każdy artykuł otrzymał unikalną etykietę. Jest to pierwszy etap procesu automatycznej analizy prasy.
- Metody wydzialania znaków
Projekt polega na przetestowaniu/opracowaniu kilku metod wydzialania pojedynczych
znaków z zeskanowanych wyrazów. Chodzi oczywiście o pismo drukowane. Często się
zdarza, że znaki zlewają się ze sobą i proste algorytmy ich wydzielania nie zdają
egzaminu. Chodzi o to by spróbować mimo wszystko wydzielić je z ciągu.
- Robot gra w warcaby
Projekt polega na wykorzystaniu (niemal) gotowego oprogramowania do
sterowania manipulatorem oraz rozpoznawania obrazów i lokalizacji obiektów do
zaimplementowania rozgrywki w warcaby między robotem a człowiekiem.
- Robot gra w kółko i krzyżyk
Projekt bardzo podobny do gry w warcaby,
tylko tym razem robot ma mieć pisak i normalnie pisać na kartce. Kartka jest
wdzięcznym obiektem do lokalizowania, bo jej wymiary są znormalizowane (no
chyba, że ktoś złośliwie położy inną kartkę), więc łatwo jest wyznaczyć jej
położenie w przestrzeni. Pewną trudność może stanowić zagadnienie rozpoznawania
linii oraz kółek czy krzyżyków narysowanych przez człowieka, w porównaniu do gry
w warcaby, gdzie mamy do czynienia z wyraźnymi pionkami.
- Współpraca robotów
Projekt polega na wykorzystaniu (rozszerzeniu) oprogramowania do sterowania
manipulatorami w taki sposób, by roboty były w stanie przekazywać sobie jakieś
przedmioty. Problem sprowadza się do możliwie precyzyjnej kalibracji robotów
oraz stworzenia tablicy korekcji, gdyż stosunkowa niska precyzja ruchów robotów
spowoduje, że mimo iż będą sądzić że ich chwytaki znajdują się w jednym miejscu
(i że mogą sobie przekazać jakiś przedmiot), w rzeczywistości rozminą się one o
kilkadziesiąt milimetrów.
- Kalibracja
robotów mobilnych
Projekt polega na zbadaniu aktualnych właściwości jezdnych robotów pod kątem dokładności
realizacji zadanej trajektorii (czy roboty jadą tak daleko i skręcają o tyle, ile
im się rozkaże oraz czy robią to jednakowo), a następnie eksperymentalnym dobraniu
kilku parametrów kalibracyjnych tak, aby roboty jeździły jak najdokładniej w stosunku
do wydanych im poleceń. Pracę należy oprzeć na
istniejącym sprawozdaniu i rozszerzyć.
- Gadający robot
Projekt polega na napisaniu aplikacji wydającej komunikaty głosowe w zależności
od sytuacji w jakiej znajdzie się robot. Pożądanym rozwiązaniem jest wykorzystanie
syntetyzatora mowy, a nie uprzednio nagranych komunikatów. Rozszerzeniem tej aplikacji
byłoby dodanie wizerunku głowy oraz próba rozumienia kilku wybranych słów i reakcja
na nie.
- Strzał z armaty
Projekt polega na opracowaniu (w miarę możliwości jak najdokładniejszej) symulacji
lotu kuli wystrzeliwanej z armaty z wykorzystaniem jakiegoś silnika fizyki.
Docelowa aplikacja powinna umożliwiać wizualizację wyznaczonej trajektorii np. w
postaci prostej gry, w której strzela się do celu.
- Strzał z armaty z Kinectem
Projekt jest rozszerzeniem projektu powyżej o sposób wprowadzania danych. O
ile w projekcie poprzednim dane są wprowadzane z klawiatury, tym razem dane mają
pochodzić z czujnika Kinect. Innymi słowy, rzucamy kulkę, Kinect ją widzi i
podaje nam jej współrzędne. Na podstawie kilku klatek wyznaczamy wektor jej
prędkości. Reszta tak jak poprzednio. Interesujące byłoby porównanie wyliczonego
w symulacji miejsca upadku kulki z faktycznym. Rozszerzeniem projektu byłoby
zaprogramowaine robota w taki sposób, aby łapał kulkę (nie chwytakiem, bo robot
jest za wolny i za mało dokładny, ale jakimś odpowiednio dużym pudełkiem czy
siatką).
- Porównywanie dokumentów tekstowych
Projekt polega przetestowaniu, usprawnieniu i rozszerzeniu istniejącej aplikacji
do wykrywania plagiatów, ewentualnie do implementacji tej aplikacji w C++ (źródła
są w Javie).
- Sterowanie obrotową kamerą
Projekt polega na takim wysterowaniu kamerą na ruchomej głowicy by ta zawsze
widziała twarz człowieka. Program do rozpoznawania twarzy jest gotowy.
- Sklejanie obrazków
Projekt polega na napisaniu aplikacji do automatycznego zszywania czy też sklejania
obrazków w panoramy. Sporo jest na ten temat materiałów w sieci (image stitching)
- Synteza mowy
Projekt polega na przetestowaniu dostępnych narzędzi do syntezy mowy i porównaniu
ich pod kątem jakości, stabilności i możliwości implementacji z poziomu języka C.
Dysponujemy oprogramowaniem firmy IVO.
- Analiza mowy
Projekt polega na przetestowaniu dostępnych narzędzi do analizy mowy i porównaniu
ich pod kątem jakości, stabilności i możliwości implementacji z poziomu języka C.
Dysponujemy oprogramowaniem Dragon Naturally Speaking.
- Analiza senności kierowcy
Projekt polega na napisaniu aplikacji, która wyznacza czas mrugnięcia okiem. Okazuje
się, że im człowiek jest bardziej śpiący, tym ten czas jest dłuższy. Jednym ze sposobów
rozpoznania oka i jego stanu (zamknięte, otwarte) jest wytrenowanie dwóch klasyikatorów,
które będą rozpoznawać oczy otwarte i zamknięte. Inne metody też są oczywiście dopuszczalne.
Wszystko do zrealizowania w bibliotece OpenCV.
- Przetwarzanie obrazów na smartfonie/tablecie/komputerze jednopłytkowym
(Raspberry Pie)
Projekt polega na napisaniu aplikacji pod system Android wykorzystującej
bibliotekę (lub jej fragmenty) OpenCV. Należy przetestować wydajność danego
urządzenia i napisać jakąś ciekawą aplikację wykorzystującą mobilność
urządzenia.
- Zastosowanie sieci neuronowych do predykcji przebiegów czasowych
Projekt polega na przetestowaniu różnych konfiguracji sieci neuronowych (jest do
tego gotowe oprogramowanie) w zadaniu wyznaczania przyszłych wartości sygnału.
Uczenie sieci polega na podaniu na jej wejście fragmentu przebiegu, a na wyjściu
znanej wartości sygnału następującej po fragmencie wejściowym. Odpowiednia
architektura sieci i odpowiedni zbiór sekwencji uczących powinien umożliwić
sieci przewidzenie przyszłej wartości sygnału. Interesujące jest sprawdzenie
poprawności takiej predykcji na sygnałach okresowych (łatwo), okresowych
zaburzonych/złożonych (trudniej) i nieokresowych - np. kurs akcji (trudno).
- ROS - Uniwersalny system operacyjny robotów
Projekt polega na przetestowaniu możliwości tego uniwersalnego systemu
operacyjnego robotów na naszych robotach (Lego NXT oraz Pioneer 3DX), a w wersij
rozszerzonej na napisainu sterownika do ROSa dla nszego manipulatora
ScorbotER-4u. http://www.ros.org/wiki/
- Programowanie wielowątkowe z użyciem OpenCV i TBB
Projekt polega na weryfikacji wzrostu wydajności typowych algorytmów wizyjnych
(i nie tylko) przy zastosowaniu biblioteki TBB do zrównoleglania zadań na
procesorach wielordzeniowych. Większość algorytmów została już zoptymalizowana
pod kątem wielowątkowości, wystarczy więc przetestować je na jednym i wielu
rdzeniach. Warto jednak spróbować samodzielnie zrównoleglić jakieś zadanie
wizyjne (ręczne zrównoleglanie zazwyczaj jest lepsze od automatycznego).
http://threadingbuildingblocks.org/
Tryb
realizacji projektów
Doświadczenia lat ubiegłych pokazują, że brak kontroli ze
strony prowadzącego podczas realizacji projektów prowadzi często to mizernych efektów.
Aby tego uniknąć i zakończyć projekt sukcesem i w terminie (oznacza to ukończenie
aplikacji, demonstrację jej działania oraz napisanie i przekazanie sprawozdania/dokumentacji)
będę wymagał regularnego raportowania na temat stanu pracy, osiągnięć i problemów,
planów na najbliższą przyszłość itd. Regularność i jakość tych raportów będzie w
wpływać na ocenę końcową (w przypadku projektów zespołowych pozwoli na indywidualną
ocenę jego uczestników i wyeliminuje tzw. martwe dusze) oraz będzie czynnikiem mobilizującym.
Forma raportów i sposób ich przekazywania zostanie ustalony oddzielnie.
|