summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Chapters/chapter1.tex80
-rw-r--r--Chapters/chapter2.tex32
-rw-r--r--Chapters/chapter3.tex58
-rw-r--r--Chapters/chapter4.tex46
-rw-r--r--iithesis.pdfbin469879 -> 479505 bytes
5 files changed, 119 insertions, 97 deletions
diff --git a/Chapters/chapter1.tex b/Chapters/chapter1.tex
index d6d302d..5af0f29 100644
--- a/Chapters/chapter1.tex
+++ b/Chapters/chapter1.tex
@@ -1,26 +1,30 @@
 \chapter{Preliminaria}
-Ta praca została zrealizowana w ramach przedmiotu "Projekt: autonomiczna jazda łazikiem".
-Z jego powodu(trzeba zmienic to wyrazenie), powstało wiele rozwiązań dla zadań z 
+Ta praca 
+powstała w ramach przedmiotu "Projekt: autonomiczna jazda łazikiem".
+
+Podczas realizacji przedmiotu powstało wiele rozwiązań dla zadań z 
 "konkursów łazikowych".
 
 Żaden spośród łazików biorących udział w University Rover Challenge nie 
-używa sieci neuronowych bezpośrednio do nawigacji , ale prawie wszystkie używają
+używa sieci neuronowych bezpośrednio do nawigacji, ale prawie wszystkie używają
 ROS (Robot Operating System) jako podstawy całego oprogramowania. Z tego powodu
-w tym rozdziale poruszone będą:
+rozdziale zostaną poruszone poniższe zagadnienia:
 \begin{itemize}
   \item Łazik Aleph 1
-  \item Podstawy sieci neuronowych.
+  \item Podstawy sieci neuronowych
   \item Architektura ROS
 \end{itemize}
-\section {Łazik}
-Łazik Aleph 1 powstał z inicjatywy koła naukowego Continuum\footnote{ Strona koła naukowego Continuum:
+\section {Łazik Aleph 1}
+Łazik Aleph 1 powstał z inicjatywy 
+% Koło Pasjonatów Mechaniki i Informatyki "Continuum" (oficjalna nazwa?)
+Koło Pasjonatów Mechaniki i Informatyki "Continuum"\footnote{ Strona Koła Pasjonatów Mechaniki i Informatyki "Continuum":
 \href{http://continuum.uni.wroc.pl/}{http://continuum.uni.wroc.pl/}}
 w roku 2014. Od tego czasu został zaprezentowany na konkursach takich jak 
 European Rover Challenge (ERC) oraz University Rover Challenge (URC). Przez ostatnie
 dwa lata łazik był doceniany na konkursie URC (w roku 2016 zajął 3 miejsce, a w roku
 2017 -- 2 miejsce).
 
-Podczas konkursu URC pojazdy były ocenianie w czterech kategoriach\footnote{
+Podczas konkursu URC pojazdy były oceniane w czterech kategoriach\footnote{
 Regulamin konkursu URC: \href{http://urc.marssociety.org/home/requirements-guidelines}
 {http://urc.marssociety.org/home/requirements-guidelines}}:
 \begin{itemize}
@@ -40,7 +44,7 @@ Celem sieci jest przybliżenie funkcji $f^*$, przyporządkowującej argumentom $
 $y$, funkcją $f(x,\theta)=y$ oraz znalezienie parametru $\theta$, który da najlepsze
 przybliżenie.
 \subsection{Jak działają}
-Sieci neuronowe są zazwyczaj złożone z wielu różnych funkcji, nazywanych warstwami. Przykładowo
+Sieci neuronowe są zazwyczaj złożone z wielu różnych funkcji, nazywanych warstwami. Przykładowo,
 $f(x)=f^{(3)}(f^{(2)}(f^{(1)}(x)))$, wtedy $f^{(3)}$ jest wartwą wyjściową, której wyniki
 powinny odpowiadać funkcji $f^*$. Wyniki dla pozostałych warstw nie są znane, z tego
 powodu nazywa się je ukrytymi warstwami.
@@ -48,9 +52,10 @@ powodu nazywa się je ukrytymi warstwami.
 W wyniku trenowania chcemy znaleźć takie $\theta$, żeby $f^*(x)\approx f(x,\theta)$.
 W tym celu należy zdefiniować funkcję kosztu $L(\theta)$ tzn. odległości modelu 
 od celu, zależną od $\theta $,
-przykładowo dla regresji średni błąd kwadratowy dla danych uczących. Dla takiej
-funkcji chcielibyśmy teraz znaleźć minimum. Minimum globalne może być trudne
-do znalezienia, ale minima lokalne zazwyczaj są wystarczająco dobre.
+np. dla problemu regresji, $L$ to średni błąd kwadratowy dla danych uczących. 
+Dla takiej funkcji chcielibyśmy teraz znaleźć minimum. Minimum globalne może być trudne
+do znalezienia, ale minima lokalne zazwyczaj są wystarczające do większości zastosowań.
+
 
 Gdyby $L$ byłoby funkcją jednej zmiennej, wystarczyłoby zacząć w losowym miejscu i
 wielokrotnie wykonać następujący
@@ -58,7 +63,9 @@ krok $x=x-\epsilon L'(x)$, aby dotrzeć do minimum lokalnego. Dla funkcji
 wielu zmiennych podobny algorytm działa, ale pochodną należy zastąpić gradientem
 $x=x-\epsilon \nabla _x L(x)$.
 \subsection{Popularne warstwy}
-Warstwa liniowa (linear lub dense) jest najbardziej podstawową warstwą. Każdy 
+Warstwa liniowa (linear lub dense)
+
+ jest najbardziej podstawową warstwą. Każdy 
 element wyjściowy ($m$ wartości) jest kombinacją wszystkich wejść ($n$ wartości)
 danej warstwy (powiększoną o stałą). Zatem taka warstwa jest parametryzowana
 macierzą rozmiaru $n \cdot m$ oraz wektorem rozmiaru $m$.
@@ -66,14 +73,14 @@ macierzą rozmiaru $n \cdot m$ oraz wektorem rozmiaru $m$.
 Dwie takie sąsiednie warstwy liniowe można by zredukować do jednej, ponieważ
 $W_2 \cdot (W_1 \cdot x + b_1) +b_2 = W \cdot x + b$, gdy $W=W_2 \cdot W_1$ oraz
 $b = W_2 \cdot b_1 +b_2$. Zatem dowolnie głęboką sieć złożoną z takich warstw
-możnaby zredukować do 1 takiej warstwy, ale po każdej funkcji liniowej aplikuje
-się funkcję nieliniową np. tanh lub relu ($\max(0,x)$). Dzięki temu sieci neuronowe
+możnaby zredukować do jednej takiej warstwy, ale po każdej funkcji liniowej aplikuje
+się funkcję nieliniową np. $tanh$ lub $relu$ ($\max(0,x)$). Dzięki temu sieci neuronowe
 są w stanie pokryć znacznie większą przestrzeń funkcji niż tylko liniowe.
 
 Inną warstwą, już specjalizowaną w przetwarzaniu danych położonych na pewnej kracie,
 jest warstwa konwolucyjna. Przykładowym wejściem dla takiej warstwy może być
 dwuwymiarowa siatka pikseli. Natomiast wyjściem jest obraz o zbliżonej (lub tej samej)
-rozdzielczości, którego wartość jest kombinancją liniową spójnego bloku piksli z 
+rozdzielczości, którego wartość jest kombinancją liniową spójnego bloku pikseli z 
 wejścia. Ważną cechą takiej warstwy jest fakt, że wszystkie wyjścia korzystają
 z tych samych parametrów, co powoduje że znajdują te same wzorce położone w 
 innych miejscach.
@@ -81,10 +88,10 @@ innych miejscach.
 Kolejnym typem warstw specjalizowanym w przetwarzaniu obrazów jest pooling.
 Dzieli ona wejście na spójne rozłączne bloki, na każdym z nich osobno aplikuje
 funkcję np. $max$ lub $avg$. Taka operacja powoduje niewrażliwość na małe 
-przemieszczenia wejść. Dodatkowo zmniejsza to rozmiar wejścia w kolejnych warstwach
+przemieszczenia wejść. Dodatkowo zmniejsza to rozmiar wejścia w kolejnych warstwach,
 co zmniejsza liczbę parametrów.
 \subsection{Uwagi}
-Konwolucyjne sieci neuronowe bardzo dobrze radzą soie z widzeniem maszynowym, są w stanie
+Konwolucyjne sieci neuronowe bardzo dobrze radzą sobie z widzeniem maszynowym, są w stanie
 klasyfikować bezproblemowo obrazki\footnote{\href
 {https://www.cs.toronto.edu/\~kriz/imagenet\_classification\_with\_deep\_convolutional.pdf}
 {https://www.cs.toronto.edu/\~kriz/imagenet\_classification\_with\_deep\_convolutional.pdf}}.
@@ -95,41 +102,38 @@ jest ukryte założenie, że dla każdego obrazu z kamery jest tylko jedna popra
 odpowiedź.
 
 
-\section{ROS}
-ROS to rozbudowany framework przeznaczony do programowania robotów.
+\section{Architektura ROS}
+ROS (Robot Operating System) to rozbudowany framework przeznaczony do programowania robotów.
 Składa się na niego wiele bibliotek oraz narzędzi mających na celu zbudowanie
 klastra komputerów tworzących spójny system.
 Dostarcza on abstrakcję nad sprzętem, środki komunikacji między procesami oraz
-oraz inne funkcjonalności dostarczane przez typowy system operacyjny.
+oraz inne funkcjonalności gwarantowane przez typowy system operacyjny.
 Ze względu na modułową budowę oraz architekturę peer-to-peer procesy mogą
 bezproblemowo działać na różnych komputerach.
 \subsection{Node}
-Podstawową jednostką w ROSie jest wierzchołek(node), jego głównym zdaniem jest
-wykonywanie obliczeń. Wierzchołki razem tworzą graf, a komunikują się za 
-pomocą tematów(topic).
+Podstawową jednostką w ROS-ie jest wierzchołek (node), jego głównym zdaniem jest
+wykonywanie obliczeń. Wierzchołki razem tworzą graf i komunikują się za 
+pomocą tematów (topic).
 
-Taka architektura (inspirowana budową mikrojądra) zapewnia lepsza ochronę na błędy
-w porównaniu do architektury monolitycznej. Dodatkowo pojedyńczy element można
-bezproblemowo przepisać, i to w innym języku.
+Taka architektura (inspirowana budową mikrojądra) w porównaniu do architektury monolitycznej, zapewnia lepszą ochronę przed błędami. Dodatkowo pojedyńczy element można
+bezproblemowo przepisać także w innym języku programowania.
 \subsection{Topic}
-Tematy(topic) pozwalają bezproblemowo zapewnić komunikację międzyprocesową
-w ROSie. Każdy node może zadelkarować chęć nadawania bądź nasłuchiwania na
-danym temacie. Przykładowo moduł jazdy autonomicznej może zasubskrybować
-obraz z kamery Kinect, a publikować na temacie reprezentującym kierunek ruchu.
+Tematy (topic) pozwalają bezproblemowo zapewnić komunikację międzyprocesową
+w ROS-ie. Każdy node może zadeklarować chęć nadawania bądź nasłuchiwania na
+danym temacie. Przykładowo, moduł jazdy autonomicznej może zasubskrybować
+obraz z kamery Kinect i publikować na temacie reprezentującym kierunek ruchu.
 Tematy są otypowane, co gwarantuje że wszystkie wiadomości wysłane na tym
 samym temacie mają taką samą strukturę.
 \subsection{Gotowe moduły}
 ROS dostarcza wiele gotowych modułów pozwalających szybko rozpocząć projekt.
 Jednym z nich jest Odom, który zbiera informacje o położeniu i prędkości 
-z wielu źródeł danych i łączy je w jedno (o większej pewności). Przykładowo 
-dane może zbierać z czujnika gps, prędkości obrotowej kół oraz akcelerometru.
+z wielu źródeł danych i łączy je w nowy strumień danych (o większej pewności). Przykładowo, 
+dane może zbierać z czujnika GPS, prędkości obrotowej kół oraz akcelerometru.
 
 Inny moduł potrafi tworzyć mapy na podstawie obrazu z kamery oraz mapy głębokości.
-Wynik tej rekonstrukcji można obejrzeć z pomocą innych usług służących do 
-wizualizacji różnych typów danych takich jak obraz, wartości zmieniające się
-w czasie, chmury punktów lub mapa terenu.
-%chyba nie aż tak ważne 
-%tf,kamery,konwersje obrazków/strumieni
+Wynik tej rekonstrukcji można obejrzeć za pomocą innych usług służących do 
+wizualizacji różnych typów danych takich jak obraz, wartości zmieniających się
+w czasie, chmury punktów lub mapy terenu.
 
 % \section{Autonomia Aleph 1}
 %Co zostało zrobione na przedmiocie:
diff --git a/Chapters/chapter2.tex b/Chapters/chapter2.tex
index f048612..d7a6f6d 100644
--- a/Chapters/chapter2.tex
+++ b/Chapters/chapter2.tex
@@ -1,7 +1,7 @@
 \chapter{Trenowanie sieci i zbieranie danych}
-W celu autonomicznej jazdy wytrenowałem konwolucyjną sieć neuronową (CNN)
+W celu autonomicznej jazdy wytrenowałem konwolucyjną sieć neuronową (CNN -- Convolutional Neural Network)
 przetwarzającą obraz z kamery bezpośrednio w porządaną prędkość liniową
-oraz obrotową. Takie podejście pozwala szybko zbierać dane uczące, wystarczy
+oraz obrotową. Takie podejście pozwala szybko zbierać dane uczące. Wystarczy
 tylko nagrać obraz z kamery oraz prędkość nadaną przez kierowcę.
 \begin{figure}[h]
   \centering
@@ -14,21 +14,19 @@ tylko nagrać obraz z kamery oraz prędkość nadaną przez kierowcę.
   \fbox{
   \scalebox{0.5}{\includegraphics*[viewport=0 0000 600 1300]{img/model.png}}
   }
-  \label{model}
   \caption{Architektura sieci}
+  \label{model}
 \end{figure}
 
-Wersja sterująca w symulatorze powstała, żeby odrzucić modele, które nie radzą
+Wersja sterująca w symulatorze powstała aby odrzucić modele, które nie radzą
 sobie w tak prostych warunkach. Dodatkowo zbieranie danych oraz testowanie
-modelu jest łatwiejsze, ponieważ nie wymaga przygotowywania sprzętu, oraz
-opuszczenie toru przez model jest nieszkodliwe w porównaniu do opuszczenia
-drogi przez fizycznego łazika.
+modelu jest łatwiejsze. Po pierwsze, nie wymaga przygotowywania sprzętu. Poza tym,
+opuszczenie toru przez model nie stwarza zagrożenia uszkodzenia łazika lub jego otoczenia.
 
-Architektura sieci pochodzi z rozwiązania chauffeur w konkursie udacity self driving car\footnote
-{ Repozytorium dostępne pod\href{https://github.com/udacity/self-driving-car/tree/master/steering-models/community-models}
+Architektura sieci pochodzi z rozwiązania \textit{chauffeur} w konkursie Udacity -- Self Driving Car\footnote
+{ Repozytorium dostępne pod \href{https://github.com/udacity/self-driving-car/tree/master/steering-models/community-models}
 {https://github.com/udacity/self-driving-car/tree/master/steering-models/community-models}},
-ale została zaadaptowana do interfejsu symulatora oraz łazika (oprócz obrotu
-potrafi też zadać prędkość). Konwersja z rosbaga (format nagrań ROSa) do 
+ale została zaadaptowana do interfejsu symulatora oraz łazika. Sieć wykorzystana w moim projekcie, w odróżnieniu od rozwiązania konkursowego, zadaje też prędkość. Konwersja z rosbaga (format nagrań ROS-a) do 
 naszego formatu oraz sam symulator zostały wykonane przez innych członków projektu.
 
 
@@ -37,17 +35,17 @@ Nagrania do nauki na symulatorze zostały wykonane przeze mnie i dwóch innych
 uczestników projektu. Łączna długość nagrań wynosi około 50 minut, z czego 5
 minut zostało przeznaczone na zbiór walidacyjny, a reszta była zbiorem uczącym.
 
-Obrazy pochodzą z 3 kamer, jedna skierowana na wprost, a pozostałe były obrócone
+Obrazy pochodzą z trzech kamer: jednej skierowanej na wprost, dwóch obróconych
 o 20 stopni względem środkowej. Podczas uczenia wykorzystywany był obraz ze wszystkich
-trzech kamer. Dla kamery środkowej porządanym wynikiem były nagrane dane z sterowania,
-natomiast dla kamery lewej wynik był nieznacznie zaburzony w prawo, i analogicznie 
-dla trzeciej kamery.
-Dodatkowo obraz z kamery środkowej był dodany w postaci symetrycznego odbicia
+kamer. Dla kamery środkowej pożądanym wynikiem były nagrane dane ze sterowania.
+Dla kamery lewej wynik był nieznacznie zaburzony w prawo, natomiast analogicznie
+dla kamery prawej -- w lewo.
+Dodatkowo, obraz z kamery środkowej był dodany w postaci symetrycznego odbicia
 ze zmienionym kierunkiem skrętu.
 
 \section{Trening z nagrań łazika}
 Do treningu zostało wykorzystane około 150GB nagrań z łazika, zawierających
-obraz z kamery oraz informacje o sterowaniu, jest to kilkanaście objazdów
+obraz z kamery oraz informacje o sterowaniu. Jest to kilkanaście objazdów
 po podziemnym garażu. Na większości ujęć widać kratkę zazwyczaj zgodną z kierunkiem
 jazdy, ale zakręcjącą pod kątem prostym. Około 6GB danych zostało wykorzystanych jako
 zbiór walidacyjny.
diff --git a/Chapters/chapter3.tex b/Chapters/chapter3.tex
index e18e293..8991a9a 100644
--- a/Chapters/chapter3.tex
+++ b/Chapters/chapter3.tex
@@ -1,86 +1,86 @@
 \chapter{Wyniki sieci}
-Wytrenowana sieć potrafi przejechać zarówno cały tor na symulatorze jak i
-podziemny garaż instytutu. Na dodatek sieć trenowana pod symulator uczyła się,
-tylko jeździć przeciwnie do ruchu wskazówek zegara, a po ustawieniu modelu w przeciwnym
-kierunku potrafi przejechać cały tor bezproblemowo.
+Wytrenowana sieć potrafi przejechać zarówno cały tor na symulatorze, jak i
+podziemny garaż instytutu. Na dodatek sieć trenowana pod symulator uczyła się
+ jeździć tylko przeciwnie do ruchu wskazówek zegara. Po ustawieniu modelu w przeciwnym
+kierunku, sieć potrafi bezproblemowo przejechać cały tor.
 
 \section{Na co zwraca uwagę}
 Aktywność sieci dla obrazków została wygenerowana za pomocą metody
 Integrated Gradients\footnote{\href{https://arxiv.org/abs/1703.01365}{https://arxiv.org/abs/1703.01365}}.
 
-Co było oczywiste w przypadku symulatora,sieć zwraca głównie uwagę na miejsca,
-gdzie pojawiają się granice drogi\ref{sim_act}. Co ciekawe reaguje też na ścianę
+Co było oczywiste w przypadku symulatora, sieć zwraca głównie uwagę na miejsca,
+gdzie pojawiają się granice drogi \ref{sim_act}. Co ciekawe, reaguje też na ścianę
 tworzącą horyzont, ponieważ zmienia wygląd w zależności od odległości i może
-pomóc w orientacji (na tej trasie).
+pomóc w orientacji (na trasie treningowej).
 \begin{figure}
   \centering
   \fbox{
   \scalebox{0.5}{\includegraphics{img/sim_img.png}}
   }
-  \label{sim_img}
   \caption{Obraz z symulatora}
+  \label{sim_img}
 \end{figure}
 \begin{figure}
   \centering
   \fbox{
   \scalebox{0.5}{\includegraphics{img/sim_img_act.png}}
   }
-  \label{sim_act}
   \caption{Na co sieć patrzy, symulator}
+  \label{sim_act}
 \end{figure}
 \begin{figure}
   \centering
   \fbox{
   \scalebox{0.5}{\includegraphics{img/real_img.png}}
   }
-  \label{real_img}
   \caption{Obraz z nagrania}
+  \label{real_img}
 \end{figure}
 \begin{figure}
   \centering
   \fbox{
     \scalebox{0.5}{\includegraphics{img/real_img_act.png}}
   }
-  \label{real_act}
   \caption{Na co sieć patrzy, nagranie}
+  \label{real_act}
 \end{figure}
 
-Z kolei dla łazika intensywność w najbardziej aktywnym miejscu jest dużo mniejsza,
-co oznacza że nie sugeruje się tylko jednym miejscem. Ale mimo tego najbardziej 
-zwraca uwagę na kratkę na podłodze, która mogła by wystarczyć do nawigacji.
+Z kolei dla łazika intensywność w najbardziej aktywnym miejscu jest dużo mniejsza \ref{real_act}.
+Oznacza to, że nie sugeruje się tylko jednym obszarem z kamery. Najbardziej jednak 
+zwraca uwagę na kratkę na podłodze, która mogłaby wystarczyć do nawigacji.
 
 \section{W porównaniu do nagrania}
-Na wykresie \ref{plot_ang} widać że sieć (pomarańczowy kolor), mniej gwałtownie 
-zmienia szybkość obrotu niż kierowca (kolor niebieski). Ale w podobnych momentach
-zauważa, że należy skręcić.
+Na wykresie \ref{plot_ang} widać, że sieć (pomarańczowy kolor) mniej gwałtownie 
+zmienia szybkość obrotu niż kierowca (kolor niebieski). Jednak sieć reaguje w podobnych momentach co kierowca na konieczność wykonania skrętu.
+
 \begin{figure}
   \centering
   \fbox{
     \scalebox{0.5}{\includegraphics{img/real_data_ang.png}}
   }
-  \label{plot_ang}
   \caption{Prędkość obrotowa: sieć vs kierowca}
+  \label{plot_ang}
 \end{figure}
 
 \section{Wpływ architektury}
 W przypadku sieci pod symulator, usunięcie niektórych warstw konwolucyjnych
-pozwalało modelowi utrzymać się na torze, a taka sama zredukowana architektura 
-nie radziła sobie dobrze w przypadku nagrań z prawdziwego łazika. Natomiast
-usunięcie nieliniowości z warstw konwolucyjnych tak okaleczyła zdolności sieci,
+pozwalało modelowi nadal utrzymywać się na torze, natomiast taka sama zredukowana architektura 
+nie radziła sobie dobrze w przypadku nagrań z prawdziwego łazika. Z kolei
+usunięcie nieliniowości z warstw konwolucyjnych ograniczyło zdolności sieci do takiego stopnia,
 że nie potrafiła się utrzymać na wirtualnym torze.
 
-Z kolei usunięcie dropoutu, bardzo szybko powodowało overfitting i radziła sobie
+Usunięcie dropoutu bardzo szybko powodowało overfitting i sieć radziła sobie
 dobrze tylko na danych uczących. Z kolei dodanie warstw liniowych na końcu nie 
 poprawiało, ani nie pogorszało zbytnio wydajności sieci, przynajmniej dla
-nagrań z symulatora. Widocznie większość interesujących cech już jest znaleziona
-w ramach konwolucji, i dla tak prostych danych nie pomaga zwiększenie modelu.
+nagrań z symulatora. Na tej podstawie można wywnioskować, że większość interesujących 
+cech obrazu została już znaleziona w ramach warstw konwolucyjnych, więc dla tak prostych danych zwiększenie modelu jest nieefektywne.
 
-Co ciekawe w przypadku wytrenowanego już modelu do symulatora zredukowanie 
-rozdzielczości obrazów dziesięciokrotnie w każdym wymiarze(z rozdzielczości 
+Co ciekawe, w przypadku wytrenowanego już modelu do symulatora zredukowanie 
+rozdzielczości obrazów dziesięciokrotnie w każdym wymiarze (z rozdzielczości 
 320x160 do 32x16),
-i zwykłe przeskalowanie w górę przed zewaluowaniem wystarczy żeby urzymać się 
+i zwykłe przeskalowanie w górę przed zewaluowaniem wystarczy, żeby utrzymać się 
 na torze.
 
-Na dodatek sieć uczona na obrazie kolorowym bezproblemowo działa, gdy
-zredukuje się obraz do skali szarości a następnie powtórzy kanał trzykrotnie.
+Ponadto, sieć uczona na obrazie kolorowym działa bezproblemowo, gdy
+zredukuje się obraz do skali szarości. Jedyne, co należy wykonać to stworzyć obraz kolorowy, w którym każdy z kanałów RGB będzie powtórzonym obrazem wejściowym.
 
diff --git a/Chapters/chapter4.tex b/Chapters/chapter4.tex
index b34809a..e71eda7 100644
--- a/Chapters/chapter4.tex
+++ b/Chapters/chapter4.tex
@@ -1,18 +1,38 @@
-\chapter{Co dalej}
-Najprostszym następnym krokiem jest zwiększenie danych o dodatkowy wymiar, i nauczenie takiej
-sieci decyzji na podstawie $k$ (niekoniecznie) ostatnich zdjęć. Innym prostym rozwiązaniem,
-które można z tym połączyć jest zmiana perspektywy kamery na zdjęcie z góry.
+\chapter{Podsumowanie}
+Sieć neuronowa wykonana w ramach projektu działa na ten moment dość intuicyjnie, 
+co znaczy, że nie wykonuje żadnego planowania, decyzje podejmuje na bieżąco. 
+Jest w stanie pokonać prostą trasę, w której tylko jeden tor może zostać uznany 
+za prawidłowy. 
+\section{Możliwe usprawnienia}
+Aktualna sieć może nie być w stanie rozwiązać wszystkich problemów, w szczególności
+planowania trasy. Dlatego też warto rozważyć opisane poniżej podejścia.
 
-Bardziej ambitnym pomysłem jest wytrenowanie rekurencyjnej sieci neuronowej (RNN),
-gdyby ją dobrze nauczyć sama wyciągnie kontekst. Ale problemem przy jej trenowaniu
-będzie fakt, że prostą strategią dla takiej sieci jest powtarzanie ostatniego wypisanego
-wyniku, a to dlatego że prędkość jest ciągła.
+Najprostszym rozszerzeniem obecnej architektury może być wzięcie pod uwagę czasu -- 
+np. reagowanie na $k$ ostatnich obrazków. Dzięki temu rozwiązaniu sieć byłaby w 
+stanie wywnioskować aktualną prędkość, ale wciąż jej decyzje pozostałyby
+spontaniczne.
 
-Kolejnym rozwiązaniem jest reinforced learning, sieć karało by się za
-każdą interwencję lub wyjechanie poza trasę. Niestety problemem tutaj jest 
-fakt, że jak błąd prawdziwego pojazdu może być kosztowny lub niebezpieczny.
+Większym wyzwaniem byłoby wytrenowanie rekurencyjnej sieci neuronowej (RNN), zdolnej
+do przekazania samej sobie kontekstu. Trenowanie takiej sieci mogłoby się okazać 
+bardziej problematyczne. Prostą strategią dla takiej sieci jest powtarzanie 
+ostatniego wypisanego wyniku. Mogłoby to doprowadzić do sytuacji, w której  łazik
+wykonuje wciąż te same operacje, nie reagując na zmianę warunków.
 
-Oczywiście pozostają też rozwiązania nie używające sieci neuronowych, można
-przykładowo stworzyć program pilnujący aby łazik nie wjechał w przeszkodę.
+Kolejnym rozwiązaniem jest reinforced learning, które polega na wskazywaniu sieci
+sytuacji, w których sieć popełniła błąd. Przykładowo, za taką sytuację można uznać
+konieczność interwencji człowieka lub wyjechanie łazika poza trasę. 
+Niestety, modelu wytrenowanego na symulatorze nie da się przenieść bezpośrednio 
+na pojazd (np. ze względu na znaczną różnicę obrazu). Dlatego też omawiane rozwiązanie
+można trenować jedynie w rzeczywistości. Stwarza to niestety problemy -- 
+błąd prawdziwego pojazdu może być kosztowny lub niebezpieczny.
 
+Dodatkowo, każde ze wspomnianych rozwiązań można usprawinić poprzez zmianę 
+perspektywy kamery na ujęcie z góry.
+
+Oczywiście pozostają też rozwiązania nieużywające sieci neuronowych. Można
+na przykład stworzyć program, który korzystając z mapy otoczenia lub mapy głebokości
+z kamery nadzorowałby trasę łazika, zmniejszając ryzyko wjechania pojazdu w przeszkodę.
+
+Zaproponowane powyżej rozwiązania mogą zostać zastosowane w przyszłości, w ramach 
+dalszego rozwoju projektu.
 
diff --git a/iithesis.pdf b/iithesis.pdf
index a098392..ae72aed 100644
--- a/iithesis.pdf
+++ b/iithesis.pdf
Binary files differ