Bilderkennung (siehe Bild)



  • Hallo,

    Siehe Bild: http://imageshack.us/photo/my-images/255/bilderkennunggarnelekop.png

    Wie würdet ihr vorgehen um die Garnelen zu erkennen?
    Das trivialste das mir einfällt ist mit einem Farbfilter, der nur rot durchlässt, und dann mit einer Blob-Erkennung die Farbkleckse raussuchen. Das funktioniert aber nur ca. zu 75% zuverlässig. Liegt unter anderem daran, dass die Tiere unterschiedlich stark gefärbt sind. Schränke ich die Farbe zu sehr ein, so werden zu wenig Tiere erkannt, schränke ich sie hingegen nicht so sehr ein, so wird zuviel erkannt, z.B. auch leicht rot gefärbte Pflanzen oder Blätter.
    Das gleiche Problem beim Blob Größen Schwellwert, also die Mindestgröße eines Farbkleckses um erkannt zu werden. Ist dieser zu groß gewählt, werden nur große und markant rot gefärbte Tiere erkannt, ist dieser zu klein, so werden viele Tiere doppelt und dreifach erkannt und außerdem auch noch irgendwelche anderen Dinge wie rot gefärbte Blätter, die auch kleine rote Punkte haben.
    Außerdem ist die Perspektive auch jedes Mal anders, einmal sieht man das Tier von der Seite, einmal von vorne, einmal von hinten,...

    Wie würdet ihr hier vorgehen?
    Quellcode oder so brauch ich keinen, einfach nur die prinzipielle Vorgehensweise würd mich interessieren, wie man unterschiedlich große und unterschiedlich stark gefärbte Tiere trotzdem sicher erkennen kann.

    Vielen Dank!



  • Versuch verschiedene Merkmale zu kombinierenm (Farbe, Größe des Flecks, Form, Krümmung des Randes des Flecks, etc.)
    Wenn du Glück hast, findest du eine eindeutige Kombination.



  • ImageShack speichert offensichtlich die Bilder nicht mehr allzu lange???

    Hier nochmal das Bild: http://www.bilderuploaden.de/aihspro2/show.php/26715_bilderkennunggarneleKopie.png.html



  • Das ist 'ne harte Nuss.
    Vor allem weil die Perspektive beliebig sein kann und die Rotfärbung so unterschiedlich ausgeprägt ist.

    Ist es möglich die Kamera senkrecht über den Tieren anzubringen? Dann ist die Form wenigstens relativ gleichbleibend und es gibt rotationsinvariante Mermale (Hu-Momente) die man berechnen kann.

    Bilderkennung Frage schrieb:

    Ist dieser zu groß gewählt, werden nur große und markant rot gefärbte Tiere erkannt, ist dieser zu klein, so werden viele Tiere doppelt und dreifach erkannt und außerdem auch noch irgendwelche anderen Dinge wie rot gefärbte Blätter, die auch kleine rote Punkte haben.

    Vielleicht kannst Du die roten Punkte eines Tieres mit einem Maximumfilter auf dem Rotkanal zusammenfassen. Das betrifft dann aber auch Blätter, die wiederrum über die Form aussortiert werden müssen.

    Wie gesagt, hartes Problem.
    Was steckt dahinter? Würde mich mal interessieren.



  • Puh, schon allein von den vier da zu sehenden Bildern ist das echt übel. Keypoint mit Deskriptoren scheinen ja auch irgendwie auszuscheiden.
    Welche Trefferquote ist gefordert (falsch positiv, falsch negativ)?
    Sind das einzelne Fotos oder hast du einen Videostream?
    Kann man die Tiere anmalen? (nicht ganz ernst gemeint. Ich will nur drauf hinaus, ob man das Problem an sich vielleicht abändern kann.)
    Also, mich würd der Hintergrund auch interessieren und eine eventuelle Lösung erst recht. 😉



  • Evtl. könnte man versuchen ein Model zu fitten?



  • Der Trick ist die Umgebung zu erkennen und nicht die Garnelen 😃 🤡



  • Einfach nur schwierig. Wie viele Testbilder hast du insgesamt?



  • Also, ich mach das ganze in der Freizeit. Hab nämlich auf der Arbeit einen C# Kurs gehabt und aber seitdem leider nur wenig mit C# gemacht, deswegen wollte ich jetzt mal was mit C# machen bevor ichs wieder verlern.

    Und zwar wird mit der Webcam laufend ein Bild gemacht, und zwar vom Fressplatz der Garnelen, und ich dachte mir das Programm soll die Viecher erkennen und umrahmen sowie eine gewisse Statistik führen.

    Außerdem mach ich mir einen kleinen Webserver dazu, sodass wenn ich meine IP eingebe ich immer das Bild mitsamt der kleinen Statistik auf einer einfachen Website bekomme.

    Aber wenn das ganze so schwierig ist, werd ich versuchen, es doch irgenwie mit der Farbe hinzubekommen.

    Ich hab mir folgendes überlegt:
    Die Farbpigmente der Tiere haben nahezu bei allen Tieren die gleiche Farbe. Im Farbkreis ist vor allem der Winkel ziemlich konstant, nur der Abstand vom Mittelpunkt schwankt etwas. Nun haben Jungtiere aber weniger Pigmente, daher wirken sie insgesamt heller, auch wenn jedes einzelne Pigment für sich betrachtet bereits eine recht ähnliche Farbe aufweist wie bei einem ausgewachsenen Tier.
    Ich könnte also einen (farblich gesehen) engen Farbfilter machen, der nur die roten Kleckse durchlässt. Dann bräuchte ich irgendeinen Filter der diese Kleckse etwas verwischt, sodass nahe beieinander liegende Kleckse sich verbinden und eine größere Fläche bilden.
    Anschließend gehe ich alle Farbkleckse durch und schaue, ob diese eine gewisse Mindestgröße haben.

    Mit welchem Filter könnte ich das obig fett geschriebene am besten realisieren. Ein Medianfilter verwischt mir das ganze zu wenig stark.



  • Und zwar wird mit der Webcam laufend ein Bild gemacht, und zwar vom Fressplatz der Garnelen, und ich dachte mir das Programm soll die Viecher erkennen und umrahmen sowie eine gewisse Statistik führen.

    Sag das doch gleich. Du hast eine feste Kameraposition, kannst die Lichtverhaeltnisse kontrollieren, es ist dein Aquarium und weisst wie der Hintergrund aussieht. Das macht die ganze Sache ungemein einfacher.

    Du kannst ein Bild ohne Garnelen aufnehmen und immer mit dem aktuellen Bild vergleichen. Die Garnelen sollten sich deutlich abheben. Wie abgleichen? Farb- und Strukturveraenderungen. Solltest dir auch was ueberlegen, wie du robust gegen Plankton oder Wasserpflanzen wirst. Sollte aber nicht allzu schwer werden. Ich wuerde ganz einfach herangehen: Mit welcher Wahrscheinlichkeit gehoert ein Pixel zu einer Garnele? Um diese Frage zu beantworten, muss man sich das Farbspektrum von Garnelen gegenueber dem Rest ansehen.

    Im Farbkreis ist vor allem der Winkel ziemlich konstant, nur der Abstand vom Mittelpunkt schwankt etwas.

    Welches Farbmodell? HSV? Darueber hinaus ist verwischen eher schlecht, da du die Zusammenhangsnformation brauchst, falls mehrere Garnelen auf einem Bild neben- oder hintereinander sind.



  • Je nach dem kann es auch helfen, nach Bewegungen zu suchen. Je nach dem, wie du die Kamera aufstellst (z.B. wie im ersten Bild), sollten sich praktisch nur Garnelen bewegen.
    Das ist sehr ähnlich wie das was knivil vorgeschlagen hat. Anstatt ein Bild des Hintergrundes aufzunehmen und mit dem zu vergleichen, kannst du auch zwischen zwei Bildern die in relativ kurzem Abstand aufgenommen sind vergleichen. So hast du dann evt. weniger Probleme mit sich langsam ändernden Lichtverhältnissen.



  • @lustig, knivil: Danke für die Tipps.
    Ich werd das (wenn wieder mehr Zeit ist) wirklich mal probieren!
    Einerseits Differenzbildung der Bilder von 2 Zeitpunkten um Bewegung feststellen zu können und dann noch die "Farbe der Bewegung" anschauen, und wenn die den richtigen Farbwinkel+-10° hat (im HSV), dann wirds wohl eine Garnele sein.

    Melde mich dann wieder wenn ichs probiert hab.



  • Falls der Hintergrund sich ein klein bischen bewegt oder einfach um mehr Stabilität zu bekommen, könntest du anstatt zwei Frames zu vergleichen auch immer gegen den Durchschnitt aus ganz vielen Hintergrundbildern aus der näheren Vergangenheit vergleichen. Bei OpenCV gibts das als Funktion "accumulate".

    Bilderkennung Frage schrieb:

    Dann bräuchte ich irgendeinen Filter der diese Kleckse etwas verwischt, sodass nahe beieinander liegende Kleckse sich verbinden und eine größere Fläche bilden.

    Falls die Frage noch interessant ist. Wenn du schon nach irgendwelchen Kriterien binarisiert hast, könnte das z.B. mit Dilatation gehen.


Log in to reply