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 width
height
, e channels
diversi parametri facoltativi che configurano le trasformazioni dell'immagine.
Trasformazione ritaglio
cropType
specifica la parte dell'immagine ritagliata e attualmente può essere Center
, RandomSide
RandomArea
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=RandomArea
a ) 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.