Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss18:teilprojekte:detection

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 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 Anleitung im offiziellen openCV Doc.

(Workaround falls es mit python3 nicht klappt)

Das oben genannte Tutorial ist auch als geschriebene Version von uns Verfügbar

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 Github veröffentlichtest Programm namens „mergevec.py“ von Blake Wulfe um mehrere vec dateien zusammenzufügen,

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

mit 0.9 bei allen drei

maxidev

Steht für die maximale Änderung der Intensität

Beispiel

mit 1000

mit 40 (Standard)

Trainieren der Kaskade

Parameter

Dieser Teil soll beschreiben welche Parameter welchen Einfluss auf die Kaskade haben. 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

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

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. Azure für Studenten

Alternativen sind:

  • AWS von Amazon (eventuell ein Studentenprogramm)
  • Compute Engine von Google (Test Version mit Guthaben)

Literatur

Dateien

ss18/teilprojekte/detection.txt · Zuletzt geändert: 2018/08/25 17:06 von f_g_r