Čtečka obrázků v BrainScriptu
UPOZORNĚNÍ: Tento formát čtečky stále podporujeme, ale je zastaralý. Použijte nový formát čtečky: Principy a rozšíření čtečky.
Čtečka obrázků se dá použít ke čtení obrázků a použití některých transformací specifických pro obrázky, jako jsou náhodné oříznutí, škálování, horizontální překlopení a další. Jako vstup se používá jednoduchý textový soubor, kde každý řádek obsahuje mapování oddělené tabulátorem mezi souborem obrázku (např. JPEG, PNG atd.) a popiskem založeným na 0. Příklad:
/home/user/data/train/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train/n01440764/n01440764_10027.JPEG<tab>0
ImageReader podporuje "..." syntaxe v souboru mapování. Pokud cesta k souboru uloženému v souboru mapy začíná "...", pak "..." je nahrazen adresářem samotného souboru mapování.
Pokud například soubor C:\work\CNTK\data\train.map obsahuje
...\images\img1.png 1
...\images\img2.png 2
...\images\img3.png 3
pak čtenář přečte soubory, jako by byla zadána následující absolutní cesta:
C:\work\CNTK\data\images\img1.png 1
C:\work\CNTK\data\images\img2.png 2
C:\work\CNTK\data\images\img3.png 3
Protože některé datové sady obrázků můžou být poměrně velké (např. miliony obrázků), je někdy vhodné tyto image umístit do kontejneru. Čtečka obrázků aktuálně podporuje jeden typ kontejneru: soubory ZIP. V tomto případě se doporučuje použít režim komprese STORE, protože poskytuje nejrychlejší přístup k obsahu .zip souboru, také obrázky obvykle nevyžadují kompresi. Například (poznamenejte si znak @ na konci .zip názvu souboru):
/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
Mějte na paměti, že kontejnery a soubory můžete kombinovat a spárovat, ale doporučujeme omezit počet kontejnerů pro lepší výkon, tj. umístit všechny obrázky do jednoho (nebo několika) .zip souborů.
Upozorňujeme také, že v Windows prostředí unicode znaků v názvech souborů nejsou podporované (všechny znaky by měly být standardní ASCII). Toto omezení pochází z knihovny OpenCV, na které čtečka obrázků spoléhá.
Následující příklad ukazuje použití 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
]
]
Existuje velmi málo povinných parametrů, například width
height
a channels
několik volitelných parametrů, které konfigurují transformace obrázků.
Transformace oříznutí
cropType
určuje, která část obrázku je oříznutá a aktuálně může být Center
, RandomSide
RandomArea
nebo Multiview10
. RandomSide
a RandomArea
obvykle se používá během trénování, zatímco Center
se obvykle používá během testování. Náhodné oříznutí je oblíbená technika rozšíření dat, která slouží ke zlepšení generalizace sítě DNN. MultiView10
se obvykle používá během fáze testování/vyhodnocení a umožňuje 10-zobrazení vyhodnocení obrázku: (4(rohy) + 1(střed)) * 2(původní + vodorovný překlopení) = 10.
Vodorovná transformace překlopení
hflip
parametr určuje, zda bude obrázek náhodně převrácený vodorovně. Horizontální překlopení je další oblíbená technika rozšíření dat a měla by se použít, pokud obrázky vykazují svislou symetrii, například jako mnoho objektů reálného světa.
Transformace škálování
sideRatio
určuje poměr konečné dimenze obrázku, např. width
nebo height
, k velikosti náhodného oříznutí pořízeného z obrázku. Například poměr 224 / 256 = 0,875 znamená oříznutí velikosti 224 z obrázku přeškálování na 256 (podrobnosti implementace: ImageReader
vezme oříznutí a pak se změní měřítko místo toho, aby to bylo jinak).
Chcete-li povolit škálování zatřešování (další oblíbenou techniku rozšíření dat), použijte hodnoty s oddělovači dvojtečky, jako sideRatio=0.875:0.466
je 224 oříznutí, které se z obrázků náhodně škálují tak, aby měly velikost v rozsahu [256, 480].
areaRatio
určuje poměr oblasti konečného obrázku k původnímu obrázku. Například poměr 0,5 znamená, že oblast okna oříznutí je přibližně polovina původního obrázku. Oříznuté okno se pak škáluje na 224x224. sideRatio
(specifikováno společně s cropType=RandomSide
) a areaRatio
(specifikováno společně s cropType=RandomArea
) se vzájemně vylučují.
aspectRatio
umožňuje použít náhodné zachytání poměru stran. Například hodnota 0,2 znamená, že poměr stran obrázku lze náhodně změnit (jednotné rozdělení) na 80 % na 120 % původního obrázku.
Transformace barevných třepů
brightnessRadius
a contrastRadius
povolit použití jasu a kontrastu jitter. Tyto transformace používají následující vzorec na každý pixel obrázku: Yij = alpha * Xij + beta
kde alpha
je úprava kontrastu a beta
jas. Pokud contrastRadius
je 0.2
například alfa, bude náhodně vybrán (jednotné rozdělení) od 0.8
do 1.2
. brightnessRadius
náhodně vybere hodnoty jako podíl průměru obrázku, brightnessRadius
0.2
například náhodně vybere hodnoty od -0.2 * mean
do 0.2 * mean
.
saturationRadius
umožňuje použít náhodnou sytost. Například hodnota 0.3
sytosti obrázku může být změněna z 70 % na 130 % původního obrázku.
intensityFile
a intensityStdDev
umožnit použití intenzity založené na PCA, jak je popsáno v tomto dokumentu.
intensityFile
je cesta k souboru, který obsahuje eigenvalues a eigenvectors ve formátu OPENCV XML. intensityStdDev
určuje směrodatnou odchylku náhodných koeficientů eigenvalue.
Transformace odčítání střední hodnoty
meanFile
parametr je cesta k souboru ve formátu matice Xml OpenCV, který obsahuje průměr celé datové sady na pixel. Například pro vstupní vrstvu velikosti 224x224x3
bude soubor obsahovat 150528 položky, které se odečtou během trénování (nebo testování) ze vstupního obrázku. Stejný nebo podobný účinek lze dosáhnout několika dalšími technikami, například Mean
uzlem nebo dokonce odečtením určité pevné hodnoty, jako je 128, ze vstupu.