Condividi tramite


Lettore di immagini BrainScript

ATTENZIONE: il formato del lettore è ancora supportato, ma è deprecato. Usare il nuovo formato lettore: Understanding-and-Extending-Reader.

Il lettore di immagini può essere usato per leggere le immagini e applicare alcune trasformazioni specifiche dell'immagine, ad esempio ritaglio casuale, ridimensionamento, capovolgimento orizzontale e altri. Accetta come input un semplice file di testo in cui ogni riga contiene un mapping separato da tabulazioni tra il file di immagine (ad esempio JPEG, PNG e così via) e l'etichetta basata su 0. Ad esempio:

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

ImageReader supporta "..." sintassi nel file di mapping. Se il percorso del file archiviato nel file di mapping inizia con "...", "..." viene sostituito dalla directory del file di mapping stesso.

Ad esempio, se un file C:\work\CNTK\data\train.map contiene

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

il lettore leggerà quindi i file come se fosse stato specificato il percorso assoluto seguente:

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

Poiché alcuni set di dati di immagini possono essere piuttosto grandi (ad esempio milioni di immagini), talvolta è utile inserire queste immagini in un contenitore. Il lettore di immagini supporta attualmente un tipo di contenitore: file ZIP. In questo caso è consigliabile usare la modalità di compressione STORE perché fornisce l'accesso più rapido al contenuto del file .zip, inoltre, le immagini in genere non richiedono comunque la compressione. Ad esempio (si noti il segno @ alla fine del nome file di .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

Si noti che è possibile combinare contenitori e file corrispondenti, tuttavia, è consigliabile limitare il numero di contenitori per ottenere prestazioni migliori, ad esempio inserire tutte le immagini in un singolo file (o pochi) .zip.

Si noti anche che in Windows ambiente i caratteri Unicode nei nomi di file non sono supportati (tutti i caratteri devono essere ASCII standard). Questa limitazione deriva dalla libreria OpenCV su cui si basa il lettore di immagini.

Nell'esempio seguente viene illustrato l'utilizzo di 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
        ]
    ]    

Esistono pochissimi parametri obbligatori, ad esempio widthheight , e channels diversi parametri facoltativi che configurano le trasformazioni dell'immagine.

Trasformazione ritaglio

cropTypespecifica la parte dell'immagine ritagliata e attualmente può essere Center, RandomSideRandomArea o Multiview10. RandomSide e RandomArea viene in genere usato durante il training mentre Center viene in genere usato durante i test. Il ritaglio casuale è una tecnica di aumento dei dati comune usata per migliorare la generalizzazione della rete neurale neurale. MultiView10 viene in genere usato durante la fase di test/valutazione e consente la valutazione dell'immagine a 10 visualizzazioni: (4(angoli) + 1(centro)) * 2(originale + capovolgimento orizzontale) = 10.

Trasformazione capovolgimento orizzontale

hflip parametro specifica se l'immagine verrà capovolta in modo casuale in direzione orizzontale. Lo scorrimento orizzontale è un'altra tecnica diffusa di aumento dei dati e deve essere usata se le immagini presentano simmetria verticale, ad esempio, come molti oggetti reali.

Ridimensionare le trasformazioni

sideRatio specifica il rapporto tra la dimensione dell'immagine finale, ad esempio width o height, e la dimensione del ritaglio casuale ricavato dall'immagine. Ad esempio, il rapporto 224 / 256 = 0,875 indica che il ritaglio di dimensioni 224 verrà tratto dall'immagine ridimensionata a 256 (dettagli di implementazione: ImageReader accetta il ritaglio e quindi ridimensiona invece di fare l'altro modo). Per abilitare l'instabilità della scala (un'altra tecnica di aumento dei dati comune), usare valori delimitati da due punti, come sideRatio=0.875:0.466 il che significa che 224 ritagli verranno acquisiti dalle immagini ridimensionate in modo casuale per avere dimensioni in un intervallo [256, 480].

areaRatio specifica il rapporto tra l'area dell'immagine finale e l'immagine originale. Ad esempio, un rapporto pari a 0,5 indica che l'area della finestra di ritaglio è circa la metà dell'immagine originale. La finestra ritagliata verrà quindi ridimensionata a 224x224. sideRatio (specificato insieme a cropType=RandomSide) e areaRatio (specificati insieme cropType=RandomAreaa ) si escludono a vicenda.

aspectRatio consente di applicare un'instabilità casuale delle proporzioni. Ad esempio, un valore pari a 0,2 indica che le proporzioni dell'immagine possono essere modificate in modo casuale (distribuzione uniforme) in modo che siano da 80% a 120% dell'originale.

Trasformazioni di instabilità dei colori

brightnessRadius e contrastRadius consentono di applicare la luminosità e il contrasto jitter. Queste trasformazioni applicano la formula seguente a ogni pixel di un'immagine: Yij = alpha * Xij + beta dove alpha è una regolazione del contrasto e beta - luminosità. Ad esempio, se contrastRadius è 0.2 alfa verrà scelto in modo casuale (distribuzione uniforme) da 0.8 a 1.2. brightnessRadius seleziona in modo casuale i valori come proporzione della media dell'immagine, ad esempio, brightnessRadius è uguale 0.2 a una selezione casuale dei valori da -0.2 * mean a 0.2 * mean.

saturationRadius consente di applicare un instabilità casuale di saturazione. Ad esempio, un valore indica 0.3 che la saturazione dell'immagine può essere modificata dal 70% al 130% dell'originale.

intensityFile e intensityStdDev consentono di applicare il jitter di intensità basata su PCA come descritto in questo documento. intensityFile è un percorso di un file che contiene valori eigenvalue e eigenvector in formato XML OpenCV. intensityStdDev specifica una deviazione standard dei coefficienti casuali di eigenvalues.

Trasformazione sottrazione media

meanFile parametro è un percorso di un file in formato matrice XML OpenCV che contiene la media per pixel dell'intero set di dati. Ad esempio, per il livello di input delle dimensioni 224x224x3 del file conterrà 150528 voci che verranno sottratte durante il training (o il test) dall'immagine di input. È possibile ottenere lo stesso effetto o simile usando poche altre tecniche, ad esempio nodo o anche solo sottraendo un valore fisso, ad esempio Mean 128, dall'input.