find_component_model — Suche der besten Matches eines Komponentenmodells in einem Bild.
find_component_model(Image : : ComponentModelID, RootComponent, AngleStartRoot, AngleExtentRoot, MinScore, NumMatches, MaxOverlap, IfRootNotFound, IfComponentNotFound, PosePrediction, MinScoreComp, SubPixelComp, NumLevelsComp, GreedinessComp : ModelStart, ModelEnd, Score, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp)
find_component_model findet die besten NumMatches
Instanzen des Komponentenmodells ComponentModelID im
Eingabebild Image.
Das Ergebnis der Suche kann mit get_found_component_model
visualisiert werden.
Ebenso können damit die Matches der Komponenten einer bestimmten
Instanz extrahiert werden.
ComponentModelID:Handle des Komponentenmodells.
Das Modell muss zuvor mit
create_trained_component_model oder
create_component_model erzeugt oder mit
read_component_model eingelesen worden sein.
RootComponent:Index der Wurzelkomponente.
Die Komponenten des Komponentenmodells ComponentModelID
sind durch eine Baumstruktur repräsentiert.
Die Wurzelkomponente steht an der Wurzel des Baumes.
Die Wurzelkomponente wird während der Suche im gesamten Suchraum gesucht, d.h. innerhalb aller erlaubten Positionen und Orientierungen. Die übrigen Komponenten werden dagegen jeweils relativ zur Lage ihres Vorgängers im Baum in einem eingeschränkten Suchraum gesucht (rekursive Suche). Die eingeschränkten Suchräume werden dabei aus den entsprechenden Relationen berechnet.
Inwiefern sich eine Modellkomponente als Wurzelkomponente eignet,
hängt von verschiedenen Faktoren ab.
Prinzipiell sollte eine Modellkomponente gewählt werden, die mit
hoher Wahrscheinlichkeit im Bild wiedergefunden werden kann.
Eine im Bild stark verdeckte oder fehlende Komponente eignet sind
daher nur bedingt als Wurzelkomponente.
Für Verhalten des Operators in solchen Fällen, siehe den Eintrag zu
IfRootNotFound weiter unten.
Ein anderes mögliches Auswahlkriterium ist die mit der Wurzelkomponente
verbundene Rechenzeit während der Suche.
Eine entsprechende Rangfolge der Modellkomponenten wird über
den Parameter RootRanking des Operators
create_trained_component_model bzw. create_component_model
zurückgegeben.
Wird die komplette Rangfolge RootRanking in
RootComponent übergeben, dann wird der erste Wert
RootComponent[0] als Wurzelkomponente ausgewählt.
AngleStartRoot und AngleExtentRoot:Legen den erlaubten Winkelbereich fest (in [rad]), in dem nach der Wurzelkomponente gesucht wird.
Der Winkelbereich wird gegebenenfalls auf den Bereich
beschnitten, der bei der Erzeugung des Komponentenmodells mit
create_trained_component_model bzw.
create_component_model festgelegt worden ist.
Der Winkelbereich kann für die einzelnen Formmodelle mit
get_shape_model_params abgefragt werden.
Das dazu notwendige Handle des entsprechenden Formmodells kann mit
get_component_model_params erhalten werden.
MinScore:Minimale Bewertung, die ein potentieller Match des Komoponentenmodells erhalten muss um als Instanz zu zählen.
Falls erwartet werden kann, dass das Komponentenmodell
niemals verdeckt wird, kann MinScore auf so hohe Werte wie
0.8 oder sogar 0.9 gesetzt werden.
Der Wert dieses Parameters nur geringen Einfluss auf die Rechenzeit.
Ausnahme ist im Fall IfRootNotFound auf
'select_new_root', siehe unten.
NumMatches:Bestimmt die maximale Anzahl zurückgegebener Instanzen.
Werden weniger Instanzen als NumMatches gefunden,
werden nur diese Instanzen zurückgeliefert,
d.h. der Parameter MinScore hat höhere Priorität.
Werden mehr Instanzen als NumMatches mit einer Bewertung
besser MinScore gefunden, werden nur die besten
NumMatches Instanzen zurückgeliefert.
Sollen jedoch alle Modellinstanzen, deren
Bewertung MinScore übersteigt, im Bild gefunden werden,
muss NumMatches auf 0 gesetzt werden.
MaxOverlap:Bestimmt die maximal erlaubte Überlappung zweier Instanzen, wobei dieser Anteil als Zahl zwischen 0 und 1 ausgedrücket wird.
In manchen Fällen kann es vorkommen, dass sich verschiedene
Instanzen nur durch die Lage einer oder weniger Komponenten
unterscheiden.
Überlappen sich zwei Instanzen um mehr als MaxOverlap,
wird nur die bessere zurückgeliefert.
Dies bedeutet, bei MaxOverlap = 0 werden
nur Instanzen zurückgeliefert die sich überhaupt nicht überlappen,
während bei MaxOverlap = 1
keine Überprüfung der Überlappung stattfindet und alle
gefundenen Instanzen zurückgeliefert werden.
Die Berechnung der Überlappung erfolgt anhand der kleinsten
umschließenden Rechtecke beliebiger Orientierung der Konturen der
einzelnen Komponenten (siehe smallest_rectangle2).
IfRootNotFound:Steuert das Verhalten des Operators bei einem fehlenden oder stark verdeckten Wurzelobjekt.
Mögliche Werte:
'stop_search': Es wird davon ausgegangen, dass die Wurzelkomponente im Bild immer gefunden wird. Folglich wird für eine Instanz die Suche nach den restlichen Komponenten nicht fortgesetzt, wenn die Wurzelkomponente nicht gefunden wurde.
'select_new_root':
Unterschiedliche Komponenten werden sukzessive als Wurzelkomponente
gewählt um den gesamten Suchraum zu durchsuchen.
Die Auswahl der Wurzelkomponenten erfolgt
in der Reihenfolge, die in RootRanking übergeben wurde.
Die Lagen der gefundenen Instanzen aller Wurzelkomponenten
werden dann dazu genutzt die rekursiven Suchen nach den übrigen
Komponenten zu starten. Dadurch ist es zwar möglich, Instanzen auch
dann zu finden, wenn die ursprüngliche Wurzelkomponente nicht
gefunden wird, die Rechenzeit der Suche steigt allerdings im
Vergleich zur Suche mit 'stop_search' deutlich an.
Dies ist insbesondere bei kleinem MinScore der Fall, da
dann mehr Wurzelkomponenten gesucht werden müssen.
Sollten bei der Suche mehr Wurzelkomponenten benötigt werden, als
in RootComponent übergeben wurden, so werden die
Wurzelkomponenten in der automatisch berechneten Reihenfolge ergänzt
(siehe create_trained_component_model bzw.
create_component_model).
IfComponentNotFound:Bestimmt inwiefern Komponenten gesucht werden, wenn die Vorgänger-Komponente selbst nicht gefunden wurde (z.B. weil sie fehlt oder stark verdeckt ist).
Mögliche Werte:
'prune_branch': Solche Komponenten werden nicht gesucht und ebenfalls als 'nicht gefunden' eingestuft.
'search_from_upper': Solche Komponenten werden relativ zur Lage der Vorgänger-Komponente der Vorgänger-Komponente gesucht.
'search_from_best': Solche Komponenten werden relativ zur Lage der bereits gefundenen Komponente gesucht, von der aus die relative Suche mit dem geringsten Rechenaufwand durchgeführt werden kann.
PosePrediction:Gibt an, ob die Lage von nicht gefundenen Komponenten nach der Suche geschätzt werden soll.
Mögliche Werte:
'none': Nur für die gefundenen Komponenten werden die Lagen zurückgeliefert.
'from_neighbors':
Die Lagen der nicht gefundenen Komponenten geschätzt und mit einer
Bewertung von ScoreComp = 0.0 zurückgeliefert.
Die Schätzung der Lage erfolgt auf Grundlage der Lagen gefundener
Nachbarkomponenten im Suchbaum.
'from_all':
Die Lagen der nicht gefundenen Komponenten geschätzt und mit einer
Bewertung von ScoreComp = 0.0 zurückgeliefert.
Die Schätzung der Lage erfolgt auf Grundlage der Lagen
aller gefundenen Komponenten
MinScoreComp:Minimale notwendige Bewertung der Komponenten einer zu findenden Instanz.
Dieser Parameter verhält sich analog zu MinScore
in find_shape_model.
Setzbar sind genau ein Wert oder dieselbe Anzahl Werte
wie Modellkomponenten in ComponentModelID.
Im ersten Fall wird der Wert des Eingabeparameters für alle
Modellkomponenten verwendet.
Im zweiten Fall wird das jeweilige Element des Eingabeparameters für
die entsprechende Komponente in ComponentModelID verwendet.
SubPixelComp:Bestimmt, ob die Extraktion subpixelgenau erfolgen soll und in gegebenem Fall die maximal zulässige Objektdeformation in Pixeln.
Dieser Parameter verhält sich analog zu SubPixel
in find_shape_model.
Somit ist die maximale Objektdeformation im gleichen String als
Ganzzahl anzugeben.
Setzbar sind genau ein Wert oder dieselbe Anzahl Werte
wie Modellkomponenten in ComponentModelID.
Im ersten Fall wird der Wert des Eingabeparameters für alle
Modellkomponenten verwendet.
Im zweiten Fall wird das jeweilige Element des Eingabeparameters für
die entsprechende Komponente in ComponentModelID verwendet.
Beispiel: ['least_squares', 'max_deformation 2'].
NumLevelsComp:Bestimmt die verwendeten Pyramidenebenen für die Modellkomponenten.
Dieser Parameter verhält sich analog zu NumLevels
in find_shape_model.
Er bestimmt die Anzahl der verwendeten Pyramidenebenen,
die während der Suche benutzt werden.
Setzbar sind genau ein Wert oder dieselbe Anzahl Werte
wie Modellkomponenten in ComponentModelID.
Im ersten Fall wird der Wert des Eingabeparameters für alle
Modellkomponenten verwendet.
Im zweiten Fall wird das jeweilige Element des Eingabeparameters für
die entsprechende Komponente in ComponentModelID verwendet.
Optional kann man für diesen Parameter auch Wertepaare setzen:
Dann spezifiziert der erste Wert weiterhin die Anzahl an zu verwendende
Pyramidenebenen.
Der zweite Wert spezifiziert die unterste Pyramidenebene, bis auf welche
die Matches verfolgt werden.
Dabei kann man ein einzelnes Wertepaar für alle Komponenten angeben
oder für jede Komponente in ComponentModelID ein eigenes.
Sollen für unterschiedliche Komponenten unterschiedliche Wertepaare
berücksichtigt werden, so sind diese im selben Tupel anzugeben.
Enthält ComponentModelID genau zwei Komponenten und
NumLevelsComp zwei gesetzte Werte, so werden diese Werte als
jeweilige Anzahl zu verwendende Pyramidenebenen aufgefasst und nicht als
Wertepaar.
Beispiel: In ComponentModelID sind zwei Komponenten
enthalten, für welche unterschiedliche Pyramidenebenen verwendet werden
sollen.
Für die erste Komponente sollen 5 Pyramidenebenen verwendet werden,
mit Ebene 2 als der untersten.
Für die zweite Komponente sollen 4 Pyramidenebenen verwendet werden,
mit Ebene 1 als der untersten.
Dann ist NumLevelsComp = [5,2,4,1].
GreedinessComp:„Gierigkeit“ der Suchheuristik für die Komponenten: Wert von 0 bis 1. Dabei bedeutet 0: sicher aber langsam, 1: schnell aber Matches können „übersehen“ werden.
Dieser Parameter verhält sich analog zu Greediness
in find_shape_model.
Setzbar sind genau ein Wert oder dieselbe Anzahl Werte
wie Modellkomponenten in ComponentModelID.
Im ersten Fall wird der Wert des Eingabeparameters für alle
Modellkomponenten verwendet.
Im zweiten Fall wird das jeweilige Element des Eingabeparameters für
die entsprechende Komponente in ComponentModelID verwendet.
ModelStart und ModelEnd:Geben den ersten, respektive letzten Index und damit den Indexbereich all jener Komponentenmatches die zur selben gefundenen Instanz des Komponentenmodells gehören
Die Komponentenmatches, die zur ersten gefundenen Instanz des
Komponentenmodells gehören, werden somit durch das Intervall an
Indizes [ModelStart[0],ModelEnd[0]] beschrieben.
Dabei beziehen sich die Indizes auf die Werte der Parameter
RowComp, ColumnComp, AngleComp,
ScoreComp und ModelComp.
RowComp = [100,200,300,150,250]
|
ModelStart = [0,3]
|
ColumnComp = [200,210,220,400,425]
|
ModelEnd = [2,4]
|
AngleComp = [0,0.1,-0.2,0.1,0.2]
|
ModelComp = [0,1,2,0,2]
|
ScoreComp = [1,1,1,1,1]
|
Score = [1,1]
|
Werte mit Index 0 bis 2 gehören zu den Komponenten 0 bis 2 von Instanz 1.
Werte mit Index 3 bis 4 gehören zu den Komponenten 0 und 2 von Instanz 2.
Score:Bewertung der Instanzen des gesamten Komponentenmodells.
Score ist das gewichtete Mittel der einzelnen
Komponentenbewertungen, den Werten in ScoreComp.
Dabei erfolgt die Gewichtung proportional zur Anzahl an
Modellpunkten in der jeweiligen Komponente.
RowComp, ColumnComp und AngleComp:
Positionen (RowComp, ColumnComp) und Rotationen
(AngleComp) der Modellkomponenten aller gefundenen
Instanzen des Komponentenmodells.
Die Koordinaten RowComp und ColumnComp sind die
Koordinaten des Komponenten-Ursprungs (Referenzpunkts) im
Suchbild.
Der Komponenten-Ursprung hängt davon ab, wie das Modell erzeugt wurde:
Mit create_trained_component_model durch Trainieren:
Der Ursprung einer Komponente ist der Schwerpunkt der
Konturregion, die der Operator train_model_components in
ModelComponents zurück lieferte.
Mit create_component_model manuell:
Der Ursprung einer Komponente ist der Schwerpunkt Komponentenregion,
die über ComponentRegion dem Operator
create_component_model übergeben wurde.
Da sich die Relationen zwischen den Komponenten in
ComponentModelID auf diesen Schwerpunkt beziehen,
darf der Ursprung einer Komponente nicht mit set_shape_model_origin
verändert werden.
ScoreComp:Bewertung der gefundenen Komponenteninstanzen.
Die Bewertung ist eine Zahl zwischen 0 und 1 und ist ein ungefähres Maß dafür, welcher Anteil der Komponente im Bild zu sehen ist. Falls z.B. die Hälfte der Komponente im Bild verdeckt ist, kann die Bewertung nicht größer als 0.5 sein.
ModelComp:Index der gefundenen Komponenten.
Das Tupel enthält die Indizes der jeweiligen gefundenen Modellkomponenten
(siehe create_component_model bzw. train_model_components).
Damit können die Werte in RowComp, ColumnComp,
AngleComp und ScoreComp den verschieden
Modellkomponenten zugeordnet werden.
Siehe auch das Beispiel bei ModelStart und ModelEnd.
Im Wesentlichen wird intern für die Suche der einzelnen Komponenten
das formbasierte Matching verwendet (siehe find_shape_model).
Der Definitionsbereich des Bildes
Image gibt den Suchbereich für den Referenzpunkt, d.h. die
erlaubte Position, der Wurzelkomponente an.
Im Normalfall wird das Komponentenmodell innerhalb des
Definitionsbereiches des Eingabebildes nur an den Stellen gesucht,
an denen das Modell vollständig in das Bild passt. Das bedeutet,
dass die Komponenten nicht gefunden werden können, wenn sie aus dem
Bild herausragen, selbst wenn sie eine Bewertung größer als
MinScoreComp erreichen würden (siehe oben).
Außerdem kann es sein, dass das Komponentenmodell, wenn es in einer der
Pyramidenebenen den Bildrand berührt, ebenfalls nicht gefunden wird, auch
wenn es im ursprünglichen Bild vollständig enthalten ist. Als Daumenregel
gilt hier, dass das Modell dann nicht gefunden werden könnte, wenn
seine Distanz zum Bildrand unter
fällt.
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
MinScoreComp 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 der Suche
erhöht.
Es ist weiter zu beachten, dass in seltenen Fällen, die typischerweise nur
in künstlichen Bildern auftreten, auch dann kein Modell gefunden wird, wenn
das Modell in einer Pyramidenebene die reduzierte Bilddomäne berührt. In
diesem Fall kann es helfen, die Region der Domäne um
, z.B., mit dilation_circle
zu vergrößern.
Beim Tracken der Matches durch die Bildpyramide werden auf jeder
Ebene Matches verworfen, die wenig vielversprechend sind. Dadurch ist
es möglich, dass Matches verworfen werden, die auf der niedrigsten
Pyramidenebene einen höheren Score gehabt hätten. Beispielsweise kann das
dazu führen, dass der gefundene Match für NumMatches gleich
1 nicht mit dem Match mit dem höchsten Score übereinstimmt, der von
NumMatches gleich 0 oder > 1 zurückgegeben wird.
Falls erwartet wird, dass mehrere Objekte mit einem ähnlichen Score gefunden
werden können, aber nur das Modell mit dem höchsten Score
zurückgegeben werden soll, kann es vorteilhaft sein, NumMatches zu
erhöhen, und dann den Match mit dem höchsten Score auszuwählen.
Für einen aussagekräftigen Score und zum Vermeiden falscher Matches
wird empfohlen, das Erlauben einer Deformation mit einer Subpixel-Extraktion
mit einer der Least-Squares-Adjustment-Methoden zu kombinieren. Falls die
Subpixel-Extraktion und/oder die maximale Objektdeformation für jede
Komponente einzeln spezifiziert werden sollen, muss in
SubPixelComp die Subpixel-Extraktion genauso oft angegeben
werden, wie die Anzahl an Modellkomponenten in
ComponentModelID. Nach jedem übergebenen Wert für die
Subpixel-Extraktion kann optional ein zweiter Wert übergeben werden,
der die maximale Objektdeformation für die jeweilige Komponente
beschreibt. Wird nach dem Wert für die Subpixel-Extraktion kein Wert
für die Objektdeformation übergeben, wird die entsprechende
Komponente ohne Deformation gesucht.
Weitere Details sind in der
Dokumentation von find_shape_models zu finden.
Image (input_object) (multichannel-)image → object (byte / uint2)
Eingabebild, in dem das Komponentenmodell gefunden werden soll.
ComponentModelID (input_control) component_model → (handle)
Handle des Komponentenmodells.
RootComponent (input_control) integer(-array) → (integer)
Index der Wurzelkomponente.
Wertevorschläge: 0, 1, 2, 3, 4, 5, 6, 7, 8
AngleStartRoot (input_control) angle.rad(-array) → (real)
Kleinste auftretende Rotation der Wurzelkomponente
Defaultwert: -0.39
Wertevorschläge: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0
AngleExtentRoot (input_control) angle.rad(-array) → (real)
Ausdehnung des Winkelbereichs.
Defaultwert: 0.79
Wertevorschläge: 6.28, 3.14, 1.57, 0.79, 0.39, 0.0
Restriktion: AngleExtentRoot >= 0
MinScore (input_control) real → (real)
Minimale Bewertung der zu findenden Instanzen des Komponentenmodells.
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
NumMatches (input_control) integer → (integer)
Anzahl der zu findenden Instanzen des Komponentenmodells (oder 0 für alle Treffer).
Defaultwert: 1
Wertevorschläge: 0, 1, 2, 3, 4, 5, 10, 20
MaxOverlap (input_control) real → (real)
Maximale Überlappung der zu findenden Instanzen des Komponentenmodells.
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
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.05
Restriktion: 0 <= MaxOverlap && MaxOverlap <= 1
IfRootNotFound (input_control) string → (string)
Verhalten bei fehlender Wurzelkomponente.
Defaultwert: 'stop_search'
Werteliste: 'select_new_root', 'stop_search'
IfComponentNotFound (input_control) string → (string)
Verhalten bei fehlenden Komponenten.
Defaultwert: 'prune_branch'
Werteliste: 'prune_branch', 'search_from_best', 'search_from_upper'
PosePrediction (input_control) string → (string)
Schätzung der Lagen nicht gefundener Komponenten.
Defaultwert: 'none'
Werteliste: 'from_all', 'from_neighbors', 'none'
MinScoreComp (input_control) real(-array) → (real)
Minimale Bewertung der zu findenden Instanzen der 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 <= MinScoreComp && MinScoreComp <= 1
SubPixelComp (input_control) string(-array) → (string)
Subpixelgenauigkeit der Komponentenlagen falls ungleich 'none'.
Defaultwert: 'least_squares'
Wertevorschläge: 'none', 'interpolation', 'least_squares', 'least_squares_high', 'least_squares_very_high', 'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4', 'max_deformation 5', 'max_deformation 6'
NumLevelsComp (input_control) integer(-array) → (integer)
Anzahl der verwendeten Pyramidenebenen für die
Komponenten (und
unterste zu verwendende Pyramidenebene falls
|NumLevelsComp| = 2 oder 2n).
Defaultwert: 0
Werteliste: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
GreedinessComp (input_control) real(-array) → (real)
„Gierigkeit“ der Suchheuristik für die Komponenten.
Defaultwert: 0.9
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 <= GreedinessComp && GreedinessComp <= 1
ModelStart (output_control) integer(-array) → (integer)
Startindex jeder gefundenen Instanz des Komponentenmodells auf die Tupel, die die Komponentenmatches beschreiben.
ModelEnd (output_control) integer(-array) → (integer)
Endindex jeder gefundenen Instanz des Komponentenmodells auf die Tupel, die die Komponentenmatches beschreiben.
Score (output_control) real(-array) → (real)
Bewertung der gefunden Instanzen des Komponentenmodells.
RowComp (output_control) point.y(-array) → (real)
Zeilenkoordinate der gefundenen Komponentenmatches.
ColumnComp (output_control) point.x(-array) → (real)
Spaltenkoordinate der gefundenen Komponentenmatches.
AngleComp (output_control) angle.rad(-array) → (real)
Rotationswinkel der gefundenen Komponentenmatches.
ScoreComp (output_control) real(-array) → (real)
Bewertung der gefundenen Komponentenmatches.
ModelComp (output_control) integer(-array) → (integer)
Index der gefundenen Komponenten.
Sind die Parameterwerte korrekt, dann liefert
find_component_model den Wert 2 (H_MSG_TRUE). Das Verhalten bei
leerer Eingabe (keine Eingabebild vorhanden) lässt sich mittels
set_system('no_object_result',<Result>) festlegen.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
create_trained_component_model,
create_component_model,
read_component_model
find_shape_model,
find_shape_models,
get_shape_model_params,
get_component_model_params,
train_model_components,
set_shape_model_origin,
smallest_rectangle2
Matching