| Operatoren |
train_model_components — Trainieren von Komponenten und Relationen für das komponentenbasierte Matching.
train_model_components(ModelImage, InitialComponents, TrainingImages : ModelComponents : ContrastLow, ContrastHigh, MinSize, MinScore, SearchRowTol, SearchColumnTol, SearchAngleTol, TrainingEmphasis, AmbiguityCriterion, MaxContourOverlap, ClusterThreshold : ComponentTrainingID)
train_model_components ermittelt die endgültigen (starren) Modellkomponenten und trainiert deren gegenseitige Relationen, d.h. deren relative Bewegungen, auf der Grundlage der initialen Komponenten anhand mehrerer Trainingsbilder. Das Ergebnis des Trainings wird in ComponentTrainingID als Handle zurückgegeben. Das Trainingsergebnis kann anschließend dazu verwendet werden, das eigentliche Komponentenmodell mit create_trained_component_model aufzubauen.
train_model_components sollte in den Fällen verwendet werden, in denen die Relationen der Komponenten nicht bekannt sind und daher automatisch trainiert werden sollen. Sind die Relationen dagegen bekannt, kann auf den Einsatz von train_model_components verzichtet werden und das Komponentenmodell direkt mit create_component_model generiert werden.
Sind die initialen Komponenten automatisch mit gen_initial_components erzeugt worden, so enthält InitialComponents die Konturregionen der initialen Komponenten. Sollen die initialen Komponenten dagegen von Hand vorgegeben werden, so können diese in InitialComponents direkt übergeben werden. Dabei dürfen allerdings keine Konturregionen, sondern die initialen Komponenten umschließende Regionen übergeben werden. Die übergebenen (Kontur-)Regionen beziehen sich auf das Modellbild ModelImage. Wurden die initialen Komponenten mit Hilfe von gen_initial_components bestimmt, sollte das übergebene Modellbild folglich mit dem Modellbild in gen_initial_components übereinstimmen. In jedem Fall ist zu beachten, dass jede initiale Komponente Bestandteil von höchstens einer starren Modellkomponente ist. Der Grund hierfür ist, dass während des Trainings initiale Komponenten zwar bei Bedarf zu starren Modellkomponenten zusammengefasst werden (siehe unten), nicht jedoch in kleinere Einheiten zerlegt und auf verschiedene Modellkomponenten aufgeteilt werden können.
Folgendes Vorgehen wird in train_model_components zum Trainieren angewendet: Im ersten Schritt werden die initialen Komponenten in allen Trainingsbildern gesucht. Es kann vorkommen, dass eine initiale Komponente in einem Trainingsbild mehrfach gefunden wird. Daher werden im zweiten Schritt die daraus resultierenden Mehrdeutigkeiten gelöst, d.h. die wahrscheinlichste Lage jeder initialen Komponente wird ermittelt. Nach dem Lösen der Mehrdeutigkeiten bleibt demnach in jedem Trainingsbild für jede initiale Komponente höchstens eine gefundene Instanz übrig. Im nächsten Schritt werden die (nun eindeutigen) Lagen der initialen Komponenten analysiert. Diejenigen initialen Komponenten, die sich nicht relativ zueinander bewegen, werden zu den endgültigen starren Modellkomponenten zusammengefasst. Schließlich werden im letzten Schritt die Relationen zwischen den Modellkomponenten ermittelt indem ihre relativen Bewegungen über die Sequenz an Trainingsbildern analysiert werden. Die mit den beschriebenen Schritten verbundenen Parameter werden im Folgenden erläutert.
Das Training erfolgt auf der Grundlage der in TrainingImages übergebenen Trainingsbilder. Die Trainingsbilder dürfen jeweils höchstens eine Instanz des zusammengesetzten Objektes zeigen und sollten nach Möglichkeit die relativen Bewegungen aller Modellkomponenten in vollem Umfang beinhalten. Soll z.B. das Komponentenmodell eines Ein-Aus-Schalters trainiert werden, so genügt ein Trainingsbild, in dem der Schalter im ausgeschalten Zustand zu sehen ist für den Fall, dass der Schalter im Modellbild im eingeschalteten Zustand vorliegt, bzw. umgekehrt.
Das Prinzip des Trainings ist es, die initialen Komponenten in den Trainingsbildern wiederzufinden und deren Lage (Position und Orientierung) zu analysieren. Dazu wird für jede initiale Komponente ein Formmodell erzeugt (siehe create_shape_model), das dann dazu genutzt wird, die Lage der initialen Komponente in den Trainingsbildern zu bestimmen (siehe find_shape_model). Je nachdem welcher Modus mit set_system('pregenerate_shape_models',...) eingestellt ist, wird das komplette Formmodell vorab generiert oder erst während der Suche online erzeugt. Dieser Modus hat sowohl Einfluss auf die Laufzeit als auch auf die Robustheit des Trainings. Weiterhin ist zu beachten, dass bei Verwendung von einkanaligen Bildern sowohl in ModelImage als auch in TrainingImages intern die Metrik 'use_polarity' für create_shape_model verwendet wird, während bei mehrkanaligen Bildern in ModelImage oder in TrainingImages intern die Metrik 'ignore_color_polarity' verwendet wird. Schließlich ist zu beachten, dass die Anzahl der Kanäle in ModelImage und TrainingImages zwar unterschiedlich sein darf, z.B. um die Modellgenerierung aus synthetischen Bildern zu erlauben, dass aber die Anzahl der Kanäle für alle Bilder in TrainingImages gleich sein muss. Weitere Informationen können bei create_shape_model nachgelesen werden. Das Generieren der Formmodelle kann mit Hilfe der Parameter ContrastLow, ContrastHigh und MinSize beeinflusst werden. Diese Parameter erfüllen dieselbe Funktion wie in gen_initial_components und können durch die Angabe von 'auto' auch automatisch bestimmt werden: Sollen beide Hysterese-Schwellen automatisch bestimmt werden, so müssen sowohl ContrastLow als auch ContrastHigh jeweils auf 'auto' gesetzt werden. Soll dagegen lediglich ein Kontrastwert automatisch bestimmt werden, so muss ContrastLow auf 'auto' und ContrastHigh auf einen beliebigen Wert ungleich 'auto' gesetzt werden. Wurden die initialen Komponenten automatisch mit gen_initial_components erzeugt, so sollten die Parameter ContrastLow, ContrastHigh und MinSize mit den selben Werten besetzt werden wie in gen_initial_components.
Zur Steuerung der Suche nach den initialen Komponenten dienen die Parameter MinScore, SearchRowTol, SearchColumnTol, SearchAngleTol und TrainingEmphasis. Der Parameter MinScore legt fest, welche Bewertung ein potentieller Match mindestens besitzen muss, damit er als eine Instanz der initialen Komponente im Trainingsbild angesehen wird. Je größer der Wert von MinScore gewählt werden kann, desto schneller verläuft das Training. Falls erwartet werden kann, dass die initialen Komponenten in den Trainingsbildern niemals verdeckt sind, kann MinScore auf so hohe Werte wie 0.8 oder sogar 0.9 gesetzt werden (siehe auch find_shape_model).
Im Normalfall werden die Komponenten nur an den Stellen der Trainingsbilder gesucht, an denen die jeweilige Komponente vollständig in das Bild passt. Das bedeutet, dass eine Komponente nicht gefunden werden kann, wenn sie aus dem Bild herausragt, selbst wenn sie eine Bewertung größer als MinScore erreichen würde. Dieses Verhalten kann mit set_system('border_shape_models','true') umgestellt werden, so dass auch Komponenten gefunden werden, die aus dem Bild herausragen, falls sie eine Bewertung größer als MinScore erreichen. Dabei werden Punkte außerhalb des Bildes als verdeckt angesehen, d.h. sie verringern die Bewertung. Es ist zu beachten, dass dieser Modus die Laufzeit des Trainings erhöht.
Bei einer hohen Anzahl an initialen Komponenten und vielen Trainingsbildern kann das Trainieren unter Umständen sehr lange (bis zu mehreren Minuten) dauern. Um das Trainieren zu beschleunigen besteht die Möglichkeit, den Suchbereich in den Trainingsbildern für die einzelnen initialen Komponenten einzuschränken. Dabei gilt die Lage der initialen Komponenten im Modellbild als Referenzlage. Die Parameter SearchRowTol und SearchColumnTol geben an, in welchem Toleranzbereich relativ zur Referenzposition gesucht werden soll. Wenn z.B. die Position einer initialen Komponente im Modellbild (100,200) ist und für SearchRowTol = 20 und für SearchColumnTol = 10 gewählt wird, dann wird diese initiale Komponente in den Trainingsbildern lediglich innerhalb des achsenparallelen Rechtecks gesucht, dessen linke obere Ecke bei (80,190) und dessen rechte untere Ecke bei (120,210) liegt. Das gleiche gilt für den Winkelsuchbereich, der durch die Angabe der Winkeltoleranz SearchAngleTol auf ±SearchAngleTol eingeschränkt werden kann. Damit ist es möglich durch geschickte Aufnahme der Trainingsbilder den Rechenaufwand während des Trainierens deutlich zu reduzieren. Wird für einen dieser drei Parameter der Wert -1 übergeben, erfolgt in der entsprechenden Dimension keine Suchraumeinschränkung.
Die Eingabeparameter ContrastLow, ContrastHigh, MinSize, MinScore, SearchRowTol, SearchColumnTol, and SearchAngleTol müssen entweder genau ein Element enthalten, oder dieselbe Anzahl wie initiale Komponenten in InitialComponents. Im ersten Fall wird der Wert des Eingabeparameters für alle initiale Komponenten gleich verwendet. Im zweiten Fall wird das jeweilige Element des Eingabeparameters für die entsprechende initiale Komponente in InitialComponents verwendet.
Der Parameter TrainingEmphasis bietet eine weitere Möglichkeit, auf die Geschwindigkeit des Trainingsvorgangs Einfluss zu nehmen und gleichzeitig dessen Robustheit zu steuern. Wird TrainingEmphasis auf 'speed' gesetzt, so verläuft das Training zwar vergleichsweise schnell, es kann allerdings in einigen Fällen dazu führen, dass einzelne initiale Komponenten in den Trainingsbildern nicht oder in falscher Lage gefunden werden. Das würde zu einer fehlerhaften Berechnung der starren Modellkomponenten und deren Relationen führen. Die Lage der gefundenen initialen Komponenten in den einzelnen Trainingsbildern kann mit Hilfe von get_training_components kontrolliert werden. Bei auftretenden Fehlzuordnungen sollte dann TrainingEmphasis auf 'reliability' gesetzt und das Training erneut gestartet werden. Dadurch wird eine höhere Robustheit gegenüber Fehlzuordnungen erreicht, allerdings auf Kosten einer längeren Rechenzeit.
Bei der Bestimmung der Lage kann es außerdem zu Mehrdeutigkeiten kommen, falls die initialen Komponenten Rotationssymmetrien aufweisen oder wenn mehrere initiale Komponenten identisch oder sich sehr ähnlich sind. Zur Lösung dieser Mehrdeutigkeiten wird jeweils die wahrscheinlichste Lage für jede initiale Komponenten in jedem Trainingsbild ermittelt. Dazu müssen die einzelnen mehrdeutigen Lagen bewertet werden. Die Lage einer initialen Komponente im Trainingsbild wird dann gut bewertet, wenn die relative Lage zu den übrigen initialen Komponenten möglichst gut mit der entsprechenden relativen Lage im Modellbild übereinstimmt. Die Bewertung der Übereinstimmungen kann mit AmbiguityCriterion gewählt werden. In fast allen Fällen liefert 'rigidity' die besten Ergebnisse. Dabei wird von der Starrheit des zusammengesetzten Ojektes ausgegangen. Je mehr die Starrheit des zusammengesetzten Objektes durch die Lage der initialen Komponente verletzt wird, desto geringer fällt deren Bewertung aus. Bei 'distance' wird nur die Entfernung zwischen den initialen Komponenten als Maß herangezogen. In diesem Fall erhält die Lage einer initialen Komponente eine gute Bewertung wenn ihre Distanzen zu den übrigen Komponenten mit den entsprechenden Distanzen im Modellbild gut übereinstimmen. Dementsprechend ist bei 'orientation' nur die relative Orientierung für die Bewertung ausschlaggebend. Schlussendlich kann die gleichzeitige Berücksichtigung von Entfernung und relativer Orientierung mit 'distance_orientation' erreicht werden. Im Gegensatz zu 'rigidity' wird bei 'distance_orientation' die relative Lage der initialen Komponenten vernachlässigt.
Die Lösung der Mehrdeutigkeiten kann auch durch den Parameter MaxContourOverlap beeinflusst werden. Dieser Parameter beschreibt das Ausmaß, zu dem sich die Konturen zweier Matches initialer Komponenten überlappen dürfen. Angenommen, es sollen, z.B. zwei initiale Komponenten 'I' und 'T' in einem Trainingsbild, das den Schriftzug 'IT' enthält, gefunden werden. Dann wird zwar die initiale Komponente 'T' in ihrer richtigen Lage gefunden, aufgrund der Ähnlichkeiten der beiden initialen Komponenten wird die initiale Komponente 'I' allerdings sowohl in ihrer richtigen Lage ('I') als auch in der falschen Lage an der Position des 'T' gefunden. Durch geeignete Wahl von MaxContourOverlap ist es möglich, den falschen Match zu verwerfen: Sollen überlappende Matches toleriert werden, dann sollte MaxContourOverlap auf 1 gesetzt werden. Sollen überlappende Matches vollkommen ausgeschlossen werden, dann sollte MaxContourOverlap auf 0 gesetzt werden. Durch die Wahl eines Wertes zwischen 0 und 1 kann der maximale Prozentsatz an überlappenden Konturpixeln stufenlos eingestellt werden.
Aufgrund der Lagen der initialen Komponenten im Modellbild und in den Trainingsbildern wird dann zunächst entschieden, welche initialen Komponenten zu starren Modellkomponenten zusammengefasst werden können. Zwei initiale Komponenten können genau dann zusammengefasst werden, wenn sie über alle Bilder keine relative Bewegung zeigen. Würde im Falle des Schalters das Trainingsbild den gleichen Schalterzustand zeigen wie das Modellbild, so würde der Algorithmus die entsprechenden initialen Komponenten zusammenfassen in der Annahme, es handele sich um eine starre Modellkomponente. Das Maß, in dem initiale Komponenten zusammengefasst werden, kann über den Parameter ClusterThreshold gesteuert werden. Dieser Schwellwert basiert auf der Wahrscheinlichkeit, dass zwei initiale Komponenten zur gleichen starren Modellkomponente gehören. ClusterThreshold gibt somit die minimale Wahrscheinlichkeit an, die zwei initiale Komponenten aufweisen müssen, damit sie zusammengefasst werden. Da es sich um Wahrscheinlichkeiten handelt, muss der Schwellwert im Bereich von 0 bis 1 liegen. Je größer der Cluster-Schwellwert gewählt wird, desto weniger Zusammenschlüsse finden statt. Für einen Schwellwert von 0 werden all initialen Komponenten zu einer starren Kompnonente zusammengefasst, für einen Schwellwert von 1 finden keine Zusammenschlüsse statt und jede initiale Komponente wird als starre Modellkomponente übernommen.
Die endgültigen starren Modellkomponenten werden in ModelComponents zurückgeliefert. In nachfolgenden Operatoren wird der Index einer Komponenten in ModelComponents verwendet, um die Modellkomponente zu bezeichnen. Die Lage der gefundenen Modellkomponenten in den Trainingsbildern kann mit get_training_components kontrolliert werden.
Nach der Bestimmung der Modellkomponenten werden deren relative Bewegungen analysiert. Dabei wird für jedes Komponentenpaar die Bewegung der zweiten Komponente relativ zur ersten bestimmt. Dazu werden die Komponenten zunächst auf ihren Referenzpunkt bezogen. Der Referenzpunkt einer Komponente ergibt sich aus dem Schwerpunkt seiner Konturregion, die in ModelComponents zurückgeliefert wird und kann mit area_center berechnet werden. Die relative Bewegung wird dann durch das kleinste umschließende Rechteck beliebiger Orientierung der relativen Referenzpunktbewegung und durch den kleinsten umschließenden Winkelbereich der relativen Orientierung der zweiten Komponente über alle Bilder repräsentiert. Die ermittelten Relationen können mit get_component_relations inspiziert werden.
Dieser Operator liefert ein Handle zurück. Es ist zu beachten, dass der Zustand einer Instanz dieses Handletyps durch bestimmte Operatoren geändert werden kann, obwohl das Handle als Eingabeparameter in diesen Operatoren verwendet wird.
Eingabebild, aus dem die Formmodelle für die initialen Komponenten generiert werden sollen.
Konturregionen oder umschließende Regionen der initiale Komponenten.
Zum Trainieren der Modellkomponenten verwendete Trainingsbilder.
Konturregionen der starren Modellkomponenten.
Unterer Hystereseschwellwert für den Kontrast der initialen Komponenten im Bild.
Defaultwert: 'auto'
Wertevorschläge: 'auto', 10, 20, 30, 40, 60, 80, 100, 120, 140, 160
Restriktion: ContrastLow > 0
Oberer Hystereseschwellwert für den Kontrast der initialen Komponenten im Bild.
Defaultwert: 'auto'
Wertevorschläge: 'auto', 10, 20, 30, 40, 60, 80, 100, 120, 140, 160
Restriktion: ContrastHigh > 0 && ContrastHigh >= ContrastLow
Mindestgröße zusammenhängender Konturregionen.
Defaultwert: 'auto'
Wertevorschläge: 'auto', 0, 5, 10, 20, 30, 40
Restriktion: MinSize >= 0
Minimale Bewertung der zu findenden Instanzen der initialen Komponenten
Defaultwert: 0.5
Wertevorschläge: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.05
Restriktion: 0 <= MinScore && MinScore <= 1
Suchtoleranz in Zeilenrichtung.
Defaultwert: -1
Wertevorschläge: 0, 10, 20, 30, 50, 100
Restriktion: SearchRowTol == -1 || SearchColumnTol >= 0
Suchtoleranz in Spaltenrichtung.
Defaultwert: -1
Wertevorschläge: 0, 10, 20, 30, 50, 100
Restriktion: SearchColumnTol == -1 || SearchColumnTol >= 0
Winkel-Suchtoleranz.
Defaultwert: -1
Wertevorschläge: 0.0, 0.17, 0.39, 0.78, 1.57
Restriktion: SearchAngleTol == -1 || SearchAngleTol >= 0
Entscheidung, ob das Trainieren auf dem Grundsatz einer schnellen Berechnung oder einen hohen Robustheit basiert.
Defaultwert: 'speed'
Werteliste: 'reliability', 'speed'
Kriterium zur Lösung mehrdeutiger Matches der initialen Komponenten in einem Trainingsbild.
Defaultwert: 'rigidity'
Werteliste: 'distance', 'distance_orientation', 'orientation', 'rigidity'
Maximale Konturüberlappung gefundener initialer Komponenten in einem Trainingsbild.
Defaultwert: 0.2
Wertevorschläge: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.05
Restriktion: 0 <= MaxContourOverlap && MaxContourOverlap <= 1
Schwellwert für das Zusammenfassen initialer Komponenten.
Defaultwert: 0.5
Wertevorschläge: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Restriktion: 0 <= ClusterThreshold && ClusterThreshold <= 1
Handle des Trainingsergebnisses.
* Get the model image.
read_image (ModelImage, 'model_image.tif')
* Define the regions for the initial components.
gen_rectangle2 (InitialComponentRegions, 212, 233, 0.62, 167, 29)
gen_rectangle2 (Rectangle2, 298, 363, 1.17, 162, 34)
gen_rectangle2 (Rectangle3, 63, 444, -0.26, 50, 27)
gen_rectangle2 (Rectangle4, 120, 473, 0, 33, 20)
concat_obj (InitialComponentRegions, Rectangle2, InitialComponentRegions)
concat_obj (InitialComponentRegions, Rectangle3, InitialComponentRegions)
concat_obj (InitialComponentRegions, Rectangle4, InitialComponentRegions)
* Get the training images.
gen_empty_obj (TrainingImages)
for i := 1 to 4 by 1
read_image (TrainingImage, 'training_image-'+i+'.tif')
concat_obj (TrainingImages, TrainingImage, TrainingImages)
endfor
* Extract the model components and train the relations.
train_model_components (ModelImage, InitialComponentRegions, \
TrainingImages, ModelComponents, 22, 60, 30, 0.6, \
0, 0, rad(60), 'speed', 'rigidity', 0.2, 0.4, \
ComponentTrainingID)
Sind die Parameterwerte korrekt, dann liefert train_model_components den Wert 2 (H_MSG_TRUE). Das Verhalten bei leerer Eingabe (keine Eingabebilder oder Eingaberegionen vorhanden) lässt sich mittels set_system('no_object_result',<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
inspect_clustered_components, cluster_model_components, modify_component_relations, write_training_components, get_training_components, get_component_relations, create_trained_component_model, clear_training_components
create_shape_model, find_shape_model
Matching
| Operatoren |