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:
debajo de esta carpeta también hay un archivo de datos correspondiente val2017.txt, el contenido es el siguiente:
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:
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:
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.
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.yaml
el archivo, modifícalo num_class=3
.
modificar coco.yaml
archivo
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.
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.py
Es 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')