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?
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?
Odpowiedzi:
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ć:
N
różne obrazy o odpowiednim rozmiarze.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_pad
któ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.
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.