Udostępnij za pośrednictwem


Czytnik obrazów BrainScript

UWAGA: nadal obsługujemy ten format czytnika, ale jest przestarzały. Użyj nowego formatu czytnika: Understanding-and-Extending-Reader.

Czytnik obrazów może służyć do odczytywania obrazów i stosowania niektórych przekształceń specyficznych dla obrazu, takich jak losowe przycinanie, skalowanie, przerzucanie w poziomie i inne. Przyjmuje jako dane wejściowe prosty plik tekstowy, w którym każdy wiersz zawiera rozdzielone tabulatorami mapowanie między plikiem obrazu (np. JPEG, PNG itp.) i etykietą opartą na 0. Przykład:

/home/user/data/train/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train/n01440764/n01440764_10027.JPEG<tab>0

Element ImageReader obsługuje element "..." składni w pliku mapowania. Jeśli ścieżka pliku przechowywana w pliku mapy zaczyna się od "...", to "..." jest zastępowany przez katalog samego pliku mapowania.

Jeśli na przykład plik C:\work\CNTK\data\train.map zawiera

...\images\img1.png 1
...\images\img2.png 2
...\images\img3.png 3

czytnik odczytuje pliki tak, jakby określono następującą ścieżkę bezwzględną:

C:\work\CNTK\data\images\img1.png 1
C:\work\CNTK\data\images\img2.png 2
C:\work\CNTK\data\images\img3.png 3

Ponieważ niektóre zestawy danych obrazów mogą być dość duże (np. miliony obrazów), czasami korzystne jest umieszczenie tych obrazów w kontenerze. Czytnik obrazów obsługuje obecnie jeden typ kontenera: pliki ZIP. W takim przypadku zaleca się używanie trybu kompresji STORE, ponieważ zapewnia najszybszy dostęp do zawartości pliku .zip, również obrazy zwykle nie wymagają kompresji mimo to. Na przykład (zanotuj znak @ na końcu nazwy pliku .zip):

/home/user/data/train.zip@/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train.zip@/n01440764/n01440764_10027.JPEG<tab>0
/home/user/data/train_01.zip@/n01534433/n01534433_7285.JPEG<tab>0
/home/user/data/train/n01534433/n01534433_7285.JPEG<tab>0

Należy jednak pamiętać, że można mieszać i dopasowywać kontenery i pliki, jednak zaleca się ograniczenie liczby kontenerów w celu uzyskania lepszej wydajności, tj. umieszczenie wszystkich obrazów w jednym (lub kilku) plikach .zip.

Należy również pamiętać, że w Windows znaki Unicode środowiska w nazwach plików nie są obsługiwane (wszystkie znaki powinny być standardowe ASCII). To ograniczenie pochodzi z biblioteki OpenCV, na których opiera się czytnik obrazów.

W poniższym przykładzie pokazano użycie elementu ImageReader:

    reader=[
        readerType=ImageReader
        file=$ConfigDir$/train_map.txt
        randomize=Auto
        features=[
            # Below are the required parameters.
            width=224
            height=224
            channels=3
            # Below are the optional parameters.
            # Possible values: Center, RandomSide, RandomArea, MultiView10. Default: Center
            cropType=RandomSide
            # Horizontal random flip, will be enabled by default if cropType=Random
            #hflip=0
            # Crop scale side ratio. Examples: sideRatio=0.9, sideRatio=0.7:0.9.
            sideRatio=0.875
            # Crop scale ratio jitter type.
            # Possible values: None, UniRatio. Default: None
            jitterType=UniRatio
            # Interpolation to use when scaling image to width x height size.
            # Possible values: nearest, linear, cubic, lanczos. Default: linear.
            interpolations=Linear
            # Aspect ratio jitter radius. Default is 1.0 (crop square).
            aspectRatio=0.75:1.0
            # Brightness, contrast and color jittering. Default is 0.0 (no effect).
            brightnessRadius=0.2
            contrastRadius=0.2
            saturationRadius=0.4
            # Intensity jittering: enabled if file is specified and intensityStdDev > 0. 
            # The file stores 1x3 vector (eigenvalues) and 3x3 matrix (eigenvectors) in OpenCV XML format.
            intensityFile="$ConfigDir$/ImageNet1K_intensity.xml"
            # StdDev for intensity jittering. Default is 0.0. 
            intensityStdDev=0.1
            # Mean subtraction: enabled if file is specified.
            # The file stores mean values for each pixel in OpenCV matrix XML format.
            meanFile=$ConfigDir$/ImageNet1K_mean.xml
        ]
        labels=[
            labelDim=1000
        ]
    ]    

Istnieje bardzo niewiele parametrów obowiązkowych, takich jak width, height i channels kilka parametrów opcjonalnych, które konfigurują przekształcenia obrazu.

Przekształcanie przycinania

cropTypeOkreśla, która część obrazu jest przycięta i obecnie może być Center, RandomSideRandomArea lub Multiview10. RandomSide i RandomArea jest zwykle używany podczas trenowania, podczas gdy Center jest zwykle używany podczas testowania. Przycinanie losowe to popularna technika rozszerzania danych używana do ulepszania uogólniania nazwy sieci rozproszonej. MultiView10 jest zwykle używany podczas fazy testowania/oceny i umożliwia ocenę obrazu w widoku 10: (4(narożniki) + 1(środek)) * 2(oryginalny + poziomy przerzucanie) = 10.

Przekształcenie przerzucania w poziomie

hflip Parametr określa, czy obraz będzie losowo przerzucany w kierunku poziomym. Przerzucanie w poziomie to inna popularna technika rozszerzania danych i powinna być używana, jeśli obrazy wykazują symetrię pionową, na przykład jak wiele obiektów rzeczywistych.

Skalowanie przekształceń

sideRatio Określa stosunek końcowego wymiaru obrazu, np. width lub height, do rozmiaru losowego przycinania pobranego z obrazu. Na przykład współczynnik 224 / 256 = 0,875 oznacza, że uprawy o rozmiarze 224 zostaną pobrane z obrazu przeskalowanego do 256 (szczegóły implementacji: ImageReader pobiera uprawy, a następnie skaluje ponownie zamiast robić to w drugą stronę). Aby włączyć zakłócenia skalowania (inną popularną technikę rozszerzania danych), użyj wartości rozdzielanych dwukropkami, takich jak sideRatio=0.875:0.466 oznacza to, że 224 przycinanie zostanie pobrane z obrazów skalowanych losowo, aby mieć rozmiar w zakresie [256, 480].

areaRatio określa stosunek końcowego obszaru obrazu do oryginalnego obrazu. Na przykład współczynnik 0,5 oznacza, że obszar okna przycinania wynosi około połowy oryginalnego obrazu. Przycięte okno zostanie następnie przeskalowane do 224x224. sideRatio (określone razem z cropType=RandomSide) i areaRatio (określone razem z cropType=RandomArea) wykluczają się wzajemnie.

aspectRatio umożliwia zastosowanie losowego zakłócenia współczynnika proporcji. Na przykład wartość 0,2 oznacza, że współczynnik proporcji obrazu może zostać losowo zmieniony (jednolity rozkład) na 80% do 120% oryginału.

Przekształcenia roztrzaśnięć kolorów

brightnessRadius i contrastRadius pozwalają na stosowanie jasności i kontrastu jitter. Te przekształcenia stosują następującą formułę do każdego piksela obrazu: Yij = alpha * Xij + beta gdzie alpha jest korekta kontrastu i beta - jasność. Na przykład, jeśli contrastRadius jest to 0.2 alfa zostanie losowo wybrany (jednolity rozkład) z 0.8 do 1.2. brightnessRadius losowo wybiera wartości jako proporcję średniej obrazu, na przykład brightnessRadius0.2 równa się losowo wybiera wartości z -0.2 * mean do 0.2 * mean.

saturationRadius umożliwia zastosowanie losowego zakłócenia nasycenia. Na przykład wartość 0.3 oznacza, że nasycenie obrazu można zmienić z 70% na 130% oryginału.

intensityFile i intensityStdDev umożliwiają stosowanie zakłócenia intensywności opartej na PCA zgodnie z opisem w tym dokumencie. intensityFile to ścieżka do pliku zawierającego wartości eigenvalue i wektory eigen w formacie XML OpenCV. intensityStdDev określa odchylenie standardowe współczynników losowych wartości eigenów.

Przekształcenie odejmowania średniej

meanFile parametr jest ścieżką do pliku w formacie macierzy OPENCV XML, który zawiera średnią dla każdego piksela całego zestawu danych. Na przykład dla warstwy wejściowej rozmiaru 224x224x3 pliku będzie zawierać 150528 wpisy, które zostaną odjęty podczas trenowania (lub testowania) z obrazu wejściowego. Ten sam lub podobny efekt można osiągnąć przy użyciu kilku innych technik, na przykład węzła, Mean a nawet po prostu odejmowania pewnej stałej wartości, takiej jak 128, z danych wejściowych.