Optische Zeichenerkennung, kurz OCR, ist eine Technologie, die gedruckte oder handgeschriebene Zeichen aus Bildern oder gescannten Dokumenten erkennt und in maschinenlesbaren Text umwandelt. Diese Technologie hat in den letzten Jahrzehnten zahlreiche Bereiche revolutioniert, von der Digitalisierung alter Dokumente bis hin zur Automatisierung von Dateneingabeprozessen. Doch trotz der Fortschritte stellen komplexe und stark strukturierte Inhalte wie Programmcode besondere Herausforderungen an OCR-Systeme. Genau hier setzt Pieces mit seiner spezialisierten Lösung an und verbessert die Genauigkeit der OCR-Technologie für Entwickler, die Code aus Screenshots, Videos oder Webseiten extrahieren möchten. Unsere Reise zur Verbesserung der OCR-Genauigkeit begann mit der Erkenntnis, dass Standard-OCR-Lösungen zwar für Fließtext gut funktionieren, jedoch für Programmcode, der auf korrekte Syntax und Formatierung angewiesen ist, nicht optimal sind.
Programmcode besteht nicht nur aus Zeichen, sondern auch aus einer wichtigen Struktur, etwa Einrückungen in Python, die essenziell für die Lesbarkeit und funktionale Bedeutung sind. Um den Anforderungen gerecht zu werden, verwendeten wir Tesseract, eine der führenden Open-Source-OCR-Engines, als Basis. Tesseract agiert mit fortgeschrittenen Algorithmen, inklusive eines LSTM-Modells, das auf großen Text-Bild-Paaren trainiert wurde, und unterstützt dabei über 100 Sprachen. Allerdings ist die Standard-Version von Tesseract nicht darauf ausgelegt, unterschiedliche Programmierumgebungen und deren spezifische visuelle Eigenschaften optimal zu verarbeiten. Deshalb entwickelten wir einen umfangreichen Vorverarbeitungsprozess für Bilder, bevor der OCR-Algorithmus die Texterkennung durchführt.
Die Vorgabe war, Screenshots aus verschiedenen Umgebungen und Qualitäten zuverlässig zu unterstützen. Programmier-Interfaces variieren stark – von hellen IDE-Layouts über dunkle Terminalfenster bis hin zu Videos oder Blogposts mit oft unruhigem Hintergrund. Diese Vielfalt führte zu zahlreichen Problemen bei der Zeichenerkennung, etwa durch zu dunkle oder verrauschte Hintergründe, Farbverläufe und komprimierte Bilder mit niedriger Auflösung. Um diesen Herausforderungen zu begegnen, konzentrierten wir uns im Pre-Processing zuerst auf das Standardisieren des Bildinputs. Ein besonderes Augenmerk lag auf der Erkennung und Anpassung von dunklen Hintergründen.
Da Tesseract am besten mit hellen, binarisierten Bildern funktioniert, entwickelten wir eine Methode zur automatischen Identifikation dunkler Bildmodi, die häufig in Code-Editoren oder auch in YouTube-Tutorials auftreten. Dabei wird das Bild zunächst mit einem Median-Blur bearbeitet, um Ausreißer zu entfernen, und anschließend die durchschnittliche Helligkeit des Bildes berechnet. Liegt diese unter einem festgelegten Schwellenwert, wird das Bild invertiert, um die Farbverhältnisse so zu optimieren, dass der OCR-Prozess bessere Ergebnisse erzielt. Eine weitere Herausforderung waren Bilder mit farbigen Farbverläufen oder unruhigen Hintergründen, die den Texterkennungsprozess verfälschen können. Hier haben wir einen dilatationsbasierten Ansatz gewählt, bei dem eine Kopie des Bildes mit einem Dilatations-Kernel und medianem Filter bearbeitet und anschließend von dem Original subtrahiert wird.
Das Ergebnis ist eine Verminderung dunkler Abweichungen, während die Textbereiche erhalten bleiben. Auf diese Weise konnten wir den Kontrast zwischen Text und Hintergrund signifikant verbessern, ohne wichtige Details zu verlieren. Zusätzlich problematisch waren Screenshots mit niedriger Auflösung, welche beispielsweise durch Komprimierung bei Uploads oder dem Versenden von Bildern entstehen. Um die Lesbarkeit dieser Bilder zu erhöhen, integrierten wir eine Upsampling-Technik, die auf bicubic Interpolation basiert. Dabei wird das Bild auf eine höhere Auflösung skaliert, um dem OCR-System mehr relevante Datenpunkte zur Verfügung zu stellen und die Zeichenerkennung zu erleichtern.
Interessanterweise zeigten unsere Tests, dass hochmoderne Super-Resolution-Modelle wie SRCNN zwar einen erhöhten Rechenaufwand mit sich bringen, jedoch keinen signifikanten Vorteil gegenüber der einfacheren bicubic-Methode bieten. Aus Gründen der Effizienz und Speicheroptimierung entschieden wir uns daher für den bicubic-Ansatz in der finalen Pipeline. Neben der Bildvorverarbeitung ist die korrekte Erkennung der Code-Struktur ein weiterer zentraler Punkt. Da Programmcode stark von seiner Formatierung abhängt, ist es essenziell, dass die erkannten Textzeilen entsprechend eingerückt und dargestellt werden. Die Standardausgabe von Tesseract liefert zwar den erkannten Code, ignoriert jedoch jegliche Formatierung oder Einrückung.
Ohne diese Funktionalität ist der extrahierte Code häufig unleserlich oder bei Sprachen wie Python sogar funktionsuntüchtig. Um diesem Problem zu begegnen, werteten wir die von Tesseract gelieferten Bounding-Boxen für jede Textzeile aus. Anhand der Breite der Box und der Anzahl der Zeichen berechneten wir die durchschnittliche Breite eines einzelnen Zeichens auf der jeweiligen Zeile. Mithilfe der Positionsinformationen der Boxen konnten wir anschließend die Einrückung der Zeilen relativ zueinander bestimmen. Durch eine einfache Heuristik wurden die Einrückungen dann auf gerade Zahlen von Leerzeichen gerundet, um eine konsistente und gut lesbare Formatierung zu gewährleisten.
Für die Evaluation der gesamten OCR-Pipeline mussten wir eine präzise und objektiv messbare Methode finden, um die Veränderungen durch unsere Optimierungen zu bewerten. Als Grundlage nutzten wir verschiedene Datensätze aus eigens erstellten sowie generierten Bild-Text-Paaren. Die erkannten Texte wurden mit den korrekten, von Menschen erstellten Referenztexten verglichen und die Unterschiede mittels Levenshtein-Distanz quantifiziert. Dieser Ansatz erlaubt es, die Anzahl der nötigen Bearbeitungsschritte für die Korrektur des erkannten Textes zu messen und dient somit als direkter Indikator für die OCR-Genauigkeit. Jede Modifikation der Pipeline wurde als Forschungshypothese behandelt und über zahlreiche Experimente validiert.
So untersuchten wir etwa die Auswirkungen unterschiedlicher Upsampling-Methoden mit dem Ergebnis, dass Bicubic Upsampling das optimale Verhältnis zwischen Performanz und Genauigkeit bietet. Insgesamt hat sich herausgestellt, dass die Kombination aus gezielter Bildvorverarbeitung, strukturierter Formatierung und ausführlicher Evaluation den entscheidenden Unterschied macht, um OCR-Systeme in komplexen Anwendungsbereichen wie der Code-Extraktion nutzbar zu machen. Das Ergebnis ist eine hochgenaue OCR-Lösung, die Entwicklern ermöglicht, direkt aus Screenshots oder Videomaterial funktionierenden und korrekt formatierten Programmcode zu gewinnen. Diese Leistungssteigerung eröffnet zahlreiche Möglichkeiten: von leichterem Teilen und Archivieren von Code-Schnipseln über verbesserte Dokumentation bis hin zu neuen Tools im Bereich der automatisierten Codegenerierung und -analyse. Wir sind stolz darauf, mit unserer eigens optimierten OCR-Engine einen der ersten spezialisierten Ansätze im Bereich Codetexterkennung zu realisieren und arbeiten kontinuierlich an weiteren Verbesserungen, um noch schneller und präziser zu werden.