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.
ModelImage
(input_object) (multichannel-)image →
object (byte / uint2)
Eingabebild, aus dem die Formmodelle für die initialen Komponenten generiert werden sollen.
InitialComponents
(input_object) region-array →
object
Konturregionen oder umschließende Regionen der initiale Komponenten.
TrainingImages
(input_object) (multichannel-)image(-array) →
object (byte / uint2)
Zum Trainieren der Modellkomponenten verwendete Trainingsbilder.
ModelComponents
(output_object) region(-array) →
object
Konturregionen der starren Modellkomponenten.
ContrastLow
(input_control) integer(-array) →
(integer / string)
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
ContrastHigh
(input_control) integer(-array) →
(integer / string)
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
MinSize
(input_control) integer(-array) →
(integer / string)
Mindestgröße zusammenhängender Konturregionen.
Defaultwert: 'auto'
Wertevorschläge: 'auto' , 0, 5, 10, 20, 30, 40
Restriktion: MinSize >= 0
MinScore
(input_control) real(-array) →
(real)
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
SearchRowTol
(input_control) integer(-array) →
(integer)
Suchtoleranz in Zeilenrichtung.
Defaultwert: -1
Wertevorschläge: 0, 10, 20, 30, 50, 100
Restriktion: SearchRowTol == -1 || SearchColumnTol >= 0
SearchColumnTol
(input_control) integer(-array) →
(integer)
Suchtoleranz in Spaltenrichtung.
Defaultwert: -1
Wertevorschläge: 0, 10, 20, 30, 50, 100
Restriktion: SearchColumnTol == -1 || SearchColumnTol >= 0
SearchAngleTol
(input_control) angle.rad(-array) →
(real)
Winkel-Suchtoleranz.
Defaultwert: -1
Wertevorschläge: 0.0, 0.17, 0.39, 0.78, 1.57
Restriktion: SearchAngleTol == -1 || SearchAngleTol >= 0
TrainingEmphasis
(input_control) string →
(string)
Entscheidung, ob das Trainieren auf dem Grundsatz einer schnellen Berechnung oder einen hohen Robustheit basiert.
Defaultwert: 'speed'
Werteliste: 'reliability' , 'speed'
AmbiguityCriterion
(input_control) string →
(string)
Kriterium zur Lösung mehrdeutiger Matches der initialen Komponenten in einem Trainingsbild.
Defaultwert: 'rigidity'
Werteliste: 'distance' , 'distance_orientation' , 'orientation' , 'rigidity'
MaxContourOverlap
(input_control) real →
(real)
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
ClusterThreshold
(input_control) real →
(real)
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
ComponentTrainingID
(output_control) component_training →
(handle)
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