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 found
dos 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 VOC
en formato .xml
, almacenados en annotations
carpetas 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
*.txt
archivo por imagen (si no hay objetos en la imagen, no*.txt
se requiere ningún archivo). Las*.txt
especificaciones del archivo son:
- Una fila por objeto
- Cada fila tiene
class x_center y_center width height
formato.- Las coordenadas del cuadro deben estar en formato xywh normalizado (de 0 a 1). Si sus cuadros están en píxeles, divida
x_center
ywidth
por el ancho de la imagen yy_center
porheight
el alto de la imagen.- Los números de clase están indexados a cero (comienzan desde 0).
convertir VOC a YOLOv5
Para la conversión de formato VOC a YOLOv5, consulte yolov5/data/VOC.yaml
la 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.py
Algunas 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 found
aú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
-
datasets
Las carpetasyolov5
están al mismo nivel que las carpetas ydatasets
cada archivo de conjunto de datos se crea debajo de ellas. Porcoco
ejemplo,images
la carpeta almacena directamente todos los datos de la imagen ylabels
la 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
images
nilabels
el nombre de la carpeta se pueden cambiar por ningún otro . El motivo se discutirá más adelante. -
train2017.txt
Las 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 elval2017.txt
siguiente :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 datasets
la 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
images
nilabels
el nombre de la carpeta se pueden cambiar por ningún otro . images
ylabels
carpetas, 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 formatococo128.yaml
.
Investigación de la causa del error
yolov5/utils/datasets.py
La 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) # labels
la 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/*.jpg
la ruta de la imagen ../datasets/coco128/labels/*.txt
para encontrar la ruta de las etiquetas!
¿Como resolver el problema?
label_files
Despué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.
referencias
No se pueden encontrar etiquetas en el conjunto de datos personalizado train.cache COCO #6158