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)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类,通过状态对象的行为改变来避免…...
计算机网络 (38)TCP的拥塞控制
前言 TCP拥塞控制是传输控制协议(Transmission Control Protocol,TCP)避免网络拥塞的算法,是互联网上主要的一个拥塞控制措施。 一、目的 TCP拥塞控制的主要目的是防止过多的数据注入到网络中,使网络能够承受现有的网络…...
鸿蒙面试 2025-01-09
鸿蒙分布式理念?(个人认为理解就好) 鸿蒙操作系统的分布式理念主要体现在其独特的“流转”能力和相关的分布式操作上。在鸿蒙系统中,“流转”是指涉多端的分布式操作,它打破了设备之间的界限,实现了多设备…...
【关于for循环的几种写法】
关于for循环的几种写法 在 C 中,for(int i 0; i < n; i) 是一种常见的循环写法,用于遍历从 0 到 n-1 的索引。如果你希望简化这种写法,可以使用以下几种方法: 1. 使用范围 for 循环 如果你需要遍历一个容器(如数…...
Apache和PHP:构建动态网站的黄金组合
在当今的互联网世界,网站已经成为了企业、个人和机构展示自己、与用户互动的重要平台。而在这些动态网站的背后,Apache和PHP无疑是最受开发者青睐的技术组合之一。这一组合提供了高效、灵活且可扩展的解决方案,帮助您快速搭建出强大的网站&am…...
免费开源的下载工具Xdown
软件介绍 Xdown是一款功能强大的开源免费下载工具,专为PC端用户设计,支持多种协议和下载方式。 1、多线程下载 Xdown支持最高128线程的并发下载,能够将文件分割成多个部分同时下载,从而显著提升下载速度。 2、多种协议支持 该…...
Three.js 数学工具:构建精确3D世界的基石
文章目录 前言一、向量(Vectors)二、矩阵(Matrices)三、四元数(Quaternions)四、欧拉角(Euler Angles)五、颜色(Colors)六、几何体生成器(Geometr…...
如何明智地提问
如何明智地提问的重要总结,让我为主要观点添加一些具体的实践建议: 提问前的准备工作 尝试在 Google、Stack Overflow 等平台搜索相似问题阅读相关文档和错误日志尝试自己调试和排查问题记录下已尝试过的解决方案 选择合适的提问平台 Stack Overflow…...
Microsoft Sql Server 2019 函数理解
说到函数,首先和存储过程作个比较吧,两者有一个共同点都是预编译优化后存储在磁盘中,所以效率 要比T-SQL高一点点。值得注意的是,存储过程可以创建或访问临时表,而函数不可以; 同时函数不可 以修改表中的数…...
自定义日期转换配置
文章目录 1.日期问题出现原因以及解决方案概述1.图示2.三种解决方案概述1.对于表单数据 application/x-www-form-urlencoded2.对于JSON数据1.使用JsonFormat注解2.自定义Jackson日期转换配置 2.解决方案common-web-starter1.目录2.BaseController.java 使用InitBinder解决表单数…...
“AI智能服务平台系统,让生活更便捷、更智能
大家好,我是资深产品经理老王,今天咱们来聊聊一个让生活变得越来越方便的高科技产品——AI智能服务平台系统。这个系统可是现代服务业的一颗璀璨明珠,它究竟有哪些魅力呢?下面我就跟大家伙儿闲聊一下。 一、什么是AI智能服务平台系…...
广州安全教育平台入口登录处/aso优化榜单
阅读目录:1.背景2.项目管理,质量、度量、进度3.软件开发是一种设计活动而不是建筑活动4.快速开发(简单的系统结构与复杂的业务模型)5.技术人员的业务理解与产品经理的业务理解的最终业务模型5.1.产品的业务理解(业务流…...
六灶网站建设/嘉兴网站建设方案优化
当我们的服务器某台故障的时候,我们的SCOM肯定是最早发现它的时候,但SCOM发现了以后怎么告诉IT管理员来维护呢?默认情况下肯定是需要IT管理员主动登陆到SCOM服务器上来查看其他所有服务器的运行状况,这对及时处理问题带来了延迟&a…...
荆州网站推广怎么做/怎么找需要推广的商家
为了调整移动端页面,找了好多网站,就留下这个感觉还行 https://github.com/jieyou/remote_inspect_web_on_real_device?utm_campaignemail_admin&utm_sourcetrigger-email&utm_mediumemail...
珠海专业网站建设公司哪家好/外贸快车
想必很多车主对于汽车加油的过程非常了解,直接把汽车开到加油站,使用加油枪加油即可,智能的油表会自动计算加油量和相对应的费用。这么简单的操作,其中有一个细节不知道大家有没有发现,就是这个计费表是以L来作为计量单…...
如何快速做一个网站/关键词seo培训
作为一名前端实习生,我在这周里学到了很多宝贵的知识。首先,我开始了解了如何使用 React 框架来构建用户界面。React 提供了一种组件化的方法,可以让我们更加方便地管理界面上的元素。通过实践,我对 React 的基本用法有了更加深入…...
公司网站首页布局图/买友情链接
文章目录前言一、推视频流1.sps、pps2.视频帧二、推音频流1.音频帧三、完整推流1.实时流总结前言 librtmp可以用于推rtmp流,有时候我们需要将采集的摄像头或桌面的视频数据以及麦克风的音频数据推流出去,这时候就需要使用librtmp的推流功能了࿰…...