Leitor de imagem BrainScript
ATENÇÃO: ainda apoiamos este formato de leitor, mas está a ser depreciado. Utilize o novo formato de leitor: Understanding-and-Extending-Readers.
O leitor de imagem pode ser usado para ler imagens e aplicar algumas transformações específicas da imagem como corte aleatório, escala, viragem horizontal e outras. Toma como entrada um simples ficheiro de texto onde cada linha contém um mapeamento separado por separados entre o ficheiro de imagem (por exemplo.JPEG, PNG etc) e uma etiqueta baseada em 0. Por exemplo:
/home/user/data/train/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train/n01440764/n01440764_10027.JPEG<tab>0
ImageReader suporta "..." sintaxe no ficheiro de mapeamento. Se o caminho do ficheiro armazenado no ficheiro do mapa começar com "...", então "..." é substituído pelo diretório do próprio ficheiro de mapeamento.
Por exemplo, se um ficheiro C:\work\CNTK\data\train.map contém
...\images\img1.png 1
...\images\img2.png 2
...\images\img3.png 3
em seguida, o leitor lerá ficheiros como se o seguinte caminho absoluto fosse especificado:
C:\work\CNTK\data\images\img1.png 1
C:\work\CNTK\data\images\img2.png 2
C:\work\CNTK\data\images\img3.png 3
Como alguns conjuntos de dados de imagem podem ser bastante grandes (por exemplo, milhões de imagens), por vezes é benéfico colocar estas imagens num recipiente. O leitor de imagem suporta atualmente um tipo de recipiente: ficheiros ZIP. Neste caso, recomenda-se a utilização do modo de compressão STORE, uma vez que proporciona um acesso mais rápido ao conteúdo do ficheiro .zip, também, as imagens normalmente não requerem compressão. Por exemplo (note o sinal @ no final do .zip nome de ficheiro):
/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
Note que pode misturar e combinar recipientes e ficheiros, no entanto, é aconselhável limitar o número de recipientes para um melhor desempenho, ou seja, colocar todas as imagens num único (ou poucos) ficheiros .zip.
Tenha também em atenção que, em ambiente Windows, os caracteres Unicode em nomes de ficheiros não são suportados (todos os caracteres devem ser ASCII padrão). Esta limitação vem da biblioteca OpenCV em que o leitor de imagem confia.
O exemplo a seguir demonstra a utilização de 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
]
]
Existem muito poucos parâmetros obrigatórios, como width
, height
e channels
vários parâmetros opcionais que configuram transformações de imagem.
Transformação de cultura
cropType
especifica qual parte da imagem é cortada e atualmente pode ser Center
, RandomSide
RandomArea
ou Multiview10
. RandomSide
e RandomArea
é geralmente usado durante o treino enquanto Center
é usado durante os testes. A colheita aleatória é uma técnica popular de aumento de dados usada para melhorar a generalização do DNN. MultiView10
é geralmente utilizado durante a fase de teste/avaliação e permite uma avaliação de imagem de 10 visualizações: (4(cantos) + 1 (centro)) * 2 (original + flip horizontal) = 10.
Transformação horizontal de flip
hflip
o parâmetro especifica se a imagem será rodada aleatoriamente na direção horizontal. A viragem horizontal é outra técnica popular de aumento de dados e deve ser usada se as imagens exibirem simetria vertical, por exemplo, como muitos objetos do mundo real.
Transforma-se em escala
sideRatio
especifica a relação entre a dimensão final da imagem, por exemplo width
, ou height
, o tamanho da cultura aleatória retirada da imagem. Por exemplo, a razão 224 / 256 = 0,875 significa que a cultura do tamanho 224 será retirada da imagem redimensionada para 256 (detalhe de implementação: ImageReader
leva a colheita e depois redimensiona em vez de fazer o contrário).
Para permitir o nervosismo em escala (outra técnica de aumento de dados populares), utilize valores delimitados do cólon como sideRatio=0.875:0.466
o que significa que 224 colheitas serão tiradas de imagens dimensionadas aleatoriamente para ter tamanho na gama [256,480].
areaRatio
especifica a relação entre a área de imagem final e a imagem original. Por exemplo, uma relação de 0,5 significa que a área da janela da cultura é cerca de metade da imagem original. A janela cortada será então dimensionada para 224x224. sideRatio
(especificado em conjunto com cropType=RandomSide
) e areaRatio
(especificados em conjunto com cropType=RandomArea
) são mutuamente exclusivos.
aspectRatio
permite aplicar o nervosismo aleatório da relação de aspeto. Por exemplo, um valor de 0,2 significa que o rácio de aspeto da imagem pode ser alterado aleatoriamente (distribuição uniforme) para ser de 80% a 120% do original.
O nervosismo da cor transforma-se
brightnessRadius
e contrastRadius
permitir aplicar brilho e contraste nervoso. Estas transformações aplicam a seguinte fórmula a cada pixel de uma imagem: Yij = alpha * Xij + beta
onde alpha
está um ajuste de contraste e beta
- brilho. Por exemplo, se contrastRadius
então 0.2
alfa será escolhido aleatoriamente (distribuição uniforme) de 0.8
.1.2
brightnessRadius
seleciona aleatoriamente valores como uma proporção da média de imagem, por exemplo, brightnessRadius
iguala valores 0.2
aleatoriamente seleciona valores de -0.2 * mean
.0.2 * mean
saturationRadius
permite aplicar nervosismo aleatório de saturação. Por exemplo, um valor de saturação de 0.3
meios da imagem pode ser alterado de 70% para 130% do original.
intensityFile
e intensityStdDev
permitir aplicar o nervosismo de intensidade baseado em PCA, conforme descrito neste artigo.
intensityFile
é um caminho para um ficheiro que contém eigenvalues e eigenvectors em formato OpenCV XML. intensityStdDev
especifica um desvio padrão de coeficientes aleatórios de eigenvalues.
Transformação média de subtração
meanFile
parâmetro é um caminho para um ficheiro no formato matriz OpenCV XML que contém a média por pixel de todo o conjunto de dados. Por exemplo, para a camada de entrada de tamanho 224x224x3
, o ficheiro conterá 150528 entradas que serão subtraídas durante o treino (ou teste) a partir da imagem de entrada. O mesmo efeito ou efeito semelhante pode ser alcançado utilizando poucas outras técnicas, por exemplo, Mean
nó ou até mesmo apenas subtraindo algum valor fixo, como 128, da entrada.