Source: https://la.mathworks.com/help/images/single-image-super-resolution-using-deep-learning.html
Timestamp: 2020-07-04 00:19:50+00:00

Document:
Superresolución de una sola imagen mediante el aprendizaje profundo - MATLAB & Simulink Example - MathWorks América Latina
La red VDSR
Descargar datos de entrenamiento y pruebas
Preparar datos de capacitación
Definir tubería de preprocesamiento para el conjunto de entrenamiento
Configurar capas VDSR
Especificar opciones de entrenamiento
Entrenar la red
Realizar superresolución de una sola imagen utilizando la red VDSR
Crear imagen de baja resolución de ejemplo
Mejorar la resolución de la imagen mediante la interpolación bicúbica
Mejorar la resolución de imágenes mediante la red VDSR preformada
Comparación visual y cuantitativa
En este ejemplo se muestra cómo entrenar una red neuronal de superresolución muy profunda (VDSR) y, a continuación, utilizar una red VDSR para estimar una imagen de alta resolución a partir de una sola imagen de baja resolución.
El ejemplo muestra cómo entrenar una red VDSR y también proporciona una red VDSR previamente entrenada. Si decide entrenar la red VDSR, se recomienda utilizar una GPU NVIDIA™ compatible con CUDA con capacidad de computación 3.0 o superior. El uso de una GPU requiere el cuadro de herramientas de informática paralela™.
La superresolución es el proceso de creación de imágenes de alta resolución a partir de imágenes de baja resolución. En este ejemplo se considera la superresolución de una sola imagen (SISR), donde el objetivo es recuperar una imagen de alta resolución de una imagen de baja resolución. SISR es un reto porque el contenido de imágenes de alta frecuencia normalmente no se puede recuperar de la imagen de baja resolución. Sin información de alta frecuencia, la calidad de la imagen de alta resolución es limitada. Además, SISR es un problema desorientado porque una imagen de baja resolución puede producir varias imágenes de alta resolución posibles.
Se han propuesto varias técnicas, incluidos algoritmos de aprendizaje profundo, para realizar SISR. En este ejemplo se explora un algoritmo de aprendizaje profundo para SISR, denominado superresolución muy profunda (VDSR) [ ].1
VDSR es una arquitectura de red neuronal convolucional diseñada para realizar una sola imagen de superresolución [ ].1 La red VDSR aprende la asignación entre imágenes de baja y alta resolución. Esta asignación es posible porque las imágenes de baja resolución y alta resolución tienen contenido de imagen similar y difieren principalmente en detalles de alta frecuencia.
VDSR emplea una estrategia de aprendizaje residual, lo que significa que la red aprende a estimar una imagen residual. En el contexto de la superresolución, una imagen residual es la diferencia entre una imagen de referencia de alta resolución y una imagen de baja resolución que se ha ampliado mediante interpolación bicúbica para que coincida con el tamaño de la imagen de referencia. Una imagen residual contiene información sobre los detalles de alta frecuencia de una imagen.
La red VDSR detecta la imagen residual de la luminancia de una imagen en color. El canal de luminancia de una imagen, , representa el brillo de cada píxel a través de una combinación lineal de los valores de píxel rojo, verde y azul.Y Por el contrario, los dos canales de crominancia de una imagen y , son combinaciones lineales diferentes de los valores de píxel rojo, verde y azul que representan información de diferencia de color.CbCr VDSR se entrena utilizando sólo el canal de luminancia porque la percepción humana es más sensible a los cambios de brillo que a los cambios de color.
<mi mathvariant="normal">high</mi>
<mi mathvariant="normal">res</mi>
es la luminancia de la imagen de alta resolución y
<mi mathvariant="normal">lowres</mi>
es la luminancia una imagen de baja resolución que se ha ampliado utilizando interpolación bicúbica, entonces la entrada a la red VDSR es
y la red aprende a predecir
<mi mathvariant="normal">residual</mi>
<mi mathvariant="normal">highres</mi>
de los datos de entrenamiento.
Después de que la red VDSR aprenda a estimar la imagen residual, puede reconstruir imágenes de alta resolución agregando la imagen residual estimada a la imagen de baja resolución aumentada y, a continuación, convirtiendo la imagen de nuevo al espacio de color RGB.
Un factor de escala relaciona el tamaño de la imagen de referencia con el tamaño de la imagen de baja resolución. A medida que aumenta el factor de escala, SISR se vuelve más indebido porque la imagen de baja resolución pierde más información sobre el contenido de la imagen de alta frecuencia. VDSR resuelve este problema mediante el uso de un campo receptivo grande. En este ejemplo se entrena una red VDSR con varios factores de escala mediante el aumento de escala. El aumento de escala mejora los resultados a factores de escala más grandes porque la red puede aprovechar el contexto de la imagen a partir de factores de escala más pequeños. Además, la red VDSR puede generalizar para aceptar imágenes con factores de escala no enteros.
Descargue el punto de referencia IAPR TC-12, que consta de 20.000 imágenes naturales [ ].2 El conjunto de datos incluye fotos de personas, animales, ciudades y mucho más. El tamaño del archivo de datos es de 1,8 GB. Si no desea descargar el conjunto de datos de entrenamiento, puede cargar la red VDSR previamente entrenada escribiendo en la línea de comandos.load('trainedVDSR-Epoch-100-ScaleFactors-234.mat'); A continuación, vaya directamente a la sección de este ejemplo.Realizar superresolución de una sola imagen utilizando la red VDSR
Utilice la función auxiliar, , para descargar los datos.downloadIAPRTC12Data Esta función se adjunta al ejemplo como un archivo auxiliar.
imagesDir = tempdir; url = 'http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz'; downloadIAPRTC12Data(url,imagesDir);
Este ejemplo entrenará la red con un pequeño subconjunto de los datos de referencia Tc-12 de La IAPR. Cargue los datos de entrenamiento de imageCLEF. Todas las imágenes son imágenes en color JPEG de 32 bits.
trainImagesDir = fullfile(imagesDir,'iaprtc12','images','02'); exts = {'.jpg','.bmp','.png'}; pristineImages = imageDatastore(trainImagesDir,'FileExtensions',exts);
Enumere el número de imágenes de entrenamiento.
Para crear un conjunto de datos de entrenamiento, genere pares de imágenes que consistan en imágenes desmuestreadas y las imágenes residuales correspondientes.
Las imágenes integradas se almacenan en el disco como archivos MAT en el directorio.upsampledDirName Las imágenes residuales calculadas que representan las respuestas de red se almacenan en el disco como archivos MAT en el directorio.residualDirName Los archivos MAT se almacenan como tipo de datos para una mayor precisión al entrenar la red.double
upsampledDirName = [trainImagesDir filesep 'upsampledImages']; residualDirName = [trainImagesDir filesep 'residualImages'];
Utilice la función auxiliar para preprocesar los datos de entrenamiento.createVDSRTrainingSet Esta función se adjunta al ejemplo como un archivo auxiliar.
La función auxiliar realiza estas operaciones para cada imagen prístina en:trainImages
Convierta la imagen al espacio de color YCbCr
Reduzca el tamaño del canal de luminancia (Y) por diferentes factores de escala para crear imágenes de baja resolución de muestra y, a continuación, cambie el tamaño de las imágenes al tamaño original mediante interpolación bicúbica
Calcule la diferencia entre las imágenes prístinas y redimensionadas.
Guarde las imágenes redimensionadas y residuales en el disco.
scaleFactors = [2 3 4]; createVDSRTrainingSet(pristineImages,scaleFactors,upsampledDirName,residualDirName);
En este ejemplo, las entradas de red son imágenes de baja resolución que se han muestreado mediante interpolación bicúbica. Las respuestas de red deseadas son las imágenes residuales. Cree un almacén de datos de imagen llamado desde la colección de archivos de imagen de entrada.upsampledImages Cree un almacén de datos de imagen llamado a partir de la colección de archivos de imagen residual calculados.residualImages Ambos almacenes de datos requieren una función auxiliar, , para leer los datos de imagen de los archivos de imagen.matRead Esta función se adjunta al ejemplo como un archivo auxiliar.
upsampledImages = imageDatastore(upsampledDirName,'FileExtensions','.mat','ReadFcn',@matRead); residualImages = imageDatastore(residualDirName,'FileExtensions','.mat','ReadFcn',@matRead);
Cree un que especifique los parámetros de aumento de datos.imageDataAugmenter Utilice el aumento de datos durante el entrenamiento para variar los datos de entrenamiento, lo que aumenta eficazmente la cantidad de datos de entrenamiento disponibles. Aquí, el aumentador especifica la rotación aleatoria por 90 grados y las reflexiones aleatorias en la dirección.x-
augmenter = imageDataAugmenter( ...     'RandRotation',@()randi([0,1],1)*90, ...     'RandXReflection',true);
Cree un archivo que realice una extracción aleatoria de parches de los almacenes de datos de imágenes residuales y de muestreo.randomPatchExtractionDatastore La extracción de parches es el proceso de extraer un gran conjunto de pequeños parches de imagen, o mosaicos, de una sola imagen más grande. Este tipo de aumento de datos se utiliza con frecuencia en problemas de regresión de imagen a imagen, donde muchas arquitecturas de red se pueden entrenar en tamaños de imagen de entrada muy pequeños. Esto significa que se puede extraer un gran número de parches de cada imagen de tamaño completo en el conjunto de entrenamiento original, lo que aumenta considerablemente el tamaño del conjunto de entrenamiento.
patchSize = [41 41]; patchesPerImage = 64; dsTrain = randomPatchExtractionDatastore(upsampledImages,residualImages,patchSize, ...     "DataAugmentation",augmenter,"PatchesPerImage",patchesPerImage);
El almacén de datos resultante, , proporciona minilotes de datos a la red en cada iteración de la época.dsTrain Obtenga una vista previa del resultado de la lectura desde el almacén de datos.
inputBatch = preview(dsTrain); disp(inputBatch)
InputImage      ResponseImage      ______________    ______________      {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}     {41×41 double}    {41×41 double}
En este ejemplo se define la red VDSR mediante 41 capas individuales de Deep Learning Toolbox™, entre las que se incluyen:
- Capa de entrada de imagenimageInputLayer
- Capa de convolución 2-D para redes neuronales convolucionalesconvolution2dLayer
- Capa de unidad lineal rectificada (ReLU)reluLayer
- Capa de salida de regresión para una red neuronalregressionLayer
La primera capa, , funciona en parches de imagen.imageInputLayer El tamaño del parche se basa en el campo receptivo de la red, que es la región de imagen espacial que afecta a la respuesta de la capa superior de la red. Idealmente, el campo receptivo de red es el mismo que el tamaño de la imagen para que el campo pueda ver todas las entidades de alto nivel en la imagen. En este caso, para una red con capas convolucionales, el campo receptivo es (2 +1)-by-(2 +1).DDD
El VDSR tiene 20 capas convolucionales por lo que el campo receptivo y el tamaño del parche de imagen son 41 por 41. La capa de entrada de imagen acepta imágenes con un canal porque VDSR se entrena utilizando solo el canal de luminancia.
networkDepth = 20; firstLayer = imageInputLayer([41 41 1],'Name','InputLayer','Normalization','none');
La capa de entrada de imagen va seguida de una capa convolucional 2D que contiene 64 filtros de tamaño 3 por 3. El tamaño del minilote determina el número de filtros. Cero las entradas de cada capa convolucional para que los mapas de entidades sigan siendo del mismo tamaño que la entrada después de cada convolución. Su método [ ] inicializa los pesos en valores aleatorios para que haya asimetría en el aprendizaje de neuronas.3 Cada capa convolucional va seguida de una capa ReLU, que introduce la no linealidad en la red.
convLayer = convolution2dLayer(3,64,'Padding',1, ...     'WeightsInitializer','he','BiasInitializer','zeros','Name','Conv1');
Especifique una capa ReLU.
Las capas intermedias contienen 18 capas de unidades lineales convolucionales y rectificadas alternas. Cada capa convolucional contiene 64 filtros de tamaño 3 por 3 por 64, donde un filtro opera en una región espacial de 3 por 3 a través de 64 canales. Como antes, una capa ReLU sigue todas las capas convolucionales.
middleLayers = [convLayer relLayer]; for layerNumber = 2:networkDepth-1     convLayer = convolution2dLayer(3,64,'Padding',[1 1], ...         'WeightsInitializer','he','BiasInitializer','zeros', ...         'Name',['Conv' num2str(layerNumber)]);          relLayer = reluLayer('Name',['ReLU' num2str(layerNumber)]);     middleLayers = [middleLayers convLayer relLayer];     end
La penúltima capa es una capa convolucional con un solo filtro de tamaño 3 por 3 por 64 que reconstruye la imagen.
convLayer = convolution2dLayer(3,1,'Padding',[1 1], ...     'WeightsInitializer','he','BiasInitializer','zeros', ...     'NumChannels',64,'Name',['Conv' num2str(networkDepth)]);
La última capa es una capa de regresión en lugar de una capa ReLU. La capa de regresión calcula el error cuadrado medio entre la imagen residual y la predicción de red.
Concatenar todas las capas para formar la red VDSR.
Como alternativa, puede utilizar la función auxiliar para crear capas VDSR.vdsrLayers Esta función se adjunta al ejemplo como un archivo auxiliar.
Entrene la red utilizando el descenso de gradiente estocástico con optimización de impulso (SGDM). Especifique la configuración de hiperparámetropara SDGM mediante la función.trainingOptions La tasa de aprendizaje es inicialmente y disminuida por un factor de 10 cada 10 épocas.0.1 Entrena para 100 épocas.
Entrenar una red profunda requiere mucho tiempo. Acelere la formación especificando una alta tasa de aprendizaje. Sin embargo, esto puede hacer que los gradientes de la red exploten o crezcan incontrolablemente, evitando que la red entrene con éxito. Para mantener los degradados en un rango significativo, habilite el recorte de degradado especificando como , y especifique que desea utilizar la norma L2 de los degradados.'GradientThreshold'0.01'GradientThresholdMethod'
maxEpochs = 100; epochIntervals = 1; initLearningRate = 0.1; learningRateFactor = 0.1; l2reg = 0.0001; miniBatchSize = 64; options = trainingOptions('sgdm', ...     'Momentum',0.9, ...     'InitialLearnRate',initLearningRate, ...     'LearnRateSchedule','piecewise', ...     'LearnRateDropPeriod',10, ...     'LearnRateDropFactor',learningRateFactor, ...     'L2Regularization',l2reg, ...     'MaxEpochs',maxEpochs, ...     'MiniBatchSize',miniBatchSize, ...     'GradientThresholdMethod','l2norm', ...     'GradientThreshold',0.01, ...     'Plots','training-progress', ...     'Verbose',false);
Después de configurar las opciones de entrenamiento y el almacén de datos de extracción aleatoria de parches, entrene la red VDSR mediante la función.trainNetwork Para entrenar la red, establezca el parámetro en el código siguiente en .doTrainingtrue Una GPU NVIDIA™ compatible con CUDA con capacidad de computación 3.0 o superior es muy recomendable para el entrenamiento.
Si mantiene el parámetro en el código siguiente como , el ejemplo devuelve una red VDSR previamente entrenada que se ha entrenado para superresolver imágenes para los factores de escala 2, 3 y 4.doTrainingfalse
Nota: El entrenamiento tarda unas 6 horas en un TItán ™ NVIDIA y puede tardar aún más en función del hardware de la GPU.
doTraining = false; if doTraining     modelDateTime = datestr(now,'dd-mmm-yyyy-HH-MM-SS');     net = trainNetwork(dsTrain,layers,options);     save(['trainedVDSR-' modelDateTime '-Epoch-' num2str(maxEpochs*epochIntervals) '-ScaleFactors-' num2str(234) '.mat'],'net','options'); else     load('trainedVDSR-Epoch-100-ScaleFactors-234.mat'); end
Para realizar una sola resolución de imagen (SISR) mediante la red VDSR, siga los pasos restantes de este ejemplo. El resto del ejemplo muestra cómo:
Cree una imagen de baja resolución de ejemplo a partir de una imagen de referencia de alta resolución.
Realice SISR en la imagen de baja resolución mediante la interpolación bicúbica, una solución de procesamiento de imágenes tradicional que no se basa en el aprendizaje profundo.
Realice el SISR en la imagen de baja resolución usando la red neuronal VDSR.
Compare visualmente las imágenes de alta resolución reconstruidas mediante interpolación bicúbica y VDSR.
Evalúe la calidad de las imágenes superresueltas cuantificando la similitud de las imágenes con la imagen de referencia de alta resolución.
Cree una imagen de baja resolución que se utilizará para comparar los resultados de la superresolución mediante el aprendizaje profundo con el resultado mediante técnicas de procesamiento de imágenes tradicionales, como la interpolación bicúbica. El conjunto de datos de prueba, , contiene 21 imágenes sin distorsión enviadas en Image Processing Toolbox™.testImages Cargue las imágenes en un archivo .imageDatastore
exts = {'.jpg','.png'}; fileNames = {'sherlock.jpg','car2.jpg','fabric.png','greens.jpg','hands1.jpg','kobi.png', ...     'lighthouse.png','micromarket.jpg','office_4.jpg','onion.png','pears.png','yellowlily.jpg', ...     'indiancorn.jpg','flamingos.jpg','sevilla.jpg','llama.jpg','parkavenue.jpg', ...     'peacock.jpg','car1.jpg','strawberries.jpg','wagon.jpg'}; filePath = [fullfile(matlabroot,'toolbox','images','imdata') filesep]; filePathNames = strcat(filePath,fileNames); testImages = imageDatastore(filePathNames,'FileExtensions',exts);
Muestre las imágenes de prueba como un montaje.
Seleccione una de las imágenes que desea utilizar como imagen de referencia para la superresolución. Opcionalmente, puede utilizar su propia imagen de alta resolución como imagen de referencia.
indx = 1; % Index of image to read from the test image datastore Ireference = readimage(testImages,indx); Ireference = im2double(Ireference); imshow(Ireference) title('High-Resolution Reference Image')
Cree una versión de baja resolución de la imagen de referencia de alta resolución utilizando un factor de escala de 0,25.imresize Los componentes de alta frecuencia de la imagen se pierden durante la reducción de escala.
scaleFactor = 0.25; Ilowres = imresize(Ireference,scaleFactor,'bicubic'); imshow(Ilowres) title('Low-Resolution Image')
Una forma estándar de aumentar la resolución de la imagen sin aprendizaje profundo es utilizar la interpolación bicúbica. Amplíe la imagen de baja resolución mediante interpolación bicúbica para que la imagen de alta resolución resultante tenga el mismo tamaño que la imagen de referencia.
[nrows,ncols,np] = size(Ireference); Ibicubic = imresize(Ilowres,[nrows ncols],'bicubic'); imshow(Ibicubic) title('High-Resolution Image Obtained Using Bicubic Interpolation')
Recuerde que VDSR se entrena utilizando sólo el canal de luminancia de una imagen porque la percepción humana es más sensible a los cambios de brillo que a los cambios de color.
Convierta la imagen de baja resolución del espacio de color RGB en canales de luminancia ( ) y crominancia ( y ) utilizando la función.IyIcbIcrrgb2ycbcr
Iycbcr = rgb2ycbcr(Ilowres); Iy = Iycbcr(:,:,1); Icb = Iycbcr(:,:,2); Icr = Iycbcr(:,:,3);
Amplíe la luminancia y los dos canales de crominancia mediante interpolación bicúbica. Los canales de crominancia muestreados y , no requieren ningún procesamiento adicional.Icb_bicubicIcr_bicubic
Iy_bicubic = imresize(Iy,[nrows ncols],'bicubic'); Icb_bicubic = imresize(Icb,[nrows ncols],'bicubic'); Icr_bicubic = imresize(Icr,[nrows ncols],'bicubic');
Pase el componente de luminancia ampliado, , a través de la red VDSR entrenada.Iy_bicubic Observe la capa final desde la capa final (una capa de regresión).activations La salida de la red es la imagen residual deseada.
Iresidual = activations(net,Iy_bicubic,41); Iresidual = double(Iresidual); imshow(Iresidual,[]) title('Residual Image from VDSR')
Añada la imagen residual al componente de luminancia ampliado para obtener el componente de luminancia VDSR de alta resolución.
Concatene el componente de luminancia VDSR de alta resolución con los componentes de color ampliados. Convierta la imagen al espacio de color RGB mediante la función.ycbcr2rgb El resultado es la imagen de color de alta resolución final con VDSR.
Ivdsr = ycbcr2rgb(cat(3,Isr,Icb_bicubic,Icr_bicubic)); imshow(Ivdsr) title('High-Resolution Image Obtained Using VDSR')
Para obtener una mejor comprensión visual de las imágenes de alta resolución, examine una pequeña región dentro de cada imagen. Especifique una región de interés (ROI) utilizando vector en el formato [ ].roixywidthheight Los elementos definen la coordenada x e y de la esquina superior izquierda y la anchura y altura del ROI.
Recorte las imágenes de alta resolución a este ROI y muestre el resultado como un montaje.
montage({imcrop(Ibicubic,roi),imcrop(Ivdsr,roi)}) title('High-Resolution Results Using Bicubic Interpolation (Left) vs. VDSR (Right)');
La imagen VDSR tiene detalles más claros y bordes más nítidos.
Utilice métricas de calidad de imagen para comparar cuantitativamente la imagen de alta resolución mediante la interpolación bicúbica con la imagen VDSR. La imagen de referencia es la imagen original de alta resolución, antes de preparar la imagen de baja resolución de muestra.Ireference
Mida la relación señal-ruido pico (PSNR) de cada imagen contra la imagen de referencia. Los valores PSNR más grandes generalmente indican una mejor calidad de imagen. Consulte para obtener más información acerca de esta métrica.psnr
Mida el índice de similitud estructural (SSIM) de cada imagen. SSIM evalúa el impacto visual de tres características de una imagen: luminancia, contraste y estructura, frente a una imagen de referencia. Cuanto más cerca esté el valor de SSIM de 1, mejor estará la imagen de prueba de acuerdo con la imagen de referencia. Consulte para obtener más información acerca de esta métrica.ssim
Mida la calidad de imagen perceptiva utilizando el evaluador de calidad de imagen natural (NIQE). Las puntuaciones MÁS pequeñas de NIQE indican una mejor calidad perceptiva. Consulte para obtener más información acerca de esta métrica.niqe
Calcule el PSNR y SSIM promedio de todo el conjunto de imágenes de prueba para los factores de escala 2, 3 y 4. Para simplificar, puede utilizar la función auxiliar, , para calcular las métricas promedio.superResolutionMetrics
scaleFactors = [2 3 4]; superResolutionMetrics(net,testImages,scaleFactors);
Results for Scale factor 2  Average PSNR for Bicubic = 31.809683 Average PSNR for VDSR = 31.921784 Average SSIM for Bicubic = 0.938194 Average SSIM for VDSR = 0.949404  Results for Scale factor 3  Average PSNR for Bicubic = 28.170441 Average PSNR for VDSR = 28.563952 Average SSIM for Bicubic = 0.884381 Average SSIM for VDSR = 0.895830  Results for Scale factor 4  Average PSNR for Bicubic = 27.010839 Average PSNR for VDSR = 27.837260 Average SSIM for Bicubic = 0.861604 Average SSIM for VDSR = 0.877132
Para cada factor de escala, en comparación con la interpolación bicúbica, VDSR tiene mejores puntuaciones métricas.
Este ejemplo muestra cómo crear y entrenar una red VDSR para varios factores de escala y, a continuación, utilizar la red para mejorar la resolución de la imagen a través de la superresolución. Estos son los pasos para entrenar la red:
Descargue y preprocese los datos de entrenamiento.
Cree un que alimente los datos de entrenamiento a la red.randomPatchExtractionDatastore
Defina las capas de la red VDSR.
Especifique las opciones de entrenamiento.
Entrene la red utilizando la función.trainNetwork
Después de entrenar la red VDSR o cargar una red VDSR previamente entrenada, el ejemplo realiza la superresolución en una imagen de baja resolución. En el ejemplo se compara el resultado de VDSR con la superresolución mediante la interpolación bicúbica, que no utiliza el aprendizaje profundo. VDSR supera a la interpolación bicúbica con respecto a la calidad de imagen perceptiva y las mediciones cuantitativas de calidad.
[1] Kim, J., J. K. Lee y K. M. Lee. "Superresolución de imagen precisa utilizando redes convolucionales muy profundas." .Proceedings of the IEEE® Conference on Computer Vision and Pattern Recognition 2016, pp. 1646-1654.
[2] Grubinger, M., P. Clough, H. M.ller y T. Deselaers. "El punto de referencia IAPR TC-12: Un nuevo recurso de evaluación para sistemas de información visual." .Proceedings of the OntoImage 2006 Language Resources For Content-Based Image Retrieval Génova, Italia. 5 de mayo de 2006, pág. 10.
[3] El, K., X. Zhang, S. Ren y J. Sun. "Profundizando profundamente en rectificadores: Superar el rendimiento a nivel humano en la clasificación ImageNet." , 2015, págs. 1026-1034.Proceedings of the IEEE International Conference on Computer Vision

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución