[YOLO] Resuelve el problema de que AP es 0 durante el entrenamiento de YOLOX

Se puede ver el conjunto de datos de entrenamiento de Coco: Se puede ver el conjunto de datos de entrenamiento de YOLOX COCO

ap=0 debido a la ausencia de parámetros difíciles en el archivo xml: Acerca de ap es 0 causado por la ausencia de parámetros difíciles en el archivo xml

Hace algún tiempo, YOLOX lo robó y varias cuentas oficiales lo están presionando, afirmando: el rendimiento supera a Yolov5 y supera a todos los YOLO.

Entonces, lleno de expectativas, descargué el código fuente y me preparé para intentarlo.

1. Descripción del problema

Bueno, así es, encontré un montón de errores, pero afortunadamente se solucionaron todos. En el último entrenamiento,
inserte la descripción de la imagen aquí
buen chico, el AP siempre fue 0. Busqué en los Issues de YOLOX en Github. Parece que no soy el Solo uno encontró el mismo problema, inserte la descripción de la imagen aquí
además lo revisé de acuerdo con algunas respuestas, descubrí que estaba mal y finalmente me puse a pensar profundamente.

Hasta ayer en el grupo, alguien dijo accidentalmente que había usado YOLOX con éxito y lo había desplegado, así que me quedé y le dije que mi AP era 0 durante el entrenamiento y le pregunté cómo usarlo. Por supuesto, la respuesta que obtuve fue " Realmente no resuelve el problema, mi pregunta.

Segundo, encuentra el problema.

Así que esta mañana comencé a depurar y verificar nuevamente, y de repente pensé que había algún problema con la carga de datos.

Resultó que éste era realmente el problema.

3. Resuelve el problema

  • Primero, asegúrese de que los datos del formato VOC personalizado sean correctos

    ├─datasets
    │  └─VOCdevkit
    │      └─VOC2007
    │          ├─Annotations
    │          ├─ImageSets
    │          │  └─Main
    │          └─JPEGImages
    

    Debe Mainhaber correspondencia train.txtyval.txt

  • Luego, yolox/data/datasets/voc_classes.pymodifícalo a la categoría de tus datos de entrenamiento ( 保险起见,最好每一个类别后都加上 ,):

    VOC_CLASSES = (
    "panda",
    "tiger",
    )
    
  • Luego modificaryolox/exp/yolox_base.py

    (这里应该也可以不用修改,因为后面的exps/example/yolox_voc/yolox_voc_s.py会对self.num_classes进行重载)
    将self.num_classes修改为自己的类别数
    self.num_classes = 2 (我的数据集是 2)
    
    你还可以修改 self.inputsize, self.random_size 改变训练尺寸大小
    
    你还可以修改 self.test_size 改变测试的尺寸大小
    

    Los dos siguientes son los puntos clave:

  • Modifique el yolox/data/datasets/voc.pymétodo en_do_python_eval

    annopath = os.path.join(rootpath, "Annotations", "{:s}.xml")
    
    修改为
    
    annopath = os.path.join(rootpath, "Annotations", "{}.xml")
    
  • Mi problema se refleja principalmente en el hecho exps/example/yolox_voc/yolox_voc_s.pyde que creo que la mayoría de los compañeros tienen AP=0 durante el entrenamiento por esta razón.

    修改 self.num_classes = 2
    
    修改 get_data_loder 下的 VOCDetection 下的 image_sets=[('2007', 'trainval'), ('2012', 'trainval')],
    修改为 image_sets=[('2007', 'train')]
    
    修改 get_eval_loader 下的 VOCDetection 下的 image_sets=[('2007', 'test')],
    修改为 image_sets=[('2007', 'val')]
    

    cosa importante otra vez

    get_data_loder abajo VOCDetectionabajo

    image_sets=[('2007', 'trainval'), ('2012', 'trainval')],

    cambie aimage_sets=[('2007', 'train')]


    Más importante aún: el get_eval_loaderpróximoVOCDetection

    image_sets=[('2007', 'test')],

    Asegúrese de modificarlo a image_sets=[('2007', 'val')], porque los datos que verificamos están en val.txt, no test.txt, lo que debería ser la razón por la cual AP siempre es 0

  • Finalmente modifique tools/train.pyla configuración de parámetros en

    设置 default="Animals", 训练后结果就会保存在 tools/YOLOX_outputs/Animals下
    parser.add_argument("-expn", "--experiment-name", type=str, default=None)
    
    设置 model_name,我也不太清楚这是不是必须项 (我觉得不是)
    parser.add_argument("-n", "--name", type=str, default="yolox-s", help="model name")
    
    设置 batch_size
    parser.add_argument("-b", "--batch-size", type=int, default=64, help="batch size")
    
    设置gpu,因为我只有一张卡,所以设 default=0
    parser.add_argument(
        "-d", "--devices", default=0, type=int, help="device for training"
    )
    
    设置你的数据配置的路径,default="../exps/example/yolox_voc/yolox_voc_s.py"
    parser.add_argument(
        "-f",
        "--exp_file",
        default="../exps/example/yolox_voc/yolox_voc_s.py",
        type=str,
        help="plz input your expriment description file",
    )
    
    设置权重路径, default="../weights/yolox_s.pth"
    parser.add_argument("-c", "--ckpt", default="../weights/yolox_s.pth", type=str, help="checkpoint file")
    

    Después de completar todas las configuraciones de la apelación, puedes comenzar a entrenar.

4. Entrenar y probar el efecto.

Puede ver que hay un AP, lo que significa que fue exitoso,
inserte la descripción de la imagen aquí
finalmente mire los resultados de la prueba.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
El efecto general sigue siendo muy bueno, la precisión supera el 90%

Al realizar la prueba, preste atención a:

  • Dado que demo.pyse llama de forma predeterminada COCO_CLASSES, si desea mostrar los resultados correctamente, debe cambiar yolox/data/datasets/coco_classes.pyel valor inferior COCO_CLASSESa su categoría de datos.

  • o cambiarlo yolox/data/datasets/__init__.pyafrom .voc import VOCDetectionfrom .voc import VOCDetection, VOC_CLASSES

  • Luego modifique tools/demo.pyen ,from yolox.data.datasets import COCO_CLASSESfrom yolox.data.datasets import COCO_CLASSES, VOC_CLASSES

  • Luego cambia tools/demo.pytodos COCO_CLASSESlos lugares donde solías VOC_CLASSEScambiarlo a

Supongo que te gusta

Origin blog.csdn.net/weixin_42166222/article/details/119637797
Recomendado
Clasificación