Entrenamiento e implementación de un modelo Detectron2 personalizado para la detección de objetos mediante documentos PDF (Parte 1: Entrenamiento) |  de Noah Haglund |  noviembre de 2023

Si eres usuario de Mac o Linux, ¡estás de suerte! Este proceso será relativamente simple ejecutando el siguiente comando:

pip install torchvision && pip install "detectron2@git+https://github.com/facebookresearch/detectron2.git@v0.5#egg=detectron2"

Tenga en cuenta que este comando compilará la biblioteca, por lo que deberá esperar un poco. Si desea instalar Detectron2 con soporte para GPU, consulte el sitio web oficial de Detectron2. instrucciones de instalación para obtener información detallada.

Sin embargo, si eres un usuario de Windows, este proceso será un poco complicado, pero yo mismo pude hacerlo en Windows.

Sigue atentamente las instrucciones. establecido aquí por el paquete Layout Parser para Python (que también es un paquete útil para usar si no le interesa entrenar su propio modelo Detectron2 para la inferencia de estructura/contenido de PDF y desea confiar en datos previamente anotados. Esto ciertamente es más amigable con el tiempo , pero encontrará que con casos de uso específicos, puede entrenar un modelo mucho más preciso y más pequeño por su cuenta, lo cual es bueno para la administración de la memoria en la implementación, como discutiré más adelante). Asegúrese de instalar pycocotools, junto con Detectron2, ya que este paquete le ayudará a cargar, analizar y visualizar COCO data, el formato en el que necesitamos nuestros datos para entrenar un modelo Detectron2.

La instalación local de Detectron2 se utilizará en la Parte 2 de esta serie de artículos, ya que usaremos una instancia AWS EC2 más adelante en este artículo para la capacitación de Detectron2.

Para la anotación de imágenes, necesitamos dos cosas: (1) las imágenes que anotaremos y (2) una herramienta de anotación. Arma un directorio con todas las imágenes que deseas anotar, pero si sigues mi caso de uso y deseas usar imágenes PDF, arma un directorio de archivos PDF e instala el paquete pdftoimage:

pip install pdf2image

Y luego use el siguiente script para convertir cada página PDF en una imagen:

import os
from pdf2image import convert_from_path

# Assign input_dir to PDF dir, ex: "C://Users//user//Desktop//pdfs"
input_dir = "##"
# Assign output_dir to the dir you’d like the images to be saved"
output_dir = "##"
dir_list = os.listdir(input_dir)

index = 0
while index < len(dir_list):

images = convert_from_path(f"{input_dir}//" + dir_list[index])
for i in range(len(images)):
images[i].save(f'{output_dir}//doc' + str(index) +'_page'+ str(i) +'.jpg', 'JPEG')
index += 1

Una vez que tenga un directorio de imágenes, usaremos la herramienta LabelMe, consulte las instrucciones de instalación. aquí. Una vez instalado, simplemente ejecute el comando labelme desde la línea de comando o una terminal. Esto abrirá una ventana con el siguiente diseño:

Haga clic en la opción “Abrir directorio” en el lado izquierdo y abra el directorio donde se guardan sus imágenes (y llamemos a este directorio también “tren”). LabelMe abrirá la primera imagen en el directorio y le permitirá realizar anotaciones sobre cada una de ellas. Haga clic derecho en la imagen para encontrar varias opciones de anotaciones, como Crear polígonos para hacer clic en cada punto de un polígono alrededor de un objeto determinado en su imagen o Crear rectángulo para capturar un objeto garantizando ángulos de 90 grados.

Una vez que se haya colocado el cuadro delimitador/polígono, LabelMe le pedirá una etiqueta. En el siguiente ejemplo, proporcioné el encabezado de la etiqueta para cada una de las instancias de encabezado que se encuentran en la página. Puede usar múltiples etiquetas, identificando varios objetos que se encuentran en una imagen (para el ejemplo de PDF, esto podría ser Título/Encabezado, Tablas, Párrafos, Listas, etc.), pero para mi propósito, solo identificaré encabezados/títulos y luego algorítmicamente asociar cada encabezado con su contenido respectivo después de la inferencia del modelo (ver Parte 2).

Una vez etiquetado, haga clic en el botón Guardar y luego haga clic en Siguiente imagen para anotar la siguiente imagen en el directorio indicado. Detectron2 es excelente para detectar inferencias con datos mínimos, así que siéntase libre de anotar hasta aproximadamente 100 imágenes para el entrenamiento y las pruebas iniciales, y luego anotar y entrenar más para aumentar la precisión del modelo (tenga en cuenta que entrenar un modelo en más de una etiqueta categoría disminuirá un poco la precisión, lo que requerirá un conjunto de datos más grande para mejorar la precisión).

Una vez que se haya anotado cada imagen en el directorio del tren, tomemos aproximadamente el 20% de estos pares de imagen/anotación y los traslademos a un directorio separado etiquetado como prueba.

Si está familiarizado con el aprendizaje automático, una regla general simple es que debe haber una división prueba/entrenamiento/validación (60% a 80% de datos de entrenamiento, 10% a 20% de datos de validación y 10% a 20% de datos de prueba). Para este propósito, simplemente vamos a hacer una división prueba/entrenamiento que sea 20% prueba y 80% entrenamiento.

Ahora que tenemos nuestras carpetas de anotaciones, necesitamos convertir las anotaciones de Labelme al formato COCO. Puedes hacerlo simplemente con el archivo labelme2coco.py en el repositorio que tengo aquí. Refactoricé este script desde tony607 que convertirá ambas anotaciones de poligrama y cualquier anotación rectangular que se haya realizado (ya que el script inicial no convirtió correctamente las anotaciones rectangulares al formato COCO).

Una vez que descargue el archivo labelme2coco.py, ejecútelo en la terminal con el comando:

python labelme2coco.py path/to/train/folder

y generará un archivo train.json. Ejecute el comando por segunda vez para la carpeta de prueba y edite la línea 172 en labelme2coco.py para cambiar el nombre de salida predeterminado a test.json (de lo contrario, sobrescribirá el archivo train.json).

Ahora que el tedioso proceso de anotación ha terminado, podemos pasar a la parte divertida: ¡entrenar!

Si su computadora no viene con capacidades de GPU Nvidia, necesitaremos activar una instancia EC2 usando AWS. El modelo Detectron2 se puede entrenar en la CPU, pero si intenta esto, notará que llevará mucho tiempo, mientras que usar NVIDIA CUDA en una instancia basada en GPU entrenaría el modelo en cuestión de minutos.

Para comenzar, inicie sesión en Consola de AWS. Una vez que haya iniciado sesión, busque EC2 en la barra de búsqueda para ir al panel de EC2. Desde aquí, haga clic en Instancias en el lado izquierdo de la pantalla y luego haga clic en el botón Iniciar instancias.

El nivel mínimo de detalle que deberá proporcionar para la instancia es:

  • Un nombre
  • La imagen de la máquina de Amazon (AMI) que especifica la configuración del software. Asegúrese de usar uno con capacidades de GPU y PyTorch, ya que tendrá los paquetes necesarios para CUDA y dependencias adicionales necesarias para Detectron2, como Torch. Para seguir este tutorial, utilice también una AMI de Ubuntu. Utilicé AMI – GPU AMI de aprendizaje profundo PyTorch 2.1.0 (Ubuntu 20.04).
  • El tipo de instancia que especifica la configuración del hardware. Consulta una guía aquí sobre los distintos tipos de instancias para su referencia. Queremos utilizar una instancia de rendimiento optimizado, como una de las familias de instancias P o G. Utilicé p3.2xlarge, que viene con toda la potencia informática y, más específicamente, capacidades de GPU, que necesitaremos.

TENGA EN CUENTA: las instancias de la familia P requerirán que se comunique con el servicio de atención al cliente de AWS para obtener un aumento de cuota (ya que no permiten que los usuarios base accedan inmediatamente a instancias de mayor rendimiento debido al costo asociado). Si utiliza la instancia p3.2xlarge, deberá solicitar un aumento de cuota a 8 vCPU.

  • Especifique un Par de claves (iniciar sesión). Crea esto si aún no tienes uno y siéntete libre de nombrarlo p3key como lo hice yo.
  • Finalmente, Configurar almacenamiento. Si utilizó la misma AMI y tipo de instancia que yo, verá un almacenamiento predeterminado inicial de 45 GB. Siéntase libre de aumentar esto a alrededor de 60 GB o más según sea necesario, dependiendo del tamaño de su conjunto de datos de entrenamiento para garantizar que la instancia tenga suficiente espacio para sus imágenes.

Continúe, inicie su instancia y haga clic en el hipervínculo de identificación de la instancia para verla en el panel de EC2. Cuando la instancia se esté ejecutando, abra una ventana del símbolo del sistema y accederemos mediante SSH a la instancia EC2 usando el siguiente comando (y asegúrese de reemplazar el texto en negrita con (1) la ruta a su par de claves .pem y (2) la dirección para su instancia EC2):

ssh -L 8000:localhost:8888 -i C:\path\to\p3key.pem ubuntu@ec2id.ec2region.compute.amazonaws.com

Como se trata de un anfitrión nuevo, responda sí al siguiente mensaje:

Y luego Ubuntu comenzará junto con un entorno virtual preempaquetado llamado PyTorch (de la AMI de AWS). Active venv e inicie un cuaderno jupyter preinstalado usando los dos comandos siguientes:

Esto le devolverá URL para que las copie y pegue en su navegador. Copie el que tiene localhost en su navegador y cambie 8888 a 8000. Esto lo llevará a un Jupyter Notebook similar a este:

De mi repositorio de github, cargue el archivo Detectron2_Tutorial.ipynb en el cuaderno. Desde aquí, ejecute las líneas debajo del encabezado Instalación para instalar completamente Detectron2. Luego, reinicie el tiempo de ejecución para asegurarse de que la instalación surtió efecto.

Una vez de regreso al cuaderno reiniciado, debemos cargar algunos archivos adicionales antes de comenzar el proceso de capacitación:

  • El archivo utils.py del repositorio de github. Esto proporciona los archivos .ipynb con detalles de configuración para Detectron2 (consulte la documentación aquí como referencia si está interesado en detalles de configuración). También se incluye en este archivo un muestras_trama función a la que se hace referencia en el archivo .ipynb, pero ha sido comentado en ambos. Puede descomentar y utilizar esto para trazar los datos de entrenamiento si desea ver imágenes de las muestras durante el proceso. Tenga en cuenta que necesitará instalar cv2 más para utilizar la función plot_samples.
  • Tanto los archivos train.json como test.json que se crearon utilizando el script labelme2coco.py.
  • Un archivo zip tanto del directorio de imágenes de entrenamiento como del directorio de imágenes de prueba (comprimir los directorios le permite cargar solo un elemento en el cuaderno; puede mantener los archivos de anotaciones de etiqueta en el directorio, esto no afectará la capacitación). Una vez que se hayan cargado ambos archivos zip, abra una terminal en la computadora portátil haciendo clic en (1) Nuevo y luego en (2) Terminal en la parte superior derecha de la computadora portátil y use los siguientes comandos para descomprimir cada uno de los archivos, creando un directorio de imágenes de entrenamiento y prueba separado en el cuaderno:
! unzip ~/train.zip -d ~/
! unzip ~/test.zip -d ~/

Finalmente, ejecute las celdas del cuaderno en la sección Capacitación en el archivo .ipynb. La última celda generará respuestas similares a las siguientes:

Esto mostrará la cantidad de imágenes que se utilizan para el entrenamiento, así como el recuento de instancias que había anotado en el conjunto de datos de entrenamiento (aquí, se encontraron 470 instancias de la categoría “título” antes del entrenamiento). Luego, Detectron2 serializa los datos y los carga en lotes como se especifica en las configuraciones (utils.py).

Una vez que comience la capacitación, verá los eventos de impresión de Detectron2:

Esto le permite conocer información como: el tiempo de entrenamiento restante estimado, el número de iteraciones realizadas por Detectron2 y, lo más importante, para monitorear la precisión, total_loss, que es un índice de los otros cálculos de pérdidas, que indica qué tan mala fue la predicción del modelo. un solo ejemplo. Si la predicción del modelo es perfecta, la pérdida es cero; de lo contrario, la pérdida es mayor. ¡No te preocupes si el modelo no es perfecto! Siempre podemos agregar más datos anotados para mejorar la precisión del modelo o usar las inferencias del modelo entrenado final que tienen una puntuación alta (que indica qué tan seguro está el modelo de que una inferencia es precisa) en nuestra aplicación.

Una vez completado, se creará un directorio llamado salida en el cuaderno con un subdirectorio, detección de objetos, que contiene archivos relacionados con los eventos y métricas de entrenamiento, un archivo que registra un punto de control para el modelo y, por último, un archivo .pth titulado model_final. .pth. ¡Este es el modelo Detectron2 guardado y entrenado que ahora se puede usar para hacer inferencias en una aplicación implementada! Asegúrese de descargar esto antes de cerrar o finalizar la instancia AWS EC2.

Ahora que tenemos model_final.pth, síganos para ver un Parte 2: Implementación Artículo que cubrirá el proceso de implementación de una aplicación que utiliza Machine Learning, con algunos consejos clave sobre cómo hacer que este proceso sea eficiente.

A menos que se indique lo contrario, todas las imágenes utilizadas en este artículo son del autor.