[El yolov6 más detallado de toda la red] registro de depuración de yoloV6 (incluidos conjuntos de datos de entrenamiento y errores y soluciones comunes) -- actualización continua

Este artículo le enseñará cómo depurar el último yolov6, reproducir y ejecutar COCO2017 y entrenar su propio conjunto de datos. Actualmente, el proyecto acaba de ser lanzado y habrá muchos errores. En general, no será tan sencillo. Esto El artículo incluye windows+ubuntu y proporciona algunos problemas y soluciones comunes:

Tabla de contenido

1. Introducción del proyecto

2. Atención y recomendación

3. Configuración del proyecto (incluida la configuración del conjunto de datos COCO)

4. Entrena tus propios datos:

5. Notas sobre trampas y soluciones:

6. Mis propios intentos de entrenamiento y consejos (para su referencia)


1. Introducción del proyecto

Recientemente, Meituan lanzó yoloV6, afirmando lograr los siguientes efectos:

 Entre ellos, YOLOv6-nano alcanzó 35,0 mAP en el conjunto de datos COCO val2017, y YOLOv6-s alcanzó 43,1 mAP en el mismo conjunto de datos.

Consulte el proyecto y la descripción: GitHub - meituan/YOLOv6: YOLOv6: un marco de detección de objetos de etapa única dedicado a aplicaciones industriales. https://github.com/meituan/YOLOv6

 Actualmente, dado que el proyecto se lanzó recientemente, existen ciertos problemas y las instrucciones en Github no son muy detalladas, por lo que escribo un artículo sobre la depuración.

-------------------------------------------------- -------------------------------------------------- -----

2. Atención y recomendación

Dado que el proyecto es relativamente nuevo, todavía hay muchos errores. Se recomienda que vaya a github para ver si han aparecido sus propios problemas. El código se ha modificado con frecuencia en los últimos días. Intente mantenerlo actualizado. , y habrá errores corregidos. Ahora se manifiestan más problemas al entrenar su propio conjunto de datos.

-------------------------------------------------- -------------------------------------------------- ---

Escribe en la parte superior:

Después de la prueba, este proyecto no es adecuado para portátiles (la computadora de prueba es r9000p 2021) y computadoras de escritorio ordinarias. Es adecuado para ejecutarse en computadoras o servidores con mejor rendimiento. ¡Este artículo es la configuración en Windows para su referencia y estudio!

El servidor de actualización 2022 7.1 se está ejecutando y el proyecto de nueva versión ha agregado end2end

-------------------------------------------------- -------------------------------------------------- ------

3. Configuración del proyecto (incluida la configuración del conjunto de datos COCO)

Esta parte es para reproducir el efecto de autor, es decir, intentar ejecutar el programa en COCO.

Lo siguiente inicia la configuración en Windows:

De requerimiento.txt, se puede ver que el proyecto depende de lo siguiente:

 Nota: ¡No instale la última versión de torch (1.11.0) + torchvison (0.12) causará problemas!

Mi entorno de ejecución exitoso es para su referencia: python 3.8.13 torchvision 0.11.1+cu113 torch 1.10.0+cu113 numpy 1.21.5 opencv-python 4.6.0.66 opencv-python-headless 4.5.5.64 addict 2.4.0 pyyaml 6.0 etc

Aquí se omite el proceso de instalación de la antorcha de soporte cuda y cudnn.

-------------------------------------------------- -------------------------------------------------- ----

Nota: esta depuración se completa con windows10+pycharm, pero aún así se recomienda encarecidamente completar la depuración en el servidor (linux)

El primer paso es clonar el proyecto.

git clone https://github.com/meituan/YOLOv6
cd YOLOv6
pip install -r requirements.txt

 Primero cargue el modelo pre-entrenado (prueba): (dirección de descarga)

https://github.com/meituan/YOLOv6/releases/tag/0.1.0 https://github.com/meituan/YOLOv6/releases/tag/0.1.0

 Primero descargue estos tres archivos y colóquelos en la carpeta de pesos (debe crearlos usted mismo).

Si desea ejecutarlo en pycharm, debe usar el símbolo del sistema en su terminal en lugar del PowerShell de Windows; de lo contrario, se informará un error (si usa un entorno virtual, no podrá encontrar bibliotecas como antorcha)

 Luego ejecute el modelo de inferencia:

python tools/infer.py --weights yolov6s.pt 
                                
yolov6n.pt(此处可替换别的模型)

imagedir puede mantener el valor predeterminado, la ruta existe y las opciones son las siguientes:

Puede ver los resultados de la inferencia de la prueba: 

 Parece que funciona bien.

-------------------------------------------------- --------------------------------------------------

Después de completar la prueba, es hora de entrenar:

Preparativos: descargue el conjunto de datos COCO (es posible que deba conectarse en línea científicamente) y cambie la ruta correspondiente en el archivo yaml

COCO - Objetos comunes en contexto https://cocodataset.org/#home Descarga recomendada 2017

 Si las anotaciones en formato json no se convierten con éxito y se informa un error que dice que no hay etiquetas, puede descargar las etiquetas convertidas a continuación y colocarlas en la carpeta de etiquetas (la estructura de carpetas es como se muestra a continuación)

Enlace de descarga: https://pan.baidu.com/s/12AIzhR-4wWdFrsjW7RSX0g?pwd=8e2t 
Código de extracción: 8e2t 

Cree una carpeta de datos en el archivo del proyecto, el diseño es el siguiente:

 carpeta de imagenes:

 carpeta de etiquetas:

 carpeta de anotaciones:

El conjunto de datos COCO coco.yaml implementado de acuerdo con esta estructura debe modificarse de la siguiente manera:

# COCO 2017 dataset http://cocodataset.org
train: ./data/coco/images/train2017 # 118287 images
val: ./data/coco/images/val2017  # 5000 images
test: ./data/coco/images/test2017
anno_path: ./data/coco/annotations/instances_val2017.json
# number of classes
nc: 80

# class names
names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
         'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
         'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
         'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
         'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
         'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
         'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
         'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
         'hair drier', 'toothbrush' ]

 Hasta ahora, se completó la implementación del conjunto de datos COCO, y todavía hay una cosa que se debe modificar para el entrenamiento en Windows (de lo contrario, se informará un error de ruta debido al uso mixto de barras diagonales hacia adelante y hacia atrás):

Línea 184 en yolov6->data->datasets.py:

label_dir = osp.join(osp.dirname(osp.dirname(img_dir)), 'labels', osp.basename(img_dir))

改为:

label_dir = osp.join(osp.dirname(osp.dirname(img_dir)), 'labels', osp.basename(img_dir)).replace('\\','/')

 Próximo inicio de entrenamiento:

GPU única:

python tools/train.py --batch 32 --conf configs/yolov6s.py --data data/coco.yaml --device 0
                                   

 Otros modelos en models se pueden reemplazar en configs/yolov6s.py.

Múltiples GPU (se recomienda DDP)

python -m torch.distributed.launch --nproc_per_node 8 tools/train.py --batch 256 --conf configs/yolov6s.py --data data/coco.yaml --device 0,1,2,3,4,5,6,7

 Evaluar:

Reproduce el mAP del modelo en COCO val2017

python tools/eval.py --data data/coco.yaml  --batch 32 --weights yolov6s.pt --task val
                                                                 

 carga:

ONNX

AbrirVINO

Prueba de rendimiento: ligeramente, vea la dirección original de github.

 Punto de referencia:

4. Entrena tus propios datos:

Esta parte es una parte recientemente actualizada. Hay muchos errores en el conjunto de datos de entrenamiento. Se recomienda que descargue (actualice) el código más reciente a tiempo.

Esta parte intenta ejecutarse en Windows y servidor respectivamente.

Instrucciones oficiales para entrenar su propio conjunto de datos:

https://github.com/meituan/YOLOv6/blob/main/docs/Train_custom_data.md https://github.com/meituan/YOLOv6/blob/main/docs/Train_custom_data.md Lo primero es preparar el conjunto de datos etapa, vale la pena tener en cuenta que este proyecto utiliza un conjunto de datos en formato YOLO, y los conjuntos de datos en otros formatos deben convertirse

Ejemplo de etiqueta (txt)

# class_id center_x center_y bbox_width bbox_height
0 0.300926 0.617063 0.601852 0.765873
1 0.575 0.319531 0.4 0.551562

 El conjunto de datos preparado debe colocarse así: ( la prueba es opcional, tenga en cuenta que debe colocarse de acuerdo con el formulario de la figura )

custom_dataset
├── images
│   ├── train
│   │   ├── train0.jpg
│   │   └── train1.jpg
│   ├── val
│   │   ├── val0.jpg
│   │   └── val1.jpg
│   └── test
│       ├── test0.jpg
│       └── test1.jpg
└── labels
    ├── train
    │   ├── train0.txt
    │   └── train1.txt
    ├── val
    │   ├── val0.txt
    │   └── val1.txt
    └── test
        ├── test0.txt
        └── test1.txt

 Además, aquí hay una trampa. Se recomienda usar números puros para el nombre del conjunto de datos (como 000000, jpg 000000.txt ha sido probado y no hay problema). Si hay símbolos especiales como "." , se producirá el error de lectura o no se podrán encontrar las etiquetas.

 configuración de data.yaml:

# 数据集路径
train: ../custom_dataset/images/train # train images
val: ../custom_dataset/images/val # val images
test: ../custom_dataset/images/test # test images (可选的)

# 是否是COCO格式的数据集,用YOLO的话设置为False即可
is_coco: False

# 类别
nc: 20  # 类的个数
names: ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog','horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']  # 类名

 config file: Configúrelo usted mismo y colóquelo en la carpeta configs. De forma predeterminada, usamos el archivo de configuración proporcionado, como en la carpeta configs: yolov6n_finetune.py

## YOLOv6s Model config file
model = dict(
    type='YOLOv6s',
    pretrained='./weights/yolov6s.pt', # download pretrain model from YOLOv6 github if use pretrained model
    depth_multiple = 0.33,
    width_multiple = 0.50,
    ...
)
solver=dict(
    optim='SGD',
    lr_scheduler='Cosine',
    ...
)

data_aug = dict(
    hsv_h=0.015,
    hsv_s=0.7,
    hsv_v=0.4,
    ...
)

Listo para empezar a entrenar: 

Tren:

GPU única: (configure lote, trabajadores y seleccione data.yaml según el equipo)

python tools/train.py --batch 16 --conf configs/yolov6s_finetune.py --data data/xxx.yaml --device 0 --workers x --epochs x

 Múltiples GPU: (recomendado)

python -m torch.distributed.launch --nproc_per_node 4 tools/train.py --batch 64 --conf configs/yolov6s_finetune.py --data data/xxx.yaml --device 0,1,2,3 --epochs x --workers 16

Los métodos anteriores pueden atascarse en el siguiente entrenamiento (se desconoce cómo modificar):

Usando 4 GPU para entrenamiento...
Inicializando grupo de procesos...

En este momento, puede probar el comando que no se recomienda : (es decir, agregar directamente el dispositivo)

python tools/train.py --batch 16 --conf configs/yolov6s_finetune.py --data data/xxx.yaml --device 0,1,2,3 --workers x --epochs x

 Intenté ejecutar 5 épocas en Windows (con éxito)

 valor:

Evaluación:

python tools/eval.py --data data/data.yaml  --weights output_dir/name/weights/best_ckpt.pt --device 0

Efecto de inferencia de inferencia : (actualmente solo se pueden inferir imágenes)

python tools/infer.py --weights output_dir/name/weights/best_ckpt.pt --source img.jpg --device 0

 El resultado apunta a las tres imágenes en datos/imágenes de forma predeterminada, aquí debe reemplazarlo con su ruta o colocar sus imágenes en una carpeta

Entrena 10 épocas para inferir resultados: 

Despliegue:

1. Salida en formato ONNX:

python deploy/ONNX/export_onnx.py --weights output_dir/name/weights/best_ckpt.pt --device 0

2. Salida a formato OpenVINO:

python deploy/OpenVINO/export_openvino.py --weights output_dir/name/weights/best_ckpt.pt --device 0

servidor ubunbtu:

Se recomienda que la dirección del conjunto de datos en data.yaml se establezca en una ruta absoluta, y es posible que no se encuentre la ruta relativa. Para ver las dependencias de configuración, consulte la configuración de Windows anterior. Se recomienda crear un entorno conda para la configuración. .

Modifique el archivo de acuerdo con el error 7 (error común 7 a continuación) o configure la carpeta fuente de YOLOv6 si hay un compilador como linux pycharm.

En la terminal (bajo el entorno conda), ingrese el mismo comando que el anterior para el entrenamiento.

Actualmente todavía hay muchos errores. Bienvenido a discutir!

Ejecute el servidor durante 200 épocas (tamaño de lote 128)

 valor

-------------------------------------------------- -------------------------------------------------- ---------------

5. Notas sobre trampas y soluciones:

1.AttributeError: el objeto 'NoneType' no tiene el atributo '_free_weak_ref'

Este es un problema de la versión de pytorch que instalé por primera vez: torch1.11.0 torchvision 0.12.0 no es compatible

Solución:

Paso 1: Desinstale, abra el entorno conda, verifique el paquete instalado con la lista de pip, use pip uninstall torch torchvision para desinstalar y
luego continúe: pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https ://download .pytorch.org/whl/cu113/torch_stable.html
(el método anterior se probó con éxito)
o pip install --upgrade --force-reinstall torch==1.8.0 torchvision==0.9.0 torchaudio== 0.8.0 (obligado a reinstalar Install)

2.RuntimeError: el trabajador de DataLoader (pid(s) 2244, 652) se cerró inesperadamente
debido a memoria insuficiente debido al uso de subprocesos múltiples. Ajuste la cantidad de trabajadores al número que no causará errores. Si el error aún se informa , establezca el número de trabajadores en 0 para no utilizar subprocesos múltiples.

Solución Cambie las instrucciones de capacitación (agregue --workers x (x es un número aceptable, el valor predeterminado es 8)):

python tools/train.py --batch 32 --conf configs/yolov6s.py --data data/coco.yaml --device 0 --workers 0

 3.OMP: Error n.° 15: Inicializando libiomp5md.dll, pero se encontró que libiomp5md.dll ya se había inicializado
Esto se debe a que hay varias bibliotecas libiomp5md.dll instaladas en su entorno.

Solución: busque libiomp5md.dll en su entorno y elimine las bibliotecas adicionales (solo conserve una).

4. Use el entrenamiento de GPU durante el entrenamiento, pero aparece ------------Modo de CPU para este lote-------------
Puede ver que se lanza una excepción aquí: OOM RuntimeError se genera debido al enorme costo de memoria durante la asignación de etiquetas. El modo de CPU se aplica en este lote. Si desea evitar este problema, intente reducir el tamaño del lote o el tamaño de la imagen. Esto se debe a que la memoria es insuficiente, debe reducir Batch_size
(pero debe ser mayor que 8) o reduzca el tamaño de la imagen (si usa el conjunto de datos COCO, no se recomienda modificarlo) use torch.cuda.empty_cache() para liberar el caché desocupado.

Solución: reduzca el tamaño del lote (cambie a 16 de la siguiente manera)

python tools/train.py --batch 16 --conf configs/yolov6s.py --data data/coco.yaml --device 0 

 5.RuntimeError: no se puede encontrar un algoritmo cuDNN válido para ejecutar la convolución

 Motivo: la memoria de video de la tarjeta gráfica no es suficiente, solo reduzca el tamaño del lote o reduzca los trabajadores.

 advertencia: UserWarning: torch.meshgrid: en una próxima versión, será necesario
pasar el argumento de indexación (activado internamente en ..\aten\src\ATen\native\TensorShape.cpp:2157). return _VF.meshgrid ( tensores, **kwargs) # escriba: ignore[attr-defined]

porque: la próxima versión VF.meshgrid(tensors, **kwargs) se cambiará para devolver _VF.meshgrid(tensors, **kwargs, indexing = 'ij' ) 
solución: use return _VF.meshgrid(tensors, **kwargs, indexing = 'ij') # escriba: ignore[attr-defined] para eliminar la advertencia

Además, debido a los requisitos de rendimiento relativamente altos,  aparecerá el problema de "OSError: [WinError 1455] El archivo de página es demasiado pequeño para completar la operación" , que es causado por memoria insuficiente

Solución: Aumente la memoria virtual o reemplácela con una tarjeta de memoria más grande. El método de aumentar la memoria virtual no se repetirá aquí.

6. Si el módulo no tiene xxx, generalmente se debe a la versión de la biblioteca, solo ajústelo a una versión adecuada.

7. Al entrenar el conjunto de datos usted mismo, no se pueden encontrar módulos como tools.xxx.Por ejemplo, AttributeError: module 'tools.eval' no tiene el atributo 'run'

Generalmente, el directorio del proyecto está configurado incorrectamente, lo que conduce a la falla. Cuando use un compilador como pycharm en el lado de Windows, configure el directorio fuente en yolov6. Si usa ubuntu para llamar directamente a través de la terminal, no podrá para encontrarlo porque no puede leer la ruta del sistema del sistema. Aquí se requieren los siguientes ajustes (una de las soluciones):

Cree __init__.py en el directorio YOLOv6/tools/ y ajuste el contenido de train.py:

#原
ROOT = os.getcwd()
if str(ROOT) not in sys.path:
    sys.path.append(str(ROOT))


#替换为
ROOT = os.getcwd()
if str(ROOT) not in sys.path:
    sys.path.insert(0,str(ROOT))

8.Error COCOEval

Ocurrió un error durante la verificación. Es un error en la versión anterior. Solo actualice a la nueva versión.

9. La ruta xxx/mages (la ruta relativa del conjunto de datos que configuraste) no existe

Establezca la ruta del conjunto de datos en data.yaml en una ruta absoluta.

10. Aparece el entrenamiento multi-GPU, usando distribuido (distribuido): No hay controlador de encuentro para env://

Compruebe si lo está usando en Windows. Windows no es compatible con nccl. Cambie backend = "nccl" en el archivo distribuido_c10d.py de torch a backend = "gloo"

Si se ejecuta bajo ubuntu, cambie tcp (adicional): 

--dist_url tcp://localhost:1001

 Si no puede resolverlo, puede intentar ejecutar el método no recomendado anterior.

python tools/train.py --batch 16 --conf configs/yolov6s_finetune.py --data data/xxx.yaml --device 0,1,2,3 --workers x --epochs x

 Problemas no resueltos: (Algunos amigos los han encontrado y resuelto, ¡bienvenidos a dejar un mensaje!)

Entrenamiento distribuido atascado en:

Usando 4 GPU para entrenamiento...
Inicializando grupo de procesos...

-------------------------------------------------- -------------------------------------------

6. Mis propios intentos de entrenamiento y consejos (para su referencia)

Consejos: debido a que este proyecto tiene altos requisitos de hardware, a veces habrá el problema de "explosión de memoria de video" de la cuarta tarjeta gráfica mencionado anteriormente, use el siguiente segmento de código (ingreso en la consola cmd) para monitorear el estado de la tarjeta gráfica y actualizar eso cada segundo.

nvidia-smi -l 
(是l不是1,每秒显示一次)

Se puede ver que la tarjeta gráfica de mi computadora portátil 3060 solo tiene 6G de memoria de video, por lo que es fácil reventar la memoria de video. 

Para referencia:

En mi r9000p 2021, el modo de funcionamiento del tren que puede ejecutar la GPU es:

python tools/train.py --batch 24 --conf configs/yolov6s.py --data data/coco.yaml --device 0  --workers 3

Nota: No más intentos, el tamaño de lote 32 romperá la memoria de video y el trabajador 8 (predeterminado) se quedará sin memoria (se agregó memoria virtual de 30G). Ajustar el lote y los trabajadores tiene poco efecto. Cada época tarda unos 50 minutos, un total de 400 épocas, lo cual es inaceptable. ¡Es más apropiado ejecutarlo en el servidor!

Pasa dos horas corriendo dos épocas para sentir:

época 0:

 época 1:

Abrir tensorboard: ( especifique la ruta a la carpeta del tren, no el nombre con nombre, como la carpeta exp )

tensorboard ==logdir=xxx/runs/train

TensorBoard: (solo dos épocas, solo como referencia)

-------------Actualización 5 épocas----------------

pérdida

 mapa

 

 -------------------------------------------------- --------------------------------------------

Al entrenar su propio conjunto de datos ( windows10 epochs, batch_size 16 )

pérdida 

 valor

 Verificación: (Inferencia)

 

Comparación: yolov5 200epochs

Supongo que te gusta

Origin blog.csdn.net/m0_46611008/article/details/125491850
Recomendado
Clasificación