Wyodrębnianie funkcji obrazów w języku Python

18

W mojej klasie muszę utworzyć aplikację przy użyciu dwóch klasyfikatorów, aby zdecydować, czy obiekt na obrazie jest przykładem phylum porifera (seasponge) czy jakiegoś innego obiektu.

Jestem jednak całkowicie zagubiony, jeśli chodzi o techniki ekstrakcji funkcji w pythonie. Mój doradca przekonał mnie do korzystania z obrazów, które nie były omówione w klasie.

Czy ktoś może skierować mnie w stronę sensownej dokumentacji lub lektury lub zasugerować metody do rozważenia?

Jeremy Barnes
źródło
Wspomniałeś o doradcy, więc zakładam, że jest to część zadania w Graduate School? Czy masz dostęp do jakiegokolwiek komercyjnego oprogramowania, czy spodziewasz się, że zrobisz to tylko z pakietami Python i open-source? Czego obecnie uczysz się na zajęciach i jak nazywa się ta klasa? Ponadto, czy istnieje wymóg wydajności pod względem czasu, jaki powinien zająć udzielenie odpowiedzi?
MLowry
Oczekuję, że będę używał tylko Pythona i pakietów open source. Odradzam nawet pisanie własnego kodu źródłowego. To jest kurs magisterski. Ta klasa to wstępny kurs Data Science. Ostatnią rzeczą, którą omówiliśmy, jest wybór funkcji, chociaż prawie cała dyskusja dotyczy danych tekstowych. Nie ma żadnych wymagań dotyczących wydajności poza dokładnością ~ 70%
Jeremy Barnes

Odpowiedzi:

11

Na obrazach niektóre często stosowane techniki ekstrakcji obiektów to binaryzacja i rozmycie

Binarizacja: konwertuje tablicę obrazu na 1 i 0. Odbywa się to podczas konwertowania obrazu na obraz 2D. Można również zastosować skalowanie szarości. Daje macierz numeryczną obrazu. Skala szarości zajmuje znacznie mniej miejsca, gdy jest przechowywana na dysku.

Oto jak to zrobić w Pythonie:

from PIL import Image

%matplotlib inline  

#Import an image
image = Image.open("xyz.jpg")

image

Przykładowy obraz:

wprowadź opis zdjęcia tutaj

Teraz przekonwertuj na skalę szarości:

im = image.convert('L')

im

zwróci ci ten obraz:

wprowadź opis zdjęcia tutaj

Macierz można zobaczyć, uruchamiając to:

array(im)

Tablica wyglądałaby mniej więcej tak:

array([[213, 213, 213, ..., 176, 176, 176],
       [213, 213, 213, ..., 176, 176, 176],
       [213, 213, 213, ..., 175, 175, 175],
       ..., 
       [173, 173, 173, ..., 204, 204, 204],
       [173, 173, 173, ..., 205, 205, 204],
       [173, 173, 173, ..., 205, 205, 205]], dtype=uint8)

Teraz użyj wykresu histogramu i / lub wykresu konturowego, aby zobaczyć funkcje obrazu:

from pylab import *

# create a new figure
figure()
gray()
# show contours with origin upper left corner
contour(im, origin='image')
axis('equal')
axis('off')


figure()


hist(im_array.flatten(), 128)

show()

To zwróci ci wykres, który wygląda mniej więcej tak:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Rozmycie: Algorytm rozmycia bierze średnią ważoną sąsiednich pikseli, aby uwzględnić kolor otoczenia w każdym pikselu. Poprawia kontury i pomaga lepiej zrozumieć funkcje i ich znaczenie.

I tak to robisz w Pythonie:

from PIL import *


figure()
p = image.convert("L").filter(ImageFilter.GaussianBlur(radius = 2))
p.show()

A zamazany obraz to:

wprowadź opis zdjęcia tutaj

Oto kilka sposobów inżynierii obiektów. W przypadku zaawansowanych metod musisz zrozumieć podstawy wizji komputerowej i sieci neuronowych, a także różne typy filtrów oraz ich znaczenie i matematykę.

Dawny33
źródło
1
Dziękuję bardzo. Napisałem o tym w kilku miejscach, a twoje było zdecydowanie najbardziej pouczającą odpowiedzią. Uświadomiłem sobie, że nie rozumiem, w jaki sposób ekstrakcja cech obrazów działa koncepcyjnie.
Jeremy Barnes
Cieszę się, że moja odpowiedź pomogła ci :)
Dawny33
8

Ten świetny samouczek obejmuje podstawy neuronowej sieci splotowej, która obecnie osiąga najnowocześniejsze wyniki w większości zadań związanych z widzeniem:

http://deeplearning.net/tutorial/lenet.html

Istnieje wiele opcji dla CNN w pythonie, w tym Theano i biblioteki zbudowane na nim (uważam, że keras jest łatwy w użyciu).

Jeśli wolisz unikać głębokiego uczenia się, możesz zajrzeć do OpenCV, który może nauczyć się wielu innych rodzajów funkcji, kaskad Haar i funkcji SIFT.

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_table_of_contents_feature2d/py_table_of_contents_feature2d.html

jamesmf
źródło
1

Jak powiedzieli Jeremy Barnes i Jamesmf, do rozwiązania problemu można użyć dowolnego algorytmu uczenia maszynowego. Są potężne i mogą automatycznie zidentyfikować funkcje. Musisz tylko podać algorytmowi prawidłowe dane treningowe. Ponieważ konieczne jest działanie na obrazach, sieci neuronowe splotowe będą dla Ciebie lepszą opcją.

To dobry poradnik do nauki o sieci neuronowej splotu. Możesz także pobrać kod i zmienić go zgodnie z definicją problemu. Ale musisz nauczyć się języka Python i biblioteki theano do przetwarzania, a do tego dostaniesz dobre tutoriale

http://deeplearning.net/tutorial/lenet.html

Arun Sooraj
źródło