Yolov5 cria um conjunto de dados e treina o modelo de detecção de alvo

Coleta de conjunto de dados

Use labelimg para anotação de dados

Mostre alguns abaixo 内联代码片.

pip install labelimg
labelimg

Insira a descrição da imagem aqui
O primeiro passo é clicar para abrir o arquivo , selecionar o diretório da imagem a ser anotada, clicar para alterar o diretório de salvamento e selecionar o local de salvamento da etiqueta anotada.
Insira a descrição da imagem aqui
Em seguida, selecionar o formato da etiqueta. Depende da forma como o modelo lê os dados durante o treinamento.
Recomenda-se ativar o salvamento automático na Visualização.

tecla de atalho
A Foto anterior
D próxima foto
C Seleção rápida de quadros

Formato do conjunto de dados

Tome yolov5 como exemplo

conjuntos de dados
trem
imagens
rótulos
teste
imagens
rótulos
válido
imagens
rótulos

Recomenda-se que o conjunto de dados seja dividido em trem: teste: válido = 7: 2: 1

Modelo de treinamento

Baixe e configure o ambiente yolov5

Precisa ser executado na versão pytorch gpu

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

Coloque o conjunto de dados

Basta colocar o conjunto de dados no diretório yolo5 e decorar o arquivo .yaml

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

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

Nomeie-o como data.yaml e coloque-o no diretório yolo5\dataset.

Modelo de treinamento

Abra train.py e defina os quatro parâmetros a seguir

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 é o caminho do conjunto de dados, use o arquivo data.yaml
–batch-size é o número de imagens em cada lote de treinamento. Aumentar esse valor aumentará a velocidade de treinamento e também levará a um maior uso de memória –tempos de treinamento de
épocas

O modelo usa yolov5s.pt por padrão. Os parâmetros de cada modelo pré-treinado são os seguintes:

Modelo tamanho
(pixels)
valor mAP 0,5:0,95
mAP val
0,5
Velocidade
CPU b1
(ms)
Velocidade
V100 b1
(ms)
Velocidade
V100 b32
(ms)
parâmetros
(M)
FLOP
@640 (B)
YOLOv5n 640 28,0 45,7 45 6.3 0,6 1,9 4,5
YOLOv5s 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
YOLOv5l 640 49,0 67,3 430 10.1 2.7 46,5 109.1
YOLOv5x 640 50,7 68,9 766 12.1 4.8 86,7 205,7
YOLOv5n6 1280 36,0 54,4 153 8.1 2.1 3.2 4.6
YOLOv5s6 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
YOLOv5l6 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
-

Em seguida, execute train.py para treinar o 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 não-hub, detecção de imagem ú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=)

Acho que você gosta

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