5

Jestem nowy w segmentacji obrazu, ale muszę to zrobić, aby uzyskać bazę danych dla klasyfikatora uczenia maszynowego.Trudna segmentacja obrazu: tło i obiekty są podobne

Zasadniczo mam film podobny do tego zdjęcia:

Cow with a rectangle

Moim zadaniem jest identyfikacja krów na pierwszym planie, a przynajmniej każdy krowa wcale. Zdaję sobie sprawę, że jest problem z okluzją, ale na początek chciałbym poprawnie posegmentować samotną krowę, taką jak ta z czerwonym prostokątem wokół niej (ręcznie rysowane).

W mniej trudnych problemów, takich jak to, że dyskryminuje dodając próg dla każdego piksela, że ​​albo się (0,0,0) dla obiektu lub (255,255,255) na tle:

Megasteak

Następnie oznaczam piksele tymi samymi wartościami, aby uzyskać klasy i uzyskać prostokąt dla wystarczająco dużych "obiektów typu blob".

Dla powyższego obrazu to podejście nie działa, ponieważ obiekty i tło są podobne + jest dużo cieni, oświetlenia bocznego itp., Więc nie jestem pewien, jak do niego podejść. Wszelkie sugestie są mile widziane.

+0

Czy rozważałeś użycie wykrywacza krawędzi? –

+1

trzeba zajrzeć do semantycznej segmentacji – Shai

+0

Bardzo trudny problem. Czy masz wiele zdjęć, aby stworzyć duży system szkoleniowy i korzystać z głębokiego uczenia się? –

Odpowiedz

0

Chciałbym spróbować zrobić dwa zdjęcia. Jedno zdjęcie "statycznego" tła bez krów, a następnie drugie zdjęcie z krową. Następnie możesz odjąć te dwa obrazy. Nie jestem zbyt obeznany z pythonem, ale imagemagick może łatwo odróżnić obrazy (http://www.imagemagick.org/Usage/compare/). Idealnie "różnicowany" obraz wyizoluje krowy (s). Stamtąd możesz mieć ochotę i wypróbować różne algorytmy wykrywania krawędzi itp ...

Nadzieję, że pomaga.

1

Zdaję sobie sprawę, że jest to stary wątek, ale chciałbym zaproponować podejście do problemów takich jak ten.

Możesz spróbować z segmentacją opartą na fakturze, ponieważ trawiaste tło ma inną teksturę niż krowa.

Spójrz na this link, gdzie funkcje tekstury tekstury dla obrazu są zdefiniowane zgodnie z techniką Prawa.

Oto implementacja techniki praw w Pythonie. Działa poprzez definiowanie jądra 2D używanego do wyodrębniania różnych funkcji w obrazie, na przykład krawędzi, zmarszczek, plamek i ich kombinacji. Poniższa funkcja zwraca 9 obrazów, z których można wyodrębnić cechy tekstury.

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

Nie widziałem tych od wielu lat ... –