6

Trenuję splotową sieć neuronową, ale posiadam stosunkowo mały zbiór danych. Wdrażam więc techniki, by ją rozszerzyć. Teraz po raz pierwszy pracuję nad głównym problemem wizji komputerowej, więc jestem stosunkowo nowy. W przypadku augmentacji, czytam wiele technik, a jednym z nich, o którym wspomniano w wielu artykułach, jest przypadkowe kadrowanie. Teraz próbuję go zaimplementować, dużo przeszukałem tę technikę, ale nie mogłem znaleźć odpowiedniego wyjaśnienia. Miałem więc kilka pytań:Losowe przycinanie danych augmentacja splotowe sieci neuronowe

W jaki sposób przypadkowe przycinanie pomaga w powiększaniu danych? Czy istnieje jakaś biblioteka (np. OpenCV, PIL, scikit-image, scipy) w pythonie implementującym przypadkowe przycinanie? Jeśli nie, jak mam to wdrożyć?

Odpowiedz

9

Moim zdaniem przyczyną przypadkowego przycinania pomaga w powiększaniu danych, podczas gdy semantyka obrazu jest zachowywana (chyba że wybierzesz naprawdę kiepski plon, ale załóżmy, że skonfigurowałeś losowe przycinanie, aby było to bardzo niskie prawdopodobieństwo) wartości aktywacji, które dostajesz w sieci konwergentnej, są różne. W efekcie nasza sieć koneksyjna uczy się powiązania szerszego zakresu statystyki aktywacji przestrzennej z określoną etykietą klasy, a zatem zwiększanie danych poprzez przypadkowe przycinanie pomaga poprawić odporność naszych detektorów cech w sieciach konwergentnych. Również w tym samym duchu, losowa uprawa wytwarza różne wartości aktywacji pośredniej i tworzy inny forwardpass, więc jest to "nowy punkt treningowy".

To także nie jest trywialne. Zobacz najnowsze prace na temat przeciwstawnych przykładów w sieciach neuronowych (stosunkowo płytkie w rozmiarze AlexNet). Obrazy, które semantycznie wyglądają tak samo, mniej więcej, kiedy przekazujemy je przez sieć neuronową z klasyfikatorem softmax na górze, możemy uzyskać drastycznie inne prawdopodobieństwo klasowe. Tak więc subtelne zmiany z semantycznego punktu widzenia mogą zakończyć się różnymi przejściami w przód przez sieć konwergentną. Aby uzyskać więcej informacji, patrz Intriguing properties of neural networks.

Aby odpowiedzieć na ostatnią część pytania: zwykle robię własny losowy skrypt. Powiedzmy, że moje obrazy to (3, 256, 256) (3 kanały RGB, rozmiar przestrzenny 256x256), możesz zakodować pętlę, która pobiera 224x224 losowych obrazów, po prostu losowo wybierając prawidłowy punkt narożny. Więc zazwyczaj obliczam tablicę prawidłowych punktów narożnych i jeśli chcę wziąć 10 losowych upraw, wybieram losowo 10 różnych punktów narożnych z tego zestawu, powiedzmy, że wybieram (x0, y0) dla mojego górnego lewego rogu, wybiorę zbiór X [x0: x0 + 224, y0: y0 + 224], coś takiego. Osobiście lubię losowo wybierać z wstępnie wyliczonego zestawu ważnych punktów narożnych, zamiast losowo wybierać narożniki po jednym losowaniu naraz, ponieważ w ten sposób gwarantuję, że nie otrzymam duplikatu, chociaż w rzeczywistości jest to prawdopodobnie małe prawdopodobieństwo.

+0

Witam. Dzięki. Po prostu chciałem zapytać, powiedziałeś, że przycinasz obraz 256x256 do 224x224 w celu powiększenia, wybierając kilka ważnych punktów. Ale konwojki zwykle pobierają dane o stałych rozmiarach. Powiedzmy, że mój obraz to 125x138, a używany przeze mnie konwert ma 224x224. Jak zrobić losowe przycinanie tutaj? Czy muszę zmienić rozmiar całego obrazu na 256x256, a następnie losowo przyciąć? Czy to nie wpływa na klasyfikację? – whitewalker

+0

Powiedz, że mam rozmiar danych obrazu 125x138. Powiedzmy, że chcę zrobić powiększenie danych i pobrać 96x128 losowych zbiorów. Następnie sparametryzowałbym moją sieć konwektywną, aby mieć rozmiar wejściowy 96x128. Tak więc rozmiar wejściowy konw. Sieci, który jest czymś, co wybieramy, jest zwykle ustawiony na rozmiar rośliny. Losowa uprawa i wzbogacanie danych w ogóle jest etapem wstępnego przetwarzania, więc zazwyczaj robimy to przed skonfigurowaniem naszego klasyfikatora. –

+0

Dzięki. Ale co się stanie, jeśli jeden obraz okaże się mniejszy (zestaw danych nie ma obrazów o stałej rozdzielczości) niż rozmiar wejściowy conv? Jak przypadkowo przyciąć w tym przypadku, czy przeskalować go do wyższej rozdzielczości najpierw przed przycięciem z powrotem do rozmiaru wejściowego? Również podczas przycinania (powiększania w czasie rzeczywistym), co jeśli obiekt główny zostanie częściowo odcięty (skoro nie możemy tego kontrolować za każdym razem)?Czy powinno to wpłynąć na klasyfikację? – whitewalker

0

Aby odpowiedzieć na pytanie "jak zaimplementować kadrowanie", możesz zapoznać się z https://github.com/aleju/imgaug. Dostępny jest powiększalnik Crop, który umożliwia losowe przycinanie. I wiele innych ulepszeń zabawy.