Buscar..


Preparar conjunto de datos de imagen para la tarea de clasificación de imágenes

Caffe tiene una capa de entrada incorporada adaptada para las tareas de clasificación de imágenes (es decir, una etiqueta entera única por imagen de entrada). Esta capa de "Data" entrada se basa en una estructura de datos o . Para usar la capa "Data" , se debe construir la estructura de datos con todos los datos de entrenamiento.

Una guía rápida de convert_imageset de Caffe

Construir

Lo primero que debes hacer es crear las herramientas de caffe y caffe ( convert_imageset es una de estas herramientas).
Después de instalar caffe y make de que también ejecutó make tools .
Verifique que se haya creado un archivo binario convert_imageset en $CAFFE_ROOT/build/tools .

Prepara tus datos

Imágenes: ponga todas las imágenes en una carpeta (lo llamaré aquí /path/to/jpegs/ ).
Etiquetas: cree un archivo de texto (por ejemplo, /path/to/labels/train.txt ) con una línea por imagen de entrada <ruta / a / archivo>. Por ejemplo:

img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0

En este ejemplo, la primera imagen está etiquetada como 1 mientras que las otras dos están etiquetadas como 0 .

Convertir el conjunto de datos

Ejecutar el binario en shell

~$ GLOG_logtostderr=1 $CAFFE_ROOT/build/tools/convert_imageset \
    --resize_height=200 --resize_width=200 --shuffle  \
    /path/to/jpegs/ \
    /path/to/labels/train.txt \
    /path/to/lmdb/train_lmdb

Línea de comando explicada:

  • GLOG_logtostderr indicador GLOG_logtostderr se establece en 1 antes de llamar a convert_imageset indica el mecanismo de registro para redirigir los mensajes de registro a stderr.
  • --resize_height y --resize_width redimensionan todas las imágenes de entrada al mismo tamaño 200x200 .
  • --shuffle cambia aleatoriamente el orden de las imágenes y no conserva el orden en el archivo /path/to/labels/train.txt .
  • A continuación se muestra la ruta a la carpeta de imágenes, el archivo de texto de etiquetas y el nombre de salida. Tenga en cuenta que el nombre de salida no debería existir antes de llamar a convert_imageset contrario, convert_imageset un mensaje de error de miedo.

Otras banderas que podrían ser útiles:

  • --backend - le permite elegir entre un lmdb conjunto de datos o levelDB .
  • --gray - convierte todas las imágenes a escala de grises.
  • --encoded y --encoded_type - mantienen los datos de la imagen en formato comprimido (jpg / png) en la base de datos.
  • --help - muestra ayuda, vea todos los indicadores relevantes en Indicadores de tools / convert_imageset.cpp

Puede consultar $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh para ver un ejemplo de cómo usar convert_imageset .

ver este hilo para más información.

Preparar datos arbitrarios en formato HDF5.

Además de los conjuntos de datos de clasificación de imágenes , Caffe también tiene "HDF5Data" capa "HDF5Data" para entradas arbitrarias. Esta capa requiere que todos los datos de capacitación / validación se almacenen en archivos en formato .
Este ejemplo muestra cómo usar el módulo h5py Python para construir dicho archivo hdf5 y cómo configurar la capa "HDF5Data" caffe para leer ese archivo.

Construye el archivo binario hdf5

Suponiendo que tiene un archivo de texto 'train.txt' con cada línea con un nombre de archivo de imagen y un único número de punto flotante para ser utilizado como objetivo de regresión.

import h5py, os
import caffe
import numpy as np

SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
    lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' ) 
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
    sp = l.split(' ')
    img = caffe.io.load_image( sp[0] )
    img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
    # you may apply other input transformations here...
    # Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
    X[i] = img
    y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
    H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
    H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
    L.write( 'train.h5' ) # list all h5 files you are going to use

Configurando la capa "HDF5Data"

Una vez que tenga todos los archivos h5 y los archivos de prueba correspondientes que los enumeran, puede agregar una capa de entrada HDF5 a su train_val.prototxt :

 layer {
   type: "HDF5Data"
   top: "X" # same name as given in create_dataset!
   top: "y"
   hdf5_data_param {
     source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
     batch_size: 32
   }
   include { phase:TRAIN }
 }

Puedes encontrar más información aquí y aquí .


Como se muestra arriba, pasamos a Caffe una lista de archivos HDF5. Esto se debe a que en la versión actual hay un límite de tamaño de 2 GB para un solo archivo de datos HDF5. Entonces, si los datos de entrenamiento superan los 2 GB, tendremos que dividirlos en archivos separados.

Si un solo archivo de datos HDF5 supera los 2 GB, aparecerá un mensaje de error como

Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX

Si la cantidad total de datos es inferior a 2 GB, ¿dividiremos los datos en archivos separados o no?

De acuerdo con un comentario en el código fuente de Caffe , un solo archivo sería mejor,

Si shuffle == true, el orden de los archivos HDF5 se baraja, y el orden de los datos dentro de cualquier archivo HDF5 dado se barajan, pero los datos entre archivos diferentes no se intercalan.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow