深度学习(一):Pytorch之YOLOv8目标检测

news/2024/7/10 23:27:14 标签: 深度学习, pytorch, YOLO

1.YOLOv8

2.模型详解

2.1模型结构设计

 

 

主要的模块: 

  • Conv
  • SPPF
  • Bottleneck
  • Concat
  • Upsample
  • C2f 

Backbone ----->Neck------>head

  • Backdone 

1.第一个卷积层的 kernel 从 6x6 变成了 3x3
2. 所有的 C3 模块换成 C2f,可以发现多了更多的跳层连接和额外的 Split 操作 

3.Backbone 中 C2f 的 block 数从 3-6-9-3 改成了 3-6-6-3

  • Neck 

1.去掉了 Neck 模块中的 2 个卷积连接层 

  • head 

1.不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法。 

  • Objectness:Objectness本质上是物体存在于感兴趣区域内的概率的度量。如果我们Objectness很高,这意味着图像窗口可能包含一个物体
  • Distribution Focal Loss:针对的是目标框坐标不够灵活的问题,尤其在边界不够清晰明确的情况下(如遮挡等)。
  • Distribution Focal Loss论文:https://arxiv.org/pdf/2006.04388.pdf

2.2Loss 计算

2.2.1正负样本分配策略

YOLOv8 算法中直接引用了 TOOD 的 TaskAlignedAssigner

TOOD 的 TaskAlignedAssigner:https://arxiv.org/pdf/2108.07755.pdf

总结:TaskAligned使用分类得分和IoU的高阶组合来衡量Task-Alignment的程度

t=s^{\alpha}\times_{}u_{}^{\beta}

2.2.2分类损失(VFL)

样本不均衡,正样本极少,负样本极多,需要降低负样本对 loss 的整体贡献了,于是用了focal loss。VFL当然具备focal loss拥有的所有特性。

VFL独有的:

(1)学习 IACS 得分( localization-aware 或 IoU-aware 的 classification score)

(2)如果正样本的 gt_IoU 很高时,则对 loss 的贡献更大一些,可以让网络聚焦于那些高质量的样本上,也就是说训练高质量的正例对AP的提升比低质量的更大一些。
 

\mathrm{VFL(p,q)=\begin{cases}-q(qlog(p)+(1-q)log(1-p))&q>0\\-\alpha p^\gamma log(1-p)&q=0,\\\end{cases}}

 2.2.3目标识别损失1(DFL)

将框的位置建模成一个 general distribution,让网络快速的聚焦于和目标位置距离近的位置的分布。

2.2.4目标识别损失2(CIOU Loss) 

\begin{aligned}\mathrm{CIoU}&=\mathrm{IoU}-\frac{\mathrm{D}_2^2}{\mathrm{D}_C^2}-\alpha\mathrm{v}\\\\\alpha&=\frac{\mathrm{v}}{(1-\mathrm{IoU})+\mathrm{v}}\\\\\mathrm{v}&=\frac{4}{\pi^2}(\arctan\frac{\mathrm{w}^{\mathrm{gt}}}{\mathrm{h}^{\mathrm{gt}}}-\arctan\frac{\mathrm{w}}{\mathrm{h}})^2\end{aligned}

2.2.5样本匹配


(1)抛弃了Anchor-Base方法,转而使用Anchor-Free方法

(2)找到了一个替代边长比例的匹配方法——TaskAligned

Anchor-Based是什么?——Anchor-Based是指的利用anchor匹配正负样本,从而缩小搜索空间,更准确、简单地进行梯度回传,训练网络。

Anchor-Based方法的劣势是什么?——但是因为下列这些劣势,我们抛弃掉了anchor 这一多余的步骤。

anchor也会对网络的性能带来影响:

(1)如巡训练匹配时较高的开销

(2)有许多超参数需要人为尝试调节等

Anchor-free的优势是什么?——Anchor-free模型则摒弃或是绕开了锚的概念,用更加精简的方式来确定正负样本,同时达到甚至超越了两阶段anchor-based的模型精度,并拥有更快的速度。

为与NMS(non maximum suppression非最大抑制)搭配,训练样例的Anchor分配需要满足以下两个规则:——

正常对齐的Anchor应当可以预测高分类得分,同时具有精确定位;

不对齐的Anchor应当具有低分类得分,并在NMS阶段被抑制。

基于上述两个目标,TaskAligned设计了一个新的Anchor alignment metric 来在Anchor level 衡量Task-Alignment的水平。并且,Alignment metric 被集成在了 sample 分配和 loss function里来动态的优化每个 Anchor 的预测。

3.代码实践

3.1目标检测 

from ultralytics import YOLO
from PIL import Image
# 加载模型
model = YOLO('yolov8x.pt')  # 加载官方模型

# 使用模型进行预测
results = model("E:\BaiduNetdiskDownload\people.jpg")  # 对图像进行预测
# 展示结果
for r in results:
    im_array = r.plot(font_size=0.01,conf=False)  # 绘制包含预测结果的BGR numpy数组
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL图像
    im.show()  # 显示图像
    im.save('results.jpg')  # 保存图像

3.2目标分割

from ultralytics import YOLO
from PIL import Image
# 载入一个模型
model = YOLO('yolov8x-seg.pt')    # 载入官方模型


# 使用模型进行预测
results = model("E:\BaiduNetdiskDownload\people.jpg")  # 对一张图像进行预测
for r in results:
    im_array = r.plot(font_size=0.01,conf=False,labels=False)  # 绘制包含预测结果的BGR numpy数组
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL图像
    im.show()  # 显示图像
    im.save('results.jpg')  # 保存图像

3.3目标分类

from ultralytics import YOLO
from PIL import Image
# 加载模型
model = YOLO('yolov8n-cls.pt')  # 加载官方模型


# 使用模型进行预测
results = model('E:\BaiduNetdiskDownload\people.jpg')  # 对图像进行预测
for r in results:
    im_array = r.plot(font_size=0.01,conf=False,labels=False)  # 绘制包含预测结果的BGR numpy数组
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL图像
    im.show()  # 显示图像
    im.save('results.jpg')  # 保存图像

3.4目标姿态

from ultralytics import YOLO
from PIL import Image
# 加载模型
model = YOLO('yolov8n-pose.pt')  # 加载官方模型


# 使用模型进行预测
results = model('E:\BaiduNetdiskDownload\people.jpg')  # 对图像进行预测
for r in results:
    im_array = r.plot(font_size=0.01,conf=False,labels=False)  # 绘制包含预测结果的BGR numpy数组
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL图像
    im.show()  # 显示图像
    im.save('results.jpg')  # 保存图像


http://www.niftyadmin.cn/n/5229656.html

相关文章

知识蒸馏代码实现(以MNIST手写数字体为例,自定义MLP网络做为教师和学生网络)

dataloader_tools.py import torchvision from torchvision import transforms from torch.utils.data import DataLoaderdef load_data():# 载入MNIST训练集train_dataset torchvision.datasets.MNIST(root "../datasets/",trainTrue,transformtransforms.ToTens…

Kubernetes 安全最佳实践:保护您的秘密

Kubernetes 是一个可用于微服务的开源容器编排平台。当我们想要部署容器化应用程序、自动化管理和扩展应用程序时,Kubernetes 非常有用。 在容器中运行单个微服务而不是在同一虚拟机中运行多个进程几乎总是更安全。每当我们在 Kubernetes 中启动任何 pod 时&#x…

opencv读取二进制灰度图并显示

#include <iostream> #include <fstream> #include <vector> #include <stdint.h>#include <opencv2/opencv.hpp> // 包含OpenCV头文件using namespace std;// 注意&#xff1a;确保这些值与Python脚本中生成数据的值匹配。 const int WIDTH 19…

RabbitMQ登录控制台显示--你与此网站的连接不是私密连接

一、RabbitMQ默认账号 Note: The default administrator username and password are guest and guest. 注:默认管理员用户名和密码为guest和guest 二、自己修改过或者注册的情况 由于本人之前用过,注册过账号密码,在登录时,用户名账号有异常出现以下问题 解决方案: 因为我的rab…

网络安全攻击解析:十种常见攻击手段

导言&#xff1a; 随着互联网的普及和依赖程度的提高&#xff0c;网络安全攻击也变得越来越复杂和隐蔽。攻击者使用各种手段来突破网络防线&#xff0c;获取敏感信息或者破坏系统。本文将介绍十种常见的网络安全攻击手段&#xff0c;包含具体的使用示例&#xff0c;以便更好地…

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接&#xff1a; https://repo.anaconda.com/archive/ 我安装的版本链接如下&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载&#xff1a; wget …

JavaScript计算信封的宽度和高度

给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0c;表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一个信封里&#xff0c;如同俄罗斯套娃一样。 请计算 最多能有多少个 信…

如何区分model.predict() 和 model.predict_proba()?

最近在做关于机器学习和深度学习实验的时候&#xff0c;直接将机器学习模型套了深度学习中&#xff0c;但出现了报错&#xff0c;下面我们来解释一下。 机器学习中&#xff1a; def model_performance(model,X_train,y_train,X_test,y_test):model.fit(X_train, y_train)pred…