Descargar, preprocesar y subir el conjunto de datos ImageNet

En este documento se describe cómo descargar, preprocesar y subir el conjunto de datos ImageNet para usarlo con la arquitectura de máquina virtual de TPU de Cloud.

ImageNet es una base de datos de imágenes. Las imágenes de la base de datos se organizan en una jerarquía, donde cada nodo está representado por cientos de miles de imágenes.

El tamaño de la base de datos ImageNet implica que se puede tardar bastante en entrenar un modelo. Otra opción es usar una versión de demostración del conjunto de datos, denominada fake_imagenet. Esta versión de demostración te permite probar el modelo y, al mismo tiempo, reducir los requisitos de almacenamiento y tiempo asociados al uso de la base de datos completa de ImageNet.

Preprocesar el conjunto de datos completo de ImageNet

El conjunto de datos ImageNet consta de tres partes: datos de entrenamiento, datos de validación y etiquetas de imagen.

Los datos de entrenamiento contienen 1000 categorías y 1,2 millones de imágenes, empaquetados para su descarga. Los datos de validación y de prueba no se incluyen en los datos de entrenamiento de ImageNet (se han eliminado los duplicados).

Los datos de validación y de prueba constan de 150.000 fotografías recogidas de Flickr y otros buscadores, etiquetadas manualmente con la presencia o ausencia de 1000 categorías de objetos. Las 1000 categorías de objetos contienen nodos internos y nodos hoja de ImageNet, pero no se solapan entre sí. Se ha publicado un subconjunto aleatorio de 50.000 imágenes con etiquetas como datos de validación,junto con una lista de las 1000 categorías. Las imágenes restantes se usan para la evaluación y se han publicado sin etiquetas.

Pasos para preprocesar el conjunto de datos completo de ImageNet

Para preparar el conjunto de datos completo de ImageNet para que lo use un modelo de aprendizaje automático, debes seguir cinco pasos:

  1. Comprueba que tienes espacio en el destino de descarga.
  2. Configura los directorios de destino.
  3. Regístrate en el sitio de ImageNet y solicita permiso para descargar.
  4. Descarga el conjunto de datos en un disco local o en una instancia de VM.

  5. Ejecuta la secuencia de comandos de preprocesamiento y subida.

Verificar los requisitos de espacio

Tanto si descargas el conjunto de datos en tu máquina local como en una instancia de VM, necesitas unos 300 GiB de espacio disponible en el destino de descarga.

La asignación de disco predeterminada para una máquina virtual de TPU es de 100 GiB. Como la descarga en tu VM de TPU requiere 300 GiB, si vas a descargarla en tu instancia de VM de TPU, tendrás que añadir un volumen de almacenamiento en bloques duradero con 200 GiB de espacio adicional para completar la descarga. En una VM de TPU, puedes consultar el espacio de almacenamiento disponible con el comando df -ha. Para obtener más información sobre cómo cambiar el tamaño de los discos adjuntos, consulta Modificar los ajustes de un volumen de Hyperdisk de Google Cloud y Aumentar el tamaño de un volumen de disco persistente.

Cuando añadas almacenamiento en bloque duradero, anota el directorio en el que has montado el disco. Por ejemplo: /mnt/disks/mnt-dir.

Configurar los directorios de destino

En tu máquina local o instancia de VM, configura la estructura de directorios para almacenar los datos descargados.

  1. Cambia al directorio en el que quieras descargar los datos. Si utilizas un disco persistente, sustituye DATASET_ROOT_DIR por el directorio en el que se ha montado el disco. Por ejemplo, /mnt/disks/mnt-dir:

    cd DATASET_ROOT_DIR
  2. Crea un directorio, por ejemplo, imagenet, en el destino de descarga (máquina local o VM de TPU).

    mkdir imagenet
    
  3. En este directorio, crea dos subdirectorios: train y validation.

    mkdir imagenet/train
    mkdir imagenet/validation
    
  4. Exporta el directorio imagenet como IMAGENET_HOME.

    export IMAGENET_HOME=DATASET_ROOT_DIR/imagenet
    sudo chown ${USER} ${IMAGENET_HOME}

Regístrate y solicita permiso para descargar el conjunto de datos

Regístrate en el sitio web de ImageNet. No podrás descargar el conjunto de datos hasta que ImageNet confirme tu registro y te envíe un correo de confirmación. Si no recibes el correo de confirmación en un par de días, ponte en contacto con el equipo de Asistencia de ImageNet para saber por qué no se ha confirmado tu registro. Una vez que se haya confirmado tu registro, podrás descargar el conjunto de datos. En los tutoriales de TPU de Cloud que usan el conjunto de datos ImageNet, se utilizan las imágenes del concurso ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC2012).

Descargar el conjunto de datos ImageNet

  1. En el sitio de descarga de LSRVC 2012, vaya a la sección Imágenes de la página y haga clic con el botón derecho en "Training images (Task 1 & 2)" [Imágenes de entrenamiento (tarea 1 y 2)]. URL para descargar la parte más grande del conjunto de entrenamiento. Guarda la URL.

    Haz clic con el botón derecho en "Training images (Task 3)" para obtener la URL del segundo conjunto de entrenamiento. Guarda la URL.

    Haz clic con el botón derecho en "Validation images (all tasks)" para obtener la URL del conjunto de datos de validación. Guarda la URL.

    Si descargas los archivos de ImageNet en tu máquina local, debes copiar los directorios de tu máquina local en el directorio $IMAGENET_HOME correspondiente de tu instancia de VM. Copiar el conjunto de datos ImageNet del host local a tu instancia de VM lleva aproximadamente 13 horas.

    Antes de copiar el conjunto de datos de ImageNet en tu VM de TPU, debes identificar el nombre de tu instancia de VM de TPU. Para ello, conéctate a tu VM de TPU mediante SSH. El nombre de la instancia de VM se muestra en el símbolo del sistema después del símbolo @.

    Usa el siguiente comando para copiar los archivos de ~/imagenet en tu máquina local a $IMAGENET_HOME en tu VM.

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
  2. En $IMAGENET_HOME, descarga los archivos "Training images (Task 1 & 2)" (Imágenes de entrenamiento [Tareas 1 y 2]) con la URL guardada.

    El archivo "Training images (Task 1 & 2)" es el conjunto de entrenamiento grande. Tiene un tamaño de 138 GiB y, si la descargas en tu VM de TPU mediante Cloud Shell, tardará aproximadamente 40 horas. Si Cloud Shell pierde la conexión con la máquina virtual, puedes añadir nohup al principio del comando o usar screen.

    cd $IMAGENET_HOME
    nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar

    Sustituye la URL por la que guardaste anteriormente para "Imágenes de entrenamiento (tarea 1 y 2)", ya que es posible que haya cambiado.

  3. Extrae los directorios de formación individuales en el directorio $IMAGENET_HOME/train con el siguiente comando. La extracción tarda entre 1 y 3 horas.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train

    Extrae los archivos tar de entrenamiento individuales que se encuentran en el directorio $IMAGENET_HOME/train, tal como se muestra en la siguiente secuencia de comandos:

    cd $IMAGENET_HOME/train

    for f in *.tar; do d=basename $f .tar mkdir $d tar xf $f -C $d done

    Elimina los archivos tar después de extraerlos para liberar espacio en disco.

  4. En $IMAGENET_HOME, descarga los archivos "Training images (Task 3)" con la URL guardada.

    El archivo "Training images (Task 3)" tiene un tamaño de 728 MB y se descarga en pocos minutos, por lo que no es necesario que tomes precauciones para evitar que se pierda la conexión de Cloud Shell.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar

    Sustituye la URL por la que guardaste anteriormente para "Imágenes de entrenamiento (tarea 3)", ya que es posible que haya cambiado.

  5. Extrae los directorios de formación individuales en el directorio $IMAGENET_HOME/train con el siguiente comando.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train

    Extrae los archivos tar de entrenamiento individuales que se encuentran en el directorio $IMAGENET_HOME/train, tal como se muestra en la siguiente secuencia de comandos:

    cd ${IMAGENET_HOME}/train
    
    for f in *.tar; do
        d=`basename $f .tar`
        mkdir $d
        tar xf $f -C $d
    done

    Elimina los archivos tar después de extraerlos para liberar espacio en disco.

  6. En $IMAGENET_HOME, descarga los archivos "Validation images (all tasks)" (Imágenes de validación [todas las tareas]) con la URL guardada.

    Al descargar el archivo "Validation images (all tasks)", es posible que se desconecte Cloud Shell. Puedes usar nohup o pantalla para evitar que Cloud Shell se desconecte.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar

    Sustituye la URL por la que guardaste anteriormente en "Validation images (all tasks)", ya que puede haber cambiado.

    La descarga tarda unos 30 minutos.

  7. Extrae los archivos de validación individuales en el directorio $IMAGENET_HOME/validation con el siguiente comando.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation

    Si has descargado los archivos de validación en tu máquina local, debes copiar el directorio $IMAGENET_HOME/validation de tu máquina local en el directorio $IMAGENET_HOME/validation de tu instancia de VM. Esta operación de copia tarda unos 30 minutos.

  8. Descarga el archivo de etiquetas.

    wget -O $IMAGENET_HOME/synset_labels.txt \
    https://raw.githubusercontent.com/tensorflow/models/master/research/slim/datasets/imagenet_2012_validation_synset_labels.txt

    Si has descargado el archivo de etiquetas en tu máquina local, debes copiarlo en el directorio $IMAGENET_HOME de tu máquina local y, a continuación, en $IMAGENET_HOME de tu instancia de VM. Esta operación de copia tarda unos segundos.

    Los nombres de los subdirectorios de entrenamiento (por ejemplo, n03062245) son "IDs de WordNet" (wnid). La API ImageNet muestra la asignación de IDs de WordNet a sus etiquetas de validación asociadas en el archivo synset_labels.txt. En este contexto, un conjunto de sinónimos es un grupo de imágenes visualmente similares.

Procesar el conjunto de datos de ImageNet y, opcionalmente, subirlo a Cloud Storage

  1. Descarga la secuencia de comandos imagenet_to_gcs.py de GitHub:

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
  2. Si vas a subir el conjunto de datos a Cloud Storage:

    1. Utiliza un segmento que ya tengas o crea uno siguiendo las instrucciones de Crear segmentos.

    2. Especifica la ubicación del segmento de almacenamiento en el que se subirá el conjunto de datos ImageNet:

      export STORAGE_BUCKET=gs://bucket-name
  3. Si vas a subir el conjunto de datos a tu máquina local o a tu VM, especifica un directorio de datos para alojarlo:

    (vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
  4. Instala las siguientes bibliotecas en tu máquina o en un entorno virtual:

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. Ejecuta la secuencia de comandos para preprocesar el conjunto de datos sin procesar como TFRecords y súbelo a Cloud Storage con el siguiente comando:

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$STORAGE_BUCKET  \
      --raw_data_dir=$IMAGENET_HOME \
      --local_scratch_dir=$IMAGENET_HOME/tf_records

La secuencia de comandos genera un conjunto de directorios (tanto para el entrenamiento como para la validación) con el siguiente formato:

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024

y

${DATA_DIR}/validation-00000-of-00128
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

Una vez que los datos se hayan subido a tu depósito de Cloud, ejecuta el modelo y define --data_dir=${DATA_DIR}.