Registro de aprendizaje del proceso de depuración del algoritmo de detección de objetivos YOLO

El proceso de depuración del algoritmo de detección de objetivos de la serie YOLO se ha completado antes, y hoy es principalmente para resumir toda la depuración. El
entorno conda aquí no se repetirá aquí, solo use el archivo require.txt directamente, también puede consultar al proceso de configuración de YOLOX 5

Procesamiento de conjuntos de datos

YOLOv5 tiene su propio formato de conjunto de datos: el conjunto de datos del blogger está en formato COCO y debe convertirse al formato YOLO usted mismo.
Es necesario modificar el siguiente código:
archivo de anotaciones COCO: dirección del archivo JSON

parser.add_argument('--json_path',default='/data/datasets/coco/annotations/instances_train2017.json', type=str,help="input: coco format(json)")

Dirección del archivo de anotación en formato YOLO generado: dirección del archivo TXT

parser.add_argument('--save_path', default='/home/ubuntu/outputs/yolov5/yolov5/train', type=str,help="specify where to save the output dir of labels")

La dirección correspondiente del conjunto de datos guardado: train2017.txt

list_file = open(os.path.join(ana_txt_save_path, 'train2017.txt'), 'w')

Escriba la dirección de la imagen del conjunto de datos:

list_file.write('/data/datasets/coco/images/train2017/%s.jpg\n' % (head))

El código completo es el siguiente:

import os
import json
from tqdm import tqdm
import argparse

parser = argparse.ArgumentParser()
# 这里根据自己的json文件位置,换成自己的就行
parser.add_argument('--json_path',
                    default='/data/datasets/coco/annotations/instances_train2017.json', type=str,
                    help="input: coco format(json)")
# 这里设置.txt文件保存位置
parser.add_argument('--save_path', default='/home/ubuntu/outputs/yolov5/yolov5/train', type=str,
                    help="specify where to save the output dir of labels")
arg = parser.parse_args()


def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = box[0] + box[2] / 2.0
    y = box[1] + box[3] / 2.0
    w = box[2]
    h = box[3]
    # round函数确定(xmin, ymin, xmax, ymax)的小数位数
    x = round(x * dw, 6)
    w = round(w * dw, 6)
    y = round(y * dh, 6)
    h = round(h * dh, 6)
    return (x, y, w, h)


if __name__ == '__main__':
    json_file = arg.json_path  # COCO Object Instance 类型的标注
    ana_txt_save_path = arg.save_path  # 保存的路径

    data = json.load(open(json_file, 'r'))
    if not os.path.exists(ana_txt_save_path):
        os.makedirs(ana_txt_save_path)

    id_map = {
    
    }  # coco数据集的id不连续!重新映射一下再输出!
    with open(os.path.join(ana_txt_save_path, 'classes.txt'), 'w') as f:
        # 写入classes.txt
        for i, category in enumerate(data['categories']):
            f.write(f"{
      
      category['name']}\n")
            id_map[category['id']] = i
    # print(id_map)
    # 这里需要根据自己的需要,更改写入图像相对路径的文件位置。
    list_file = open(os.path.join(ana_txt_save_path, 'train2017.txt'), 'w')
    for img in tqdm(data['images']):
        filename = img["file_name"]
        img_width = img["width"]
        img_height = img["height"]
        img_id = img["id"]
        head, tail = os.path.splitext(filename)
        ana_txt_name = head + ".txt"  # 对应的txt名字,与jpg一致
        f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w')
        for ann in data['annotations']:
            if ann['image_id'] == img_id:
                box = convert((img_width, img_height), ann["bbox"])
                f_txt.write("%s %s %s %s %s\n" % (id_map[ann["category_id"]], box[0], box[1], box[2], box[3]))
        f_txt.close()
        # 将图片的相对路径写入train2017或val2017的路径
        list_file.write('/data/datasets/coco/images/train2017/%s.jpg\n' % (head))
    list_file.close()

El formato del archivo de anotación del conjunto de datos producido es el siguiente:
inserte la descripción de la imagen aquí
debajo de esta carpeta también hay un archivo de datos correspondiente val2017.txt, el contenido es el siguiente:
inserte la descripción de la imagen aquí
es decir, la estructura del conjunto de datos es la siguiente:

images
       train2017
                XXX.jpg
       val2017
                XXX.jpg 
labels
      train2017
            XXX.txt
            train2017.txt
      val2017
            XXX.txt
            val2017.txt

En este punto, el procesamiento del conjunto de datos está completo.

Depuración de YOLOv5

Una vez completado el procesamiento del conjunto de datos, el proceso de capacitación solo necesita modificar los parámetros correspondientes y la configuración del archivo.
Primero modifique el archivo coco128.yaml y cámbielo a lo siguiente:

inserte la descripción de la imagen aquí
Luego configuramos el modelo que queremos usar. YOLOv5 se divide en cuatro versiones: YOLOv5s, YOLOv5m, YOLOv5l y YOLOvx. El rendimiento aumenta a su vez. El blogger elige la versión YOLOv5l y descarga el archivo de peso de YOLOv5l al mismo tiempo.

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='/data/programs/yolov5/yolov5l.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='/home/ubuntu/outputs/yolov5/yolov5/models/yolov5l.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')

Luego modifique la cantidad de categorías en el archivo yolov5l.yaml:

inserte la descripción de la imagen aquí
Luego puede ejecutarse, aquí establezca época = 100, tamaño de lote = 16, aquí nuevamente se queja, YOLOX realmente consume memoria de video y puede ejecutarse después de terminar.

inserte la descripción de la imagen aquí

Depuración de YOLOv7

Dado que se completó la configuración del conjunto de datos anterior, con yolov5, la depuración de YOLOv7 será mucho más fluida. Primero, modifique el archivo de configuración, busque train.py, vea qué archivos necesita y modifíquelo: aquí puede elija si desea
usar El archivo de peso, es decir, pesas, si se usa, el entrenamiento se acelerará significativamente, el valor inicial es alto y es posible que no haya muchos cambios al final. Si no se usa, significa entrenamiento desde Desde cero, el entrenamiento puede ser más lento y el tiempo de entrenamiento es más largo. Además, YOLOv7 también proporciona una versión de aprendizaje de migración, que es mejor para nosotros. es decir, usando pesasyolov7_training.pt

    parser.add_argument('--weights', type=str, default='', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='/home/ubuntu/outputs/yolov5/yolov7/yolov7/cfg/training/yolov7.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/coco.yaml', help='data.yaml path')
    parser.add_argument('--hyp', type=str, default='data/hyp.scratch.p5.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=100)

Luego modifica yolov7.yamlel archivo, modifícalo num_class=3.

modificar coco.yamlarchivo

train: /data/datasets/coco/labels/train2017/train2017.txt  # 118287 images
val: /data/datasets/coco/labels/val2017/val2017.txt  # 5000 images
# number of classes
nc: 3
# class names
names: [ 'car',  'bus', 'truck' ]

Entonces funciona.

inserte la descripción de la imagen aquí

entrenamiento de punto de interrupción

Durante el proceso de entrenamiento, el entrenamiento a menudo se interrumpe debido a varias razones. Para resolver este problema, el algoritmo de la serie YOLO reanuda el entrenamiento a través del entrenamiento de punto de interrupción. Tome YOLOv5 como ejemplo, especifique el parámetro de reanudación como Verdadero en el archivo y establezca el parámetro de pesos. train.pyEs la ruta del archivo de peso antes de que finalice el entrenamiento.

parser.add_argument('--weights', type=str, default='/home/ubuntu/outputs/yolov5/yolov5/runs/train/exp9/weights/last.pt', help='initial weights path')
parser.add_argument('--resume', nargs='?', const=True, default=True, help='resume most recent training')

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/pengxiang1998/article/details/132389428
Recomendado
Clasificación