La preparación del conjunto de datos para un flujo de trabajo de capacitación de detección de objetos puede llevar mucho tiempo y, a menudo, ser frustrante. Estudio de etiquetauna herramienta de anotación de datos de código abierto, puede darle una mano al proporcionar una manera fácil de anotar conjuntos de datos. Admite una amplia variedad de plantillas de anotación, incluida la visión por computadora, el procesamiento del lenguaje natural y el procesamiento de audio o habla. Sin embargo, nos centraremos específicamente en el flujo de trabajo de detección de objetos.
Pero, ¿qué pasa si desea aprovechar los conjuntos de datos de código abierto pre-anotados, como el conjunto de datos PASCAL VOC? En este artículo, le mostraré cómo importar fácilmente esas tareas en el formato de Label Studio mientras se configuran toda la pila, incluida una base de datos PostgreSQL, Minio Almacenamiento de objetos, un proxy inverso de Nginx y el backend del estudio de etiqueta. Minio es un servicio de almacenamiento de objetos compatible con S3: puede usar el almacenamiento nativo de la nube en la producción, pero también puede ejecutarlo localmente para el desarrollo y las pruebas.
En este tutorial, seguiremos los siguientes pasos:
- Convertir anotaciones de VOC Pascal – Transforme los cuadros delimitadores de XML en tareas de estudio de etiquetas en formato JSON.
- Ejecute la pila completa – Inicie el estudio de etiqueta con PostgreSQL, Minio, Nginx y el backend usando Docker Compose.
- Configure un proyecto de estudio de etiqueta – Configure un nuevo proyecto dentro de la interfaz Etiqueta de estudio.
- Cargar imágenes y tareas a minio -Almacene su conjunto de datos en un cubo compatible con S3.
- Conectar minio a etiquetar estudio – Agregue el cubo de almacenamiento en la nube a su proyecto para que Label Studio pueda obtener imágenes y anotaciones directamente.
Requisitos previos
Para seguir este tutorial, asegúrese de tener:
De VOC a ELETRO ESTUDIO: Preparación de anotaciones
El conjunto de datos PASCAL VOC tiene una estructura de carpetas donde los conjuntos de datos de tren y prueba ya están divididos. El Anotaciones La carpeta contiene los archivos de anotación para cada imagen. En total, el conjunto de capacitación incluye 17.125 imágenes, cada una con un archivo de anotación correspondiente.
.
└── VOC2012
├── Annotations # 17125 annotations
├── ImageSets
│ ├── Action
│ ├── Layout
│ ├── Main
│ └── Segmentation
├── JPEGImages # 17125 images
├── SegmentationClass
└── SegmentationObject
El fragmento XML a continuación, tomado de una de las anotaciones, define un cuadro delimitador alrededor de un objeto etiquetado como “persona”. El cuadro se especifica utilizando cuatro coordenadas de píxeles: xmin, ymin, xmaxy ymax.
La siguiente ilustración muestra el rectángulo interno como el cuadro delimitador anotado, definido por la esquina superior izquierda (xmin, ymin) y la esquina inferior derecha (xmax, ymax), dentro del rectángulo externo que representa la imagen.
Label Studio espera que cada cuadro delimitador se define por su ancho, altura y esquina superior izquierda, expresada como porcentajes del tamaño de la imagen. A continuación se muestra un ejemplo de trabajo del formato JSON convertido para la anotación que se muestra arriba.
{
"data": {
"image": "s3://<bucket_name>/<prefix>/2007_000027.jpg"
},
"annotations": [
{
"result": [
{
"from_name": "label",
"to_name": "image",
"type": "rectanglelabels",
"value": {
"x": 35.802,
"y": 20.20,
"width": 36.01,
"height": 50.0,
"rectanglelabels": ["person"]
}
}
]
}
]
}
Como puede ver en el formato JSON, también debe especificar la ubicación del archivo de imagen, por ejemplo, una ruta en minio o un cubo S3 si está utilizando el almacenamiento en la nube.
Al preprocesar los datos, fusioné todo el conjunto de datos, a pesar de que ya estaba dividido en capacitación y validación. Esto simula un escenario del mundo real en el que normalmente comienza con un solo conjunto de datos y realiza la división en el entrenamiento y la validación, se establece antes del entrenamiento.
Ejecutando la pila completa con Docker Compose
Fusioné el docker-compose.yml y docker-compose.minio.yml archivos en una configuración única simplificada para que toda la pila pueda ejecutarse en la misma red. Ambos archivos fueron tomados del funcionario Repositorio de sello Studio Github.
services:
nginx:
# Acts as a reverse proxy for Label Studio frontend/backend
image: heartexlabs/label-studio:latest
restart: unless-stopped
ports:
- "8080:8085"
- "8081:8086"
depends_on:
- app
environment:
- LABEL_STUDIO_HOST=${LABEL_STUDIO_HOST:-}
volumes:
- ./mydata:/label-studio/data:rw # Stores Label Studio projects, configs, and uploaded files
command: nginx
app:
stdin_open: true
tty: true
image: heartexlabs/label-studio:latest
restart: unless-stopped
expose:
- "8000"
depends_on:
- db
environment:
- DJANGO_DB=default
- POSTGRE_NAME=postgres
- POSTGRE_USER=postgres
- POSTGRE_PASSWORD=
- POSTGRE_PORT=5432
- POSTGRE_HOST=db
- LABEL_STUDIO_HOST=${LABEL_STUDIO_HOST:-}
- JSON_LOG=1
volumes:
- ./mydata:/label-studio/data:rw # Stores Label Studio projects, configs, and uploaded files
command: label-studio-uwsgi
db:
image: pgautoupgrade/pgautoupgrade:13-alpine
hostname: db
restart: unless-stopped
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
- POSTGRES_USER=postgres
volumes:
- ${POSTGRES_DATA_DIR:-./postgres-data}:/var/lib/postgresql/data # Persistent storage for PostgreSQL database
minio:
image: "minio/minio:${MINIO_VERSION:-RELEASE.2025-04-22T22-12-26Z}"
command: server /data --console-address ":9009"
restart: unless-stopped
ports:
- "9000:9000"
- "9009:9009"
volumes:
- minio-data:/data # Stores uploaded dataset objects (like images or JSON tasks)
# configure env vars in .env file or your systems environment
environment:
- MINIO_ROOT_USER=${MINIO_ROOT_USER:-minio_admin_do_not_use_in_production}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minio_admin_do_not_use_in_production}
- MINIO_PROMETHEUS_URL=${MINIO_PROMETHEUS_URL:-http://prometheus:9090}
- MINIO_PROMETHEUS_AUTH_TYPE=${MINIO_PROMETHEUS_AUTH_TYPE:-public}
volumes:
minio-data: # Named volume for MinIO object storage
Este archivo de composición de Docker simplificado define cuatro servicios principales con sus asignaciones de volumen:
Aplicación – Ejecuta el backend del estudio de etiqueta.
- Comparte el
mydataDirectorio con NGINX, que almacena proyectos, configuraciones y archivos cargados. - Usa un montar atar:
./mydata:/label-studio/data:rw→ Mapea una carpeta de su host en el contenedor.
Nginx – Actúa como un proxy inverso para el sello Studio Frontend and Backend.
- Comparte el
mydataDirectorio con el servicio de aplicación.
PostgreSQL (DB) – Maneja metadatos y información del proyecto.
- Almacena archivos de base de datos persistentes.
- Usa un montar atar:
${POSTGRES_DATA_DIR:-./postgres-data}:/var/lib/postgresql/data.
Minio -Un servicio de almacenamiento de objetos compatible con S3.
- Almacena objetos de conjunto de datos como imágenes o tareas de anotación JSON.
- Usa un Volumen llamado:
minio-data:/data.
Cuando monta carpetas de host como ./mydata y ./postgres-datadebe asignar la propiedad del host al mismo usuario que se ejecuta dentro del contenedor. Label Studio no se ejecuta como root: utiliza un usuario no raíz con Uid 1001. Si los directorios de host son propiedad de un usuario diferente, el contenedor no tendrá acceso de escritura y se encontrará con permiso denegado errores.
Después de crear estas carpetas en el directorio de su proyecto, puede ajustar su propiedad con:
mkdir mydata
mkdir postgres-data
sudo chown -R 1001:1001 ./mydata ./postgres-data
Ahora que los directorios están preparados, podemos mencionar la pila usando Docker Compose. Simplemente ejecute:
docker compose up -d
Puede tomar unos minutos extraer todas las imágenes requeridas de Docker Hub y configurar Label Studio. Una vez que se complete la configuración, abra http: // localhost: 8080 en su navegador para acceder a la interfaz de estudio de etiqueta. Debe crear una nueva cuenta, y luego puede iniciar sesión con sus credenciales para acceder a la interfaz. Puedes habilitar un token de API heredado yendo a Organización → Configuración de token API. Este token le permite comunicarse con la API Etiqueta Studio, que es especialmente útil para las tareas de automatización.
Configure un proyecto de estudio de etiqueta
Ahora podemos crear nuestro primer proyecto de anotación de datos en Label Studio, específicamente para un flujo de trabajo de detección de objetos. Pero antes de comenzar a anotar sus imágenes, debe definir los tipos de clases para elegir. En el conjunto de datos PASCAL VOC, hay 20 tipos de objetos pre-anotados.
Cargar imágenes y tareas a minio
Puede abrir la minio interfaz de usuario en su navegador en Localhost: 9000y luego inicie sesión utilizando las credenciales que especificó bajo el servicio relevante en el docker-compose.yml archivo.
Creé un cubo con carpetas, una de las cuales se usa para almacenar imágenes y otra para tareas JSON formateadas de acuerdo con las instrucciones anteriores.
Configuramos un servicio similar a S3 localmente que nos permite simular el almacenamiento de la nube S3 sin incurrir en ningún cargo. Si desea transferir archivos a un cubo S3 en AWS, es mejor hacerlo directamente a través de Internet, considerando los costos de transferencia de datos. La buena noticia es que también puedes interactuar con tu minio cubo usando el AWS CLI. Para hacer esto, debe agregar un perfil en ~/.aws/config y proporcionar las credenciales correspondientes en ~/.aws/credentials bajo el mismo nombre de perfil.
Y luego, puede sincronizar fácilmente con su carpeta local usando los siguientes comandos:
#!/bin/bash
set -e
PROFILE=<your_profile_name>
MINIO_ENDPOINT=<your_minio_endpoint> # e.g. http://localhost:9000
BUCKET_NAME=<your_bucket_name>
SOURCE_DIR=<your_local_source_dir>
DEST_DIR=<your_bucket_destination_dir>
aws s3 sync \
--endpoint-url "$MINIO_ENDPOINT" \
--no-verify-ssl \
--profile "$PROFILE" \
"$SOURCE_DIR" "s3://$BUCKET_NAME/$DEST_DIR"
Conectar minio a etiquetar estudio
Después de que todos los datos, incluidas las imágenes y las anotaciones, se han cargado, podemos pasar a agregar almacenamiento en la nube al proyecto que creamos en el paso anterior.
Desde la configuración de su proyecto, vaya a Almacenamiento en la nube y agregue los parámetros requeridos, como el punto final (que apunta al nombre del servicio en la pila Docker junto con el número de puerto, por ejemplo, minio:9000), el nombre del cubo y el prefijo relevante donde se almacenan los archivos de anotación. Cada ruta dentro de los archivos JSON apuntará a la imagen correspondiente.
Después de verificar que la conexión está funcionando, puede sincronizar su proyecto con el almacenamiento en la nube. Es posible que deba ejecutar el comando Sync varias veces ya que el conjunto de datos contiene 22,263 imágenes. Puede parecer fallar al principio, pero cuando reinicie la sincronización, continúa progresando. Eventualmente, todos los datos de Pascal VOC se importarán con éxito a Label Studio.
Puede ver las tareas importadas con sus imágenes en miniatura en la lista de tareas. Cuando haga clic en una tarea, la imagen aparecerá con sus preanotaciones.
Conclusiones
En este tutorial, demostramos cómo importar el conjunto de datos Pascal VOC en Label Studio convirtiendo las anotaciones XML en el formato JSON de Label Studio, ejecutando una pila completa con Docker Compose y conectando Minio como almacenamiento compatible con S3. Esta configuración le permite trabajar con conjuntos de datos pre-anotados a gran escala de una manera reproducible y rentable, todo en su máquina local. Probar la configuración de su proyecto y los formatos de archivo localmente primero garantizarán una transición más suave cuando se mueva a los entornos de la nube.
Espero que este tutorial lo ayude a iniciar su proyecto de anotación de datos con datos pre-anotados que puede expandir o validar fácilmente. Una vez que su conjunto de datos esté listo para la capacitación, puede exportar todas las tareas en formatos populares como Coco o Yolo.