Newbie Fragen: Mustererkennung mit Open CV // Lego inventarisieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mlu_wi
User
Beiträge: 4
Registriert: Samstag 8. Februar 2020, 10:10

HI zusammen,

vorab: Ich hab noch NULL Ahnung von Python, bin aber mit Interpretersprachen wie historischem Basic, Javascript, PHP, MS Macros/VB usw. gut vertraut. Der Grund warum ich mich mit Python beschäftige ist, dass ich mich mit Muster/Objekterkennung mit Open CV beschäftigen möchte und Python für mich die naheliegendste Implementierungsmöglichkeit zu sein scheint. Wen Newbies oder "blöde" Fragen nerven, der möge mich bitte ab hier ignorieren. :)

Mein Use-Case heißt: Lego-Steine mit Kamera(s) und Open CV erkennen, die Produktnummer und Farbe erkennen, die Steine inventorisieren und in einer fernen, fernen Zukunft vielleicht sogar sortieren.

Daher suche ich Hilfestellung, oder sogar Gleichgesinnte, mit denen man ggf. ein gemeinsames Projekt auf die Beine stellen kann. Wenn ich mit der Bibliothek völlig auf dem Holzweg und damit in einer Sackgasse bin, nehme ich auch dieses Feedback gerne entgegen. Allerdings bitte mit kurzer Begründung und nicht nur "Vergiss es".

Initial suche ich Quellen für Scriptschnipsel oder Beispiele, wie man mit einer, bzw. mehreren Kamera(s) Objekte aufnimmt (Video Capture bereits erfolgreich) und anhand einer Datenreferenz identifiziert. Mich interessiert das "Anlernen" der Datenreferenz und die Verknüpfung/der Vergleich um ein Objekt eindeutig zu erkennen.

Ich freue mich auf Eurer Feedback, selbst wenn es mir den Wind aus den Segeln nehmen solle. THX
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Grundsaetzlich ist OpenCV schon die richtige Wahl. Doch sei dir bewusst, dass du als jemand mit so wenig Erfahrung dir hier eine hochgradig anspruchsvolle Aufgabe gestellt hast.

Ich kann die Seite pyimagesearch.com empfehlen - ich habe mir da vor 3 Jahren Zugriff auf den Kurs gekauft, und bin damit sehr zufrieden. Allerdings ist das nicht billig, damals $750.

Wenn ich dein Problem loesen muesste, wuerde ich ein paar Dinge versuchen:

- sehr kontrollierte Umgebung fuer die Klassifikation. Also ein definiertes Kameramodell, senkrecht montiert in definiertem Abstand ueber eine Flaeche, die ebenfalls wohldefiniert ist. Bei der wuerde ich ggf. sogar zu einer matt-weissen Platte mit RGB-Leds darunter greifen, um verschiedene Beleuchtungssituationen herstellen zu koennen. Denn sonst hast du zB bei weissen Teilen Probleme. Die Kamera sollte moeglichst grosse Brennweite haben, und damit auch etwas weiter weg von der Flaeche. Grund ist, das man sonst zu den Raendern hin starke Verzerrungen hat. Die kann man sonst auch versuchen mathematisch zu korrigieren.
- die ueblichen, aus Kindertagen bekannten Steine sind noch das geringste Problem. Durch simple Vordergrund-Hintergrund-Separation und danach dem Vergleich mit hinterlegten Polygonen sollte sich das ganz gut abfruehstuecken lassen. Dafuer gibt es Algorithmen, die da eine Aehnlichkeit berechnen. Vorraussetzung ist natuerlich, dass der Stein immer mit seinen Noppen oben ist. Man kann den Suchraum der Polygone auch schon gut vorher einschraenken, weil bei einem so stabilen Setup die Flaeche des separierten Objektes ja im grunde schon proportional zur Anzahl der Noppen ist.
- fuer die ja heutzutage existenten myriaden an Sonderteilen wird es dann schwer. Gerade wenn die sich dann auch noch ggf. en detail nur ganz leicht unterscheiden. Eine Moeglichkeit die man probieren koennte: es gibt ja im Grunde fuer jeden Stein gute 3D-Modelle. Du kannst probieren, daraus eine Vielzahl von Trainingsdaten zu generieren, wenn du es schaffst, eine entsprechend realistische Darstellung deiner Klassifikations-Umgebung herzustellen. Und damit dann zB ein Transfer-Learning mit VGG-Net probieren.

Wie gesagt - das ist alles andere als trivial. Ich habe schon ein paar erfolgreiche CV-Projekte hinter mir, und wuerde da monatelang dran arbeiten.
mlu_wi
User
Beiträge: 4
Registriert: Samstag 8. Februar 2020, 10:10

Hi __deets__,

vielen Dank für Deinen Input. Wenn es einfach wäre, würde es ja keinen Spaß machen. :) Und ganz so unerfahren bin ich nur in Python/CV und Mustererkennung, mit 3D Rendering, Konstruktion von 3D Daten und VR sowie Programmmierung grundsätzlich habe ich ein paar Jahre Erfahrung auf dem Buckel. Zumindest die mathematischen Grudlagen sind also da. Und PYthon/CV sieht jetzt erst mal nicht nach Hexenwerk aus. Außerdem geht's ja in erste LInie auch drum, mal was Neues zu lernen und den Horizont zu erweitern.

Das mit der definierten Umgebung ist der Plan.
- Die Idee wäre zunächst, eine Photobox zu bauen, mit klarer definierter Ausleuchtung und einem "Rasterboden" bzw. einem statischen "Pixelstandard" zur Größenbestimmung.
- Außerdem plane ich den Einsatz von zunächst *zwei* Kameras aus definiertem Winkeln, aus dem sich mit den passenden Algorithmen bessere 3D Daten ermitteln lassen
- Als Erstes möchte ich den Farberkennungsalgorithmus definieren, der ist zur Hälfte fertig und das Einfachste an der ganzen Geschichte
- Danach würde ich eine Größenermittlung in Angriff nehmen
- Und dann fängt der knifflige Part an, wo mir (noch) zu viel Wissen fehlt, wie ich aus zwei (oder mehr) isometrischen Fotos eine Datenwolke generiere, die ich mit vorhandenen, bzw. noch aufzubereitenden Daten vergleiche.

Naja, schaun wir mal, vielleicht bin ich auch irre, aber wenn's nicht klappt lerne ich ne Menge und wenn's klappt, dann lasse ich mich feiern. In jedem Fall kann ich nur gewinnen. :D
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Farb-Geschichte ist sicherlich das geringste aller Probleme. Aber eine Punktewolke zu erzeugen aus einer Stereoaufnahme, und die dann auch noch irgendwie zu matchen - da bin ich skeptischer.

Wenn sowas dein Ziel ist, und du dank Lego ja eh mechanische Konstruktionen machen kannst, dann wuerde ich eher multiple-view-geometry nutzen, also mit einer Kamera um das Objekt herum fahren & versuchen es einzuscannen. Da gibt es ja zB auch apps, die das koenen, und damit koennte man erstmal experimentieren. Wenn die das nicht in ein halbwegs sinnvolles 3D-Modell wandeln koennen, wirst du das auch selbst nicht besser hinbekommen.

Wie man dann Punktewolken *effizient* mit einer bestehenden Datenbank abgleicht - das steht auf einem anderen Blatt. Da muesste ich erstmal Literaturecherche betreiben.
mlu_wi
User
Beiträge: 4
Registriert: Samstag 8. Februar 2020, 10:10

Wow ... pyimagesearch war schon mal ein heißer Tip. Vielen Dank dafür Ein klein bisschenTweaking mit den Thresholds und Blurring und schon erkennt er schon mal Shape und Farbe. Das wird sicher noch besser mit entsprechender Beleuchtung.

Bild

Ich überlege gerade ob es nicht m Einfachsten wäre ein Foto von links, vorne und oben zu machen und diese mit (Batch-) vorgerenderten Ansichten zu vergleichen Der Datensatz mit den drei ähnlichsten Ansichten bekommt den Zuschlag ...

Ok, jetzt muss ich erst mal das definierte Environment bauen. :D

Danke schon mal für die Klasse-Hinweise.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das wird nicht so einfach. Ich finde auch nicht, dass das da oben eine *gute* Kontour ist. Wenn du da zB mit dem HSV-Farbraum gearbeitet haettest, und damit dann nach Farbe separiert, sollte sich zB der Schatten nicht mehr in der Kontour befinden, und dafuer die linke Kante.

Und "Aehnlichkeit aus einer Richtung" ist kein einfaches Problem. Sonst wuerde man nicht so viel Aufwand treiben muessen. Um sowas zu machen, gibt es zB HOG-Klassifikatoren, oder eben heutzutage CNNs.
mlu_wi
User
Beiträge: 4
Registriert: Samstag 8. Februar 2020, 10:10

*lach* Was erwartest Du nach ner Stunde in mehr als suboptimalen Bedingungen? Natürlich ist da noch ein Kilometer Luft nach oben! :D Deine Tips helfen mir schon viel weiter.
Antworten