Conjunto de datos VOC

El conjunto de datos PASCAL VOC (Visual Object Classes) es un conjunto de datos muy conocido para la detección, segmentación y clasificación de objetos. Está diseñado para fomentar la investigación en una amplia variedad de categorías de objetos y se utiliza habitualmente para comparar modelos de visión artificial. Es un conjunto de datos esencial para investigadores y desarrolladores que trabajan en tareas de detección, segmentación y clasificación de objetos.



Watch: How to Train Ultralytics YOLO26 on the Pascal VOC Dataset | Object Detection 🚀

Características clave

  • El conjunto de datos VOC incluye dos desafíos principales: VOC2007 y VOC2012.
  • El conjunto de datos comprende 20 categorías de objetos, que incluyen objetos comunes como coches, bicicletas y animales, así como categorías más específicas como barcos, sofás y mesas de comedor.
  • Las anotaciones incluyen cuadros delimitadores de objetos y etiquetas de clase para tareas de detección y clasificación de objetos, y máscaras de segmentación para las tareas de segmentación.
  • VOC proporciona métricas de evaluación estandarizadas como la mean Average Precision (mAP) para la detección y clasificación de objetos, lo que lo hace adecuado para comparar el rendimiento de los modelos.

Estructura del conjunto de datos

El conjunto de datos VOC se divide en tres subconjuntos:

  1. Train: Este subconjunto contiene imágenes para entrenar modelos de detección, segmentación y clasificación de objetos.
  2. Validation: Este subconjunto tiene imágenes utilizadas para fines de validación durante el entrenamiento del modelo.
  3. Test: Este subconjunto consiste en imágenes utilizadas para probar y comparar los modelos entrenados. Las anotaciones de verdad fundamental para este subconjunto no están disponibles públicamente, y los resultados se enviaban históricamente al servidor de evaluación de PASCAL VOC para la evaluación del rendimiento.

Aplicaciones

El conjunto de datos VOC se utiliza ampliamente para entrenar y evaluar modelos de deep learning en detección de objetos (como Ultralytics YOLO, Faster R-CNN y SSD), instance segmentation (como Mask R-CNN) y image classification. El diverso conjunto de categorías de objetos, el gran número de imágenes anotadas y las métricas de evaluación estandarizadas lo convierten en un recurso esencial para investigadores y profesionales de la computer vision.

YAML del conjunto de datos

Se utiliza un archivo YAML (Yet Another Markup Language) para definir la configuración del conjunto de datos. Contiene información sobre las rutas, clases y otra información relevante del conjunto de datos. En el caso del conjunto de datos VOC, el archivo VOC.yaml se mantiene en https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/VOC.yaml.

ultralytics/cfg/datasets/VOC.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC by University of Oxford
# Documentation: https://docs.ultralytics.com/datasets/detect/voc/
# Example usage: yolo train data=VOC.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── VOC ← downloads here (2.8 GB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: VOC
train: # train images (relative to 'path') 16551 images
  - images/train2012
  - images/train2007
  - images/val2012
  - images/val2007
val: # val images (relative to 'path') 4952 images
  - images/test2007
test: # test images (optional)
  - images/test2007

# Classes
names:
  0: aeroplane
  1: bicycle
  2: bird
  3: boat
  4: bottle
  5: bus
  6: car
  7: cat
  8: chair
  9: cow
  10: diningtable
  11: dog
  12: horse
  13: motorbike
  14: person
  15: pottedplant
  16: sheep
  17: sofa
  18: train
  19: tvmonitor

# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
  import xml.etree.ElementTree as ET
  from pathlib import Path

  from ultralytics.utils.downloads import download
  from ultralytics.utils import ASSETS_URL, TQDM

  def convert_label(path, lb_path, year, image_id):
      """Converts XML annotations from VOC format to YOLO format by extracting bounding boxes and class IDs."""

      def convert_box(size, box):
          dw, dh = 1.0 / size[0], 1.0 / size[1]
          x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]
          return x * dw, y * dh, w * dw, h * dh

      with open(path / f"VOC{year}/Annotations/{image_id}.xml") as in_file, open(lb_path, "w", encoding="utf-8") as out_file:
          tree = ET.parse(in_file)
          root = tree.getroot()
          size = root.find("size")
          w = int(size.find("width").text)
          h = int(size.find("height").text)

          names = list(yaml["names"].values())  # names list
          for obj in root.iter("object"):
              cls = obj.find("name").text
              if cls in names and int(obj.find("difficult").text) != 1:
                  xmlbox = obj.find("bndbox")
                  bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ("xmin", "xmax", "ymin", "ymax")])
                  cls_id = names.index(cls)  # class id
                  out_file.write(" ".join(str(a) for a in (cls_id, *bb)) + "\n")

  # Download
  dir = Path(yaml["path"])  # dataset root dir
  urls = [
      f"{ASSETS_URL}/VOCtrainval_06-Nov-2007.zip",  # 446MB, 5012 images
      f"{ASSETS_URL}/VOCtest_06-Nov-2007.zip",  # 438MB, 4953 images
      f"{ASSETS_URL}/VOCtrainval_11-May-2012.zip",  # 1.95GB, 17126 images
  ]
  download(urls, dir=dir / "images", threads=3, exist_ok=True)  # download and unzip over existing (required)

  # Convert
  path = dir / "images/VOCdevkit"
  for year, image_set in ("2012", "train"), ("2012", "val"), ("2007", "train"), ("2007", "val"), ("2007", "test"):
      imgs_path = dir / "images" / f"{image_set}{year}"
      lbs_path = dir / "labels" / f"{image_set}{year}"
      imgs_path.mkdir(exist_ok=True, parents=True)
      lbs_path.mkdir(exist_ok=True, parents=True)

      with open(path / f"VOC{year}/ImageSets/Main/{image_set}.txt") as f:
          image_ids = f.read().strip().split()
      for id in TQDM(image_ids, desc=f"{image_set}{year}"):
          f = path / f"VOC{year}/JPEGImages/{id}.jpg"  # old img path
          lb_path = (lbs_path / f.name).with_suffix(".txt")  # new label path
          f.rename(imgs_path / f.name)  # move image
          convert_label(path, lb_path, year, id)  # convert labels to YOLO format

Uso

Para entrenar un modelo YOLO26n en el conjunto de datos VOC durante 100 epochs con un tamaño de imagen de 640, puedes usar los siguientes fragmentos de código. Para obtener una lista completa de los argumentos disponibles, consulta la página de Training del modelo.

Ejemplo de entrenamiento
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="VOC.yaml", epochs=100, imgsz=640)

Imágenes y anotaciones de muestra

El conjunto de datos VOC contiene un conjunto diverso de imágenes con varias categorías de objetos y escenas complejas. Aquí tienes algunos ejemplos de imágenes del conjunto de datos, junto con sus anotaciones correspondientes:

Pascal VOC dataset mosaic training batch

  • Imagen en mosaico: esta imagen muestra un lote de entrenamiento compuesto por imágenes en mosaico del conjunto de datos. El mosaico es una técnica utilizada durante el entrenamiento que combina múltiples imágenes en una sola para aumentar la variedad de objetos y escenas dentro de cada lote de entrenamiento. Esto ayuda a mejorar la capacidad del modelo para generalizar a diferentes tamaños de objeto, relaciones de aspecto y contextos.

El ejemplo muestra la variedad y complejidad de las imágenes en el conjunto de datos VOC y los beneficios de usar mosaicos durante el proceso de entrenamiento.

Citas y reconocimientos

Si utilizas el conjunto de datos VOC en tu trabajo de investigación o desarrollo, por favor cita el siguiente artículo:

Cita
@misc{everingham2010pascal,
      title={The PASCAL Visual Object Classes (VOC) Challenge},
      author={Mark Everingham and Luc Van Gool and Christopher K. I. Williams and John Winn and Andrew Zisserman},
      year={2010},
      eprint={0909.5206},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Nos gustaría agradecer al Consorcio PASCAL VOC por crear y mantener este valioso recurso para la comunidad de computer vision. Para obtener más información sobre el conjunto de datos VOC y sus creadores, visita el sitio web del conjunto de datos PASCAL VOC.

Preguntas frecuentes

¿Qué es el conjunto de datos PASCAL VOC y por qué es importante para las tareas de visión artificial?

El conjunto de datos PASCAL VOC (Visual Object Classes) es un punto de referencia reconocido para la object detection, segmentación y clasificación en visión artificial. Incluye anotaciones completas como cuadros delimitadores, etiquetas de clase y máscaras de segmentación en 20 categorías de objetos diferentes. Los investigadores lo utilizan ampliamente para evaluar el rendimiento de modelos como Faster R-CNN, YOLO y Mask R-CNN debido a sus métricas de evaluación estandarizadas, como la mean Average Precision (mAP).

¿Cómo entreno un modelo YOLO26 usando el conjunto de datos VOC?

Para entrenar un modelo YOLO26 con el conjunto de datos VOC, necesitas la configuración del conjunto de datos en un archivo YAML. Aquí tienes un ejemplo para empezar a entrenar un modelo YOLO26n durante 100 épocas con un tamaño de imagen de 640:

Ejemplo de entrenamiento
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="VOC.yaml", epochs=100, imgsz=640)

¿Cuáles son los desafíos principales incluidos en el conjunto de datos VOC?

El conjunto de datos VOC incluye dos desafíos principales: VOC2007 y VOC2012. Estos desafíos ponen a prueba la detección de objetos, la segmentación y la clasificación en 20 categorías de objetos diversas. Cada imagen está meticulosamente anotada con cuadros delimitadores, etiquetas de clase y máscaras de segmentación. Los desafíos proporcionan métricas estandarizadas como mAP, lo que facilita la comparación y evaluación comparativa de diferentes modelos de visión artificial.

¿Cómo mejora el conjunto de datos PASCAL VOC la evaluación comparativa y el rendimiento de los modelos?

El conjunto de datos PASCAL VOC mejora la evaluación comparativa y el rendimiento de los modelos a través de sus anotaciones detalladas y métricas estandarizadas como la mean Average Precision (mAP). Estas métricas son cruciales para evaluar el rendimiento de los modelos de detección y clasificación de objetos. Las imágenes diversas y complejas del conjunto de datos aseguran una evaluación integral del modelo en diversos escenarios del mundo real.

¿Cómo uso el conjunto de datos VOC para semantic segmentation en modelos YOLO?

Para usar el conjunto de datos VOC para tareas de segmentación semántica con modelos YOLO, debes configurar correctamente el conjunto de datos en un archivo YAML. El archivo YAML define las rutas y clases necesarias para entrenar modelos de segmentación. Consulta el archivo de configuración YAML del conjunto de datos VOC en VOC.yaml para obtener configuraciones detalladas. Para tareas de segmentación, usarías un modelo específico de segmentación como yolo26n-seg.pt en lugar del modelo de detección.

Comentarios