¿Es posible ejecutar modelos de caffe en el conjunto de datos que no se almacena en la fuente de datos como LMDB?

Tengo 2 conjuntos de datos de parches de imagen, es decir, conjuntos de entrenamiento y pruebas. Ambos de estos han sido escritos en archivos LMDB. Estoy ejecutando una neural network convolucional en estos datos usando Caffe.

El problema es que los datos almacenados en el disco duro ocupan una cantidad de espacio considerable y obstaculizan mis esfuerzos por introducir más datos de entrenamiento con una adición de ruido deliberada para hacer que mi modelo sea más robusto.

¿Hay alguna forma de enviar parches de imagen desde mi progtwig directamente a la CNN (en Caffe) sin almacenarlos en LMDB? Actualmente estoy usando python para generar parches de las imágenes para el conjunto de datos de entrenamiento.

Puedes escribir tu propia capa de datos de python. Vea las discusiones aquí y la implementación de la capa de datos de entrada para el flujo de video aquí .

Básicamente necesitará agregar a su capa de descripción de red como:

 layer { type: 'Python' name: 'data' top: 'data' top: 'label' python_param { # the module name -- usually the filename -- that needs to be in $PYTHONPATH module: 'filename' # the layer name -- the class name in the module layer: 'CustomInputDataLayer' } } 

e implementar la interfaz de capa en Python:

 class CustomInputDataLayer(caffe.Layer): def setup(self): ... def reshape(self, bottom, top) top[0].reshape(BATCH_SIZE, your_data.shape) top[1].reshape(BATCH_SIZE, your_label.shape) def forward(self, bottom, top): # assign output top[0].data[...] = your_data top[1].data[...] = your_label def backward(self, top, propagate_down, bottom): pass 

Además de definir capas de python personalizadas, puede usar las siguientes opciones:

  • use la capa ImageData : tiene un parámetro de origen (fuente: nombre de un archivo de texto, con cada línea que da un nombre de archivo y una etiqueta a la imagen)

  • use la capa MemoryData : mediante la cual puede cargar imágenes de entrada directamente desde la memoria a su red usando el método ‘setinputarrays’ en python. Tenga cuidado al usar esta capa, ya que solo acepta tags que son valores únicos y no puede usar imágenes como tags (por ejemplo, en la segmentación semántica)

  • usa una versión de despliegue de tu red como esta:

     input: "data" input_shape { dim: n # batch size dim: c # number of channels dim: r # image size1 dim: w # image size2 } input: "label" input_shape { dim: n # batch size dim: c # number of channels dim: r # label image size1 dim: w # label image size2 } ... #your other layers to follow 
  • use una capa de entrada HDF5 (más o menos ine lmdb, pero lmdb es más computacionalmente eficiente)

Puede encontrar los detalles de estas capas aquí: http://caffe.berkeleyvision.org/tutorial/layers.html

Hay ejemplos disponibles en línea también.