Lector de imágenes de BrainScript
PRECAUCIÓN: todavía se admite este formato de lector, pero está en desuso. Use el nuevo formato de lector: Understanding-and-Extend-Readers.
El lector de imágenes se puede usar para leer imágenes y aplicar algunas transformaciones específicas de la imagen, como recorte aleatorio, escalado, volteo horizontal y otros. Toma como entrada un archivo de texto simple donde cada línea contiene una asignación separada por tabulaciones entre el archivo de imagen (por ejemplo, JPEG, PNG, etc.) y una etiqueta basada en 0. Por ejemplo:
/home/user/data/train/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train/n01440764/n01440764_10027.JPEG<tab>0
ImageReader admite "..." sintaxis en el archivo de asignación. Si la ruta de acceso del archivo almacenada en el archivo de asignación comienza por "...", "..." se sustituye por el directorio del propio archivo de asignación.
Por ejemplo, si un archivo C:\work\CNTK\data\train.map contiene
...\images\img1.png 1
...\images\img2.png 2
...\images\img3.png 3
después, el lector leerá los archivos como si se especificara la ruta de acceso absoluta siguiente:
C:\work\CNTK\data\images\img1.png 1
C:\work\CNTK\data\images\img2.png 2
C:\work\CNTK\data\images\img3.png 3
Dado que algunos conjuntos de datos de imagen pueden ser bastante grandes (por ejemplo, millones de imágenes), a veces resulta beneficioso colocar estas imágenes en un contenedor. El lector de imágenes admite actualmente un tipo de contenedor: archivos ZIP. En este caso, se recomienda usar el modo de compresión STORE, ya que proporciona acceso más rápido al contenido del archivo .zip, además, las imágenes normalmente no requieren compresión de todos modos. Por ejemplo (tenga en cuenta el signo @ al final de .zip nombre de archivo):
/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
Tenga en cuenta que puede combinar contenedores y archivos, pero se recomienda limitar el número de contenedores para mejorar el rendimiento, es decir, colocar todas las imágenes en un solo archivo (o pocos) .zip.
Tenga en cuenta también que en Windows los caracteres Unicode del entorno en los nombres de archivo no se admiten (todos los caracteres deben ser ASCII estándar). Esta limitación procede de la biblioteca OpenCV en la que se basa el lector de imágenes.
En el ejemplo siguiente se muestra el 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
]
]
Hay muy pocos parámetros obligatorios, como width
, height
y channels
varios parámetros opcionales que configuran transformaciones de imagen.
Transformación de recorte
cropType
especifica qué parte de la imagen se recorta y actualmente puede ser Center
, RandomSide
RandomArea
o Multiview10
. RandomSide
y RandomArea
se suele usar durante el entrenamiento, mientras Center
que normalmente se usa durante las pruebas. El recorte aleatorio es una técnica de aumento de datos popular que se usa para mejorar la generalización de la DNN. MultiView10
normalmente se usa durante la fase de prueba/evaluación y habilita la evaluación de imágenes de 10 vistas: (4(esquinas) + 1(centro)) * 2(original + volteo horizontal) = 10.
Transformación de volteo horizontal
hflip
parameter especifica si la imagen se voltea aleatoriamente en dirección horizontal. El volteo horizontal es otra técnica popular de aumento de datos y se debe usar si las imágenes muestran simetría vertical, por ejemplo, como muchos objetos reales.
Transformaciones de escalado
sideRatio
especifica la proporción de la dimensión final de la imagen, por ejemplo width
, o height
, con el tamaño del recorte aleatorio tomado de la imagen. Por ejemplo, la proporción 224 / 256 = 0,875 significa que el recorte del tamaño 224 se tomará de la imagen escalada a 256 (detalle de implementación: ImageReader
toma el recorte y, a continuación, se escala en lugar de hacerlo de otra manera).
Para habilitar la vibración de escala (otra técnica de aumento de datos popular), use valores delimitados por dos puntos, como sideRatio=0.875:0.466
lo que significa que se tomarán 224 recortes de imágenes de forma aleatoria para tener tamaño en el intervalo [256, 480].
areaRatio
especifica la proporción del área de imagen final con la imagen original. Por ejemplo, una proporción de 0,5 significa que el área de ventana de recorte es aproximadamente la mitad de la imagen original. A continuación, la ventana recortada se escalará a 224 x 224. sideRatio
(especificado junto con cropType=RandomSide
) y areaRatio
(especificado junto con cropType=RandomArea
) son mutuamente excluyentes.
aspectRatio
permite que uno aplique la vibración aleatoria de la relación de aspecto. Por ejemplo, un valor de 0,2 significa que la relación de aspecto de la imagen se puede cambiar aleatoriamente (distribución uniforme) para que sea del 80 % al 120 % del original.
Transformaciones de vibración de color
brightnessRadius
y contrastRadius
permiten aplicar brillo y vibración de contraste. Estas transformaciones aplican la fórmula siguiente a cada píxel de una imagen: Yij = alpha * Xij + beta
donde alpha
es un ajuste de contraste y beta
- brillo. Por ejemplo, si contrastRadius
es 0.2
alfa, se elegirá aleatoriamente (distribución uniforme) de 0.8
a 1.2
. brightnessRadius
selecciona aleatoriamente los valores como una proporción de la media de la imagen, por ejemplo, brightnessRadius
igual que 0.2
selecciona aleatoriamente los valores de -0.2 * mean
a 0.2 * mean
.
saturationRadius
permite aplicar vibración aleatoria de saturación. Por ejemplo, un valor de 0.3
significa saturación de la imagen se puede cambiar del 70 % al 130 % del original.
intensityFile
y permiten aplicar vibración de intensidad basada en PCA, tal y intensityStdDev
como se describe en este documento.
intensityFile
es una ruta de acceso a un archivo que contiene valores propios y vectores propios en formato OpenCV XML. intensityStdDev
especifica una desviación estándar de coeficientes aleatorios de valores propios.
Transformación de resta media
meanFile
parameter es una ruta de acceso a un archivo en formato de matriz OpenCV XML que contiene la media por píxel de todo el conjunto de datos. Por ejemplo, para la capa de entrada de tamaño 224x224x3
, el archivo contendrá 150528 entradas que se restarán durante el entrenamiento (o las pruebas) de la imagen de entrada. El mismo efecto o similar se puede lograr mediante algunas otras técnicas, por ejemplo, Mean
nodo o incluso restando algún valor fijo, como 128, de la entrada.