Yolov8目标识别与实例分割——算法原理详细解析
前言
YOLO是一种基于图像全局信息进行预测并且它是一种端到端的目标检测系统,最初的YOLO模型由Joseph Redmon和Ali Farhadi于2015年提出,并随后进行了多次改进和迭代,产生了一系列不同版本的YOLO模型,如YOLOv2、YOLOv3、YOLOv4,YOLOv5等。这些更新和迭代旨在提高模型的性能、精度和速度,使其在实际应用中更具竞争力。
YOLO的核心思想是将图像划分为网格,并在每个网格单元中预测物体的边界框和类别。这种设计使得YOLO非常适合实时目标检测应用,因为它可以在较短的时间内完成目标检测任务。
一、算法比较
1、简介
Yolov8,作为一种SOTA(State-of-the-Art)模型,构建在Yolo系列的基础之上,融合了先前版本的经验,同时引入了创新性的特性和改进,以进一步提高其性能和灵活性,使其成为目标检测、图像分割、姿态估计等多项任务的首选。
Yolov8的创新点包括以下方面:
-
新的骨干网络:Yolov8采用了一种新的骨干网络架构,有望提高特征提取和处理能力,从而有助于更准确的目标检测和分割。
-
新的Anchor-Free检测头:引入了Anchor-Free检测头,不再依赖锚框,提供更大的灵活性,可以更好地适应各种目标形状和大小。
-
新的损失函数:Yolov8采用了一种全新的损失函数,有望进一步提升模型的收敛速度和性能表现。
Yolov8还具备多平台支持的能力,可以在不同硬件平台上运行,包括CPU和GPU。此外,Yolov8的开源库不仅限于Yolo系列模型,还具有卓越的可扩展性,支持其他类型的模型以及各种任务,如分类、分割、姿态估计等。
Yolov8在各项指标上实现了显著的提升,超越了现有的目标检测和实例分割模型。它汲取了Yolov5、Yolov6、YoloX等模型的设计优点,通过全面改进Yolov5的结构,同时保留了Yolov5工程化简洁易用的特点。

2.对比
从下面的表格可以看到,Yolov5与Yolov8在COCO Val 2017数据集的测试结果,比较了Yolov8和Yolov5在mAP、参数数量和FLOPs方面的性能。结果显示,Yolov8相较于Yolov5在精度上有显著提升,然而,模型的参数数量和FLOPs也相应增加,这导致模型的推理速度相对较慢。
这个比较表格是有关性能和复杂性的重要信息,对于选择合适的模型在不同应用中非常有帮助。 Yolov8的精度提高表明其在更精细的目标检测任务中可能更具竞争力,但同时需要更多的计算资源。在使用的过程中,可以具体对比应用需求,权衡精度和速度,选择最适合的模型。
FlOPs(floating point operations):浮点运算次数,用于衡量算法/模型的复杂度。FLOPS(全部大写)(floating point operations per second):每秒运算的浮点数,可以理解为计算速度,用于衡量硬件性能。这里是衡量模型的复杂度,因此选择FlOPs。
Yolov5与yolov8在COCO Val 2017数据集的测试结果:

二、算法解析
1、算法创新
Yolov8主要汲取了Yolov5、Yolov6、YoloX等模型的设计优点,并将其工程实践进行了深入改进。具体创新点如下:
- Yolov8引入了一个全新的SOTA模型,包括P5 640和P6 1280分辨率的目标检测网络以及基于YOLACT的实例分割模型。此外,通过提供不同尺度的模型(N/S/M/L/X),以满足不同部署平台和应用场景的需求。
s:这是 YOLO 系列中最小的模型。“s” 代表 “small”(小)。该模型在计算资源有限的设备上表现最佳,如移动设备或边缘设备。YOLOv5s 的检测速度最快,但准确度相对较低。
m:这是 YOLO 系列中一个中等大小的模型。“m” 代表 “medium”(中)。m 在速度和准确度之间提供了较好的平衡,适用于具有一定计算能力的设备。
l:这是 YOLO 系列中一个较大的模型。“l” 代表 “large”(大)。l 的准确度相对较高,但检测速度较慢。适用于需要较高准确度,且具有较强计算能力的设备。
x:这是 YOLO系列中最大的模型。“x” 代表 “extra large”(超大)。x 在准确度方面表现最好,但检测速度最慢。适用于需要极高准确度的任务,且具有强大计算能力(如 GPU)的设备。
n:这是 YOLO 系列中的一个变体,专为 Nano 设备(如 NVIDIA Jetson Nano)进行优化。n 在保持较快速度的同时,提供适用于边缘设备的准确度。
- 在骨干网络(Backbone)方面,Yolov8继续采用CSP模块的思想,但将Yolov5中的C3模块替换为C2f模块,从而实现了进一步的轻量化。此外,它延续了Yolov5中的SPPF模块,并对不同尺度的模型进行了精心微调,不再采用单一的参数设置,从而显著提升了模型性能。
Yolov5中的C3模块:

Yolov8 C2f模块:

-
在特征融合(Neck)方面,Yolov8继续使用PAN的思想,但通过对比Yolov5和Yolov8的结构图,可以看到Yolov8去除了1*1降采样层。
-
头部(Head)部分相较于Yolov5有较大的改动。Yolov8采用了目前主流的解耦头结构(Decoupled-Head),将分类和检测头分离。此外,Yolov8从Anchor-Based方法切换到了Anchor-Free方法。
-
在损失函数计算方面,Yolov8使用VFL Loss作为分类损失(在实际训练中使用BCE Loss),同时使用DFL Loss和CIOU Loss作为回归损失。
-
Yolov8改进了标签分配策略,弃用了以往的IoU分配或单边比例的分配方式,取而代之的是采用Task-Aligned Assigner策略,用于正负样本的分配。
这些创新和改进使Yolov8成为一个在性能和工程实践方面都有重要进展的目标检测模型。
2.网络结构
网络结构如下图:

2.1 Backbone
Yolov8的Backbone同样借鉴了CSPDarkNet结构网络结构:

与Yolov5最大区别是,Yolov8使用C2f模块代替C3模块。具体改进如下:
第一个卷积层的Kernel size从6×6改为3x3。所有的C3模块改为C2f模块,如下图所示,多了更多的跳层连接和额外Split操作。
Block数由C3模块3-6-9-3改为C2f模块的3-6-6-3。

由上图可以看出,C2f中每个BottleNeck的输入Tensor的通道数channel都只是上一级的0.5倍,因此计算量明显降低。从另一方面讲,梯度流的增加,也能够明显提升收敛速度和收敛效果。
C2f模块首先以输入tensor(n,c,h,w)经过Conv1层进行split拆分,分成两部分(n,0.5c,h,w),一部分直接经过n个Bottlenck,另一部分经过每一操作层后都会以(n,0.5c,h,w)的尺寸进行Shortcut,最后通过Conv2层卷积输出。也就是对应n+2的Shortcut(第一层Conv1的分支tensor和split后的tensor为2+n个bottenlenneck)。
2.2 Neck
Neck采用了PANet结构:

Backbone最后SPPF模块(Layer9)之后H、W经过32倍下采样,对应地Layer4经过8倍下采样,Layer6经过16倍下采样。输入图片分辨率为640640,得到Layer4、Layer6、Layer9的分辨率分别为8080、4040和2020。
Layer4、Layer6、Layer9作为PANnet结构的输入,经过上采样,通道融合,最终将PANet的三个输出分支送入到Detect head中进行Loss的计算或结果解算。
与FPN(单向,自上而下)不同的是,PANet是一个双向通路网络,引入了自下向上的路径,使得底层信息更容易传递到顶层。
2.3 Head
Head部分相比Yolov5改动较大,直接将耦合头改为类似Yolox的解耦头结构(Decoupled-Head),将回归分支和预测分支分离,并针对回归分支使用了Distribution Focal Loss策略中提出的积分形式表示法。之前的目标检测网络将回归坐标作为一个确定性单值进行预测,DFL将坐标转变成一个分布。

3. yaml配置文件
3.1 参数设置

Yolov8采用Anchor-Free方式,因而在yaml文件中移除了anchors参数,并且将多个不同版本的模型参数写在一个yaml,同时在深度因子和宽度因子后面增加了 最大通道数 这一参数。
3.2 Backbone

- [from, repeats, module, args]
- from:本层的来源,即就是输入。-1表示将上层的输出作为本层的输入。
- repeats:本层重复次数。
- module:本层名称。
- args:本层参数。
- 第0层:[-1,1,Conv,[64, 3, 2]] #0-P1/2
- -1表示将上层的输出作为本层的输入,第0层的输入是6406403的图像。
- Conv表示卷积层。
- [64, 3, 2]:输出通道数64,卷积核大小k为3,stride步长为2。由此计算padding为1。
- 输出特征图大小(「向下取整1」):f_out=((f_in - k + 2p ) / s )=((640 - 3 + 21 ) / 2 )=320。
- 所以本层输出特征图尺寸为32032064,长宽为原输入图片的1/2。
- 第1层:[-1,1,Conv,[128, 3, 2]] # 1-P2/4
- [128, 3, 2]:输出通道数128,卷积核大小k为3,stride步长为2。
- 输出特征图大小(「向下取整1」):f_out=((f_in - k + 2p ) / s )=((320 - 3 + 21 ) / 2 )=160。
- 所以本层输出特征图尺寸为160160128,长宽为原输入图片的1/4。
- 第2层:[-1,3,C2f,[128, True]]
- [128, True]:128表示输出通道数,True表示Bottleneck有shortcut。
- 本层输出特征图尺寸仍为160160128。
- 第3层:[-1,1,Conv,[256,3,2]] # 3-P3/8
- [256,3,2]:输出通道数256,卷积核大小k为3,stride步长为2。
- 输出特征图大小(「向下取整1」):f_out=((f_in - k + 2p ) / s )=((160-3+ 21 )/2)=80。
- 所以本层输出特征图尺寸为8080256,长宽为原输入图片的1/8。
…
- 第9层:[-1,1,SPPF,[1024, 5]]
- [1024, 5]:1024表示输出通道数,5表示池化核大小k。
- 输出特征图尺寸为20201024。
3.3 Head

- 第10层:[-1,1,nn.Upsample,[None,2,‘nearest’]]
- torch.nn.Upsample(size=None, scale_factor=None, mode=‘nearest’, align_corners=None)
- 本层为上采样层,-1表示将上层的输出作为本层的输入。None表示上采样的输出尺寸size不指定。2表示scale_factor=2,即输出尺寸是 输入的2倍,nearest表示使用的上采样算法为最近邻插值算法。经过这层之后,特征图的长和宽变为原来的二倍,通道数不变,所以输出特征图尺寸为40401024。
- 第11层:[[-1,6],1,Concat,[1]] #cat backbone P4
- 本层为cancat层,[-1,6]表示将上层和第6层的输出作为本层的输入,[1]表示concat拼接的维度为1。上层的输出尺寸为40401024,第6层的输出尺寸为4040512,最终本层的输出尺寸为40401536。
…
- 第21层:[-1,3,C2f,[1024]] # 21(P5/32-large)
- 本层是C2f模块,3表示本层重复3次。1024表示输出通道数。经过这层之后,特征图尺寸变为20201024,特征图的长宽已经变成原输入图片的1/32。
- 第22层:[[15, 18, 21], 1, Detect, [nc]]
- 本层是Detect层,[15, 18, 21]表示将第15、18、21层的输出(分别是8080256、4040512、20201024)作为本层的输入。nc是数据集的类别数。
4. loss
Loss计算过程包括两部分:正负样本分配策略和Loss计算
4.1 正负样本分配策略
在目标检测中,正负样本分配策略是指在训练期间为每个样本分配一个权重,以便模型更加关注困难的样本和重要的样本。
常见的正负样本分配策略包括动态分配策略和静态分配策略两种。
-
静态分配策略:静态分配策略是指在训练开始之前,固定为一组预先定义的权重,这些权重不会在训练过程中改变。这种分配策略通常基于经验得出,可以根据数据集的特点进行调整,但是不够灵活,可能无法充分利用样本的信息,导致训练效果不佳。
-
动态分配策:动态分配策略则可以根据训练的进展和样本的特点动态调整权重。在训练初期,模型可能会很难区分正负样本,因此应该更加关注那些容易被错分的样本。随着训练的进行,模型逐渐变得更加强大,可以更好地区分样本,因此应该逐渐减小困难样本的权重,同时增加易分样本的权重。动态分配策略可以根据训练损失或者其他指标来进行调整,可以更好地适应不同的数据集和模型。
典型的动态分配策略如YOLOX的simOTA、TOOD的Task-Aligned Assigner和RTMDet的DynamicSoftLabelAssigner等。YOLOv5采用的依然是静态分配策略,考虑到动态分配策略的优异性,「Yolov8算法中直接引用了TOOD中的Task-Aligned Assigner正负样本分配策略」。
Task-Aligned Assigner,顾名思义就是对齐分配器,即在训练过程中动态调整正负样本的分配比例。怎么个对齐方式呢?「根据分类与回归的分数,作为加权分数,选择正样本」。

- s是标注类别对应的预测分值,u是预测框和GT Box的IoU,两者相乘即可衡量对齐程度(Task-Alignment)。α和β是权重超参数。
- t可以同时控制分类得分和IoU的优化来实现Task-Alignment,从而引导网络动态关注高质量的anchor。当类别分值越高且IoU越高时,t的值就越接近于1。
具体执行步骤如下:
- 基于分类得分和预测框与GT的IoU,加权得到一个关联分类以及回归的对齐分数alignment_metrics。
- 计算anchor的中心点是否在当前GT框内,只有在当前GT内的anchor才能作为正样本。
- 满足「2」的前提下,基于alignment_metrics选取topK大的作为正样本,其余作为负样本进行训练。
4.2 loss计算
Loss计算包括2个分支:分类和回归分支,没有了之前的objectness(目标前景/背景)分支。
- 分类损失
使用sigmoid函数来计算每个类别地概率,并采用VFL Loss或BCE Loss计算全局的类别损失。
VFL Loss
VFL Loss(Varifocal Loss)的灵感来自Focal Loss,这里也简要回顾一下Focal Loss。Focal Loss的设计是为了解决密集目标检测器训练中前景类和背景类之间极度不平衡的问题。Focal Loss定义为:

其中,1为ground-truth类,表示前景类的预测概率。如公式所示,调制因子(γ为前景类和γ为背景类)可以减少简单样例的损失贡献,相对增加误分类样例的重要性。
然而,不同的Focal Loss处理的正负样本是对称的,VFL Loss则是提出了非对称的加权操作,定义如下:

其中,预测值为目标分数。对于前景点将其ground truth类别分数设定为「生成的边界框和它的ground truth(gt_IoU)之间的IoU」,否则为0;而对于背景点,所有类的分数为0。
如公式所示,通过利用γ的因子缩放损失,VFL Loss仅减少了负例(q=0)的损失贡献,而不以同样的方式降低正例(q>0)的权重。这是因为正样本相对于负样本是非常罕见的,应该保留它们的学习信息。
BCE Loss
由源代码可以看出,Yolov8实际采用的是BCE Loss,如下图所示:

这也说明,Yolov8团队应该是对VFL Loss和BCE Loss都尝试过,但最终发现使用VFL和使用普通的BCE效果相当,优势不明显,故采用了简单的BCE Loss。
- 回归损失
Yolov8的回归损失计算分为「CIou_Loss + Distribution Focal Loss」两部分,其中,CIou_Loss用于计算预测框与目标框之间的IoU。
DFL Loss
常规的坐标点回归方式是一种狄拉克分布,即认为某一点概率无穷大,而其它点概率为0(概率密度是一条尖锐的竖线,如下图),这种方式认为标签是绝对正确的。

但是在实际应用中,对于遮挡、模糊场景下目标框的边界存在一定的不确定性,如下图中滑板左侧边界和大象右侧边界,常规的回归方式是不能解决这种不确定问题的,此时学习一个边界分布更为合理。

但是如果分布过于随意,网络学习的效率可能不会高,因为一个积分目标可能对应无穷多种分布模式。

考虑到真实的分布通常不会距离标注的位置太远,因此Distribution Focal Loss选择优化标签y附近左右两个位置(yi与yi+1)的概率,使得网络分布聚焦到标签值附近。

相关文章:
Yolov8目标识别与实例分割——算法原理详细解析
前言 YOLO是一种基于图像全局信息进行预测并且它是一种端到端的目标检测系统,最初的YOLO模型由Joseph Redmon和Ali Farhadi于2015年提出,并随后进行了多次改进和迭代,产生了一系列不同版本的YOLO模型,如YOLOv2、YOLOv3、YOLOv4&a…...
HandlerMethodArgumentResolver方法参数解析器支持多用户
1、概述 HandlerMethodArgumentResolver,中文称为方法参数解析器,是Spring Web(SpringMVC)组件中的众多解析器之一,主要用来对Controller中方法的参数进行处理。 使用场景 在一般的接口调用场景下,每次调用Controller都需要检查请求中的token信息,并根据token还原用户信息…...
【Linux】 man命令使用
介绍 man命令是Linux下最核心的命令之一。而man命令也并不是英文单词“man”的意思,它是单词manual的缩写,即使用手册的意思。 man命令会列出一份完整的说明。 其内容包括命令语法、各选项的意义及相关命令 。更为强大的是,不仅可以查看Lin…...
同一个数据库服务器进行数据表间的数据迁移-MySQL
同一个数据库服务器进行数据表间的数据迁移 一、相同结构的表数据迁移/备份/导入到同一MySQL的某个库的某张表 实验目标:将t1.table_one的数据备份到migration_one.table_11(提醒:这两个表结构一致) 同一个MySQL中有很多库&…...
适用于 Linux 的 WPF:Avalonia
许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开…...
【教3妹学编程-算法题】数组中两个数的最大异或值
3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包” 2哥 :3妹,什么事呀这么开心呀。 3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。 2哥&…...
STM32-RTC实时时钟
目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1:显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2:闹钟 常规配置 RTC配置 测试环节 实验现象 R…...
初学Flutter,实现底部导航切换
效果展示 flutter bottomNavBar 主要实现代码 入口文件:main.dart import package:flutter/material.dart; import package:flutter_demo/components/bottomNavBar.dart; import package:flutter_demo/views/cart.dart; import package:flutter_demo/views/cata.d…...
使用JMeter进行接口压力测试
1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试,结果反馈如下图...
ElasticSearch集群架构实战及其原理剖析
ES集群架构 为什么要使用ES集群架构 分布式系统的可用性与扩展性: 高可用性 服务可用性:允许有节点停止服务;数据可用性:部分节点丢失,不会丢失数据; 可扩展性 请求量提升/数据的不断增长(将数据分布…...
选择适合你的办公桌:提高工作效率的关键
在如今的数字时代,越来越多的人将办公桌移到家里或办公室。但是,如何选择适合你的办公桌可能是个挑战。不同的工作需要和工作空间大小会影响你的选择。下面是一些简单的建议,帮助你找到适合你的办公桌,提高工作效率。 首先&…...
机器学习之多层感知机 MLP简洁实现 《动手深度学习》实例
🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…...
使用C#在Windows上调用7-zip压缩文件
使用C#在Windows上调用7-zip压缩文件 可以设置输出文件的路径也可以留空,留空则会在压缩文件创建一个同名的.压缩包 可以设置压缩包的密码 可以设置压缩包的加密方式(ASE-256),可以使用LZMA但是加密码会报错 可以设置压缩包的格式(zip),可以使用7z但是加…...
京东数据平台:2023年Q3季度黄金市场数据分析
继9月国内黄金市场持续上涨后,进入10月中下旬后,黄金行情再度反转,多家品牌金饰价格再次突破600元/克,达到611元/克。 今年以来,黄金行情不断走俏,销售市场也有明显增长。根据鲸参谋平台的数据显示…...
https原理
首先说一下几个概念:对称加密、非对称加密 对称加密: 客户端和服务端使用同一个秘钥,分两种情况: 1、所有的客户端和服务端使用同一个秘钥,这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…...
FFmpeg直播能力更新计划与新版本发布
// 编者按:客户端作为直接面向用户大众的接口,随着技术的发展进化与时俱进,实现更好的服务是十分必要的。FFmpeg作为最受欢迎的视频和图像处理开源软件,被相关行业的大量用户青睐,而随着HEVC标准的发布到广泛使用&am…...
面试算法55:二叉搜索树迭代器
题目 请实现二叉搜索树的迭代器BSTIterator,它主要有如下3个函数。 构造函数:输入二叉搜索树的根节点初始化该迭代器。函数next:返回二叉搜索树中下一个最小的节点的值。函数hasNext:返回二叉搜索树是否还有下一个节点。 分析 …...
Linux Crontab 定时任务
crond 服务 Linux 通过 crond 服务来支持 crontab。 查看 crond 服务是否已经安装 输入下面命令确认 crond 服务是否已安装。 systemctl list-unit-files | grep crond 如果为 enabled,表示服务正运行。 crontab 文件 crontab 要执行的定时任务都被保存在 /etc…...
HiveSQL高级进阶技巧
目录 1.删除2.更新:3.行转列:4.列转行:5.分析函数:6.多维分析7.数据倾斜groupby:join: 掌握下面的技巧,你的SQL水平将有一个质的提升! 1.删除 正常hive删除操作基本都是覆盖原数据&…...
【Flutter】Flutter 动画深入解析(1):掌握 AnimationController 的使用
【Flutter】Flutter 动画深入解析(1):掌握 AnimationController 的使用 文章目录 一、前言二、AnimationController 简介三、AnimationController 的主要功能四、Ticker 提供者五、AnimationController 的生命周期六、与 AnimationController 一起使用的 Future七、实际业务…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
