当前位置: 首页 > news >正文

YOLO——pytorch与paddle实现YOLO

YOLO——pytorch与paddle实现YOLO

本文将深入探讨YOLO目标检测的理论基础,并通过PyTorch和PaddlePaddle两个深度学习框架来展示如何实现基础的YOLO模型。我们将首先介绍YOLO的基本概念,这些理论基础是理解和实现YOLO网络的基础。通过PyTorch和PaddlePaddle的代码示例,我们将展示如何设计、训练和评估一个YOLO目标检测模型,从而让读者能够直观地理解并掌握这两种框架在计算机视觉问题中的应用。

YOLO网络简介

论文地址(You Only Look Once: Unified, Real-Time Object Detection):https://arxiv.org/abs/1506.02640

人类只需一瞥图像,就能立刻知道图像中有什么物体、它们在哪里以及它们如何相互作用。人类的视觉系统既快速又准确,使我们能够在几乎无需有意识思考的情况下执行复杂的任务,比如驾驶。快速、准确的目标检测算法将使计算机能够在没有专门传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时场景信息,并释放通用、响应迅速的机器人系统的潜力。

之前的一些目标检测方法,如R-CNN,使用区域提议方法首先在图像中生成潜在的边界框,然后在这些提议的框上运行分类器。分类后,使用后处理来细化边界框,消除重复的检测,并根据场景中的其他物体对框进行重新评分。这些复杂的流程是缓慢的,并且难以优化,因为每个单独的组件都必须单独训练。

YOLO将目标检测重新定义为一个单一的回归问题,直接从图像像素到边界框坐标和类别概率。使用YOLO系统,只需看一次(YOLO)图像,就可以预测存在哪些物体以及它们的位置。

YOLO令人耳目一新地简单,如下图。一个单一的卷积网络同时预测多个边界框和这些框的类别概率。

在这里插入图片描述

YOLO在全图像上进行训练,并直接优化检测性能。与传统的目标检测方法相比,这种统一的模型具有多种优势:

首先,YOLO非常快。由于YOLO将检测定义为回归问题,因此不需要复杂的流程。只需在测试时在新图像上运行YOLO网络来预测检测。YOLO基础网络在Titan X GPU上以每秒45帧的速度运行,无需批处理,而快速版本则以超过150 fps的速度运行。这意味着YOLO可以以小于25毫秒的延迟实时处理流媒体视频。此外,YOLO的平均精度是其他实时系统的两倍以上。有关YOLO的系统在网络摄像头上实时运行的演示,请参阅YOLO项目网页:https://docs.ultralytics.com/

其次,YOLO在做出预测时会全局考虑图像。与基于滑动窗口和区域提议的技术不同,YOLO在训练和测试期间都会看到整个图像,因此它隐式地编码了关于类别及其外观的上下文信息。Fast R-CNN是一种顶级的检测方法,它错误地将图像中的背景块视为物体,因为它无法看到更大的上下文。与Fast R-CNN相比,YOLO产生的背景错误不到其一半。

第三,YOLO学习了物体的可推广表示。在自然图像上进行训练并在艺术品上进行测试时,YOLO的性能远超DPM和R-CNN等顶级检测方法。由于YOLO具有高度可推广性,因此在应用于新领域或意外输入时,它不太可能崩溃。

YOLO在准确性方面仍然落后于最先进的检测系统。虽然它可以快速识别图像中的物体,但难以精确定位某些物体,尤其是小物体。

YOLO将输入图像划分为一个 S × S S \times S S×S的网格。如果一个目标的中心落入一个网格单元,那么该网格单元负责检测该目标。

在这里插入图片描述

每个网格单元预测 B B B个边界框和这些框的置信度得分。这些置信度得分反映了模型对于框内包含目标的信心,以及它认为自己预测的框的准确度。形式上,置信度定义为 P r ( O b j e c t ) ∗ I O U t r u t h p r e d Pr(Object) * IOU^{pred}_{truth} Pr(Object)IOUtruthpred。如果该网格单元内不存在目标,则置信度得分应为零。否则,我们希望置信度得分等于预测框与真实框之间的交并比(IOU)。

每个边界框包含5个预测值: x x x y y y w w w h h h和置信度。其中, ( x , y ) (x, y) (x,y)坐标表示边界框相对于网格单元边界的中心位置。宽度 w w w和高度 h h h是相对于整个图像预测的。最后,置信度预测表示预测框与任何真实框之间的IOU。

每个网格单元还预测 C C C个条件类别概率, P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject)。这些概率是在网格单元包含目标的条件下得出的。每个网格单元只预测一组类别概率,而不管边界框 B B B的数量。

在测试时,网络将条件类别概率和单个边界框的置信度预测相乘,即:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U t r u t h p r e d = P r ( C l a s s i ) ∗ I O U t r u t h p r e d Pr(Class_i|Object) * Pr(Object) * IOU_{truth_{pred}} = Pr(Class_i) * IOU^{pred}_{truth} Pr(ClassiObject)Pr(Object)IOUtruthpred=Pr(Classi)IOUtruthpred
从而得到每个边界框的特定类别置信度得分。这些得分既编码了该类别出现在边界框中的概率,也编码了预测边界框与目标的匹配程度。

YOLO将检测建模为一个回归问题。它将图像划分为一个S×S的网格,并为每个网格单元预测B个边界框、这些边界框的置信度以及C类概率。这些预测被编码为一个S×S×(B∗5+C)的张量。

YOLO 发展历史

YOLO模型于2015年推出,因其高速度和准确性而迅速受到欢迎。由华盛顿大学的Joseph Redmon和Ali Farhadi开发。https://arxiv.org/pdf/1506.02640

2016年发布的YOLOv2通过引入批量归一化、锚框(anchor boxes)和维度聚类(dimension clusters)对原始模型进行了改进。https://arxiv.org/pdf/1612.08242

2018年推出的YOLOv3通过使用更高效的主干网络、多个锚点和空间金字塔池化(spatial pyramid pooling),进一步提升了模型的性能。https://pjreddie.com/media/files/papers/YOLOv3.pdf

2020年发布的YOLOv4引入了诸如Mosaic数据增强、新的无锚点检测头(anchor-free detection head)和新的损失函数等创新点。https://arxiv.org/pdf/2004.10934

YOLOv5进一步提升了模型的性能,并添加了新的特性,如超参数优化、集成实验跟踪和自动导出到流行的导出格式。https://github.com/ultralytics/yolov5

2022年,美团开源了YOLOv6,该版本目前已在该公司的许多自主配送机器人中使用。https://github.com/meituan/YOLOv6

YOLOv7在COCO关键点数据集上增加了额外的任务,如姿态估计。https://github.com/WongKinYiu/yolov7

YOLOv8是Ultralytics推出的YOLO最新版本。作为一个前沿的、最先进的(SOTA)模型,YOLOv8借鉴了之前版本的成功经验,引入了新的特性和改进,以提高性能、灵活性和效率。YOLOv8支持全系列的视觉AI任务,包括检测、分割、姿态估计、跟踪和分类。这种多功能性使用户能够在不同的应用和领域中利用YOLOv8的能力。https://github.com/ultralytics/ultralytics

YOLOv9引入了创新的方法,如可编程梯度信息(PGI)和广义高效层聚合网络(GELAN)。https://docs.ultralytics.com/models/yolov9/

YOLOv10是由清华大学的研究人员使用Ultralytics Python包创建的。这个版本通过引入一个端到端的头部结构,消除了非极大值抑制(NMS)的需求,从而提供了实时目标检测的进步。https://docs.ultralytics.com/models/yolov10/

Pytorch实现YOLO模型

YOLO安装

可参考YOLO官网快速入门:https://docs.ultralytics.com/zh/quickstart/#install-ultralytics ,进行YOLO的安装。

从python库中进行安装( https://pypi.org/project/ultralytics/):

# Install the ultralytics package from PyPI
pip install ultralytics

直接从gitHub仓库进行安装(https://github.com/ultralytics/ultralytics):

# Install the ultralytics package from GitHub
pip install git+https://github.com/ultralytics/ultralytics.git@main

训练YOLO网络

官网介绍文档:https://docs.ultralytics.com/zh/modes/train/

接下来我们介绍如何使用自己的数据集进行网络训练过程。该过程可以参照作者的另一篇文章:图像识别————玩转YOLO。

我们使用数据集coco128,下载地址:coco128数据集,coco128数据集下载,该数据集中有文件夹images原始图像,labels标签,我们通过设计函数,将data数据集中数据进行适当的调整,转化为ultralytics HUB标准的数据集格式。
HUB Datasets制作可查看官网:https://docs.ultralytics.com/hub/datasets/

import os  
import shutil  
import random  
from pathlib import Path  def check_names_match(image_files, label_files):'''检查图片文件名与标签文件名是否匹配如果匹配,则返回True,否则返回False'''for image_file, label_file in zip(image_files, label_files):if image_file.split('.')[0] != label_file.split('.')[0]:# 在这里添加删除不匹配文件的代码image_files.remove(image_file)label_files.remove(label_file)while len(image_files) != len(label_files):if len(image_files) > len(label_files):# 删除多余的图片文件image_files.pop()else:# 删除多余的标签文件label_files.pop()return Truedef split_data(image_dir, label_dir, output_dir, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1):  """  将数据集中的图片和标签按照指定比例分割成训练、验证和测试集,并创建相应的文件夹结构。  参数:  image_dir (str): 原始图片所在的文件夹路径。  label_dir (str): 原始标签所在的文件夹路径。  output_dir (str): 输出文件夹的路径,用于存放分割后的数据。  train_ratio (float): 训练集所占的比例,默认为0.8。  val_ratio (float): 验证集所占的比例,默认为0.1。  test_ratio (float): 测试集所占的比例,默认为0.1。  """  # 确保比例总和为1  assert train_ratio + val_ratio + test_ratio == 1.0, "Ratios must sum up to 1"  # 创建输出目录结构  Path(output_dir).mkdir(parents=True, exist_ok=True)  output_dir = Path(output_dir)for subset in ['train', 'val', 'test']:  # 使用Path对象的joinpath方法来连接路径,并创建目录  (output_dir.joinpath('images', subset)).mkdir(parents=True, exist_ok=True)  (output_dir.joinpath('labels', subset)).mkdir(parents=True, exist_ok=True) # 获取所有图片和标签的文件名  image_files = sorted(os.listdir(image_dir))  label_files = sorted(os.listdir(label_dir))  check_names_match(image_files, label_files)# 打乱文件列表  combined = list(zip(image_files, label_files))  random.shuffle(combined)  image_files[:], label_files[:] = zip(*combined)  # 根据比例分割数据集  num_files = len(image_files)  train_end = int(num_files * train_ratio)  val_end = train_end + int(num_files * val_ratio)  # 复制文件到对应的文件夹  for i, (img_file, lbl_file) in enumerate(zip(image_files, label_files)):  if i < train_end:  subset = 'train'  elif i < val_end:  subset = 'val'  else:  subset = 'test'  shutil.copy(os.path.join(image_dir, img_file), os.path.join(output_dir, 'images', subset, img_file))  shutil.copy(os.path.join(label_dir, lbl_file), os.path.join(output_dir, 'labels', subset, lbl_file)) import yaml
def generate_yaml_file(output_dir, dataset_name):''' 根据数据集生成yaml文件'''data = {"train": f"images/train","val": f"images/val","test": f"images/test","nc": 0,  # 类别数量,需要根据实际情况修改"names": []  # 类别名称列表,需要根据实际情况修改}# 读取类别名称label_dir = f"{output_dir}/labels"for subset in ["train", "val", "test"]:try:label_files = os.listdir(os.path.join(label_dir, subset))for label_file in label_files:with open(os.path.join(label_dir, subset, label_file), "r") as f:lines = f.readlines()for line in lines:class_name = line.split(" ")[0]if class_name not in data["names"]:data["names"].append(class_name)data["nc"] += 1except FileNotFoundError:data.pop(subset)continue# 写入yaml文件with open(f"{output_dir}/{dataset_name}.yaml", "w") as f:yaml.dump(data, f)
# 使用,我们将data中数据整理到data_sorted文件夹中
path_img = 'data\coco128\images'
path_label = 'data\coco128\labels'
path_out = 'data\coco128_sorted'
split_data(path_img, path_label, path_out)
generate_yaml_file(path_out, 'coco128')

注意,此时生成的COCO128.yaml文件只是一个基本的yaml,里边信息并不能反映出真实的图片信息,读者可以对文件内容进行修改,可参考yolo官网的yaml文件格式:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO8 dataset (first 8 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/detect/coco8/
# Example usage: yolo train data=coco8.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco8  ← downloads here (1 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: # test images (optional)# Classes
names:0: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: toothbrush

现在我们加载yolo模型并进行训练:

选择模型

登入网站ultralytics hub,在Models中可以看到很多模型,选择合适的模型进行训练,例如yolov8m.pt,下载到本地,并加载模型即可:

在这里插入图片描述

导出模型后,我们只需将模型文件yolov8m.pt放入项目文件夹中,并加载模型即可。也可通过官网示例进行训练:https://docs.ultralytics.com/zh/modes/train/

from ultralytics import YOLO# Load a model
model = YOLO("yolov8m.pt")

训练模型并结果分析

# Train the model
results = model.train(data="data\coco128_sorted\coco128.yaml", epochs=100)
Ultralytics YOLOv8.2.74 🚀 Python-3.10.12 torch-2.0.1+cu118 CUDA:0 (NVIDIA GeForce RTX 4090, 24217MiB)
[34m[1mengine/trainer: [0mtask=detect, mode=train, model=yolov8m.pt, data=/home/featurize/data/datasets/data/coco128_sorted/coco128.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs/detect/trainfrom  n    params  module                                       arguments                     0                  -1  1      1392  ultralytics.nn.modules.conv.Conv             [3, 48, 3, 2]                 1                  -1  1     41664  ultralytics.nn.modules.conv.Conv             [48, 96, 3, 2]                2                  -1  2    111360  ultralytics.nn.modules.block.C2f             [96, 96, 2, True]             3                  -1  1    166272  ultralytics.nn.modules.conv.Conv             [96, 192, 3, 2]               4                  -1  4    813312  ultralytics.nn.modules.block.C2f             [192, 192, 4, True]           5                  -1  1    664320  ultralytics.nn.modules.conv.Conv             [192, 384, 3, 2]              6                  -1  4   3248640  ultralytics.nn.modules.block.C2f             [384, 384, 4, True]           7                  -1  1   1991808  ultralytics.nn.modules.conv.Conv             [384, 576, 3, 2]              8                  -1  2   3985920  ultralytics.nn.modules.block.C2f             [576, 576, 2, True]           9                  -1  1    831168  ultralytics.nn.modules.block.SPPF            [576, 576, 5]                 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           12                  -1  2   1993728  ultralytics.nn.modules.block.C2f             [960, 384, 2]                 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           15                  -1  2    517632  ultralytics.nn.modules.block.C2f             [576, 192, 2]                 16                  -1  1    332160  ultralytics.nn.modules.conv.Conv             [192, 192, 3, 2]              17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           18                  -1  2   1846272  ultralytics.nn.modules.block.C2f             [576, 384, 2]                 19                  -1  1   1327872  ultralytics.nn.modules.conv.Conv             [384, 384, 3, 2]              20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           21                  -1  2   4207104  ultralytics.nn.modules.block.C2f             [960, 576, 2]                 22        [15, 18, 21]  1   3822016  ultralytics.nn.modules.head.Detect           [80, [192, 384, 576]]         
Model summary: 295 layers, 25,902,640 parameters, 25,902,624 gradients, 79.3 GFLOPsTransferred 475/475 items from pretrained weights
[34m[1mTensorBoard: [0mStart with 'tensorboard --logdir runs/detect/train', view at http://localhost:6006/
Freezing layer 'model.22.dfl.conv.weight'
[34m[1mAMP: [0mrunning Automatic Mixed Precision (AMP) checks with YOLOv8n...
[34m[1mAMP: [0mchecks passed ✅
[34m[1mtrain: [0mScanning /home/featurize/data/datasets/data/coco128_sorted/labels/train.cache... 59 images, 24 backgrounds, 0 corrupt: 100%|██████████| 83/83 [00:00<?, ?it/s]
[34m[1mval: [0mScanning /home/featurize/data/datasets/data/coco128_sorted/labels/val.cache... 8 images, 8 backgrounds, 0 corrupt: 100%|██████████| 16/16 [00:00<?, ?it/s]
Plotting labels to runs/detect/train/labels.jpg... 
[34m[1moptimizer:[0m 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically... 
[34m[1moptimizer:[0m AdamW(lr=0.000119, momentum=0.9) with parameter groups 77 weight(decay=0.0), 84 weight(decay=0.0005), 83 bias(decay=0.0)
[34m[1mTensorBoard: [0mmodel graph visualization added ✅
Image sizes 640 train, 640 val
Using 8 dataloader workers
Logging results to [1mruns/detect/train[0m
Starting training for 100 epochs...Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size1/100      7.65G     0.7807     0.8657      1.074          2        640: 100%|██████████| 6/6 [00:04<00:00,  1.30it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 16.72it/s]                   all         16         35      0.741      0.865      0.864      0.723Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size2/100       7.6G     0.7839     0.6583       1.04         18        640: 100%|██████████| 6/6 [00:00<00:00,  8.44it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 17.89it/s]                   all         16         35      0.765      0.891       0.88      0.738...(此处省略训练过程)Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size100/100      7.66G     0.4719     0.3212     0.8571         13        640: 100%|██████████| 6/6 [00:00<00:00,  9.82it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 18.14it/s]                   all         16         35      0.901       0.98      0.952      0.894100 epochs completed in 0.050 hours.
Optimizer stripped from runs/detect/train/weights/last.pt, 52.1MB
Optimizer stripped from runs/detect/train/weights/best.pt, 52.1MBValidating runs/detect/train/weights/best.pt...
Ultralytics YOLOv8.2.74 🚀 Python-3.10.12 torch-2.0.1+cu118 CUDA:0 (NVIDIA GeForce RTX 4090, 24217MiB)
Model summary (fused): 218 layers, 25,886,080 parameters, 0 gradients, 78.9 GFLOPsClass     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 12.67it/s]all         16         35      0.906      0.981      0.952      0.908person          2          8      0.639      0.667      0.724       0.48car          1          1      0.484          1      0.497      0.497motorcycle          1          2       0.96          1      0.995      0.995truck          1          1      0.937          1      0.995      0.995bench          1          2      0.984          1      0.995      0.995dog          1          1      0.926          1      0.995      0.895elephant          1          2      0.962          1      0.995      0.995fork          1          1       0.92          1      0.995      0.995bowl          2          4      0.989          1      0.995      0.973orange          1          4      0.992          1      0.995      0.961broccoli          1          1      0.914          1      0.995      0.995cake          1          1      0.921          1      0.995      0.995potted plant          1          1      0.953          1      0.995      0.895oven          1          1      0.927          1      0.995      0.995sink          1          1      0.949          1      0.995      0.995refrigerator          1          1       0.92          1      0.995      0.995clock          2          2          1      0.989      0.995      0.704vase          1          1      0.935          1      0.995      0.995
Speed: 0.1ms preprocess, 1.6ms inference, 0.0ms loss, 0.5ms postprocess per image
Results saved to [1mruns/detect/train[0m

从上方训练过程可以简单看出模型的训练效果及训练时的参数,模型所有的训练结果都将保存到训练时生成的文件夹runs中,主要包括以下部分,各部分具体内容可见博客:https://blog.csdn.net/java1314777/article/details/134154676 :

  • runs/detect/train/weights/best.pt:训练过程中表现最好的模型权重文件
  • runs/detect/train/weights/last.pt:训练过程中最后一次的模型权重文件
  • runs/detect/train/results.csv:训练过程中每次epoch的评估结果,包括每一轮的 train/box_loss(训练时边界框损失), train/cls_loss(训练时分类损失), train/dfl_loss(训练时Distribution Focal Loss), metrics/precision(B)(预测正确的正样本比例), metrics/recall(B)(模型能够找出所有真实正样本比例), metrics/mAP50(B)(在50%的IOU阈值下MAP值), metrics/mAP50-95(B)(在50%~95%的IOU下MAP值取平均), val/box_loss(验证时边界框损失), val/cls_loss(验证时分类损失), val/dfl_loss(验证时Distribution Focal Loss)
  • runs/detect/train/args.yaml:训练过程中使用的参数
  • runs/detect/train/confusion_matrix.png: 混淆矩阵
  • runs/detect/train/confusion_matrix_normalized.png: 归一化化混淆矩阵
  • runs/detect/train/PR_curve.png: 精确率-召回率曲线
  • runs/detect/train/P_curve.png: 精确率曲线
  • runs/detect/train/R_curve.png: 召回率曲线
  • runs/detect/train/F1-curve.png: F1曲线
  • runs/detect/train/results.png: 训练结果可视化
  • runs/detect/train/labels.jpg: 目标的类别和边界框信息
  • runs/detect/train/labels_correlogram.jpg: 预测标签之间的相关性

PaddlePaddle实现YOLO

项目位置: https://github.com/PaddlePaddle/PaddleYOLO
项目Gitee位置: https://gitee.com/paddlepaddle/PaddleDetection

PaddleYOLO安装

安装说明:https://github.com/PaddlePaddle/PaddleYOLO/blob/develop/docs/tutorials/INSTALL_cn.md

首先需要安装paddlepaddle:

# CUDA(GPU版本CUDA)
python -m pip install paddlepaddle-gpu==2.3.2 -i https://mirror.baidu.com/pypi/simple# CPU(CPU版本)
python -m pip install paddlepaddle==2.3.2 -i https://mirror.baidu.com/pypi/simple
import paddle
print("paddle version:",paddle.__version__)
paddle version: 2.5.2

安装PaddleDetection:


# 克隆PaddleDetection仓库
cd <path/to/clone/PaddleDetection>
git clone https://github.com/PaddlePaddle/PaddleDetection.git# 安装其他依赖
cd PaddleDetection
pip install -r requirements.txt# 编译安装paddledet
python setup.py install

训练YOLO模型

读者可结合paddleYOLO官网教程进行YOLO目标检测模型的训练部署:https://gitee.com/paddlepaddle/PaddleDetection/tree/release/2.7/docs/tutorials

准备数据集

PaddleDetection默认支持COCO和Pascal VOC 和WIDER-FACE 数据源。准备数据集教程:https://gitee.com/paddlepaddle/PaddleDetection/blob/release/2.7/docs/tutorials/data/PrepareDetDataSet.md
同时还支持自定义数据源,包括:

  • (1) 自定义数据转换成VOC数据;
  • (2) 自定义数据转换成COCO数据;
  • (3) 自定义新的数据源,增加自定义的reader。

我们下载一下VOC数据集:

首先在PaddleDetection文件夹内打开终端,或者执行:

cd PaddleDetection/

然后执行:

python dataset/roadsign_voc/download_roadsign_voc.py

如果成功运行的话,即可在PaddleDetection/dataset中看到roadsign_voc文件夹:

  ├── download_roadsign_voc.py├── annotations│   ├── road0.xml│   ├── road1.xml│   |   ...├── images│   ├── road0.png│   ├── road1.png│   |   ...├── label_list.txt├── train.txt├── valid.txt

训练

在PaddleDetection中打开文件configs/yolov3/yolov3_mobilenet_v1_roadsign.yml,可以看到该文件已经配置好了下载数据集训练和测试的参数:

_BASE_: ['../datasets/roadsign_voc.yml','../runtime.yml','_base_/optimizer_40e.yml','_base_/yolov3_mobilenet_v1.yml','_base_/yolov3_reader.yml',
]
pretrain_weights: https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_270e_coco.pdparams
weights: output/yolov3_mobilenet_v1_roadsign/model_finalYOLOv3Loss:ignore_thresh: 0.7label_smooth: true

命令行执行命令:

export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml

训练好之后在output文件夹中即可看到训练过程中产生的所有模型参数,让我们把最终的模型参数加载一下进行预测.

在命令行执行:

python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \--infer_img=demo/road554.png \--output_dir=infer_output/ \--draw_threshold=0.5 \-o weights=output/model_final \--use_vdl=True

在PaddleDetection/infer_output/road554.png中即可看到图像的目标检测结果:
在这里插入图片描述

相关文章:

YOLO——pytorch与paddle实现YOLO

YOLO——pytorch与paddle实现YOLO 本文将深入探讨YOLO目标检测的理论基础&#xff0c;并通过PyTorch和PaddlePaddle两个深度学习框架来展示如何实现基础的YOLO模型。我们将首先介绍YOLO的基本概念&#xff0c;这些理论基础是理解和实现YOLO网络的基础。通过PyTorch和PaddlePad…...

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早&#xff0c;赶了个晚集”&#xff0c;用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日&#xff0c;北汽蓝谷新能源科技股份有限公司&#xff08;SH:600733&#xff0c;简称“北汽蓝谷”&#xff09;对外披露了子公司北京…...

C# OpenCV机器视觉:背景减除与前景分离

在实验室的一角&#xff0c;阳光仿若一个急性子的小精灵&#xff0c;迫不及待地穿过窗帘缝隙&#xff0c;在阿强的桌面上欢快跳跃&#xff0c;洒下一片片斑驳陆离的光影&#xff0c;似乎在催促着阿强赶紧开启今日的奇妙探索。阿强端坐在桌前&#xff0c;眼神炽热地盯着眼前那台…...

C语言return与 ? :

上次讲解过一次函数&#xff0c;函数要配合return返回东西&#xff0c;但是在编写一些程序的时候我发现了很多冷门逻辑语法还没有掌握&#xff0c;当时讲课也是看一眼就过去了&#xff08;死去的记忆开始攻击我&#xff09; Return&#xff0c;爽&#xff01; 现在有一个小问…...

【论文阅读】SCGC : Self-supervised contrastive graph clustering

论文地址&#xff1a;SCGC : Self-supervised contrastive graph clustering - ScienceDirect 代码地址&#xff1a; https://github.com/gayanku/SCGC 摘要 图聚类旨在发现网络中的群体或社区。越来越多的模型使用自编码器&#xff08;autoencoders&#xff09;结合图神经网…...

python pyqt5+designer的信号槽和动态显示

至少需要两个文件&#xff0c;一个是python的主文件&#xff0c;一个是designer的UI文件 1.对UI文件的处理 首先需要将UI文件转化成python文件&#xff0c;并且引入到主文件中。 2.在主文件中接受UI上的一些动作和返回主文件处理的数据到UI界面上。 框中选中的部分&#xff0c…...

版本控制系统Helix Core 2024.2增强功能:与OpenTelemetry协议集成、Delta同步和传输等

“Perforce团队非常高兴为您带来Helix Core 2024.2版本&#xff0c;它拥有众多旨在提高团队效率、优化工作流程的增强功能。通过新的Open Telemetry协议集成&#xff0c;团队现在可以轻松将结构化日志集成到可观测性平台中。DeltaTransfer现在也适用于同步操作——这是2024.1版…...

certificate verify failed: unable to get local issuer certificate (_ssl.c:10

出现 “certificate verify failed: unable to get local issuer certificate (_ssl.c:10)” 这个错误通常是因为Python在尝试建立HTTPS连接时&#xff0c;无法验证服务器的SSL证书。这可能是因为本地系统中缺少必要的根证书&#xff0c;或者服务器的证书链不完整&#xff0c;导…...

关于大一上的总结

大一上总结 前言 源于学长们都喜欢写总结&#xff0c;今晚也正好听见一首有点触动心灵的歌&#xff0c;深有感慨&#xff0c;故来此写下这篇总结 正文 1.暑假前的准备 暑假之前姑且还是学习了基本的C语法&#xff0c;大概是到了结构体的地方&#xff0c;进度很慢&#xff0…...

JavaScript的基础知识

在鸿蒙操作系统的应用开发中&#xff0c;JavaScript作为一种广泛使用的编程语言&#xff0c;扮演着重要的角色。无论是构建用户界面还是实现业务逻辑&#xff0c;理解JavaScript的基础知识都是必不可少的。本文将深入探讨鸿蒙开发中与JavaScript相关的几个关键概念&#xff1a;…...

数据结构之单链表(超详解)

文章目录 1. 单链表1.1 概念、结构1.2 结点1.2.1 链表的性质 2. 链表的打印3. 尾插、头插创建结点尾插头插 4. 尾删、头删尾删头删 5. 查找指定结点6. 指定位置之前、之后插入数据指定位置之前插入数据指定位置之后插入数据 7. 删除指定位置结点7.1 删除指定位置之后结点8. 链表…...

告别编程困惑:GDB、冯诺依曼、操作系统速通指南

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 前言 一…...

网络分析工具-tcpdump

文章目录 前言一、tcpdump基础官网链接命令选项详解常规过滤规则tcpdump输出 一、tcpdump实践HTTP协议ICMP状态抓包 前言 当遇到网络疑难问题的时候&#xff0c;抓包是最基本的技能&#xff0c;通过抓包才能看到网络底层的问题 一、tcpdump基础 tcpdump是一个常用的网络分析工…...

基于AI边缘计算盒子的智慧零售场景智能监控解决方案

一、方案背景 随着零售业的快速发展&#xff0c;传统零售模式面临着诸多挑战&#xff0c;如人力成本高、管理效率低、顾客体验不佳等。智慧零售借助人工智能、物联网等技术手段&#xff0c;实现对零售场景的全面感知和智能管理。AI边缘计算盒子作为智慧零售的关键技术之一&…...

STM32G431收发CAN

1.硬件连接 PB8作为CAN_RX&#xff0c;PB9作为CAN_TX&#xff0c;连接一个CAN收发器TJA1051T/3 2. CubeMX里配置CAN 设置连接FDCAN1的参数&#xff0c;使用1个标准过滤器&#xff0c;波特率位500K 使能FDCAN1的中断 3 自动生成代码 3.1 初始化 static void MX_FDCAN1_In…...

如何得到深度学习模型的参数量和计算复杂度

1.准备好网络模型代码 import torch import torch.nn as nn import torch.optim as optim# BP_36: 输入2个节点&#xff0c;中间层36个节点&#xff0c;输出25个节点 class BP_36(nn.Module):def __init__(self):super(BP_36, self).__init__()self.fc1 nn.Linear(2, 36) # …...

2025年股指期货每月什么时候交割?

股指期货交割日是指期货合约到期时&#xff0c;买卖双方根据合约规定的指数价值进行现金结算的日期。在中国市场中&#xff0c;股指期货的交割日通常是合约到期月份的第三个星期五。这一规律适用于所有股指期货合约&#xff0c;无论是当月、下月合约&#xff0c;还是季度月合约…...

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码&#xff0c;我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时&#xff0c;才会发现它就像一本魔法书&#xff0c;轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具&#xff1f;它究…...

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…...

关于 AWTK 和 Weston 在旋转屏幕时的资源消耗问题

关于 AWTK 和 Weston 在旋转屏幕时的资源消耗问题&#xff0c;首先需要理解这两者旋转的本质区别及其资源开销。 AWTK的屏幕旋转&#xff1a; AWTK旋转的实现方式&#xff1a; AWTK 是一个用户界面工具包&#xff0c;它通过图形渲染系统处理所有控件和窗口的旋转。当你使用 w…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...