jak sformatować dane obrazu do szkolenia / przewidywania, gdy obrazy mają różne rozmiary?

88

Próbuję trenować mój model, który klasyfikuje obrazy. Problem polega na tym, że mają różne rozmiary. jak sformatować moje obrazy / architekturę modelu?

Asif Mohammed
źródło
2
Pokaż, czego do tej pory próbowałeś, a co wydaje się nie działać.
Keith John Hutchison
16
I bam, idzie kod Inception v4. Nie zgadzam się z tym zwykłym komentarzem. Przydałoby się trochę więcej wkładu - na przykład o jakim rodzaju sieci mówimy - ale głosy przeciw nie są w ogóle uzasadnione. To jest prawdziwy problem.
Sunside
4
Pytanie brzmi, w jaki sposób ImageNet formatuje dane obrazu, aby były przydatne do szkolenia?
mskw

Odpowiedzi:

148

Nie powiedziałeś, o jakiej architekturze mówisz. Ponieważ powiedziałeś, że chcesz klasyfikować obrazy, zakładam, że jest to częściowo konwolucyjna, częściowo w pełni połączona sieć, taka jak AlexNet, GoogLeNet itp. Ogólnie odpowiedź na Twoje pytanie zależy od typu sieci, z którą pracujesz.

Jeśli na przykład twoja sieć zawiera tylko jednostki splotowe - to znaczy nie zawiera w pełni połączonych warstw - może być niezmienna w stosunku do rozmiaru obrazu wejściowego. Taka sieć mogłaby przetwarzać obrazy wejściowe i z kolei zwracać inny obraz („cały konwolucyjny”); musiałbyś upewnić się, że wynik jest zgodny z oczekiwaniami, ponieważ oczywiście musisz w jakiś sposób określić stratę.

Jeśli jednak używasz w pełni podłączonych jednostek, możesz mieć kłopoty: tutaj masz stałą liczbę wyuczonych wag, z którymi twoja sieć musi pracować, więc różne wejścia wymagałyby różnej liczby wag - a to nie jest możliwe.

Jeśli to jest twój problem, oto kilka rzeczy, które możesz zrobić:

  • Nie przejmuj się zgniataniem obrazów. Sieć może i tak nauczyć się rozumieć treść; czy skala i perspektywa w ogóle coś znaczą dla treści?
  • Wyśrodkuj obrazy do określonego rozmiaru. Jeśli obawiasz się, że tracisz dane, zrób wiele przycięć i użyj ich do rozszerzenia danych wejściowych, aby oryginalny obraz został podzielony na Nróżne obrazy o odpowiednim rozmiarze.
  • Wypełnij obrazy jednolitym kolorem do kwadratu, a następnie zmień rozmiar.
  • Zrób to kombinację.

Opcja dopełniania może wprowadzić dodatkowe źródło błędu do przewidywania sieci, ponieważ sieć może (czytać: prawdopodobnie będzie) obciążona obrazami zawierającymi takie wypełnione obramowanie. Jeśli potrzebujesz pomysłów, zajrzyj do sekcji Obrazy w dokumentacji TensorFlow. Są tam takie elementy, resize_image_with_crop_or_padktóre zabierają więcej pracy.

Jeśli chodzi o nie przejmowanie się zgniataniem, oto fragment potoku wstępnego przetwarzania słynnej sieci Inception:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Są tego całkowicie świadomi i mimo to to robią.

W zależności od tego, jak daleko chcesz lub musisz się posunąć, w rzeczywistości jest tutaj artykuł zatytułowany Spatial Pyramid Pooling in Deep Convolution Network for Visual Recognition, który obsługuje dane wejściowe o dowolnych rozmiarach, przetwarzając je w bardzo specjalny sposób.

Sunside
źródło
11
Ten temat wydaje się znacznie bardziej skomplikowany, gdy masz do czynienia z wykrywaniem obiektów i segmentacją wystąpień, ponieważ rozmiary zakotwiczenia, które są również hiperparametrami, muszą zostać dostosowane, jeśli masz zestaw danych z dużą zmiennością rozmiarów obrazu.
CMCDragonkai
Współczynniki proporcji odgrywają dość ważną rolę w sieci, która rozróżnia okręgi i elipsy.
HelloGoodbye
1
Inną ogólną obserwacją jest to, że partie niekoniecznie muszą mieć takie same wymiary; pierwsza partia może obsłużyć obrazy 4: 3, druga 16: 9 itd., o ile zadbano o gęstość warstw.
Sunside
1
@Tobitor, zawsze ustawiaj dane wejściowe sieci tak blisko rzeczywistych danych (testowych lub czasu wnioskowania), jak to tylko możliwe. Jeśli wszystkie twoje obrazy są znacznie szersze niż wysokie, powinieneś także modelować swoją sieć, aby przetwarzać swoje obrazy w ten sposób. To powiedziawszy, jeśli nie możesz powiedzieć, jak będą wyglądać Twoje dane dotyczące „użytkowania”, musisz poświęcić się podczas treningu. W takim przypadku zmiana rozmiaru obrazu z 1000x200 na 256x256 jest ogólnie w porządku (wyobraź sobie, że patrzysz na tę tablicę rejestracyjną pod kątem 60 stopni - jest teraz bardzo z grubsza kwadratowa).
Sunside
2
@Tobitor Nie ma wymogu, aby obrazy były kwadratowe, po prostu jest to najmniej zły kompromis, jeśli nie znasz rzeczywistych rozmiarów obrazu podczas wnioskowania. : ^) Jeśli chodzi o rozmiar, im mniejszy, tym lepiej, ale obrazy muszą być wystarczająco duże, aby nadal uchwycić najdrobniejsze wymagane szczegóły - ogólnie rzecz biorąc, pamiętaj, że jeśli jako ekspert od ludzi nie możesz określić, co jest w obraz, sieć też nie będzie w stanie.
Sunside
11

Spróbuj wykonać przestrzenną warstwę łączącą piramidę. Następnie umieść go po ostatniej warstwie splotu, aby warstwy FC zawsze otrzymywały wektory o stałych wymiarach jako dane wejściowe. Podczas szkolenia trenuj obrazy z całego zbioru danych przy użyciu określonego rozmiaru obrazu dla jednej epoki. Następnie w następnej epoce przełącz się na inny rozmiar obrazu i kontynuuj szkolenie.

Pranay Mukherjee
źródło
Czy mógłbyś nieco wyjaśnić, czym jest „przestrzenne łączenie piramid” w porównaniu do zwykłego łączenia?
Matthieu
proszę przeczytać Pule piramid przestrzennych w głębokich sieciach konwolucyjnych w celu rozpoznania wizualnego na blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed