{ "info": { "author": "Benedikt Bieberle", "author_email": "benedikt.bieberle@tu-ilmenau.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "Natural Language :: English", "Natural Language :: German", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Software Development :: Testing" ], "description": "# PyStereoAlgEval\n\nPython Stereo Algorithm Evaluator - Das Python basierte Stereo-Algorithus-Evaluations Toolkit ist eine einfache L\u00f6sung zur automatisierten Evaluation von Stereo Algorithmen. \nDabei kommt ein intelligentes Verfahren des Templatings von Konsolenaufrufen zum Einsatz. Die erzeugten Disparit\u00e4tsbilder werden automatisch mittels mehrerer konfigurierbarer Qualit\u00e4tsmetriken ausgewertet und die Resultate in eine praktische CSV-Datei geschrieben.\nPyStereoAlgEval erm\u00f6glicht auch die Visualisierung aller erhobenen Daten in verschiedenen Auspr\u00e4gungen.\n\n## Vorraussetzungen\n\n### Ben\u00f6tigte Software\nDie Vorraussetzung f\u00fcr das Verwenden der Bibliothek ist eine Python 3 Installation, wobei empfohlen wird, ein [Anaconda](https://www.anaconda.com/distribution/#download-section) oder [VirtualEnv](https://virtualenv.pypa.io/en/latest/) Environment zu verwenden.\nDes Weiteren m\u00fcssen neben der Python Installation folgende Pakete zus\u00e4tzlich installiert sein. \nDie Funktionsf\u00e4higkeit von PyStereoAlgEval ist mit den genannten Versionen verifiziert.\n\n- Python: 3.6.6\n- [OpenCV](https://opencv.org): 3.4.2\n- [Matplotlib](https://matplotlib.org): 2.2.3\n- [NumPy](http://www.numpy.org): 1.15.3\n- [Pandas](https://pandas.pydata.org): 0.23.4\n- [SciPy](https://www.scipy.org): 1.1.0\n- [Scikit-Image](https://scikit-image.org): 0.14.1\n\n### Installation\n\nDas Paket kann sich durch folgenden Befehl \u00fcber die Python eigene Paketverwaltung [pip](https://pip.pypa.io/en/stable/) installieren, der in der Regel in der Python Installation enthalten ist.\n\n```bash\npip install pystereoalgeval\n```\nFalls ein Anaconda oder VirtualEnv Environment aufgesetzt worden ist, sollte dieses vor Ausf\u00fchren des Befehls [aktiviert](https://stackoverflow.com/a/21707160) werden.\n\n### Datensatz\n\nEin Beispiel-Datensatz, der verwendet werden kann ist der [Datensatz](http://vision.middlebury.edu/stereo/data/scenes2006/) der Version von 2006 von Middlebury Stereo Vision.\n\nZum Durchf\u00fchren des automatisierten Auswerteverfahrens wird ein geeigneter Datensatz ben\u00f6tigt, der bestimmte Vorraussetzungen erf\u00fcllen muss.\nDie Ordnerstruktur des Datensatzes muss folgenderma\u00dfen aufgebaut sein:\n\n .\t\t# Oberverzeichnis zu definieren in \"dataset_dir\"\n \u251c\u2500\u2500 ...\n \u251c\u2500\u2500 TestSet1 # Ordner des Testdatensatzes\n \u2502 \u251c\u2500\u2500 imgl.png # Linkes Stereo-Bild\n \u2502 \u251c\u2500\u2500 imgr.png # Rechtes Stereo-Bild\n \u2502 \u2514\u2500\u2500 ground_truth.png # Disparit\u00e4tsbild der Grundwahrheit\n \u251c\u2500\u2500 TestSet2 # N\u00e4chster Testbildsatz\n \u2502 \u251c\u2500\u2500 imgl.png \n \u2502 \u251c\u2500\u2500 imgr.png \n \u2502 \u2514\u2500\u2500 ground_truth.png \n \u251c\u2500\u2500 ...\n\nZu beachten ist, dass die einzelnen Bilderpaare mit Grundwahrheit sich in einem eigenen Ordner befinden.\nDer konkrete Dateiname der Testbilder l\u00e4sst sich in der sp\u00e4ter beschriebenen Konfigurationsdatei anpassen.\nEs ist, um eine Auswertung des erzeugten Disparit\u00e4tsbildes zu erm\u00f6glichen, darauf zu achten, dass die Abmessungen der drei Bilder f\u00fcr jeden Ordner einheitlich sind. \nDie Intensit\u00e4tswerte des Bildes mit der Grundwahrheit, entsprechen im Zahlenwert den Disparit\u00e4ten zwischen den Stereobildern. \nSollte eine Reskalierung der Testbilder stattgefunden haben, k\u00f6nnen zur Auswertung die Intensit\u00e4tswerte der Grundwahrheit mit einem Faktor versehen werden.\nDieser Faktor kann in der [Konfigurationsdatei](#konfiguration) angepasst werden. \n__Wichtig:__ \nInvalide Disparit\u00e4tswerte oder Bildpunkte, f\u00fcr die keine Grundwahrheit existiert, sind mit dem Wert 0 zu belegen.\n\nEs k\u00f6nnen alle 8-Bit Bilder verwendet, werden deren Format von OpenCV gelesen werden kann (u. A. .png, .jpg, .tiff; siehe [Doku](https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html)). Wobei verlustbehaftete Bildformate, wie z.B. JPEG, m\u00f6glichst nicht verwendet werden sollten.\nDes Weiteren sollte darauf geachtet werden, dass die verwendeten Testdaten kein gr\u00f6\u00dferes Disparit\u00e4tsintervall als 255 Bildpunkte erfordern. \nGrund daf\u00fcr ist, dass eine Unterst\u00fctzung von berechneten Disparit\u00e4tsbildern mit einer gr\u00f6\u00dferen Bittiefe als 8, derzeit nicht verf\u00fcgbar ist.\n\n### Verwendbare Stereo Algorithmen\n\nEs lassen sich alle Stereo Algorithmen verwenden, die von der Kommandozeile gestartet werden k\u00f6nnen. \nGrundvorraussetzung f\u00fcr den Kommandozeilenaufruf ist die M\u00f6glichkeit, dass die Berechnungsparameter durch den Konsolenbefehl an den Algorithmus \u00fcbergeben werden k\u00f6nnen.\nDie Verwendung eines Bash-Skripts kann hierf\u00fcr ggf. eine Hilfestellung sein. \nIn der aktuellen Version des Programms muss der Pfad des Ausgangsbildes statisch sein. Eine variable Bestimmung des Pfades pro Testbildpaar ist in zuk\u00fcnfigten Versionen geplant.\n\n## Erste Schritte\n\nWenn alle beschrieben Vorraussetzungen erf\u00fcllt wurden, kann die Auswertung beginnen.\n\nZuerst muss die Klasse `AlgorithmEvaluator` aus der Bibliothek PyStereoAlgEval in der Python Umgebung importiert werden. \nDas ist entweder in der Python Konsole oder einem Skript m\u00f6glich.\nNach dem Import sollte ein Objekt erstellt werden, mit dem ab sofort gearbeitet werden kann.\n\n```python\nfrom pystereoalgeval import AlgorithmEvaluator\na = AlgorithmEvaluator()\n```\nEs besteht hier die M\u00f6glichkeit, bei der Initialisierung direkt einige Parameter zu definieren.\nz.B. kann direkt der Pfad zur selbst erstellten [Konfigurationsdatei](#konfiguration) \u00fcbergeben werden. \n\n```python\na = AlgorithmEvaluator(config_path='/path/to/config.ini')\n```\nAlternativ kann diese auch sp\u00e4ter erneut eingelesen werden, was die bestehende Konfiguration des Objektes \u00fcberschreibt.\n\n```python\na.read_config('/path/to/config.ini')\n```\n\nBei einer vollst\u00e4ndig erzeugten [Konfigurationsdatei](#konfiguration), kann nun ein Testdurchlauf gestartet werden.\nZuvor muss jedoch zwingend ein vollst\u00e4ndiges und valides Template definiert werden.\nF\u00fcr genauere Informationen siehe [Template](#template). \nF\u00fcr das Beispiel, dass bei einer konstanten maximalen Disparit\u00e4t, die Auswirkungen unterschiedlicher Fenstergr\u00f6\u00dfen untersucht werden sollen, k\u00f6nnen die Einstellungen folgenderma\u00dfen definiert sein:\n\n```python\na.set_constant(name=\"disparity_range\", value=64)\na.set_iterator(name=\"window_size\", steps=[7,9,11])\na.set_execution_template(\"$imgL$ $imgR$ $out$ $window_size$ $method$$disparity_range$\")\na.update_config()\na.run()\n```\n\nMit dem Befehl `set_constant(name=const_name, value=const_value)` l\u00e4sst sich eine Konstante definieren, deren Wert in den gleichnamigen Tag innerhalb des Templates eingesetzt wird. \nEine Definition mittels dieser Funktion ist nicht zwingend notwendig, da sich die Konstante direkt in das Template schreiben l\u00e4sst. \nJedoch wird auf diese Weise in der resultierenden CSV-Datei eine Spalte f\u00fcr den Wert angelegt, was im Nachinein zur weiteren Verwendung sinnvoll ein kann.\n\nDer Befehl `set_iterator(name=iter_name, steps=inter_steps)` definiert eine Laufvariable, f\u00fcr die der Algorithmus jeweils pro Testbildsatz ausgef\u00fchrt wird.\nWie auch bei den Konstanten wird f\u00fcr die sog. Iteratoren eine eigene Spalte in der CSV-Datei angelegt. \nEs besteht die M\u00f6glichkeit, mehrere Iteratoren zu definieren, in dem der gleiche Befehl mit unterschiedlichem `name`-Parameter erneut aufgerufen wird. \nDas Programm erstellt dann alle m\u00f6glichen Permutationen der Iteratorenwerte und f\u00fchrt den Algorithmus somit f\u00fcr alle m\u00f6glichen Kombinationen aus.\n\nMit dem Befehl `update_config()` wird die, durch get\u00e4tigte Befehle wom\u00f6glich ge\u00e4nderte Konfiguration, in die INI-Datei geschrieben.\n\nF\u00fcr den Anfang kann dieses [Python Skript](https://github.com/dettoman/py_stereo_alg_eval/blob/master/stereo.py) als Target-Algorithmus verwendet werden. Es beinhlatet eine simple NCC- und SAD-Implementierung, sowie einen Wrapper f\u00fcr die OpenCV-interne Semi-Global Block Matching Funktion.\n\nMit `run()` wird der Programmablauf gestartet und die Ergebnisse in die Datei \"results.csv\" in den in der Konfiguration definierten Pfad `results_dir` geschrieben.\nSollte ein anderer Dateiname gew\u00fcnscht sein, so l\u00e4sst sich dieser durch den Aufruf von `run(\"filename.csv\")` bestimmen.\n\nNach Beendigung des Programms l\u00e4sst sich direkt in Python Plots auf Basis der Ergebnisse erstellen.\nEine genaue Beschreibung der Plotting Funktion findet in Abschnitt [Plotting](#plotting) statt. \nJedoch k\u00f6nnte so eine Auswertung f\u00fcr das obige Beispiel ablaufen:\n\n```python\na.plot(y_category=\"rms_total\", x_category=\"window_size\", title=\"RMS pro Fenstergr\u00f6\u00dfe\", results_name=\"filname.csv\")\n```\nEs wird ein Plot erstellt, auf deren y-Achse der Mittelwert des rooted mean square error der Resultate \u00fcber den Datensatz gezeigt wird. \nGruppiert sind die Werte pro Fenstergr\u00f6\u00dfe entlang der x-Achse. \nEs ist zu beachten, dass `results_name` standardm\u00e4\u00dfig, bei Weglassen des Parameters, auf die Datei \"results.csv\" im Pfad `results_dir` zugreift. \nDer erzeugte Plot sieht somit wie folgt aus:\n[Link](https://github.com/dettoman/py_stereo_alg_eval/blob/master/example_plot_rm.png?raw=true)\n\n\n## Konfiguration\n\nZur Verwendung der Bibliothek und zur Vereinfachung von Arbeitsabl\u00e4ufen wird eine Konfigurationsdatei ben\u00f6tigt.\nDiese muss vor dem Start eingelesen werden. Eine Beispielhafte [config.ini](https://github.com/dettoman/py_stereo_alg_eval/blob/master/config.ini) Datei befindet sich im Repository.\n\nDie Konfigurationsdatei besteht aus f\u00fcnf Teilen. Im Nachfolgenden wird jeder Teil und jeder Schl\u00fcssel einzeln erl\u00e4utert\n\n```ini\n[BASE]\ndataset_dir = /Users/USER/Desktop/Dataset\nresults_dir = /Users/USER/Desktop\nimgl_name = imgl.png\nimgr_name = imgr.png\ngt_name = ground_truth.png\noutput_disp_filepath = /Users/USER/Desktop/Dataset/output.png\ntemplate = $imgL$ $imgR$ $out$ $window_size$ $disparity_range$ $method$\n```\n- `dataset_dir` bestimmt das Verzeichnis in dem sich alle Ordner mit den einzelnen Testbildpaaren befinden. Siehe dazu ([Datensatz](#datensatz))\n- `results_dir` bestimmt das Verzeichnis, in dem die CSV-Datei angelegt wird, in die alle Resultate der Evaluation und Plots des berechneten Disparit\u00e4tsbildes geschrieben werden.\n- `imgl_name`, `imgr_name` und `gt_name` bestimmen die Namen, die das jeweils rechte, linke Bild sowie das Bild der Grundwahrheit der Testdaten im Ordner haben.\n- `output_disp_filepath` bezeichnet den Dateipfad, unter dem das berechnete Disparit\u00e4tsbild abgelegt wird. (Aktuell konstant, in zuk\u00fcnftigen Versionen variabel definierbar)\n- `template` definiert das erstellte [Template](#template).\n\n```ini\n[PREPROCESSING]\nenable = True\nfilter = median\nparams = {'mode': 'reflect'}\n```\n- `enable` aktiviert Vorverarbeitung durch Filter oder Feature-Detektor\n- `filter` der name einer beliebigen Filterfunction von [skimage.filter](http://scikit-image.org/docs/dev/api/skimage.filters.html) oder [skimage.feature](http://scikit-image.org/docs/dev/api/skimage.feature.html). Es ist zu beachten, dass eventuell nicht alle aufgef\u00fchrten Filterfunktionen zur Vorverarbeitung tauglich sind. \n- `params` Dictionary der zu \u00fcbergebenen Parameter an die Filterfunktion. Der Parametername muss immer in Anf\u00fchrungszeichen geschrieben sein. Beispiel: `\"{\"para1\": 23.4\", \"para2\": 'test'}\"`\n\n\n```ini\n[EXECUTION]\nmode = python\ntarget = /Users/USER/software/stereo.py\nerror_handling = interrupt\n```\n- `mode` beschreibt, wie der in `target` definierte Algorithmus ausgef\u00fchrt werden soll. `mode = python` wird ben\u00f6tigt, wenn es sich bei dem Target um ein Python-Skript handelt. Dazu wird als Executable das aktuelle Python Environment benutzt, da Python-Skripte selbst nicht ausf\u00fchrbar sind. Ist der Algorithmus selbst eine aufrufbare Programminstanz, sollte `mode = generic` gesetzt sein.\n- `target` ist der aufzurufende Algorithmus selbst. Kann ein ausf\u00fchrbares Programm sein oder ein Python-Skript. Beachte dazu auch `mode`.\n- `error_handling` Bei `error_handling = interrupt` wird der Ablauf gestoppt, sollte der Algorithmus einen Fehler zur\u00fcckgeben. Bei `error_handling = ignore` wird jeglicher Fehler innerhalb des Algorithmus ignoriert und zur n\u00e4chsten Kombination aus Bilddaten und Iteratoren gesprungen.\n\n```ini\n[ITERATORS]\nwindow_size = 7,9,11,13\n\n[CONSTANTS]\ndisparity_range = 112\nmethod = NCC\n```\nIteratoren und Konstanten k\u00f6nnen auch in der Konfigurationsdatei definiert werden. \nDazu sind die Schritte der Iteratoren mit \",\" zu trennen. \nM\u00f6gliche Datentypen sind Ganze Zahlen, Kommazahlen (mit \".\" als Trennzeichen) und Text.\n\n```ini\n[EVALUATION]\ngt_coefficient = 0.5\ntextureless_width = 5\ntextureless_threshold = 60.0\ndiscont_width = 14\ndiscont_threshold = 15.0\n```\n- `gt_coefficient` beschreibt einen Faktor, mit dem die Werte des Bildes der Grundwahrheit zur Auswertung multipliziert wird. Ist bei einer Reskalierung der Testdaten erforderlich.\n- `textureless_width` beschreibt das Fenster \u00fcber das, mit den Sobel-Operator erstelle Texturbild, der Mittelwert gebildet wird.\n- `textureless_threshold` ist der Schwellenwert, unter welchem ein Bereich als texturarm gewertet wird.\n- `discont_width` Anzahl an Dilatationen die auf die Punkte an Disparit\u00e4ts\u00fcberg\u00e4nge angewendet werden.\n- `discont_threshold` Schwellenwert f\u00fcr die Differenz von benachbarten Disparit\u00e4tswerten der Grundwahrheit, ab wann ein Bildbereich als Disparit\u00e4tsdiskontinuit\u00e4t gewertet wird. Die Ausweitung des Bereiches erfolgt mittels `discont_width`.\n\n\n### Template\n\nDie mit `$` markierten Tags werden w\u00e4hrend des Programmablaufs durch gesetzte Konstanten und die Laufvariablen der Iteratoren ersetzt.\nDes Weiteren k\u00f6nnen unterschiedliche programm-intere Tags verwendet werden:\n\n- `$imgL$`, `$imgR$` Der absolute Pfad des linken/rechten Bildes des aktuellen Testbildpaares.\n- `$out$` Konstanter absoluter Pfad, der nach dem Ablauf des Algorithmus zur Evaluation mit der Grundwahrheit verwendet wird. In Konfigurationsdatei definierbar.\n- `$base_dir$` Konstanter Pfad des Oberverzeichnisses des Datensatzes. In Konfigurationsdatei definierbar.\n- `$curr_dataset_dir$` Aktueller absoluter Pfad des verwendeten Testbildpaares.\n\n\nEs ist zu beachten, dass der Pfad des Algorithmus und im Fall eines Python-Skripts, auch die Python Executable, __nicht__ im Template enthalten ist und automatisch davor gesetzt wird.\n\n__Beispiel__: Wird oben genannte aufgef\u00fchrte Beispielkonfiguration verwendet, ergibt sich folgender erster Aufruf des Algorithmus:\n\nTemplate: \n`$imgL$ $imgR$ $out$ $window_size$ $disparity_range$` \nErgebnis: \n`Executable -> python /Users/USER/software/stereo.py` \n`$imgL$ -> /Users/USER/Desktop/Dataset/TestSet1/imgl.png` \n`$imgR$ -> /Users/USER/Desktop/Dataset/TestSet1/imgr.png` \n`$out$ -> /Users/USER/Desktop/Dataset/output.png`\n`$window_size$ -> 7` \n`$disparity_range$ -> 112` \nVollst\u00e4ndiger Konsolenaufruf: \n\n```bash\npython /Users/USER/software/stereo.py /Users/USER/Desktop/Dataset TestSet1/imgl.png /Users/USER/Desktop/Dataset/TestSet1/imgr.png \n/Users/USER/Desktop/Dataset/output.png 7 112\n```\n\nDie Bildung des Aufrufs wird wiederholt f\u00fcr alle Testbildpaare in Verbindung mit allen Kombinationen aus den gesetzten Iteratoren.\n\nEs ist zu beachten, dass wenn nach dem Parsen des Templates noch `$`-Symbole \u00fcbrig sind, es zu einem Fehler kommt. \nEine weitere Vorraussetzung ist, dass alle gesetzten Iteratoren im Template vorkommen. \nEs ist hingegen nicht erforderlich, dass die anderen oben genannten Tags beinhaltet sind (ausgenommen `$out$`).\n\nHinweis: Zur Nutzung der verwendeten Stereo-Algorithmus-Sammlung \"stereo.py\" muss diese datei aus dem Repository heruntergeladen werden. Diese ist in der Installation \u00fcber pip nicht enthalten. \n\n\n## Evaluataion\n\nAuf das berechnete Disparit\u00e4tsbild wird eine Vielzahl von Qualit\u00e4tsmetriken angewendet. \nDie Metriken m\u00fcssen nicht vorher ausgew\u00e4hlt werden, sondern werden stete berechnet. \nVerglichen werden bei der Bestimmung der Werte immer das berechnte Disparit\u00e4tsbild mit der Grundwahrheit. \nZu beachten ist, dass nur valide Bildpunkte ausgewertet werden, die in beiden Bildern (berechnetes Disparit\u00e4tsbild und Grundwahrheit) ungleich 0 sind. Pixel f\u00fcr die kein Disparit\u00e4tswert existiert, sollten vom Algorithmus den Zahlenwert 0 zugewiesen bekommen. \n\nBei reskalierten Testdaten m\u00fcssen die Intensit\u00e4tswerte der Grundwahrheit mit einem Korrekturfaktor gleich dem Skalierungsfaktor versehen werden. Der Faktor kann wie in [Konfiguration](#konfiguration) beschrieben, im Abschnitt `[EVALUATION]` im Schl\u00fcssel `gt_coefficient` definiert werden.\n\n### CSV-Resultate\nIn der resultierenden CSV-Datei finden sich folgende Spalten wieder: \n(der [Platzhalter](#platzhalter) `*region*` wird in [Segmentierung](#segmentierung) erkl\u00e4rt)\n\n- `index` Index\n- `dataset` Names des Testbildpaares (Ordnername)\n- Konstanten (eigene Spalte pro Konstante)\n- Iteratoren (eigene Spalte pro Iterator)\n- `height` und `width` H\u00f6he und Breite des Testbildes\n- `psnr_*region*` Peak signal to noise ratio ([PSNR](https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio))\n- `rms_*region*` Rooted mean square error (Quadratwurzel aus [MSE](https://en.wikipedia.org/wiki/Mean_squared_error))\n- `err_*region*_*threshold*` Anteil an validen Bildpunkten, die um \u00fcber den in `*threshold*` Angegeben prozentwert an der maximalen Intensit\u00e4t (255) von der Grundwahrheit abweichen.\n- `dens_img` Verh\u00e4ltnis von validen Bildpunkten zu Gesamtzahl der Bildpunkte des berechneten Disparit\u00e4tsbildes\n- `dens_gt` Verh\u00e4ltnis von validen Bildpunkten zu Gesamtzahl der Bildpunkte der Grundwahrheit\n- `dens_rel` Verh\u00e4ltnis von `dens_img` zu `dens_gt`\n- `dens_*region*`\n\n### Segmentierung\n\nZum besseren Vergleich der Leistung der Algorithmen, in zur Evaluierung meist relevanten Bildregionen, lassen sich die Ergebnisse von einigen Metriken in bestimmten Bildregionen einzeln bestimmen.\nDazu l\u00e4sst sich das Bild nach zwei lokalen Bildmerkmalen segmentieren:\n\n##### Textur\nEs ist sinnvoll, die Resultate eines Algorithmus, anders in Bildbereichen mit geringer Textur, zu bewerten als in Bereichen mit viel Textur. \nEs l\u00e4sst sich vom Program mithilfe des [Sobel](https://en.wikipedia.org/wiki/Sobel_operator) Operators der Texturgehalt einer Bildregion bestimmen. \nIn der [Konfigurationsdatei](#konfiguration) lassen sich im Abschnitt `EVALUATION` Einstellungen zu dem gew\u00fcnschten Schwellenwert zur Segmentierung des Bildes treffen.\nDer durch die Einstellungen definierte Bereich mit geringer Textur l\u00e4sst sich mithilfe der Funktion `show_region()` anzeigen. \n\n```python\na.show_region(\"textureless\")\n``` \nDer nicht markierte Bereich ist somit der Bereich mit hoher Textur.\nEs ist zu beachten, dass bevor der Befehl aufgerufen wird, die Konfigurationsdatei geladen sein muss. \nStandardm\u00e4\u00dfig wird das erste Testbildpaar des Datensatzes zur Anzeige benutzt.\nDurch Verwendung des zus\u00e4tzlichen Parameters `image_of_dataset` kann der Ordnername eines anderen Testbildpaares angegeben werden.\n\nNach Aufruf des Fensters kann es zu Problemen kommen, die verhindern, dass sich das Fenster wieder schlie\u00dft.\nIn diesem Fall schlie\u00dft der Befehl `daw()` die Anzeige.\n\n```python\na.daw()\n```\n\n##### Disparit\u00e4tsdiskontinuit\u00e4ten\nEin weiteres wichtiges Kriterium der Bildsegmentierung ist der Bereich von Disparit\u00e4tsdiskontinuit\u00e4ten. Zur Auswertung kann es relevant sein, Bereiche in denen sich die Disparit\u00e4t eines Bildes sprunghaft \u00e4ndert, anders zu beurteilen als Bereiche mit kontinuierlichen Disparit\u00e4ten. \nDaher wird analog zur Textur das Bild nach diesem Kriterum segmentiert.\nDie Parameter der Segmentierung lassen sich in der [Konfiguration](#konfiguration) festlegen. \nDer ausgew\u00e4hlte Bereich l\u00e4sst sich durch folgenden Befehl anzeigen:\n\n```python\na.showregion(\"discontinued\")\n```\n\n##### Platzhalter\n\nAus der Segmentierung ergeben sich demnach folgenden M\u00f6glichkeiten den Platzhalter in den Spalten der [CSV](#csv) zu ersetzen:\n\n- `lowtexture` Bereiche mit wenig Textur\n- `hightexture` Bereich mit hoher Textur (invertierte Auswahl von `lowtexture`)\n- `disc` Bereiche mit starken Disparit\u00e4tsspr\u00fcngen\n- `nondisc` Bereiche mit geringen oder keinen Disparit\u00e4tsspr\u00fcngen (invertierte Auswahl von `disc`)\n- `total` Keine Segmentierung\n\n## Plotting\n\nZur Visualisierung der Resultate steht ein intelligentes Werkzeug zur Verf\u00fcgung.\nEs erm\u00f6glicht die Gruppierung von Daten anhand einer Kategorie und die Darstellung von mehreren Mittelwerten unterschiedlicher Evaluationsparamter.\nZus\u00e4tzlich l\u00e4sst sich der Datensatz nach mehreren Kategorien filtern.\nDer Plot wird dabei im `results_dir` Verzeichnis als PNG-Datei gespeichert.\n\nZur Erstellung eines Plots m\u00fcssen mindestens zwei Festlegungen getroffen werden.\n\n1. Welche Datenkategorien (Spalten der [CSV](#csv)-Datei) im Mittelwert sollen angezeigt werden?\n2. Nach welcher Datenkategorie soll gruppiert werden?\n3. (optional) Soll nach einer/mehreren weiteren Kategorie/-en gefiltert werden?\n\nDer konkrete Aufruf der Plotting-Funktion ist folgender:\n\n```python\na.plot(y_category=\"rms_total\", x_category=\"window_size\")\n```\nDer Parameter `y_category` definiert die Mittelwerte der Daten pro Kategorie, die entlang der y-Achse angezeigt werden. Es ist m\u00f6glich mehrere innerhalb einer Liste anzugeben (nur f\u00fcr Style \"default\").\n\nDer Parameter `x_category` definiert die Datenkategorie, nach der die Werte gruppiert werden sollen.\n\nEs k\u00f6nnen dabei alle Spalten der CSV-Datei verwendet werden.\n\n##### Filter\nEs k\u00f6nnen zur weiteren Eingrenzung der Daten Filter verwendet werden. Dazu muss an den Parameter `filters` ein Dictionary \u00fcbergeben werden, mit folgendem Aufbau:\n\n```python\nfilter = {category1: value1, category2: value2}\n```\n\n##### Styles\n\nEs stehen zwei verschiedene Style-Optionen zur Verf\u00fcgung, nach denen der Plot erstellt werden kann.\nDefiniert werden k\u00f6nnen die Styles mit dem Parameter `style` mit den Werten `default` oder `whisker`. Bei Weglassen des Parameters wird ein Plot im Default-Style erstellt.\n\n###### Default\nDie Erste ist \"Default\", die einen einfach Linienplot mit Fehlerbalken erstellt. In diesem Modus ist es m\u00f6glich mehrere x-Kategorien anzugeben. \nBeispiel: [Link](https://github.com/dettoman/py_stereo_alg_eval/blob/master/example_plot_rm_default.png?raw=true)\n\n###### Box-Whisker\nDie zweite M\u00f6glichkeit ist die Anzeige eines [Box-Whisker](https://de.wikipedia.org/wiki/Box-Plot) Plots, der weitere Informationen zur Verteilung der Werte um den Mittelwert enth\u00e4lt. Es ist zu beachten, dass in diesem Modus nur eine x-Kategorie ausgew\u00e4hlt werden kann. \nBeispiel: [Link](https://github.com/dettoman/py_stereo_alg_eval/blob/master/example_plot_rm.png?raw=true)\n\n##### Weitere Parameter\n\n- `results_name` Neben den genannten Parametern kann die CSV-Datei als Datenquelle ausgew\u00e4hlt werden, sollte sie vom Namen `results.csv` abweichen. Die Datei muss sich jedoch immer in dem in der [Konfiguration](#konfiguration) definierten `results_dir` Verzeichnis befinden.\n- `unique` Durch einen \u00fcbergebenen `True` Wert an den Parameter, wird dem Dateinamen, der standardm\u00e4\u00dfig dem Dateinamen der CSV-Datei entspricht, ein Zeitstempel angeh\u00e4gt. Dieser Parameter ist standardm\u00e4\u00dfg `False`.\n- `relative_base` Diesem Parameter kann ein Wert aus der gew\u00e4hlten `x_category` \u00fcbergeben werden. Danach ist auf dem Plot der Mittelwert der relativen \u00c4nderungen der y-Werte zu dem gew\u00e4hlten Wert gezeigt. Die relativen Werte werden f\u00fcr jeden Datensatz einzeln berechnet und danach gemittelt.\n- `axis_label` Damit lassen sich eigene Achsen-Bezeichnungen einstellen, die die automatisch erzeugten \u00fcberschreiben. Siehe [Alle Funktionen](#allefunc)\n- `disable_error` Die geplotteten Fehlerbalken k\u00f6nnen mit diesem Parameter deaktiviert werden.\n\n## Alle Funktionen\n\n\n- `set_logging_level(level)` zum setzen des Logging-Levels. Level standardm\u00e4\u00dfig auf `INFO`\n\t- `level (str):` Python Logging Level (s. [Doku](https://docs.python.org/3/howto/logging.html)). M\u00f6glichkeiten: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`\n- `set_mode(mode)` zum Setzen des Execution Modus\n\t- `mode (str)`: Execution Modus. M\u00f6glichkeiten: `'python'`, `'generic'`\n- `set_target(target) (str)` zum Setzen des Pfades zum Algorithmus\n\t- `target (str)`: Pfad zum Algorithmus\t\n- `set_error_handling(error_handling)` zum Setzen des Verhaltens bei einem Fehler im Algorithmus\n\t- `error_handling (str)`: Error Handling Modus. M\u00f6glichkeiten: `'ignore'`, `'interrupt'`\n- `get_iterators()` gibt alle definierten Iteratoren zur\u00fcck\n\t- `return=dict`: gibt Dictionary mit Iteratoren zur\u00fcck.\n- `get_constants()` gibt alle definierten Konstanten zur\u00fcck\n\t- `return=dict`: gibt Dictionary mit Konstanten zur\u00fcck.\n- `set_iterators(name, steps, remove)` zum setzen eines Iterators. \n\t- `name (str)`: Name des Iterators\n\t- `steps (list of int/str/float)`: Schritte der Laufvariable\n\t- `remove=False (bool)`: ob Iterator entfernt werden soll. Steps d\u00fcrfen nicht angegeben werden.\n- `set_constants(name, value)` zum Setzen einer Konstanten. \n\t- `name (str)`: bestimmt Namen des Iterators\n\t- `steps (int/str/float)`: Wert\n\t- `remove=False (bool)`: ob Konstante entfernt werden soll. Value darf nicht angegeben werden. Standardm\u00e4\u00dfig auf `False`\n- `set_evaluation_parameter(paramter, value)` Definiert Parameter zur Auswertung, wie Segmentierung oder Koeffizient f\u00fcr Grundwahrheit\n\t- `parameter (str)`: Name des Parameters (siehe Konfiguration). M\u00f6glichkeiten: `'gt_coefficient'`, `'textureless_threshold'`, `'discont_threshold'`, `'textureless_width'`, `'discont_width'`\n\t- `value`: Wert. Thresholds und der Koeffizient sind als `float` und die Width Parameter als `int` anzugeben\n- `set_execution_template(template)` zum Setzen des Templates\n\t- `tempalte (str)`: Template \n- `check_execution_template` Methode zum \u00dcberpr\u00fcfen des Templates, ob alle notwendigen Tags enthalten sind\n\t- `return=bool`: ob Template funktionsf\u00e4hig ist\n- `set_preprocessing(filter_name, parms)` Methode zum Aktivieren und Definieren der optionalen Vorverarbeitung der Bilddaten.\n - `filter_name (str)` Name der Filterfunktion aus [skimage.filter](http://scikit-image.org/docs/dev/api/skimage.filters.html) oder [skimage.feature](http://scikit-image.org/docs/dev/api/skimage.feature.html).\n - `params (dict)` Optionale Parameter f\u00fcr die Filterfunktion im dict format. Beispiel: `dict(param1=1.5, para2=\"test\")`\n- `remove_preprocessing()` Methode zum L\u00f6schen aller Einstellungen zur Vorverarbeitung\n- `daw()` schlie\u00dft alle Fenster\n- `show_region(mode, images_of_dataset)` Funktion zum Anzeigen von aktueller Einstellung zur Segmentierung\n\t- `mode (str)`: angezeigte Segemtierung. M\u00f6glichkeiten: `'textureless'`, `'discontinued'`\n\t- `image_of_dataset=None (str)`: Ordnername des angezeigten Bildes. Standardm\u00e4\u00dfg wird erstes Bild des Datensatz-Verzeichnisses angezeigt.\n- `get_dataset()` Gibt geparstes Dictionary des Datensatz-Verzeichnisses wieder\n\t- `return=dict`: Datensatz als Dictionary aufgel\u00f6st\n- `run(results_name)` f\u00fchrt Evaluations-Ablauf aus\n\t- `results_name=\"results.csv\" (str)`: Dateiname der resultierenden CSV-Datei\n- `plot(y_category, x_category, filters, title, style, unique, results_name)` Funktion zur Erstellung von Plots\n\t- `y_category (list of int/str/floar)/(int/str/float)`: in y-Richtung dargestelle Werte\n\t- `x_category (int/str/float)`: Kategorie, nach der in x-Richtung gruppiert wird\n\t- `filters (dict)`: Filter im Format `{cat1: value1, cat2: value2}`\n\t- `title=\"Plot\" (str)`: Titel\n\t- `style=\"default\" (str)`: Style des Plots. M\u00f6glichkeiten: `'default'`, `'whisker'`\n\t- `unique=False (bool)`: ob Dateinamen ein Zeitstempel angeh\u00e4ngt werden soll\n\t- `relative_base (int,str,float)`: Basiswert aus der `x_category` von dem aus die relavite Aggregation durchgef\u00fchrt werden soll\n - `axis_label` (tuple len=2 of str): Eigene Achsen-Bezeichner. `axis_label:= (\"x-Achse\", \"y-Achse\")`.\n - `disable_error=False` Deaktiviert bei Bedarf die Fehlerbalken.\n\n\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/dettoman/py_stereo_alg_eval", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pystereoalgeval", "package_url": "https://pypi.org/project/pystereoalgeval/", "platform": "", "project_url": "https://pypi.org/project/pystereoalgeval/", "project_urls": { "Homepage": "https://github.com/dettoman/py_stereo_alg_eval" }, "release_url": "https://pypi.org/project/pystereoalgeval/0.2.3/", "requires_dist": null, "requires_python": "", "summary": "Automated Stereo Algorithm Evaluation", "version": "0.2.3" }, "last_serial": 5127467, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "0add664dbe68defdb3207f8f57aa52dd", "sha256": "29c4cfc59044802c4f02590146d2679ee474143fc24840d630dd4e992f139733" }, "downloads": -1, "filename": "pystereoalgeval-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0add664dbe68defdb3207f8f57aa52dd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 39031, "upload_time": "2019-03-04T14:57:13", "url": "https://files.pythonhosted.org/packages/54/7e/9e434444c5234da6dbfe8683f1556cb0a2cab5e925befdcf4dbbd0f6c0b3/pystereoalgeval-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "47fb90e317ff532aa68f9c59a32d2dd5", "sha256": "e2e178153a2496510e125822191c33016a379f6795fb3e3b19cfb23e80d1264b" }, "downloads": -1, "filename": "pystereoalgeval-0.2.tar.gz", "has_sig": false, "md5_digest": "47fb90e317ff532aa68f9c59a32d2dd5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42522, "upload_time": "2019-03-04T14:57:15", "url": "https://files.pythonhosted.org/packages/dc/3f/3a24834fa9def35b2351e1a671f66353dca3f526c3d41d364dc19fe5509b/pystereoalgeval-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "c3757047baa0d32f6b4f974d067d27b6", "sha256": "23233498f1e01134e3958d945890ccd70256e12bba13698fe94978422523251c" }, "downloads": -1, "filename": "pystereoalgeval-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c3757047baa0d32f6b4f974d067d27b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 39037, "upload_time": "2019-03-04T15:00:01", "url": "https://files.pythonhosted.org/packages/75/b0/08640cdc3e74933e818f8b99e45769861e50adb58e75216805c9562a843e/pystereoalgeval-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "146cd072409953f85a31715e6a674875", "sha256": "e0ccecd612f1f6e68b4836b8051167a7c79ca6bad4b42c78307ccb03d13050ac" }, "downloads": -1, "filename": "pystereoalgeval-0.2.1.tar.gz", "has_sig": false, "md5_digest": "146cd072409953f85a31715e6a674875", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42500, "upload_time": "2019-03-04T15:00:03", "url": "https://files.pythonhosted.org/packages/28/1e/07f05ea2a23a4d5eaf9c5aa05bd4c7ad5b2e261aa7d152415addbe28c2f3/pystereoalgeval-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "9b1fed7148524a6592a42aae0c34fdda", "sha256": "b61a505aaea7b334968dc6aa86cf7045f3c0cbdd116326ded5822c26f7bb1b98" }, "downloads": -1, "filename": "pystereoalgeval-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "9b1fed7148524a6592a42aae0c34fdda", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38704, "upload_time": "2019-03-11T09:35:57", "url": "https://files.pythonhosted.org/packages/f7/48/78521ca2eb7037870cec24bd81e76b97c77e560fbfafa517600af6e9393a/pystereoalgeval-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff6790f7a3193df4465c793a9bf1937e", "sha256": "5f7e67bd5e7b85b6a58bb1c41b7ad61d8b557ad6b6e7857f53fcabfe2576e7cf" }, "downloads": -1, "filename": "pystereoalgeval-0.2.2.tar.gz", "has_sig": false, "md5_digest": "ff6790f7a3193df4465c793a9bf1937e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42538, "upload_time": "2019-03-11T09:35:59", "url": "https://files.pythonhosted.org/packages/68/37/5dc7a1b825409f9795a19178daf34b28902ae34674329b255b7604b9ae43/pystereoalgeval-0.2.2.tar.gz" } ], "0.2.2b0": [ { "comment_text": "", "digests": { "md5": "571bfda1608d584a6d48557ad8b88e72", "sha256": "8394d56a191b57dd2e2020bfcca86f1a2e60a1408d5ad3c54e3d570c61a58169" }, "downloads": -1, "filename": "pystereoalgeval-0.2.2b0-py3-none-any.whl", "has_sig": false, "md5_digest": "571bfda1608d584a6d48557ad8b88e72", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38750, "upload_time": "2019-04-02T08:10:44", "url": "https://files.pythonhosted.org/packages/9c/68/70e42e7897d7f5d9e0fe0857ebbd9a62be923e88d87b5945a1b93d6c25fb/pystereoalgeval-0.2.2b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fd21172e762bf57e08e5255bed80b9e3", "sha256": "b4049dc27167089e27d6052483ad98e98bf0d6ed01e6bf3526d35dc6657141e6" }, "downloads": -1, "filename": "pystereoalgeval-0.2.2b0.tar.gz", "has_sig": false, "md5_digest": "fd21172e762bf57e08e5255bed80b9e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42571, "upload_time": "2019-04-02T08:10:46", "url": "https://files.pythonhosted.org/packages/d8/5f/e109da107df700ea880b601be68fbf14565b68434dfd697917d1a3e83822/pystereoalgeval-0.2.2b0.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "e0d7584f8d1357aaaf1731c102bd73ad", "sha256": "34469caa07f27aadbb9aade86020a051bcd10b834feddec7d67cff167abcdb15" }, "downloads": -1, "filename": "pystereoalgeval-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e0d7584f8d1357aaaf1731c102bd73ad", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38793, "upload_time": "2019-04-11T07:09:11", "url": "https://files.pythonhosted.org/packages/72/61/39c7752bf50a2dbde706cffe622b92ca44e6bd9dcdf5c56c40ea4dd5c457/pystereoalgeval-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68f2f8a41b334d642b81571dfae302f7", "sha256": "edddadbfa09891d7a6924f378c45146c0320e524995bc36e04c62c37d6de53f6" }, "downloads": -1, "filename": "pystereoalgeval-0.2.3.tar.gz", "has_sig": false, "md5_digest": "68f2f8a41b334d642b81571dfae302f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42754, "upload_time": "2019-04-11T07:09:13", "url": "https://files.pythonhosted.org/packages/56/5d/30f9149affffccd4a9c176421bb5be29ba5de58e082660ced6eb782ceb9c/pystereoalgeval-0.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e0d7584f8d1357aaaf1731c102bd73ad", "sha256": "34469caa07f27aadbb9aade86020a051bcd10b834feddec7d67cff167abcdb15" }, "downloads": -1, "filename": "pystereoalgeval-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e0d7584f8d1357aaaf1731c102bd73ad", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38793, "upload_time": "2019-04-11T07:09:11", "url": "https://files.pythonhosted.org/packages/72/61/39c7752bf50a2dbde706cffe622b92ca44e6bd9dcdf5c56c40ea4dd5c457/pystereoalgeval-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68f2f8a41b334d642b81571dfae302f7", "sha256": "edddadbfa09891d7a6924f378c45146c0320e524995bc36e04c62c37d6de53f6" }, "downloads": -1, "filename": "pystereoalgeval-0.2.3.tar.gz", "has_sig": false, "md5_digest": "68f2f8a41b334d642b81571dfae302f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42754, "upload_time": "2019-04-11T07:09:13", "url": "https://files.pythonhosted.org/packages/56/5d/30f9149affffccd4a9c176421bb5be29ba5de58e082660ced6eb782ceb9c/pystereoalgeval-0.2.3.tar.gz" } ] }