Wie ich OpenCV kennengelernt habe oder auf der Suche nach ColorChecker

Ich habe das zweite Jahr am CS-Zentrum in Nowosibirsk studiert. Vor meinem Eintritt hatte ich bereits einen Job in der IT - ich arbeitete als Analyst bei Yandex, wollte mich aber weiterentwickeln, etwas über die aktuellen Aufgaben hinaus herausfinden und auf Anraten eines Kollegen das CS-Center betreten. In diesem Artikel möchte ich über die Praxis sprechen, die ich während des Studiums durchlaufen habe.

Zu Beginn des ersten Semesters wurden uns mehrere Projekte angeboten. Meine Aufmerksamkeit wurde sofort auf ein Projekt namens "Methode zur Beurteilung der Farbe von Körnern anhand von Fotografien" gelenkt. Dieses Thema wurde von Spezialisten des Instituts für Zytologie und Genetik des SB RAS vorgeschlagen, aber das Projekt selbst bezog sich mehr auf die Bildanalyse und -verarbeitung als auf die Biologie. Ich habe mich dafür entschieden, weil ich mich für maschinelles Lernen und Mustererkennung interessierte und in diesen Bereichen üben wollte.

Die Essenz des Projekts


Es gibt eine SeedCounter- Anwendung, mit der die Größe von Weizenkörnern auf einem Foto gezählt und gemessen werden kann, um Agronomen von der langweiligen und routinemäßigen Arbeit des Zählens und Analysierens von Getreide zu befreien. Ich musste die Möglichkeit untersuchen, die Farbe von Körnern aus einem Foto zu bestimmen und dies in der Anwendung zu implementieren, damit die Körner in sinnvolle Klassen unterteilt werden konnten. Die erhaltenen Klassen können beispielsweise dem Gehalt an für den Menschen nützlichen Substanzen entsprechen.

Beispielfoto vor und nach der Kalibrierung:



Es scheint, dass das Aufnehmen und Verstehen der Farbe von Körnern von einem Foto eine einfache Aufgabe ist, insbesondere wenn es bereits einen Algorithmus zum Auffinden der Körner selbst gibt. Die erhaltene Farbe hängt jedoch stark von der Beleuchtung ab und die Kamera führt eine eigene Verzerrung ein. Infolgedessen hat die erhaltene Farbe wenig Beziehung zu den Eigenschaften des Korns selbst. Daher bestand das Hauptziel darin, kalibrierte Kornfarben zu erhalten, d.h. wie sie unter idealen Aufnahmebedingungen wären.

Zum Anpassen der Farben haben wir eine Referenzpalette namens ColorChecker verwendet. ColorChecker befindet sich im selben Rahmen wie die Körner, seine Farben sind im Voraus bekannt. Die Anwendung muss eine Bildkonvertierung so auswählen, dass die Farben auf dem ColorChecker den bekannten Referenzfarben so nahe wie möglich kommen.

Das heißt, die Aufgabe wurde in drei Unteraufgaben unterteilt:

  • Finden von ColorChecker im Bild,
  • Berechnung der Farbkonvertierung und Anwendung auf das Bild,
  • Trennung der Körner nach den erhaltenen Farben.

Arbeitsfortschritt


Zunächst suchten wir nach dem bereits implementierten ColorChecker-Suchalgorithmus - er wurde im kostenlosen Macduff-Paket gefunden. Ich habe es an Testbildern versucht, es stellte sich als schlecht heraus: Selbst mit einer kleinen Umdrehung von ColorChecker wurden zu wenige Quadrate der Palette erkannt. Danach begann ich nach anderen Suchmethoden zu suchen, bei denen die Ausrichtung nicht wichtig ist. Es stellte sich heraus, dass es eine Methode für eine allgemeinere Aufgabe gibt, ein beliebiges Objekt zu finden - sie basiert auf der Auswahl charakteristischer Punkte im Bild und deren Vergleich mit der Vorlage. Alle erforderlichen Komponenten befinden sich bereits in OpenCV, sodass die Implementierung nicht schwierig war.

Um die charakteristischen Punkte in OpenCV hervorzuheben, haben wir verschiedene Algorithmen verwendet: sowohl patentierte (SIFT / SURF) als auch freie (ORB / FAST). Anfangs funktionierte die Methode mit den patentierten Optionen recht gut, war jedoch sehr langsam, was bei Verwendung auf einem mobilen Gerät von entscheidender Bedeutung ist. Sie fehlten auch in der Standardversion der Bibliothek, was beim Portieren auf Android zu Schwierigkeiten führen kann. Bei Verwendung schnellerer Optionen sank die Erkennungsqualität.

Um die Qualität der Erkennung zu verbessern, habe ich mir Beispiele angesehen, bei denen der Algorithmus falsch war. In den meisten Fällen fand der Algorithmus den ungefähren Standort von ColorChecker, bestimmte jedoch nicht genau dessen Fläche. Aufgrund der ungenauen Bestimmung des Bereichs des Punktes, von dem aus die Farben zur Kalibrierung genommen wurden, fielen sie nicht in die richtigen Quadrate der Palette, bzw. die Farben wurden falsch wiederhergestellt. Um dies zu beheben, habe ich versucht, den Algorithmus erneut auszuführen, eine ungenaue Anfangsnäherung zu erhalten und die für die Kalibrierung verwendeten Punkte empirisch in Richtung der gewünschten Quadrate zu verschieben. Danach stieg die Qualität der Methode und wurde akzeptabel, selbst für anfänglich schwache, aber schnelle Algorithmen:
AlgorithmusGenauigkeitArbeitszeit
Surfen75%2,8s
83% (+ 8%)14s
SIFT88%3.4s
96% (+ 8%)15s
Lebhaft65%0,5s
93% (+ 28%)1,5s
ORB56%0,4s
79% (+ 23%)1s

Für die Kalibrierung verwende ich eine einfache Regression der kleinsten Quadrate: sowohl linear in Farbe als auch in höherer Ordnung. Dementsprechend stellte sich die Frage, wie man aus mehreren Modellen das Beste auswählt. Metriken, die auf der Nähe der Farbe zum Standard basieren, ergaben gemischte Ergebnisse: Ein nach formalen Kriterien gut kalibriertes Bild kann aus menschlicher Sicht unnatürlich aussehen. Das Bild unten zeigt ein Beispiel für einen solchen Effekt. Zur Veranschaulichung habe ich anstelle von Körnern eine Scheibe Kartoffelknolle genommen, da diese größer ist und wir Farbverzerrungen besser erkennen können. Wir haben versucht, die Metriken zu ändern, aber am Ende haben wir entschieden, dass es besser ist, das Modell für die Kalibrierung anhand seines Einflusses auf das Ergebnis der endgültigen Aufgabe - die Korntrennung - zu bewerten.

Kartoffelknollenscheibe von links nach rechts: vor der Kalibrierung, nach der Kalibrierung durch Regression der ersten, zweiten und dritten Ordnung.



Als nächstes musste ein Datensatz zusammengestellt werden, um die Qualität der ColorChecker-Suche und -Kalibrierung zu überprüfen und das Problem der Trennung der Körner nach Farbe zu lösen. Zu diesem Zweck haben wir Körnerproben verschiedener Sorten entnommen und auf verschiedenen Geräten mit unterschiedlichen Lichtquellen fotografiert: sowohl künstlich als auch bei Tageslicht. Danach ließ ich alle Bilder durch den Kalibrierungsalgorithmus laufen und sammelte die Farben der Körner, der Algorithmus zum Erkennen von Körnern wurde mir fertig gegeben. Ich musste mehr als eine Iteration dieses Prozesses durchführen: Die Erkennung von Bildern mit schlechter Qualität funktionierte nicht immer gut, ich musste zusätzliche Heuristiken auswählen, um den Müll auszusieben.

Am Ende stellte sich heraus, dass ein Datensatz gesammelt wurde, mit dessen Qualität ich zufrieden war. Ich habe das Problem der Korntrennung wie folgt formalisiert: Neun Getreidesorten wurden in drei Klassen (weiß, rot und lila) eingeteilt, wobei jedes einzelne Korn nach Farbe in eine von drei Klassen eingeteilt werden musste. Ich habe einfache Klassifizierungsmethoden wie KNN und lineare Klassifizierer ausprobiert, aber keine gute Genauigkeit erzielt. Selbst bei Betrachtung mit dem Auge war jedoch klar, dass sich die Klassen stark überschneiden und es keine offensichtliche Trennfläche zwischen ihnen gibt.

Zusammenfassung


Das Hauptergebnis der Arbeit ist der ColorChecker-Suchalgorithmus, der schnell und mit guter Qualität arbeitet, und die Farbkalibrierung durch ihn. Es kann nicht nur für Getreide nützlich sein. Zum Beispiel war es möglich, es bei der Analyse von Weizenähren anzuwenden.

Ich habe auch die Möglichkeit geprüft, Körner nach Farbe zu klassifizieren - ich konnte hier selbst mit Hilfe der Kalibrierung keine hohe Genauigkeit erzielen.

Das wichtigste Ergebnis ist jedoch, dass ich Erfahrungen bei der Lösung eines Problems gesammelt habe, für das kein vorgefertigter Algorithmus in den Regalen steht, und für mich einen spannenden Bereich der Computer Vision entdeckt habe, auf den ich hoffentlich in Zukunft stoßen werde.

Source: https://habr.com/ru/post/de437450/


All Articles