Compartilhar via


Leitor de imagens do BrainScript

CUIDADO: ainda damos suporte a esse formato de leitor, mas ele está sendo preterido. Use 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 de imagem, como corte aleatório, dimensionamento, inversão horizontal e outras. Ele usa como entrada um arquivo de texto simples em que cada linha contém um mapeamento separado por tabulação entre o arquivo de imagem (por exemplo, JPEG, PNG etc) e um rótulo baseado em 0. Por exemplo:

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

O ImageReader dá suporte a "..." sintaxe no arquivo de mapeamento. Se o caminho do arquivo armazenado no arquivo de mapa começar com "...", então "..." é substituído pelo diretório do próprio arquivo de mapeamento.

Por exemplo, se um arquivo C:\work\CNTK\data\train.map contiver

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

em seguida, o leitor lerá arquivos como se o seguinte caminho absoluto tivesse sido 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 muito grandes (por exemplo, milhões de imagens), às vezes é benéfico colocar essas imagens em um contêiner. Atualmente, o leitor de imagem dá suporte a um tipo de contêiner: arquivos ZIP. Nesse caso, é recomendável usar o modo de compactação STORE, pois ele fornece acesso mais rápido ao conteúdo do arquivo .zip, além disso, as imagens geralmente não exigem compactação de qualquer maneira. Por exemplo (observe o sinal @ no final de .zip nome do arquivo):

/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

Observe que você pode misturar e combinar contêineres e arquivos, no entanto, é recomendável limitar o número de contêineres para o melhor desempenho, ou seja, colocar todas as imagens em um único (ou poucos) arquivos de .zip.

Observe também que, em Windows ambiente, não há suporte para caracteres Unicode em nomes de arquivo (todos os caracteres devem ser ASCII padrão). Essa limitação vem da biblioteca OpenCV na qual o leitor de imagens depende.

O exemplo a seguir demonstra o uso 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
        ]
    ]    

Há muito poucos parâmetros obrigatórios, como widthe heightchannels vários parâmetros opcionais que configuram transformações de imagem.

Transformação de corte

cropTypeespecifica qual parte da imagem é cortada e atualmente pode serCenter, RandomSideRandomArea ou Multiview10. RandomSide e RandomArea geralmente é usado durante o treinamento enquanto Center geralmente é usado durante o teste. O corte aleatório é uma técnica popular de aumento de dados usada para melhorar a generalização da DNN. MultiView10 geralmente é usado durante a fase de teste/avaliação e habilita a avaliação de imagem de 10 modos de exibição: (4(cantos) + 1(centro)) * 2(original + inversão horizontal) = 10.

Transformação de inversão horizontal

hflip o parâmetro especifica se a imagem será invertida aleatoriamente na direção horizontal. A inversão 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ções de escala

sideRatio especifica a proporção da dimensão final da imagem, por exemplo width , ou height, para o tamanho da cultura aleatória tirada da imagem. Por exemplo, a taxa 224/256 = 0,875 significa que a recortar do tamanho 224 será tirada da imagem redimensionada para 256 (detalhes da implementação: ImageReader usa a cultura e, em seguida, redimensiona em vez de fazer o contrário). Para habilitar o nervosismo de escala (outra técnica popular de aumento de dados), use valores delimitados por dois pontos, como sideRatio=0.875:0.466 o que significa que 224 recortes serão obtidos de imagens dimensionadas aleatoriamente para ter tamanho no intervalo [256, 480].

areaRatio especifica a proporção da área de imagem final para a imagem original. Por exemplo, uma taxa de 0,5 significa que a área da janela de corte é cerca de metade da imagem original. Em seguida, a janela cortada será dimensionada para 224 x 224. sideRatio (especificado junto com cropType=RandomSide) e areaRatio (especificado junto com cropType=RandomArea) são mutuamente exclusivos.

aspectRatio permite que um aplique tremulação aleatória de taxa de proporção. Por exemplo, um valor de 0,2 significa que a taxa de proporção da imagem pode ser alterada aleatoriamente (distribuição uniforme) para 80% a 120% do original.

Transformações de tremulação de cores

brightnessRadius e contrastRadius permitir a aplicação de brilho e tremulação de contraste. Essas transformações aplicam a fórmula a seguir a cada pixel de uma imagem: Yij = alpha * Xij + beta onde alpha está um ajuste de contraste e beta – brilho. Por exemplo, se contrastRadius for 0.2 , alfa será escolhido aleatoriamente (distribuição uniforme) de 0.8 para 1.2. brightnessRadius seleciona valores aleatoriamente como uma proporção da média de imagem, por exemplo, brightnessRadius é igual 0.2 a selecionar valores aleatoriamente de -0.2 * mean para 0.2 * mean.

saturationRadius permite aplicar tremulação aleatória 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 a aplicação de tremulação de intensidade baseada em PCA, conforme descrito neste artigo. intensityFile é um caminho para um arquivo que contém eigenvalues e eigenvectors no formato XML OpenCV. intensityStdDev especifica um desvio padrão de coeficientes aleatórios de eigenvalues.

Transformação de subtração média

meanFile o parâmetro é um caminho para um arquivo no formato de matriz XML OpenCV 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 arquivo conterá 150528 entradas que serão subtraídas durante o treinamento (ou teste) da imagem de entrada. O mesmo efeito ou efeito semelhante pode ser obtido usando poucas outras técnicas, por exemplo, Mean nó ou até mesmo apenas subtraindo algum valor fixo, como 128, da entrada.