Sdílet prostřednictvím


Č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 widthheight a channels několik volitelných parametrů, které konfigurují transformace obrázků.

Transformace oříznutí

cropTypeurčuje, která část obrázku je oříznutá a aktuálně může být Center, RandomSideRandomArea 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, brightnessRadius0.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.