25/1/12 算法笔记 剖析Yolov8底层逻辑
YOLOv8 是一种基于深度学习的目标检测和图像分割模型,属于 YOLO(You Only Look Once)系列的最新版本。YOLO 系列模型以其高效的实时目标检测能力而闻名,YOLOv8 在此基础上进行了一些优化和改进。
Yolov8的主要特点:
1.实时性,在速度和准确性之间得到了良好的平衡,适合实时应用。
2.多任务学习,支持多任务,包括目标检测,示例分割,语义分割
3.改进的网络结构,引入了新的网络结构和层,可能包括更深的卷积层,更高效的特征提取模块等,以提高模型的性能。
4.增强的训练策略,采用一系列新的训练策略,如数据增强,混合精度训练。
5.可拓展性,允许用户根据具体任务的需求进行自定义和扩展。
Yolov8的网络结构:
Backbone:网络的特征提取部分,负责从输入图像中提取高层次的特征。
import torch
import torch.nn as nnclass CSPNet(nn.Module):def __init__(self, in_channels, out_channels):super(CSPNet, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels // 2, kernel_size=1)self.conv2 = nn.Conv2d(in_channels, out_channels // 2, kernel_size=1)self.conv3 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)def forward(self, x):x1 = self.conv1(x)x2 = self.conv2(x)return self.conv3(torch.cat((x1, x2), dim=1))
通过两个1*1卷积将输入特征分成两块,然后将它们拼接在一起,最后通过3*3卷积处理。
Backbone会根据任务的复杂度和目标的多样性来调整层数。例如:
class YOLOv8Backbone(nn.Module):def __init__(self):super(YOLOv8Backbone, self).__init__()self.backbone = nn.Sequential(nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(32),nn.ReLU(),nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1),nn.BatchNorm2d(64),nn.ReLU(),# 继续增加通道数...)def forward(self, x):x = self.backbone(x)return x
通道数的逐步增加确保了模型在不同层次上捕捉到丰富的特征,同时避免了过高的计算成本。这样的设计在实际应用中能够有效提升模型的性能和效率。
Neck:用于连接Backbone和Head,通常负责特征融合和多尺度特征的生成。
FPN 类实现了一个简单的特征金字塔网络。它通过 1x1 卷积生成横向连接的特征,并通过上采样将特征提升到更高的分辨率。
class FPN(nn.Module):def __init__(self, in_channels, out_channels):super(FPN, self).__init__()self.lateral_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)self.upsample = nn.Upsample(scale_factor=2, mode='nearest')def forward(self, x):lateral = self.lateral_conv(x)upsampled = self.upsample(lateral)return upsampled
Upsample:是一种将低分辨率数据转换为高分辨率数据的操作。它在信号处理、图像处理、计算机视觉和深度学习等领域中广泛应用。上采样的目的是增加数据的尺寸或分辨率,同时尽可能地保留原始数据的特征。
Head:是模型的输出部分,负责生成最终的检测预测,包括边界框的位置,类别概率和分割掩码。YOLOV8在此部分可能会采用新的损失函数和预测方式。
class YOLOHead(nn.Module):def __init__(self, in_channels, num_classes):super(YOLOHead, self).__init__()self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(in_channels, num_classes + 5, kernel_size=1) # 5 for bbox (x, y, w, h, conf)def forward(self, x):x = self.conv1(x)return self.conv2(x)
这个示例中,类实现了Yolov的输出层,首先通过一个3*3卷积提取特征,然后通过一个1*1卷积生成边界框和类别概率的预测。
整体的网络结构
class YOLOv8(nn.Module):def __init__(self, num_classes):super(YOLOv8, self).__init__()self.backbone = CSPNet(in_channels=3, out_channels=64)self.neck = FPN(in_channels=64, out_channels=128)self.head = YOLOHead(in_channels=128, num_classes=num_classes)def forward(self, x):x = self.backbone(x)x = self.neck(x)return self.head(x)
损失函数
Yolov8使用多重损失函数来优化模型,包括定位损失,置信度损失和类别损失。
class YOLOLoss(nn.Module):def __init__(self):super(YOLOLoss, self).__init__()def forward(self, predictions, targets):# 计算定位损失、置信度损失和类别损失loc_loss = self.compute_location_loss(predictions, targets)conf_loss = self.compute_confidence_loss(predictions, targets)class_loss = self.compute_class_loss(predictions, targets)return loc_loss + conf_loss + class_loss
预测机制
Yolov8通过将图像划分位网络来进行目标检测,每个网络负责预测其中心点落在其内部的目标。每个网络预测以下信息:
边界框坐标:通常以相对于网络单元的偏移量和比例进行预测
置信度分数:表示该网络内是否有目标的概率
类别概率:表示目标属于各个类别的概率分布
数据增强和训练策略
YOLOv8 采用多种数据增强技术,以提高模型的泛化能力。常见的数据增强方法包括:
随机裁剪,旋转,翻转
import torchvision.transforms as transformstransform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2),
])
推理和后处理
在推理阶段,YOLOv8 会对输入图像进行处理,生成预测结果。
包括:
非极大值抑制NM5:用于消除重叠的边界框,只保留置信度最高的框。
def non_max_suppression(predictions, conf_threshold=0.5, iou_threshold=0.4):# 过滤低置信度的预测predictions = [p for p in predictions if p[4] >= conf_threshold]# 按照置信度排序predictions.sort(key=lambda x: x[4], reverse=True)keep_boxes = []while predictions:best_box = predictions.pop(0)keep_boxes.append(best_box)predictions = [p for p in predictions if compute_iou(best_box, p) < iou_threshold]return keep_boxes
阈值过滤:根据设定的阈值过滤低置信度的预测。
def filter_predictions(predictions, conf_threshold):return [p for p in predictions if p[4] >= conf_threshold]
总的来看其实Yolov8模型并没有这么复杂,其实是它里面的结构网络设计的非常具有合理性,使得它简单高效。
Backbone:
- 特征提取效率:选择高效的网络结构,减少计算量,同时保留足够的特征信息。
- 深度和宽度的平衡:合理的层数和通道数设计,使得模型在提取低级和高级特征时具有良好的表现。
- 预训练模型:通常使用在大规模数据集(如 ImageNet)上预训练的模型,帮助加速收敛并提高准确性。
Neck:
- 特征金字塔结构:通过特征金字塔网络(FPN)或其他融合方法,能够有效地结合来自不同层的特征,增强模型对多尺度目标的检测能力。
- 减少信息损失:在特征融合过程中,合理的设计可以最大限度地保留重要信息,避免特征的丢失。
Head:
- 多任务学习:通过同时预测多个输出(边界框、置信度、类别),模型能够更好地学习到目标的特征,提高检测的准确性。
- 损失函数设计:合理的损失函数组合(如定位损失、置信度损失和类别损失)能够使模型在训练过程中更有效地优化各个任务,避免单一任务的过拟合。
网络结构也能基于任务复杂性自主调节:
# 基于任务复杂性调整通道数if task_complexity == 'simple':self.channels = [32, 64, 128]elif task_complexity == 'moderate':self.channels = [64, 128, 256]else: # complexself.channels = [128, 256, 512]# 根据类别数量调整最后一层的通道数self.final_channels = self.channels[-1] + num_classes
ok!明天见!
相关文章:
25/1/12 算法笔记 剖析Yolov8底层逻辑
YOLOv8 是一种基于深度学习的目标检测和图像分割模型,属于 YOLO(You Only Look Once)系列的最新版本。YOLO 系列模型以其高效的实时目标检测能力而闻名,YOLOv8 在此基础上进行了一些优化和改进。 Yolov8的主要特点: …...
Python双指针
双指针 双指针:在区间操作时,利用两个下标同时遍历,进行高效操作 双指针利用区间性质可以把 O ( n 2 ) O(n^2) O(n2) 时间降低到 O ( n ) O(n) O(n) 反向扫描 反向扫描: l e f t left left 起点,不断往右走&…...
1、docker概念和基本使用命令
docker概念 微服务:不再是以完整的物理机为基础的服务软件,而是借助于宿主机的性能。以小量的形式,单独部署的应用。 docker:是一个开源的应用容器引擎,基于go语言开发的,使用时apache2.0的协议。docker是…...
数据结构与算法之链表: LeetCode 92. 反转链表 II (Ts版)
反转链表 II https://leetcode.cn/problems/reverse-linked-list-ii/description/ 描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 示例 1 输入&…...
【PPTist】插入形状、插入图片、插入图表
一、插入形状 插入形状有两种情况,一种是插入固定的形状, 一种是插入自定义的形状。 插入固定的形状时,跟上一篇文章 绘制文本框 是一样一样的,都是调用的 mainStore.setCreatingElement() 方法,只不多传的类型不一…...
三台Centos7.9中Docker部署Redis集群
Docker部署Redis集群 1. 安装 Docker 和 Docker Compose安装 Docker:安装 Docker Compose: 2. 配置 Redis 容器和网络3. 启动 Redis 容器4. 设置 Redis 集群4.1 集群创建异常处理 5. 验证和测试总结 如果 CentOS 服务器上还没有安装 Docker 和 Docker Co…...
Entity 的材质(棋盘、条纹、网格)
Entity 的材质 普通物体的材质 import { nextTick, onMounted, ref } from vue import * as Cesium from cesium // console.log(Cesium, Cesium)const viewer ref<any>(null)onMounted(() > { ... })let material Cesium.Color.YELLOW.withAlpha(0.5)Cesium.Colo…...
MACPA:fMRI连接性分析的新工具
摘要 不同脑区的共同激活为它们之间的功能交互或连接提供了一个有价值的衡量指标。元分析连接模型(MACM)是一种经过充分验证的研究某一特定区域共激活模式的方法,该方法对基于任务的功能磁共振成像(task-fMRI)数据进行种子点(seed-based)元分析。虽然MACM是一种强大…...
JavaScript-一份你的前端入门说明书(计算机专业)
一.简介 1.起源 JavaScript 起源于 1995 年,当时它主要是为了满足网页交互的需求而被创建。它最初的设计目的是为了让网页开发者能够在网页中添加一些简单的交互效果和动态内容。在那个时期,网页大多是静态的,而 JavaScript 的出现为网页带来了新的活力。Netscape 公司的 B…...
STM32供电参考设计
STM32供电参考设计 在图中有VDD,VSS和VDDA,VSSA两种类型的供电引脚,其数据手册解释如下: 令我不解的是:VDDA和VSSA必须分别连接到VDD和VSS,这是什么意思?有大佬能够解答一下吗?…...
python+fpdf:创建pdf并实现表格数据写入
目录 创建pdf文件对象 新增页 添加自定义字体 设置字体 设置文字颜色和背景色 插入内容 换行 插入图片 保存pdf 完整代码 安装:pip install fpdf 创建pdf文件对象 from fpdf import FPDF, Alignpdf FPDF() # 创建pdf文件对象 获取边距 print(pdf.l_…...
亚远景-ASPICE评估:汽车软件项目的过程能力评价
ASPICE(Automotive SPICE)的评估对象主要是汽车软件研发过程。 这个评估过程不仅仅关注最终的软件产品,而是深入到软件开发的全生命周期中,从需求分析、设计、编码、测试到发布和维护等各个环节。 具体来说,ASPICE评…...
电脑提示directx错误导致玩不了游戏怎么办?dx出错的解决方法
想必大家都有过这样的崩溃瞬间:满心欢喜打开心仪的游戏,准备在虚拟世界里大杀四方或者畅游冒险,结果屏幕上突然弹出个 DirectX 错误的提示框,紧接着游戏闪退,一切美好戛然而止。DirectX 作为 Windows 系统下游戏运行的…...
【13】制作镜像以及重启实例
制作镜像 k8s集群 有两个镜像需要制作,一个是master节点,一个是node节点。 在master节点上成功部署了k8s的控制平面,在node节点上部署了worker节点的配置,不知道打包镜像重启之后集群的状态是什么样的。 确认集群在运行&#…...
electron 启动警告
1. 问题 当启动 electron 时,控制台警告 Electron Security Warning (Insecure Content-Security-Policy) This renderer process has either no Content Security 2. 解决方法 在主进程文件 main.js 中添加如下内容 process.env["ELECTRON_DISABLE_SECURI…...
wow-agent 学习笔记
wow-agent-课程详情 | Datawhale 前两课比较基础,无笔记 第三课 阅卷智能体这一块,曾经做过一点和AI助教相关的内容,也是用了一个prompt去进行CoT,但是风格和课程中的不太相同,在下面附上我的prompt 你是一名资深教…...
使用Cilium/eBPF实现大规模云原生网络和安全
大家读完觉得有帮助记得关注和点赞!!! 目录 抽象 1 Trip.com 云基础设施 1.1 分层架构 1.2 更多细节 2 纤毛在 Trip.com 2.1 推出时间表 2.2 自定义 2.3 优化和调整 2.3.1 解耦安装 2.3.2 避免重试/重启风暴 2.3.3 稳定性优先 2…...
“深入浅出”系列之C++:(4)回调函数
在写项目的时候遇见一个问题,现在的需求是主项目需要拿到子项目的结果来进行显示,那么如何集成呢,子项目里面有一个MainWindow类,类里 回调函数是一种通过函数指针将函数作为参数传递给另一个函数的编程技术。这种机制允许程序在特…...
Mysql--运维篇--主从复制和集群(主从复制I/O线程,SQL线程,二进制日志,中继日志,集群NDB)
一、主从复制 MySQL的主从复制(Master-Slave Replication)是一种数据冗余和高可用性的解决方案,它通过将一个或多个从服务器(Slave)与主服务器(Master)同步来实现。主从复制的基本原理是&#…...
设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类,通过状态对象的行为改变来避免…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
