5

Ich bin neu in der Bildsegmentierung, aber ich muss es tun, um eine Datenbank für den maschinellen Lernklassifikator zu bekommen.Schwierige Bildsegmentierung: Hintergrund und Objekte sind ähnlich

Im Grunde habe ich ein Video ähnlich zu diesem Bild:

Cow with a rectangle

Meine Aufgabe ist es Kühe im Vordergrund, oder zumindest jede Kuh überhaupt zu identifizieren. Ich erkenne, dass es ein Okklusionsproblem gibt, aber für eine Vorspeise möchte ich eine einsame Kuh richtig segmentieren, wie die mit dem roten Rechteck um sie herum (von Hand gezeichnet).

In weniger anspruchsvollen Probleme, wie diese, I diskriminieren, indem ein Schwellenwert für jedes Pixel das Hinzufügen, dass entweder zu (0,0,0) für das Objekt (255,255,255) für den Hintergrund:

Megasteak

Dann beschrifte ich die Pixel mit den gleichen Werten, um Klassen zu erhalten und das Rechteck für genügend große 'Blobs' zu erhalten.

Für das Bild oben wird dieser Ansatz nicht funktionieren, da die Objekte und der Hintergrund ähnlich sind + es gibt viele Schatten, Seitenbeleuchtung etc, so dass ich nicht sicher bin, wie ich es angehen soll. Irgendwelche Vorschläge sind willkommen.

+0

Haben Sie in Betracht gezogen, einen Kantendetektor zu verwenden? –

+1

Sie müssen in semantische Segmentierung – Shai

+0

suchen Sehr schwieriges Problem. Haben Sie viele Bilder für ein großes Trainingssystem und nutzen Sie Deep Learning? –

Antwort

0

Ich würde versuchen, zwei Fotos zu machen. Ein Foto von einem "statischen" Hintergrund ohne Kühe, dann ein zweites Foto mit einer Kuh. Dann können Sie diese zwei Bilder subtrahieren. Ich bin nicht vertraut mit Python aber Imagemagick kann Bilder leicht unterscheiden (http://www.imagemagick.org/Usage/compare/). Idealerweise wird das differenzierte Bild die Kuh (en) isolieren. Von dort können Sie Lust bekommen und verschiedene Kantenerkennungsalgorithmen usw. ausprobieren ...

Hoffe, dass hilft.

1

Ich weiß, das ist ein alter Thread, aber ich würde gerne einen Ansatz für Probleme wie diesen vorschlagen.

Sie können es mit einer texturbasierten Segmentierung versuchen, da der grasige Hintergrund eine andere Textur hat als die Kuh.

Werfen Sie einen Blick auf this link, wo die Textur Energie-Features für ein Bild nach der Technik der Gesetze definiert sind.

Hier ist eine Implementierung der Gesetze Technik in Python. Dazu werden 2D-Kernel definiert, die zum Extrahieren verschiedener Features in einem Bild verwendet werden, z. B. Kanten, Wellen, Blobs und Kombinationen daraus. Die folgende Funktion gibt 9 Bilder zurück, aus denen Texturmerkmale extrahiert werden können.

def laws(array): 

    # Define the 1D kernels 
    L5 = np.array([1,4,6,4,1]) # level 
    E5 = np.array([-1,-2,0,2,1]) # edge 
    S5 = np.array([-1,0,2,0,-1]) # spot 
    R5 = np.array([1,-4,6,-4,1]) # ripples 

    # Generate 2D kernels 
    L5E5 = np.outer(L5,E5) 
    E5L5 = np.outer(E5,L5) 

    L5R5 = np.outer(L5,R5) 
    R5L5 = np.outer(R5,L5) 

    E5S5 = np.outer(E5,S5) 
    S5E5 = np.outer(S5,E5) 

    S5S5 = np.outer(S5,S5) 

    R5R5 = np.outer(R5,R5) 

    L5S5 = np.outer(L5,S5) 
    S5L5 = np.outer(S5,L5) 

    E5E5 = np.outer(E5,E5) 

    E5R5 = np.outer(E5,R5) 
    R5E5 = np.outer(R5,E5) 

    S5R5 = np.outer(S5,R5) 
    R5S5 = np.outer(R5,S5) 


    return (0.5*(correlate(array, L5E5) + correlate(array, E5L5)), \ 
      0.5*(correlate(array, L5R5) + correlate(array, R5L5)), \ 
      0.5*(correlate(array, E5S5) + correlate(array, S5E5)), \ 
      correlate(array, S5S5), \ 
      correlate(array, R5R5), \ 
      0.5*(correlate(array, L5S5) + correlate(array, S5L5)), \ 
      correlate(array, E5E5), \ 
      0.5*(correlate(array, E5R5) + correlate(array, R5E5)), \ 
      0.5*(correlate(array, R5S5) + correlate(array, S5R5))) 
+0

Habe diese in vielen Jahren nicht gesehen ... –