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
cropType
Określa, która część obrazu jest przycięta i obecnie może być Center
, RandomSide
RandomArea
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 brightnessRadius
0.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.