Yolov5 crea un conjunto de datos y entrena el modelo de detección de objetivos

Recopilación de conjuntos de datos

Utilice labelimg para anotaciones de datos

Muestre algunos a continuación 内联代码片.

pip install labelimg
labelimg

Insertar descripción de la imagen aquí
El primer paso es hacer clic para abrir el archivo , seleccionar el directorio de imágenes a anotar, luego hacer clic para cambiar el directorio de almacenamiento y seleccionar la ubicación para guardar la etiqueta anotada.
Insertar descripción de la imagen aquí
Luego seleccione el formato de la etiqueta. Depende de la forma El modelo lee los datos durante el entrenamiento.
Se recomienda activar el guardado automático en Ver.

tecla de acceso rápido
A Imagen anterior
D siguiente imagen
W. Selección rápida de fotogramas

Formato de conjunto de datos

Tome yolov5 como ejemplo

conjuntos de datos
tren
imágenes
etiquetas
prueba
imágenes
etiquetas
válido
imágenes
etiquetas

Se recomienda dividir el conjunto de datos en tren: prueba: válido = 7: 2: 1

Modelo de entrenamiento

Descargue y configure el entorno yolov5

Debe realizarse bajo la versión pytorch gpu

git clone https://github.com/ultralytics/yolov5 
cd yolov5
pip install -r requirements.txt  # 下载所需包

Colocar el conjunto de datos

Simplemente coloque el conjunto de datos en el directorio yolo5 y luego decore el archivo .yaml

train: ../train/images
val: ../valid/images
test: ../test/images

nc: 你的数据种类数
names: ['类别1的名称', '类别2的名称', '类别3的名称']

Nómbrelo data.yaml y colóquelo en el directorio yolo5\dataset.

Modelo de entrenamiento

Abra train.py y configure los siguientes cuatro parámetros

def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
    parser.add_argument('--data', type=str, default=ROOT / 'datasets/data.yaml', help='dataset.yaml path')
    parser.add_argument('--batch-size', type=int, default=32, help='total batch size for all GPUs, -1 for autobatch')
    parser.add_argument('--epochs', type=int, default=20, help='total training epochs')

–data es la ruta del conjunto de datos, use el archivo data.yaml
–batch-size es el número de imágenes en cada lote de entrenamiento. Incrementar este valor aumentará la velocidad de entrenamiento y también conducirá a un mayor uso de memoria
–tiempos de entrenamiento de épocas

El modelo utiliza yolov5s.pt de forma predeterminada. Los parámetros de cada modelo previamente entrenado son los siguientes:

Modelo tamaño
(píxeles)
valor mapa 0.5:0.95
mapa valor
0.5
Velocidad
CPU b1
(ms)
Velocidad
V100 b1
(ms)
Velocidad
V100 b32
(ms)
parámetros
(M)
FLOP
@640 (G)
yolv5n 640 28.0 45,7 45 6.3 0,6 1.9 4.5
yolv5s 640 37,4 56,8 98 6.4 0,9 7.2 16.5
YOLOv5m 640 45,4 64.1 224 8.2 1.7 21.2 49.0
yolv5l 640 49.0 67,3 430 10.1 2.7 46,5 109.1
yolv5x 640 50,7 68,9 766 12.1 4.8 86,7 205.7
yolv5n6 1280 36.0 54.4 153 8.1 2.1 3.2 4.6
yolv5s6 1280 44,8 63,7 385 8.2 3.6 12.6 16.8
YOLOv5m6 1280 51.3 69.3 887 11.1 6.8 35,7 50.0
yolv5l6 1280 53,7 71.3 1784 15.8 10.5 76,8 111.4
YOLOv5x6
+ [TTA][TTA]
1280
1536
55,0
55,8
72,7
72,7
3136
-
26.2
-
19.4
-
140,7
-
209,8
-

Luego ejecuta train.py para entrenar el modelo.

Usar modelo

pytorch.hub

import torch

# Model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

# Images
img = 'https://ultralytics.com/images/zidane.jpg'numpy, list

# Inference
results = model(img)

# Results
results.print()

Uso de modelos sin concentrador, detección de imagen única

from models.common import DetectMultiBackend
from utils.dataloaders import LoadImages
from utils.general import Profile, check_img_size, non_max_suppression, scale_boxes
from utils.torch_utils import select_device
from utils.plots import Annotator, colors
import cv2

import torch


def dtect_img(model, img_path, save_path, size=640):

    imgsz = (640, 640)
    bs = 1  # batch_size
    conf_thres = 0.25
    iou_thres = 0.45
    max_det = 1000
    classes = None
    agnostic_nms = True

    stride, names, pt = model.stride, model.names, model.pt
    imgsz = check_img_size(imgsz, s=stride)  # check image size


    dataset = LoadImages(img_path, img_size=imgsz, stride=stride, auto=pt)

    model.warmup(imgsz=(1 if pt or model.triton else bs, 3, *imgsz))  # warmup
    seen, windows, dt = 0, [], (Profile(), Profile(), Profile())

    # 数据读取
    for path, im, im0s, vid_cap, s in dataset:
        with dt[0]:
            im = torch.from_numpy(im).to(model.device)
            im = im.half() if model.fp16 else im.float()  # uint8 to fp16/32
            im /= 255  # 0 - 255 to 0.0 - 1.0
            if len(im.shape) == 3:
                im = im[None]  # expand for batch dim

        # Inference
        with dt[1]:
            pred = model(im)
        # NMS
        with dt[2]:
            pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)

        det = pred[0]
        annotator = Annotator(im0s, line_width=3, example=str(names))
        if len(det):
            # 图像标注区域等比缩放
            det[:, :4] = scale_boxes(im.shape[2:], det[:, :4], im0s.shape).round()

            for c in det[:, 5].unique():
                n = (det[:, 5] == c).sum()  # detections per class
                s += f"{
      
      n} {
      
      names[int(c)]}{
      
      's' * (n > 1)}, "  # add to string

            # 打印检测结果
            *xyxy, conf, cls = det.tolist()[0]
            name = names[int(c)]
            conf = f'{
      
      float(conf):.2f}'
            print(xyxy, "可信度:", conf, name)

            # 图像标注
            label = name + " " + conf
            annotator.box_label(xyxy, label, color=colors(c, True))

            # 保存图片
            img = annotator.result()

    return img

if __name__ == '__main__':
     model_path = '' # 模型路径
     img_path = '' # 检测图片路径
     save_path = '' # 保存路径
     
     device = ''
     device = select_device(device)

     model_detect = DetectMultiBackend(model_path, device=device)
     img = dtect_img(model_detect, model_path, save_path=)

Supongo que te gusta

Origin blog.csdn.net/YierAnla/article/details/128198555
Recomendado
Clasificación