Jak przygotować / powiększyć obrazy dla sieci neuronowej?

41

Chciałbym użyć sieci neuronowej do klasyfikacji obrazów. Zacznę od wstępnie przeszkolonego CaffeNet i wyszkolę go do mojej aplikacji.

Jak przygotować obrazy wejściowe?

W tym przypadku wszystkie obrazy są tego samego obiektu, ale z różnymi odmianami (pomyśl: kontrola jakości). Są w nieco różnych skalach / rozdzielczościach / odległościach / warunkach oświetleniowych (w wielu przypadkach nie znam skali). Ponadto na każdym obrazie znajduje się obszar (znany) wokół interesującego obiektu, który powinien zostać zignorowany przez sieć.

Mógłbym (na przykład) przyciąć środek każdego obrazu, co gwarantuje, że zawiera część interesującego obiektu i żaden z ignorowanego obszaru; ale wydaje się, że to wyrzuciłoby informacje, a także wyniki nie byłyby tak naprawdę w tej samej skali (może 1,5-krotna odmiana).

Powiększanie zestawu danych

Słyszałem o tworzeniu większej ilości danych treningowych przez losowe przycinanie / odbicie lustrzane / itp. Czy istnieje standardowa metoda? Jakieś wyniki na temat tego, jak wiele poprawia dokładność klasyfikatora?

Alex I.
źródło

Odpowiedzi:

35

Idea sieci neuronowych polega na tym, że nie wymagają one wstępnego przetwarzania, ponieważ ciężkie podnoszenie odbywa się za pomocą algorytmu odpowiedzialnego za uczenie się funkcji.

Zwycięzcy konkursu Data Science Bowl 2015 mają świetne uwagi dotyczące swojego podejścia, więc większość treści tej odpowiedzi pochodzi z: Klasyfikacji planktonu z głębokimi sieciami neuronowymi . Sugeruję przeczytanie go, zwłaszcza części o przetwarzaniu wstępnym i rozszerzaniu danych .

- Zmień rozmiar zdjęć

Jeśli chodzi o różne rozmiary, rozdzielczości lub odległości, możesz wykonać następujące czynności. Możesz po prostu przeskalować największy bok każdego obrazu do stałej długości.

Inną opcją jest użycie openCV lub scipy. a to zmieni rozmiar obrazu, aby miał 100 cols (szerokość) i 50 wierszy (wysokość):

resized_image = cv2.resize(image, (100, 50)) 

Jeszcze inną opcją jest użycie modułu scipy przy użyciu:

small = scipy.misc.imresize(image, 0.5)

- Zwiększanie danych

Rozszerzanie danych zawsze poprawia wydajność, chociaż ilość zależy od zestawu danych. Jeśli chcesz rozszerzyć dane, aby sztucznie zwiększyć rozmiar zbioru danych, możesz wykonać następujące czynności, jeśli sprawa ma zastosowanie (nie dotyczyłoby to na przykład zdjęć domów lub osób, w których obrócenie ich o 180 stopni spowoduje utratę wszystkich informacji ale nie, jeśli odwrócisz je jak lustro):

  • obrót: losowy z kątem od 0 ° do 360 ° (jednolity)
  • tłumaczenie: losowe z przesunięciem między -10 a 10 pikseli (jednolite)
  • przeskalowanie: losowe ze współczynnikiem skali od 1 / 1,6 do 1,6 (log-uniform)
  • przerzucanie: tak lub nie (bernoulli)
  • ścinanie: losowe z kątem od -20 ° do 20 ° (jednolite)
  • rozciąganie: losowe ze współczynnikiem rozciągania od 1 / 1,3 do 1,3 (log-uniform)

Wyniki można zobaczyć na obrazach misy Data Science.

Wstępnie przetworzone obrazy

Wstępnie przetworzone obrazy

rozszerzone wersje tych samych zdjęć

wprowadź opis zdjęcia tutaj

-Inne techniki

Zajmą się one innymi właściwościami obrazu, takimi jak oświetlenie, i są już powiązane z głównym algorytmem, bardziej jak prosty etap wstępnego przetwarzania. Sprawdź pełną listę na: Samouczku UFLDL

wacax
źródło
1
Warto również przyjrzeć się kolorowi w celu zwiększenia danych.
David C. Bishop
Czy możesz również udostępnić kod rotacji i strzyżenia itp? @wacax
Arsenal Fanatic
Możecie używać pakietu takiego jak keras do powiększania danych.
Ricardo Cruz,
2
Dla każdego, kto ma problemy z importowaniem modułu scipy.misc. Trzeba import scipy.misc. stackoverflow.com/questions/13581593/...
eleijonmarck
Jeśli chodzi o zmianę rozmiaru obrazu, jaką metodę stosuje się zwykle w najnowszych metodach, np. W ImageNet?
HelloGoodbye,
2

Chociaż odpowiedź wacax jest kompletna i naprawdę wyjaśniająca, chciałbym dodać kilka rzeczy na wypadek, gdyby ktoś natknął się na tę odpowiedź.

Przede wszystkim, w większości scipy.misczwiązanych z funkcji graficznych ( imread, imsave, imresizeERC) stały się przestarzałe na rzecz obu ImageIO lub skimage .

Po drugie, zdecydowanie zalecałbym imgaug biblioteki python do każdego zadania rozszerzania. Jest naprawdę łatwy w użyciu i ma praktycznie wszystkie techniki powiększania, których możesz chcieć użyć.

nieznany z nazwiska
źródło