170 lines
7.4 KiB
TeX
170 lines
7.4 KiB
TeX
\documentclass[]{article}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage{polski}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[margin=1.25in]{geometry}
|
|
\usepackage{alltt}
|
|
\usepackage{titling}
|
|
\usepackage{pdfpages}
|
|
\usepackage{float}
|
|
\usepackage{amsmath}
|
|
\usepackage{booktabs}
|
|
\usepackage{tabularx}
|
|
\usepackage{amstext}
|
|
\usepackage{pgfplots}
|
|
\usepackage{tikz}
|
|
\usepackage{xspace}
|
|
\usepackage{enumerate}
|
|
\usepackage{lmodern}
|
|
\usepackage{amsfonts}
|
|
\usepackage{mathtools}
|
|
\usepackage{graphicx}
|
|
\usepackage{algorithm}
|
|
\usepackage{algpseudocode}
|
|
\usepackage{wrapfig}
|
|
\usepackage[polish]{babel}
|
|
\usepackage{etoolbox}
|
|
\usepackage{subcaption}
|
|
\usepackage{multirow} % kurwa
|
|
|
|
\pgfplotsset{compat=1.15}
|
|
\usepgfplotslibrary{groupplots}
|
|
|
|
\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
|
|
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
|
|
|
|
\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning}
|
|
\usetikzlibrary{shapes.geometric, arrows, intersections}
|
|
\usetikzlibrary{external}
|
|
\tikzexternalize
|
|
|
|
\pgfdeclarelayer{background}
|
|
\pgfdeclarelayer{foreground}
|
|
\pgfsetlayers{background,main,foreground}%
|
|
|
|
% opening
|
|
\title{Retusz starych zdjęć \\ \small{Projekt ze Sztzucznej Inteligencji, WETI, PG 2018}}
|
|
\author{\protect\begin{tabular}{ll|l}
|
|
Szymon Szczyrbak & \textit{165760} & Informatyka 2016/2017 \\
|
|
Kacper Donat & \textit{165581} & Semest IV, gr. 1
|
|
\protect\end{tabular}}
|
|
\floatname{algorithm}{Program}
|
|
|
|
\makeatletter
|
|
\newcommand{\imgresult}[1]{%
|
|
\gdef\tablerow{
|
|
\includegraphics[height=1.6cm]{out/#1_damaged.jpg} &%
|
|
\foreach \v in {damaged,1,2,4,8,16,32,64,128,200} {%
|
|
\includegraphics[height=1.6cm]{out/#1_\v.jpg} &%
|
|
}%
|
|
\includegraphics[height=1.6cm]{out/#1_ok.jpg} \\%
|
|
}%
|
|
}
|
|
\makeatother
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
\section{Cel projektu}
|
|
Celem projektu było przygotowanie programu, który w sposób automatyczny umożliwiałby retuszowanie starych zdjęć z
|
|
wykorzystaniem technik sztucznej inteligencji.
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\includegraphics{./oczekiwane.jpg}
|
|
\caption{Oczekiwany rezultat działania aplikacji}
|
|
\end{figure}
|
|
|
|
Do realizacji celu zdecydowano się wykorzystać technikę GAN\footnote{https://arxiv.org/abs/1406.2661} zakładającą
|
|
stworzenie 2 sieci neuronowych, próbujących się wzajemnie oszukać. Jedna sieć - Generator - odpowiada za generowanie danych na
|
|
podstawie wektora wejściowego (w tym wypadku uszkodzonego zdjęcia) starając się przekonać drugą sieć -
|
|
Dyskryminatora - że jest to nieuszkodzone zdjęcie.
|
|
|
|
\subsection{Pozyskanie datasetu}
|
|
Jednym z problemów, na które natknęliśmy się podczas opracowywania rozwiązania był brak dostępnego wystarczająco
|
|
dużego datasetu, mogącego posłużyc do wyuczenia sieci. aby poradzić sobie z tym problemem została napisana aplikacja
|
|
umożliwająca generyczne niszczenie zdjęć.
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\begin{tikzpicture}[node distance=1.5cm]
|
|
\node (in) {\includegraphics[height=2cm]{steps/in.jpg}};
|
|
\node[right=of in] (sepia) {\includegraphics[height=2cm]{steps/sepia.jpg}};
|
|
\node[right=of sepia] (brightness) {\includegraphics[height=2cm]{steps/brightness.jpg}};
|
|
\node[below=of in] (noise) {\includegraphics[height=2cm]{steps/noise.jpg}};
|
|
\node[right=of noise] (decals) {\includegraphics[height=2cm]{steps/decals.jpg}};
|
|
\node[right=of decals] (blur) {\includegraphics[height=2cm]{steps/blur.jpg}};
|
|
|
|
\draw [->] (in) -- node [above] {sepia} (sepia);
|
|
\draw [->] (sepia) -- node [above] {jasność} (brightness);
|
|
\draw [->] (brightness) -- node [sloped, above] {szum} (noise);
|
|
\draw [->] (noise) -- node [above] {zniszczenia} (decals);
|
|
\draw [->] (decals) -- node [above] {rozmycie} (blur);
|
|
\end{tikzpicture}
|
|
\caption{Proces niszczenia zdjęć}
|
|
\end{figure}
|
|
|
|
Każdy z kroków jest parametryzowalny, oraz każde zdjęcie zawiera losową zmianę do parametru w celu zapobiegnięcia
|
|
zbyt szybkiemu overfittingowi sieci.
|
|
|
|
\section{Rezultaty}
|
|
\begin{center}\textit{\color{red} wstaw budowę sieci plox}\end{center}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\begin{tikzpicture}
|
|
\begin{axis}[grid=both, width=\linewidth, height=8cm, no marks, xmin=0, xmax=200, xlabel={Epoka}, ylabel={Strata}]
|
|
\addplot[very thin, blue] table [x=epoch,y=g,col sep=comma] {iterations.csv};
|
|
\addplot[very thick] table [x=epoch,y=g,col sep=comma] {loss.csv};
|
|
\end{axis}
|
|
\end{tikzpicture}
|
|
\caption{Funkcja straty dla generatora}
|
|
\label{fig:results}
|
|
\end{figure}
|
|
|
|
\begin{figure}[H]
|
|
\centering
|
|
\begin{tikzpicture}
|
|
\begin{axis}[grid=both, width=\linewidth, height=8cm, no marks, xmin=0, xmax=200, xlabel={Epoka}, ylabel={Strata}]
|
|
\addplot[very thin, red] table [x=epoch,y=d,col sep=comma] {iterations.csv};
|
|
\addplot[very thick] table [x=epoch,y=d,col sep=comma] {loss.csv};
|
|
\end{axis}
|
|
\end{tikzpicture}
|
|
\caption{Funkcja straty dla dyskryminatora}
|
|
\end{figure}
|
|
|
|
\begin{table}[H]
|
|
\centering
|
|
\def\arraystretch{.6}
|
|
\setlength{\tabcolsep}{0pt} % for the horizontal padding
|
|
\begin{tabular}{cccccccccccc}
|
|
zniszczone & 1 & 2 & 4 & 8 & 16 & 32 & 64 & 128 & 200 & oczekiwane \tabularnewline \hline
|
|
\input{table.tex}
|
|
\end{tabular}
|
|
\caption{Zestawienie wyników dla kolejnych epok, zdjęcia z 3 oraz 4 rzędu pochodzą z internetu, pozostałe zostały zniszczone generycznie}
|
|
\end{table}
|
|
|
|
\subsection{Obserwacje}
|
|
Powyższe dane zostały pozyskane z uczenia sieci na datasecie zawierajacym 100 różnych elementów. W zestawieniu
|
|
\ref{fig:results} wyraźnie widać, że wraz z każdą generacją generator osiąga coraz lepsze wyniki jednak, od pewnego
|
|
momentu szybkość uczenia się zdecydowanie maleje.
|
|
|
|
\subsection{Problemy}
|
|
Głównym blokujący problemem podczas rozwijania projektu były niezwykle długie czasy uczenia się sieci na CPU, oraz
|
|
dość wysoka podatność na zmiany w parametrach sieci czy wygenerowanego datasetu, nie pozwoliło to na zrobienie zbyt
|
|
wielu iteracji programu, a tym samym na jego skuteczny rozwój.
|
|
|
|
Wyraźnie również widać przekolorowanie na obrazkach oraz zmianę jasności - prawdopodobnie oba te problemy wynikają z
|
|
zastosowania normalizacji zarówno wektora wejściowego jak i na poszczególnych etapach Generatora oraz przy konwersji
|
|
z tensorów, którymi posługuje się do obrazów.
|
|
|
|
Po sprawdzeniu kilku różnych zestawu danych do uczenia się, można zauważyć, że efekty na obrazach pochodzących z
|
|
realnego śiata są do siebie bardzo podobne, co wskazywałoby na relatywną stabilność rozwiązania i problem ze
|
|
sposobem generowania danych, który dostarcza zbyt mało różnorodne wejście. Problem ten można by rozwiązać
|
|
wykorzystując dataset zbudowany na podstawie kilku różnych metod generowania zniszczeń, bądź najlepiej wykorzystując
|
|
dane pochodzące z realnego świata.
|
|
|
|
Dodatkową trudnością jest fakt, że sieć nie tylko musi nauczyć się generować brakujące części obrazu ale też
|
|
decydować, które części są uszkodzeniem, a które detalem do zachowania. Problem ten widać w 3 wierszu prezentowanych
|
|
danych - wzór na koszuli został uznany za uszkodzenie i usunięty przez sieć.
|
|
\end{document}
|