<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">Wie oben bereits erwähnt, ist die Annotation von Bildern ein notwendiger Prozess, um einem Computer beizubringen, Objekte automatisch zu erkennen.
Je nachdem welche Aufgabe der Computer später übernehmen soll, müssen dabei verschiedene Objekte annotiert werden.
Wenn der Computer zum Beispiel lernen soll, Menschen und Tiere zu erkennen, dann würde es nichts bringen Autos zu annotieren.
Die verschiedenen Objektkategorien, deren Objekte annotiert werden sollen, werden Klassen genannt. 
In diesem Beispiel würden die Klassen \glq Mensch\grq{ } und \glq Tier\grq{ } ausreichen. Je nach Anwendungsfall 
könnte es aber auch sinnvoll sein diese Klassen noch weiter aufzuteilen.

In der GUI, welche in dieser Arbeit vorgestellt wird, im nachfolgenden Text nur noch GUI genannt, 
geht es jedoch nicht nur um die Annotation von Objekten auf Bildern, sondern auch um die Annotation von Bildsequenzen.
Eine Bildsequenz ist eine geordnete Abfolge von Bildern, die von verschiedenen Kameras aufgenommen wurden.
Dabei sind die Bilder zunächst nach der Kamera und dann nach dem Aufnahmenzeitpunkt geordnet.
Diese besondere Ordnung der Bilder erleichtert den Prozess des Annotierens, 
da sich die Objekte in den verschiedenen Bildern einer Kamera immer nur ein Stück in eine Richtung bewegen.
Es ist für den Nutzer der GUI daher leicht, dieselben Objekte auf den Bildern wiederzuerkennen.
Außerdem ändern sich die Objekte nur selten in ihrer Form, weshalb die Umrisse eines Objektes oft von einem Bild zum nächsten kopiert werden können.

Beispiel: 
Es sind zwei Kameras A und B vorhanden, welche alle 2 Sekunden ein Bild machen. Die Objekte, die von den Kameras erfasst werden, 
bewegen sich zunächst durch das Sichtfeld von Kamera A und dann durch das Sichtfeld von Kamera B.
Eine Bildsequenz dieser beiden Kameras enthält nun zuerst alle Bilder von Kamera A, in zeitlich sortierter Reihenfolge,
und dann alle Bilder von Kamera B, welche im gleichen Zeitfenster aufgenommen wurden.

Der Nutzer kann nun das erste Bild von Kamera A annotieren. 
Dann kann der Nutzer jedes annotierte Objekt kopieren und auf dem nächsten Bild leicht verschoben oder gedreht wieder einfügen.

Bei der Annotierung von einzelnen Bildern reichen bei der Objekterkennung als Trainingsdaten die Daten aus, 
wo sich auf welchem Bild ein Objekt einer bestimmten Klasse befindet.
Bei einer Sequenz von Bildern spielen jedoch auch andere Daten eine Rolle. Zum Beispiel ist es sinnvoll zu wissen, 
bei welchen Objekten auf unterschiedlichen Bildern es sich um dasselbe Objekt handelt, 
welches zu einem anderen Zeitpunkt oder aus einer anderen Blickrichtung aufgenommen wurde.
Daher bekommt in der GUI jedes Objekt eine eindeutige ID, an welcher man das Objekt auf verschiedenen Bildern wiedererkennen kann.
Jeder Objekt-ID wird dann eine Objektklasse zugeordnet. So ist sichergestellt, dass dasselbe Objekt nicht auf unterschiedlichen Bildern 
unterschiedlichen Klassen zugeordnet werden kann.
Es kann sogar vorkommen, dass dasselbe Objekt an mehreren unterschiedlichen Stellen im gleichen Bild vorkommt.
Das passiert genau dann, wenn die Sicht auf das Objekt durch einen Gegenstand versperrt wird und das Objekt nur teilweise sichtbar ist (siehe Abbildung \ref{fig:zerteiltesobjekt}).
\graphicsfigure{bilder/zerteiltesobjekt}{Mehrfaches Vorkommen desselben Objektes auf einem Bild}{fig:zerteiltesobjekt}{0.33\textwidth}
Außerdem gibt es bei einer Bildsequenz für eine Kamera oft Bereiche, in denen sich kein Objekt befinden kann.
Solche Bereiche können in der GUI mit Masken festgelegt werden.

Um die Annotation zu speichern, können verschiedene Formate benutzt werden. Dabei ist es sinnvoll sich für ein Format zu entscheiden,
welches möglichst viele andere Personen auch benutzen, da dann möglichst viele von den annotierten Bildern profitieren können.
Im folgenden Abschnitt wird das von der GUI verwendete Format zum Speichern von Annotationen 
und die unterstützten Formate für das Erstellen neuer annotierter Bildsequenzen erklärt.

\section{Annotationsformat}\label{sec:annotationsformat}
Damit möglichst viele Forscher die von der GUI erstellten Annotationen verwenden können, 
wird zur Speicherung der Annotationen ein Format verwendet, welches sich sehr stark an dem Format des PascalVOC 2007 Datensatzes orientiert~\cite{pascal-voc-2007}.
Es werden lediglich zusätzliche Informationen wie zum Beispiel Kamera und Objekt-ID gespeichert.
Zu jeder annotierten Bildsequenz gehören dabei die vier Ordner \glq Annotations\grq, \glq SourceImages\grq, \glq SourceMasks\grq{ } und \glq JPEGImages\grq.
Im Ordner \glq Annotations\grq{ } wird für jedes Bild eine XML Datei erstellt, 
welche alle annotierten Objekte auf dem Bild enthält. Zusätzlich werden hier auch Informationen zu dem zugehörigen Bild 
wie zum Beispiel Größe und Aufnahmezeitpunkt gespeichert.
Der Inhalt einer XML Datei könnte für ein Bild mit nur einem Objekt zum Beispiel wie folgt aussehen:

\lstset{language=XML}
\begin{lstlisting}
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;annotation&gt;
    &lt;folder&gt;VOC2007&lt;/folder&gt;
    &lt;filename&gt;0001.jpg&lt;/filename&gt;
    &lt;source&gt;
        &lt;database&gt;The VOC2007 Database&lt;/database&gt;
        &lt;annotation&gt;PASCAL VOC 2007&lt;/annotation&gt;
        &lt;image&gt;0001.jpg&lt;/image&gt;
    &lt;/source&gt;
    &lt;camera_id&gt;Scan E 01&lt;/camera_id&gt;
    &lt;size&gt;
        &lt;width&gt;1920&lt;/width&gt;
        &lt;height&gt;1080&lt;/height&gt;
        &lt;depth&gt;32&lt;/depth&gt;
    &lt;/size&gt;
    &lt;segmented&gt;0&lt;/segmented&gt;
    &lt;timestamp&gt;2017-02-07 21:07:47.275&lt;/timestamp&gt;
    &lt;object&gt;
        &lt;name&gt;packingbox&lt;/name&gt;
        &lt;id&gt;1&lt;/id&gt;
        &lt;pose&gt;Unspecified&lt;/pose&gt;
        &lt;truncated&gt;0&lt;/truncated&gt;
        &lt;difficult&gt;0&lt;/difficult&gt;
        &lt;bndbox&gt;
            &lt;xmin&gt;100&lt;/xmin&gt;
            &lt;ymin&gt;100&lt;/ymin&gt;
            &lt;xmax&gt;150&lt;/xmax&gt;
            &lt;ymax&gt;150&lt;/ymax&gt;
        &lt;/bndbox&gt;
        &lt;polygon&gt;
            &lt;point&gt;
                &lt;x&gt;100&lt;/x&gt;
                &lt;y&gt;100&lt;/y&gt;
            &lt;/point&gt;
            &lt;point&gt;
                &lt;x&gt;150&lt;/x&gt;
                &lt;y&gt;100&lt;/y&gt;
            &lt;/point&gt;
            &lt;point&gt;
                &lt;x&gt;150&lt;/x&gt;
                &lt;y&gt;100&lt;/y&gt;
            &lt;/point&gt;
        &lt;/polygon&gt;
    &lt;/object&gt;
&lt;/annotation&gt;
\end{lstlisting}

Dabei wird der Name der Kamera in dem camera\_id Tag (im Beispiel Zeile 10) angegeben. Der Zeitpunkt, zudem das Bild aufgenommen wurde, 
wird durch timestamp (im Beispiel Zeile 17) angegeben. Die Objekt-ID, an der die Objekte auf unterschiedlichen Bildern wiedererkannt werden, 
wird im id Tag (im Beispiel Zeile 20) angegeben. Der Objektumriss wird im polygon Tag (im Beispiel Zeile 30-43) als Liste von Punkten angegeben, 
welche in Pixelkoordinaten angegeben werden. Falls das Objekt mehrmals auf dem Bild zu sehen ist, 
werden die Polygone als Liste hintereinander abgespeichert.

Im Ordner \glq SourceImages\grq{ } werden die originalen Bilder der Sequenz gespeichert.
Sie werden von der GUI benötigt, da der Nutzer auf diesen Bildern die Objekte annotiert.

Im Ordner \glq SourceMasks\grq{ } wird für jede Kamera eine Maske gespeichert.
Eine Maske ist ein schwarz-weiß Bild mit gleicher Größe wie das zugehörige originale Bild.
Weiße Flächen in der Maske bedeuten, dass innerhalb dieser Fläche im originalen Bild ein Objekt vorkommen darf.
Schwarze Flächen bedeuten, dass sich an diesen Stellen im originalen Bild kein Objekt befinden kann.

\begin{figure}[H]
  \centering
  \subfigure[Source Image]{\includegraphics[width=0.25\textwidth]{bilder/bild_von_kamera.jpg}}
  \subfigure[Source Mask]{\includegraphics[width=0.25\textwidth]{bilder/maske_von_kamera.jpg}}
  \subfigure[JPEG Image]{\includegraphics[width=0.25\textwidth]{bilder/ergebnis.jpg}}
  \caption{Beispiel für eine Kameramaske} 
\end{figure}

Im Ordner \glq JPEGImages\grq{ } werden die Bilder gespeichert, welche man erhält, wenn man die Masken auf die originalen Bilder anwendet.
Dabei werden die schwarzen Flächen der Maske auf das originale Bild übertragen. 
Die Bilder werden von der GUI generiert, sobald die Maske einer Kamera durch den Nutzer verändert wird.
Die Bilder in diesem Ordner werden später für das Training verwendet, da hier keine Objekte außerhalb der Maske mehr vorkommen.

\section{Format neuer Annotationen}\label{sec:formatNeuerAnnotationen}
Wie oben bereits erwähnt, entstand diese GUI im Kontext einer Arbeit, 
bei der es darum ging ein neuronales Netzwerk darauf zu trainieren, 
automatisch Pakete durch Überwachungskameras zu verfolgen.
Die GUI hat daher eine Funktion, die es dem Nutzer erlaubt eine Bildsequenz, wie sie von den Überwachungskameras erzeugt wird zu importieren.
Damit die GUI eine solche Sequenz öffnen kann, müssen die Bilder in folgendem Format vorliegen: 
\begin{enumerate}
  \item Alle Bilder befinden sich in einem Ordner
  \item Die Bilder sind aufsteigend nummeriert und im JPG Format gespeichert.
  \item Es existiert eine CSV Datei mit Informationen über Aufnahmezeitpunkt und verwendeter Kamera für jedes Bild im Ordner.
\end{enumerate}
Falls die Bilder im obigen Format vorliegen, kann die GUI daraus automatisch eine annotierte Bildsequenz im Format aus Abschnitt \ref{sec:annotationsformat} generieren.
Natürlich soll die GUI auch für andere Zwecke verwendet werden können.
Sobald in dem Ordner keine CSV Datei gefunden wird, wird der Ordner von der GUI rekursiv nach Bildern durchsucht.
Dabei werden die Namen der Unterordner als Kameranamen und das Datum der Dateierstellung als Aufnahmezeitpunkt übernommen.
</pre></body></html>