Partilhar via


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

cropTypeespecifica qual parte da imagem é cortada e atualmente pode ser Center, RandomSideRandomArea 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 brightnessRadiusseleciona 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.