====== Detection mit Kaskaden ======
Man kann Haar Kaskaden benutzen um spezielle Objekte zu erkennen. Dafür muss man diese aber erst einmal mit positiven (Bilder die das gesuchte Objekt beinhalten) und negativen trainieren.
Wir haben uns dabei nach erst für einen Algemeinen Überlick nach diesem [[https://pythonprogramming.net/haar-cascade-object-detection-python-opencv-tutorial/|diesem]] Tutorial gerichtet.
===== Allgemein =====
Allgemein sei gesagt das man mit wenig Erfahrung von Kaskaden viel mehr Zeit zum Trainieren der Kaskaden verbraucht. Im Laufe unseres Projektes hat sich der Zeitaufwand des Trainieren von Kaskaden enorm verbessert, so weit das man eventuell nur noch einen Server brauch um allen eine Linux Umgebung zu ermöglichen.
Dieses Projekt muss nicht in Linux gemacht aber unsere folgenden Anleitungen und Scripte sind für Linux geschrieben
===== Installation =====
Es gibt mindestens zwei Möglichkeiten um openCV mit dem dev Package (wir brauchen das Dev Package z.B. zum trainieren der Kaskaden) der eine weg ist es einfach über den Package Manager einer Linux Distribution zu installieren oder das Projekt selbst mit cmake zu bauen was auch gut und schnell möglich ist. Für die zweite Lösung gibt es eine gute [[https://docs.opencv.org/3.4.2/d7/d9f/tutorial_linux_install.html|Anleitung]] im offiziellen openCV Doc.
([[https://github.com/opencv/opencv/issues/7045|Workaround falls es mit python3 nicht klappt]])
Das oben genannte Tutorial ist auch als geschriebene Version von uns Verfügbar
{{:ss18:teilprojekte:python_haar_cascade_print.pdf| PDF}}
===== Master Skript =====
==== Allgemein ====
Um das eigentliche Trainieren und Testen einer Kaskade zu vereinfachehn haben wir ein Bash Script geschrieben.
Das Script liest die Paramter aus einer einfach zu editierenden Config Datei (AKETS.conf) und macht den Rest alleine. Dabei zeigt es an wie weit es ist und leitet den output einzelner Programme in getrennte Output Dateien.
Es ist so geschrieben das man es für das einfache Trainieren mehrerer Kaskaden benutzen kann und immer nur eine neue config Datei erstellen muss.
Es benutzt außerdem ein auf [[https://github.com/wulfebw/mergevec|Github]] veröffentlichtest Programm namens "mergevec.py" von Blake Wulfe um mehrere vec dateien zusammenzufügen,
{{:ss18:teilprojekte:akets_bild_1.png?direct&300|}}
==== Ordner Struktur ====
Ordner_in_dem_man_arbeitet/
AKETS.sh
mergevec.py
test_cascade.py
cascade_0/
AKETS.conf
annotations/
...
cascade_1/
AKETS.conf
annotations/
...
Ausführen tut man das Skript wenn man im gleichen Ordner ist mit ./AKETS.sh
oder wenn man in einem Unterordner ist mit ../AKETS.sh
==== Funktionen ====
=== 1) setup ===
Erstellen aller Ordner und erschaffung der samples
=== 2) train_cascade ===
Eigentliches Trainieren der Kaskade
=== 3) test_cascade ===
Testen der Kaskade mit python Programm oder automatischen Test Dateien
=== 4) utilities ===
Werkzeuge zum umgehen mit großen Datenmengen
== 4.1) multipli_pics ==
[funktioniert leider noch nicht]
== 4.2) number_files_dir ==
Nummiert Dateien in einem ordner welcher der Benutzer eingibt
=== 5) clean_dir ===
zum löschen aller dateien die im Setup erstellt werden
=== 6) write_config ===
Alternative zum schreiben der Config Datei
===== Erstellen von Samples =====
"The goal of machine learning (ML)* is to turn data into information. After learning from a collection of data, we want a machine to be able to answer questions about the data: What other data is most similar to this data? Is there a car in the image? What ad will the user respond to? There is often a cost component, so this question could become: “Of the products that we make the most money from, which one will the user most likely buy if we show them an ad for it?” Machine learning turns data into informationby extracting rules or patterns from that data.
"
- aus Learning OpenCV von Gary Bradski und Adrian Kaehler
Da wir uns hier mit einem Machine Learning Problem rumschlagen brauchen wir Daten. In unserem Fall Bilder die beinhalten was wir suchen (positive) und Bilder die nicht beinhalten was wir suchen.
negative zu bekommen ist einfach, positive sind auf der anderen Seite sind schwierig da wir nicht 10000 Fotos machen wollen. Zum Glück können wir positive Bilder auf negative mit Hilfe des von OpenCV bereitgestellten Programm opencv_createsamples
drauf projezieren und somit einfach neue positive Bilder erstellen.
==== Parameter ====
=== numSmaples ===
Man kann nur so viele Samples mit opencv_createsamples erstellen wie negative Bilder vorhanden sind. Also wenn z.B. 200 negative vorhanden sind kann man man mit einem positiven auch nur 200 Bilder erstellen.
Der weg ist es dann die anzahl der positiven Bilder zu erhöhen, auch wenn es die selben sind. Da durch die zufällige Plazierung von opencv_createsamples andere Bilder erstellt werden.
=== maxxangle, maxyangle und mayzangle ===
Diese drei Parameter geben an wie ein positives Bild was auf negative drauf projeziert wird, gedreht wird.
Beispiel:
== mit 0.0 bei allen drei ==
{{:ss18:teilprojekte:rotation_0.0_0.jpg?direct&100|}}
{{:ss18:teilprojekte:rotation_0.0_1.jpg?direct&100|}}
== mit 0.9 bei allen drei ==
{{:ss18:teilprojekte:rotation_0.9_0.jpg?direct&100|}}
{{:ss18:teilprojekte:rotation_0.9_1.jpg?direct&100|}}
=== maxidev ===
Steht für die maximale Änderung der Intensität
Beispiel
== mit 1000 ==
{{:ss18:teilprojekte:maxidev_mit_1000_0.jpg?direct&100|}}
{{:ss18:teilprojekte:maxidev_mit_1000_1.jpg?direct&100|}}
== mit 40 (Standard) ==
{{:ss18:teilprojekte:maxidev_mit_40_0.jpg?direct&100|}}
{{:ss18:teilprojekte:maxidev_mit_40_1.jpg?direct&100|}}
===== Trainieren der Kaskade =====
==== Parameter ====
Dieser Teil soll beschreiben welche Parameter welchen Einfluss auf die Kaskade haben. [[https://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html|openCV Doc Beispiel]]
=== featureType ===
Dieser Parameter gibt an welche Art von Feature man benutzen soll.
HAAR richtet sich nach der 2001 wissentschaftlichen Arbeit von Paul/Viola:
Rapid Object Detection using a Boosted Cascade of Simple Features. Conference on Computer Vision and Pattern Recognition"
LBP richtet sich nach der 2007er wissentschafltichen Arbeit von Shengcai Liao, Xiangxin Zhu, Zhen Lei, Lun Zhang and Stan Z. Li:
"Learning Multi-scale Block Local Binary Patterns for Face Recognition"
Am Anfang haben wir immer den Feature Type HAAR benutzt doch jüngste Ergebnisse zeigen das LBP, anders als erst gedacht, doch sehr effiktiv sein kann.
===== Testen der Kaskade =====
Zum Testen der Kaskaden an Bildern und Videos haben ein kleines Python3 Programm geschrieben was nichts mehr macht ausser die Kaskaden auf das Bild/Video anzuwenden.
Die Syntax ist:
python3 cascade_test_img/vid.py pfad_zu_bild/vid pfad_zu_kaskade
für das testen an Bildern. Für das Video Programm ist es genauso.
Beispiel:
python3 cascade_test_img.py first_frame.png cascade.xml
{{:ss18:teilprojekte:haar_kaskade_test_code_mit_beispiel.zip|}}
===== Allgemeine Erfahrungen aus dem Trainieren =====
Dieser Teil der Doku soll einige Erfahrungen die wir im Laufe des Projektes gemacht haben wiederspiegeln.
==== Tipps, Tricks und Philosophien ===
=== Tipps und Tricks ===
Um Bilder zu bearbeiten empfehlen wir allgemein Gimp, die beiden wichtigsten Sachen nämlich Bilder zuschneiden mit SHIFT+C und das resizen von Bildern unter "Image>Scale Image" sind dort schnell gemacht.
Um Frame aus Videos zu bekommen empfehlen wir VLC und seine Snapshot Funktion
=== Philosophien ===
1. mehr, auch wenn unrelevante, negative Beispiele sind besser. Hört sich vielleicht komisch an aber unserer Erfahrung nach werden alle negativen Bilder zwar die Rechenzeit verlängern aber das Ergebnis verbessern.
2. Haltet die positiven Bilder ungefähr in einem Bereich von 20-35 Pixeln.
===== Server als Ressource =====
{{:ss18:teilprojekte:azure_bild.png?400|}}
Man kann einen externen Server mieten um wenn viel Rechenarbeit von nöten ist nicht seinen eigenen Computer benutzen zu müssen. Außerdem kann dies genutzt werden um eine Linux Umgebung für Windows Nutzer bereit zu stellen.
Wir haben uns dabei für den Dienst Azure von Microsoft entschieden da sie jedem Studenten 100 USD Guthaben geben um damit zu machen was man will. [[https://azure.microsoft.com/de-de/free|Azure für Studenten]]
Alternativen sind:
* AWS von Amazon (eventuell ein Studentenprogramm)
* Compute Engine von Google (Test Version mit Guthaben)
===== Literatur ====
* [[https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf | Wissentschaftliche Arbeit von Paul/Viola]]
* [[http://www.cbsr.ia.ac.cn/users/lzhang/papers/ICB07/ICB07_Liao.pdf | Wissentschaftliche Arbeit über LBP]]
* [[https://docs.opencv.org/3.4.1/ | OpenCV Dokumentation]]
* [[https://docs.python.org/3/contents.html | Python3 Dokumentation]]
* [[https://www.python.org/dev/peps/pep-0008/ | PEP8]]
===== Dateien ====
{{:ss18:teilprojekte:detection_dateien.zip|}}