Un artículo resuelve por completo el problema de que no se encuentran etiquetas en el entrenamiento de YOLOv5

El entrenamiento de YOLOv5 no puede encontrar etiquetas. No se encontraron etiquetas en la solución del problema /path/train.cache (disponible para pruebas personales)

❤️ La mayoría de las soluciones descritas en los tutoriales en Internet no son confiables y no hay un análisis de la causa del problema. ¡Este artículo resuelve por completo el problema de No se encontraron etiquetas en /path/train.cache durante el entrenamiento de YOLOv5! Espero que a través de este artículo puedas resolver algunos problemas innecesarios durante el proceso de configuración del entorno. ——©️ Sylvan Ding

Versión sistema
YOLOv5 v6.1 linux

Hay No labels founddos razones principales para esto: por un lado, el conjunto de datos descargado de Internet solo proporciona su propio formato de etiqueta y debe convertirse a etiquetas de formato YOLOv5; por otro lado, se debe a la organización del proyecto. directorio. Este artículo se centra en esto último, es decir, el problema de no poder encontrar etiquetas causado por la organización del directorio del proyecto . Hay pocas respuestas a este tipo de problemas en línea.

El formato de la etiqueta es incorrecto

La mayoría de los conjuntos de datos descargados de Internet solo proporcionan archivos etiquetados VOCen formato .xml, almacenados en annotationscarpetas o archivos etiquetados en otros formatos. En este momento, primero debe escribir un programa para convertir las etiquetas al formato requerido por YOLOv5.

Descripción del formato de etiqueta YOLOv5

Después de usar una herramienta como Roboflow Annotate para etiquetar sus imágenes, exporte sus etiquetas al formato YOLO , con un *.txtarchivo por imagen (si no hay objetos en la imagen, no *.txtse requiere ningún archivo). Las *.txtespecificaciones del archivo son:

  • Una fila por objeto
  • Cada fila tiene class x_center y_center width heightformato.
  • Las coordenadas del cuadro deben estar en formato xywh normalizado (de 0 a 1). Si sus cuadros están en píxeles, divida x_centery widthpor el ancho de la imagen y y_centerpor heightel alto de la imagen.
  • Los números de clase están indexados a cero (comienzan desde 0).

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

convertir VOC a YOLOv5

Para la conversión de formato VOC a YOLOv5, consulte yolov5/data/VOC.yamlla línea 36 convert_label(), ​​que convert_box()proporciona la función de conversión de coordenadas.

def convert_label(path, lb_path, year, image_id):
    def convert_box(size, box):
        dw, dh = 1. / size[0], 1. / 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

    in_file = open(path / f'VOC{
      
      year}/Annotations/{
      
      image_id}.xml')
    out_file = open(lb_path, 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        cls = obj.find('name').text
        if cls in yaml['names'] and not 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 = yaml['names'].index(cls)  # class id
            out_file.write(" ".join([str(a) for a in (cls_id, *bb)]) + '\n')

Nota: convert_box(size, box),bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')])

❤️ Para obtener detalles de implementación específicos, puede consultar los artículos de otros blogueros, hay muchos artículos de este tipo.

Convertir otros formatos a YOLOv5

Para otros archivos de marcas en diferentes formatos, debe escribir manualmente un programa para convertirlos a marcas de formato YOLOv5.

yolov5/utils/general.pyAlgunas funciones que contiene pueden inspirarte, como xyxy2xywh()... xywh2xyxy()Son responsables de la conversión de formatos de coordenadas.

La estructura del directorio del proyecto es incorrecta.

Después de obtener el formato de etiqueta correcto, No labels foundaún se producen errores. En este momento, considere que hay un error en la estructura organizativa del directorio del proyecto.

Estructura de directorio correcta

Coco

⭐️ Primero pongamos la conclusión: tomando COCO como ejemplo, la estructura de directorio correcta debería ser:

# path example
../datasets/coco128/images/im0.jpg  # image
../datasets/coco128/labels/im0.txt  # label
# yolov5/data/coco.yaml
path: ../datasets/coco  # dataset root dir
train: train2017.txt  # train images (relative to 'path')
val: val2017.txt  # val images
test: test-dev2017.txt

Insertar descripción de la imagen aquí

  • datasetsLas carpetas yolov5están al mismo nivel que las carpetas y datasetscada archivo de conjunto de datos se crea debajo de ellas. Por cocoejemplo, imagesla carpeta almacena directamente todos los datos de la imagen y labelsla carpeta almacena directamente los archivos de marcas correspondientes a las imágenes *.txt.

    .
    ├── images
    │   ├── 20151127_114556.jpg
    │   ├── 20151127_114946.jpg
    │   └── 20151127_115133.jpg
    ├── labels
    │   ├── 20151127_114556.txt
    │   ├── 20151127_114946.txt
    │   └── 20151127_115133.txt
    
  • Tenga en cuenta que ni el nombre imagesni labelsel nombre de la carpeta se pueden cambiar por ningún otro . El motivo se discutirá más adelante.

  • train2017.txtLas rutas de los archivos de imagen del conjunto de entrenamiento, el conjunto de verificación y el conjunto de prueba se almacenan en , y su contenido es el val2017.txtsiguiente :test-dev2017.txt

    ./images/20151127_114556.jpg
    ./images/20151127_114946.jpg
    ./images/20151127_115133.jpg
    

coco128

Si desea utilizar el formato de organización de archivos de coco128:

# yolov5/data/coco128.yaml
path: ../datasets/coco128  # dataset root dir
train: images/train2017  # train images (relative to 'path') 128 images
val: images/train2017  # val images (relative to 'path') 128 images
test:  # test images (optional)

Entonces datasetsla estructura del directorio debería ser:

coco128
├── images
│   ├── test
│   │   └── 20151127_115133.jpg
│   └── train2017
│       └── 20151127_114556.jpg
└── labels
    ├── test
    │   └── 20151127_115133.txt
    └── train2017
        └── 20151127_114556.txt
  • Tenga en cuenta que ni el nombre imagesni labelsel nombre de la carpeta se pueden cambiar por ningún otro .
  • imagesy labelscarpetas, cree las carpetas correspondientes para almacenar el conjunto de entrenamiento, el conjunto de validación y el conjunto de prueba. Los nombres de las carpetas deben ser consistentes. No hay ningún requisito, pero deben configurarse en formato coco128.yaml.

Investigación de la causa del error

yolov5/utils/datasets.pyLa línea 391 img2label_paths(img_paths)define el mapeo de rutas de imágenes para etiquetar rutas, y self.label_files = img2label_paths(self.im_files) # labelsla línea 447 llama img2label_paths()a generar label_files.

def img2label_paths(img_paths):
    # Define label paths as a function of image paths
    sa, sb = os.sep + 'images' + os.sep, os.sep + 'labels' + os.sep  # /images/, /labels/ substrings
    return [sb.join(x.rsplit(sa, 1)).rsplit('.', 1)[0] + '.txt' for x in img_paths]

YOLOv5 ubica etiquetas automáticamente para cada imagen reemplazando la última instancia de /images/en cada ruta de imagen con /labels/.

Es decir, ¡YOLOv5 cambiará automáticamente ../datasets/coco128/images/*.jpgla ruta de la imagen ../datasets/coco128/labels/*.txtpara encontrar la ruta de las etiquetas!

¿Como resolver el problema?

label_filesDespués de la asignación e impresión anteriores label_files, podemos obtener la ruta marcada y luego modificar la ruta del archivo de nuestro proyecto en función de la ruta impresa para resolver todos los problemas.

Insertar descripción de la imagen aquí

referencias

No se pueden encontrar etiquetas en el conjunto de datos personalizado train.cache COCO #6158

Supongo que te gusta

Origin blog.csdn.net/IYXUAN/article/details/124339385
Recomendado
Clasificación