Informationsextraktion aus technischen Zeichnungen


Dr. Frank Weilandt


Technical drawing

Mussten Sie schon einmal Daten über ein Objekt aus zwei verschiedenen Quellen kombinieren, zum Beispiel Bilder und Text? Bei unserer Arbeit bei dida stehen wir oft vor solchen Herausforderungen. Hier stellen wir ein Beispiel aus dem Bereich technischer Zeichnungen vor. Solche Zeichnungen werden in vielen Bereichen von Fachleuten verwendet, um Informationen auszutauschen. Sie bestehen aus Zeichnungen, die ganz bestimmten Richtlinien folgen, damit jeder Fachmann verstehen kann, was darauf abgebildet ist. Normalerweise liegen technische Zeichnungen in Formaten vor, die eine Indizierung ermöglichen, wie z. B. svg, html, dwg, dwf, usw., aber viele, vor allem ältere, existieren nur im Bildformat (jpeg, png, bmp, usw.), z. B. aus Buchscans. Auf diese Art von Zeichnungen kann man nur schwer automatisch zugreifen, was ihre Verwendung schwierig und zeitaufwändig macht. Hier könnten automatische Erkennungstools eingesetzt werden, um die Suche zu erleichtern.

In diesem Blogpost zeigen wir, wie sowohl traditionelle als auch Deep-Learning-basierte Computer-Vision-Techniken für die Informationsextraktion aus Explosionszeichnungen eingesetzt werden können. Wir gehen davon aus, dass eine solche Zeichnung zusammen mit einigen textuellen Informationen für jedes Objekt auf der Zeichnung gegeben ist. Die Objekte können durch Nummern, die mit ihnen verbunden sind, identifiziert werden. Hier ist ein recht einfaches Beispiel für eine solche Zeichnung: Eine elektrische Bohrmaschine.

 Exploded-view image of an electrical drill machine.

Auf jeder Zeichnung gibt es drei Hauptkomponenten: Die Zahlen, die Objekte und die Hilfslinien. Die Hilfslinien werden verwendet, um die Objekte mit den Zahlen zu verbinden.

Die vorliegende Aufgabe besteht darin, alle Objekte einer bestimmten Art / Klasse über eine große Anzahl von Zeichnungen zu finden, z. B. die Buchse mit der Nummer 653 im obigen Bild kommt in mehreren Zeichnungen und sogar in Zeichnungen anderer Hersteller vor. Dies ist eine typische Klassifizierungsaufgabe, allerdings mit einer Einschränkung: Da es zu jedem Objekt zusätzliche Informationen gibt, die über die Nummern zugänglich sind, müssen wir zunächst jede Nummer auf dem Bild dem entsprechenden Objekt zuordnen. Im Folgenden beschreiben wir, wie diese Zusatzaufgabe mit Hilfe traditioneller Computer-Vision-Techniken gelöst werden kann.


Klassische Computer-Vision-Techniken


Wir verwenden hauptsächlich traditionelle Computer-Vision-Techniken, um diese Komponenten (d.h. die einzelnen Objekte) und ihre Beziehungen zu finden. Man könnte es zwar auch mit ziemlich komplexen Machine-Learning-Architekturen probieren, aber wir haben die Erfahrung gemacht, dass Heuristiken bereits funktionieren. Auf diese Weise brauchen wir auch keine manuell erstellten Bounding Boxes, mit denen wir ein Modell trainieren können. Unser unten vorgestellter Algorithmus geht durch alle Zeichnungen, markiert die Begrenzungen jedes Objekts und findet die zu diesem Objekt gehörende Nummer.

Bei der Betrachtung technischer Zeichnungen sind einige der zu erwartenden Herausforderungen:

  1. Bildüberfüllung - technische Zeichnungen haben in der Regel mehrere, möglicherweise überlappende, Objekte.

  2. Objektvariabilität - die auf dem Bild vorhandenen Objekte haben eine hohe Variabilität in Größe und Form.

  3. Geringe Detailgenauigkeit - die Zeichnungen bestehen meist aus Konturen ohne Textur, Farbe usw.

  4. Rauschen/Artefakte - einige Linien gehören zu keinem Objekt, wie z. B. Hilfslinien.

Angesichts dieser Herausforderung unterteilen wir unseren Ansatz in drei Teile.

1. Zahlenerkennung

Auf technischen Zeichnungen erscheinen Zahlen normalerweise auf sehr vorhersehbare Weise: gleiche Schriftart, ähnliche Größe und Ausrichtung. Man kann also Template-Matching verwenden - zumindest innerhalb von Zeichnungen derselben Firma. Die Verwendung eines OCR-Tools wie Tesseract ist ebenfalls möglich und verallgemeinert besser über Zeichnungen von verschiedenen Firmen.

2. Bildvorverarbeitung

Dieser Schritt zielt darauf ab, das Bild so zu transformieren, dass mögliche Artefakte entfernt oder reduziert werden, wodurch die Leistung der endgültigen Ziffern-Objekt-Zuordnung verbessert wird. Kurz gesagt, wir entfernen zunächst die Zahlen aus dem Bild (vgl. Schritt 1). Als nächstes führen wir eine Bildbinarisierung durch, gefolgt von einer Transformation von Konturen in "feste" Objekte. Wir schließen "Lücken" in den Konturen durch morphologische Operationen wie Dilatation. Zusätzlich markieren wir die inneren Pixel jedes Objekts als Vordergrund. Wir beenden die Vorverarbeitung, indem wir die Hilfslinien entfernen. So erhalten wir zusammenhängende Komponenten, wie im Bild unten gezeigt.

 Connected components of the drill machine.

3. Nummer-Objekt-Zuordnung

Der stärkste Hinweis für die Zuordnung von Nummern zu Objekten ist bei weitem die Entfernung. Indem wir uns die Nachbarschaft jeder Nummer ansehen, finden wir das nächstgelegene Objekt, das als Übereinstimmung betrachtet werden kann. Wenn wir den Vordergrund vorher nicht korrekt in zusammenhängende Komponenten aufgeteilt haben, dann könnten zwei Nummern nahe an derselben Komponente liegen. Dann nehmen wir jede der beiden Nummern, folgen ihren Hilfslinien und teilen die Komponente so auf, dass jede Nummer ihrem eigenen Teil der verbundenen Komponente zugewiesen wird.

Nach diesen Schritten können wir für jede Zahl auf dem Bild sagen, wo sich das entsprechende Objekt befindet. Einfach für den Menschen, aber eine Herausforderung für den Computer. Es ist nun an der Zeit, diese Informationen zu verwenden, um das Bild jedes Objekts in einen Klassifikator einzugeben. Wir haben einen Satz von Bildern, bei denen wir für jede Nummer wissen, welcher Klasse dieses Objekt angehört. Jetzt ist es Zeit für maschinelles Lernen.


Deep Learning zur Objektklassifizierung


Wir nehmen die verbundenen Komponenten aus der Zeichnung und zeichnen eine Bounding Box um jede von ihnen, wodurch wir mehrere neue kleinere Bilder erhalten, die wir klassifizieren wollen - man kann auch die Textinformationen einbeziehen und einen Textklassifikator und den Bildklassifikator abstimmen lassen, aber Textklassifikatoren liegen außerhalb des Rahmens dieses Blogbeitrags.

Ansatz

Wir unterteilen die Klassifizierung jedes Bildes in die folgenden zwei Schritte, was uns die Freiheit gibt, verschiedene Ansätze für jeden Schritt auszuprobieren:

- Der Bildkodierer: Nimmt das Bild des Objekts und wandelt es in einen viel niedriger-dimensionalen Vektor um (sagen wir 512 Zahlen), der die aussagekräftigen Informationen für die Klassifizierung enthält.

- der Vektor-Klassifikator: Ermittelt den Typ des Objekts aus dem vom Bildkodierer erzeugten Vektor.

Der Kodierer ist eine Funktion $$E$$, der als Eingabe das extrahierten Bildes Im empfängt. Die Ausgabe von $$E$$ wird dann an unseren Vektor-Klassifikator $$C$$ geschickt. Die Zusammensetzung dieser beiden Funktionen nennen wir das Modell $$M$$, d.h. $$M = C \circ E$$. Somit ist $$M(Im) = C(E(Im))$$ die Klasse, die der Algorithmus ausgibt. Natürlich haben diese beiden Funktionen Parameter/Gewichte, und diese können mit Hilfe von Trainingsdaten gefunden werden. Es überrascht nicht, dass wir neuronale Netze verwenden, die für die Bildklassifizierung sehr nützlich sind.

Der Bildkodierer

Für alle Ansätze wählen wir unser Modell $$M = C \circ E$$ als ResNet18, eine Funktion mit Millionen von Parametern, wobei $$E$$ ein Convolutional Neural Network (CNN) und $$C$$ eine voll verbundene Schicht ist. Zunächst laden wir auch Parameterwerte, die an der ImageNet-Klassifikationsaufgabe vortrainiert wurden. Aber wir müssen $$C$$ wegwerfen und durch einen für uns passenden ersetzen, da $$C$$ ursprünglich für eine andere Klassifikationsaufgabe (Tiere, Objekte, die man auf der Straße sieht, etc.) verwendet wurde. Es ist einfach, $$M$$ mit PyTorch, TensorFlow oder einer ähnlichen Deep-Learning-Bibliothek zu laden.

Klassifikator

Man kann einen der beiden folgenden Ansätze verwenden:

- Transfer-Lernen: Man verwendet den geladenen Kodierer $$E$$ und trainiert die Parameter des Klassifikators $$C$$ anhand von Trainingsdaten für unsere spezielle Aufgabe.

- Metrik-Lernen: Man trainiert eine Distanzfunktion, die sicherstellt, dass $$E(Im_1)$$ und $$E(Im_2)$$ dann und nur dann nahe / ähnlich sind, wenn die Objekte auf den Bildern $$Im_1$$ und $$Im_2$$ vom gleichen Typ sind.

Direkte Klassifikation mittels Transfer-Lernen

Hier ersetzen wir einfach die Komponente $$C$$ des ursprünglichen ResNet18-Modells durch eine neue lineare Funktion, deren Ausgangsdimension die Anzahl der Objektklassen ist. Dann wird der zugewiesene Typ anhand der Überprüfung entschieden, welcher der Werte im Ausgabevektor der höchste ist. Wir haben zwei Möglichkeiten:

- Wir trainieren einfach die Parameter von $$C$$ - unter Verwendung der vortrainierten Gewichte in $$E$$. Dieser Ansatz ist sinnvoll, auch wenn der Encoder $$E$$ auf Fotos trainiert wurde.

- Wir trainieren die Parameter $$C$$ und $$E$$. Dies ist nur möglich, wenn die Anzahl der Trainingsbeispiele pro Objektklasse hoch ist.

Um mehr Trainingsbilder zu erzeugen, wenden wir auch Bild-Augmentierung an. Dies ist eine Standardtechnik, um neue Bilder aus alten zu erzeugen: Wir verwenden Scheren (das Objekt könnte aus einem etwas anderen Winkel betrachtet werden), Beschneiden (die Bounding Box ist ohnehin nicht immer perfekt), unterschiedliche Helligkeit/Kontrast und horizontales Spiegeln.

Metrik-Lernen

Dieser Ansatz ist nützlich, wenn die Anzahl der Trainingsbeispiele pro Objekttyp sehr gering ist (z. B. wenn wir viele Objektklassen haben, aber nur drei oder fünf Bilder für jeden Objekttyp). Für jedes Bildpaar $$Im_1, Im_2$$ wenden wir den Kodierer $$E$$ auf beide an und lernen dann eine Distanzfunktion $$d$$, die $$d(E(Im_1), E(Im_2)) = 0$$ ergeben sollte, wenn beide Bilder zur gleichen Klasse gehören und $$d(E(Im_1), E(Im_2)) = 1$$, andernfalls. Für die Klassifikation eines Bildes $$Im$$ suchen wir das nächstgelegene Trainingsbild $$Im_{Train}$$ (d. h. $$d(E(Im), E(Im_{Train}))$$ sollte minimal sein) und ordnen $$Im_{Train}$$ den Typ von $$Im$$ zu.

Die Parameter der Distanzfunktion $$d$$ werden anhand der Trainingsdaten gelernt. Auf diese Weise lernt die Distanzfunktion zu extrahieren, welche Merkmale für die Unterscheidung von Objektklassen signifikant sind.

Metrik-Lernen hat Vorteile beim Hinzufügen neuer Objektklassen: Erstens ist eine beträchtliche Anzahl von Labels nur für eine Teilmenge der Objektklassen notwendig. Im Idealfall generalisiert ein Modell, das auf einer Teilmenge von Klassen trainiert wurde, gut auf semantisch ähnliche Klassen. Dadurch kann die Anzahl der Klassen erhöht werden, ohne das Modell neu zu trainieren. Zweitens kann man One-Shot-Learning durchführen, d. h. eine Klassifizierung auf der Basis eines einzigen Referenzbeispiels.


Zusammenfassung


Wir haben eine Pipeline für das Problem der Interpretation von technischen Zeichnungen skizziert. Sie zeigt, dass unsere Projekte in der Regel nicht durch einfaches Training eines Katzen-vs-Hunde-Klassifikators aus dem Lehrbuch abgeschlossen werden können. Wenn die Zahlen in den Zeichnungen keine Rolle spielen, kann man eine eher standardmäßige Objekterkennung wie YOLO versuchen. Das Problem, das wir hier vorgestellt haben, ist anders, weil wir weniger Bilder verwenden, die aber recht standardisiert und mit Nummern versehen sind, die wiederum als Schlüssel zu weiteren Informationen dienen.

Es gibt immer noch viele technische Zeichnungen, die automatisch verarbeitet werden müssen. Natürlich wäre es bequemer, einfach strukturierte CAD-Daten anstelle von Bildern zu haben - aber das würde auch eine Art Vereinbarung über digitale Standards zwischen den Herstellerfirmen erfordern.