【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析
1 YOLO时间线
这里简单列下yolo的发展时间线,对每个版本的提出有个时间概念。
2 yolov8 的简介
工程链接:https://github.com/ultralytics/ultralytics
2.1 yolov8的特点
- 采用了anchor free方式,去除了先验设置可能不佳带来的影响
- 借鉴Generalized Focal Loss,使用任务解耦,分别学习box,class。并将box边框的学习,从回归的形式更换成交叉熵的形式
- 增加了实例分割的功能,该模块借鉴了 YOLACT 的思想
2.2 yolov8 的相关参数
以上为官方视图:
- YOLOv8 相比 YOLOv5,mAP提升较多
- 左图可得: N/S/M 模型相应的参数量和 FLOPs 都增加了不少
- 右图可得:相比 YOLOV5,YOLOv8 大部分模型推理速度变慢
其中目标检测模型的相关参数如下图,更多的看查阅工github的官方工程:
以下章节分别对yolov8的目标检测、实例分割、关键点估计、目标跟踪进行介绍
3 yolov8 目标检测
3.1 网络结构
3.1.1 网络结构
- 【backbone】C2f、SPPF、Conv_BN_SiLU(strides=2,用于下采样)
- 【neck】FPN(特征金字塔网络)、PAN(路径聚合网络)
- 【head】Conv_BN_SiLU的堆叠分别输出:box、cls
- 【backbone】
第一个Conv的kernel:6*6 --> 3*3;
C3模块替换了C2f,其数量从3-6-9-3,变成了3-6-6-3。- 【neck】
FPN中去除第一个的卷积;
yolov8中的N/S、M、L/X 三组网络中最后的C2f输出通道不同,分别为1024,768,512。- 【head】
yolov5中单个Conv_BN_SiLU,同时输出三个信息:obj、cls、box
yolov8中使用Conv_BN_SiLU的堆叠,并分支输出两个信息:box、cls。3.1.2 C3 & C2f
C2f相较于C3,有更多的跳层连接,与更多的特征的concat,梯度流更丰富。有助于更为丰富的特征的融合和提取
3.1.3 SPP & SPPF 空间金字塔池化
- 上图是SPPNET原论文中提出的:提取并融合更多尺度的特征,使用fc_layer的同时并能够适应不同尺寸的输入
- 下左图是YOLOV5、YOLOV8中使用的SPP:继承了原SPP的提取更多尺度的特征,但结构上已更新
- 下右图是fast SPP,对SPP进行了改进,减小参数的、增加运算速度,但不改变计算结果
3.1.4 head
yolov5的head 的每层中分别为一个分支,同时预测3个内容:检测框质量( 1 是否为目标 ∗ i o u p r e d , l a b e l 1_{是否为目标}*iou_{pred,label} 1是否为目标∗ioupred,label)、类别的onehot、box的xywh。
与yolov5不同,yolov8的目标检测解耦了目标框和类别的预测,每层有两个分支,分别预测:类别的 o n e h o t ∗ i o u p r e d , l a b e l onehot*iou_{pred,label} onehot∗ioupred,label、box的xywh。
3.2 目标检测的head输出
yolov8 的目标检测头,采用了Generalized Focal Loss,详细的内容可以看链接中的论文阅读,这里说明下关键点
3.2.1 定位质量与类别
- 已有工作问题:训练和测试之间的差距,并可能会降低检测性能
- GFL工作解决:分类IoU联合表示
分类onehot向量的标签 在真实类别位置上的是其相应的定位质量(预测box与标签box的iou)。也就是:类别的 o n e h o t ∗ i o u p r e d , l a b e l onehot*iou_{pred,label} onehot∗ioupred,label。
训练时和测试时使用相同的规则,它消除了训练-测试的不一致性,并使定位质量和分类之间具有最强的相关性。
- 举例子:
左边为已有工作,右边为GFL,针对分类项目可称为QFL3.2.1 box的预测
- 已有工作:
边界框表示是唯一确定的位置,为一个简单的狄拉克分布,并采用回归方式进行训练。
问题:但是,它没有考虑到数据集的模糊性和不确定性。如下图中的边界不清晰,因此真实标签(白色框)有时不可信,狄拉克分布无法很好的表示这些问题。- GFL工作:
对于边界框表示,直接学习box位置上的离散概率分布,而不引入任何其他更强的先验(比如统计出来的anchor)。因此,我们可以获得更可靠和准确的边界框估计,同时了解它们的各种潜在分布。
给定标签y的范围为 y 0 ≤ y ≤ y n , n ∈ N + y_0≤y≤y_n,n∈N^+ y0≤y≤yn,n∈N+,我们可以从模型中得到估计值 y ^ \hat{y} y^, 也满足 y 0 ≤ y ^ ≤ y n y_0≤\hat{y}≤y_n y0≤y^≤yn: y ^ = ∫ − ∞ + ∞ P ( x ) x d x = ∫ y 0 y n P ( x ) x d x \hat{y}=\int_{-\infty }^{+\infty }P(x)xdx=\int_{y_0}^{y_n}P(x)xdx y^=∫−∞+∞P(x)xdx=∫y0ynP(x)xdx为了与卷积神经网络保持一致,我们将连续域上的积分转换为离散表示,从离散范围[y0,yn]到一个集合 { y 0 , y 1 , . . . , y i , y i + 1 . . . , y n − 1 , y n } \{y0,y1,...,y_i,y_{i+1}...,y_{n−1},y_n\} {y0,y1,...,yi,yi+1...,yn−1,yn},其间隔∆=1。因此,给定离散分布性质 ∑ i = 0 n P ( y i ) = 1 \sum_{i=0}^{n}P(y_i)=1 ∑i=0nP(yi)=1,估计的回归值 y ^ \hat{y} y^可以表示为: y ^ = ∑ i = 0 n P ( y i ) y i \hat{y}=\sum_{i=0}^{n}P(y_i)y_i y^=i=0∑nP(yi)yi
尝试多种分布,最终发现下图第三种效果最好
- 举例子:
左边为已有工作,右边为GFL,针对分类项目可称为DFL
- 算法具体实现:
主要的公式为: ∑ i = 0 n P ( y i ) = 1 \sum_{i=0}^{n}P(y_i)=1 ∑i=0nP(yi)=1、 y ^ = ∑ i = 0 n P ( y i ) y i \hat{y}=\sum_{i=0}^{n}P(y_i)y_i y^=∑i=0nP(yi)yi。然后我们仅使用边界的浮点型位置,使用项链的两个整形表达。
假设第三个输出层的尺寸上的标签(6.25, 4.75, 18.375, 12.875),此时框的中心设为(11,9),左边框距离anchor为5.75= 11-6.25。则用长度为16的向量表示该距离 d l d_l dl:[0,0,0,0,0.25, 0.75,0,0,0,0, 0,0,0,0,0, 0]。该向量满足内容为: ∑ i n d e x ∗ v a l u e = 5.75 \sum index*value=5.75 ∑index∗value=5.75, ∑ v a l u e = 1 \sum value=1 ∑value=1。
长度为16的向量最大可表达像素距离为15,那么这种表达方式,像素级最大可表达30*30的框。当模型共有5层,在第三个输出层是下采样了32倍,则30*30的框,在原尺寸上的大小为960*960。
所以只要网络输入尺寸<= 960,用四个长度为16的向量来表示框的四个边距离base点的距离,都可正确表达。若图片>960,理论上就需要增加向量的长度,但实际情况会现将图片先进行切割,然后多次预测,结果再转换到原图尺寸上。
3.3 正样本分配
yolov5中的正样本分配 是在训练之前已经完全确定了。
yolov8 中的正样本分配 TaskAlignedAssigner,属于动态分配,会根据当前网络输出的信息动态匹配 需要监督的标签。
- 计算box在每一层的每个grid ceil上的iou、对齐衡量指标(匹配得分)。 a l i g n _ m e t r i c = s α ∗ u β align\_metric =s^{\alpha }*u^{\beta} align_metric=sα∗uβ 其中 s 和 u 分别表示分类得分和IoU,α 和 β 是权重系数用来控制两个任务对匹配得分的影响大小
- 获取box内top10的 align_metric 的位置的mask,如图2。
- 一个预测框与多个真实框匹配测情况进行处理,保留ciou值最大的真实框。如图3。
- 得到 target_bboxes, target_scores, fg_mask
3.4 损失函数
分类的gt_class --> target_class
target_class的转换(分类IoU联合表示):分类的onehot * iou(pred_box, label_box)。pred_class为长度为分类数量的向量。
则分类IoU联合表示的损失函数:sigmoid交叉熵。在代码中为:nn.BCEWithLogitsLossself.bce = nn.BCEWithLogitsLoss(reduction='none')loss[1] = self.bce(pred_scores, target_scores.to(dtype)).sum() / target_scores_sum # BCE
这里补充下在pytorch中的损失函数的一些api
nn接口 function接口 nn.NLLLoss
F.nll_loss nn.BCELoss
F.binary_cross_entropy nn.BCEWithLogitsLoss
F.binary_cross_entropy_with_logits nn.CrossEntropyLoss
= softmax + log + NLLlossF.cross_entropy 我们使用 ℓ ( x , y ) \ell(x,y) ℓ(x,y)来表示损失函数,则有 ℓ ( x , y ) = L = { l 1 , … , l N } ⊤ \ell(x, y) = L = \{l_1,\dots,l_N\}^\top ℓ(x,y)=L={l1,…,lN}⊤其中【N】batch、【x】input(在使用中一般为网络输出的内容)、【y】target、【 x n , y n x_{n,y_n} xn,yn】表示对应target那一类的概率。
- -
nn.NLLLoss()
:
l n = − w y n x n , y n l_n = - w_{y_n} x_{n,y_n} ln=−wynxn,ynnn.BCELoss
中:
l n = − w n [ y n ⋅ log ( x n ) + ( 1 − y n ) ⋅ log ( 1 − x n ) ] l_n = - w_n \left[ y_n \cdot \log (x_n) + (1 - y_n) \cdot \log (1 - x_n) \right] ln=−wn[yn⋅log(xn)+(1−yn)⋅log(1−xn)]nn.BCEWithLogitsLoss = sigmoid + BCELoss
l n = − w n [ y n ⋅ log 1 1 + exp ( − x n ) + ( 1 − y n ) ⋅ log ( 1 − 1 1 + exp ( − x n ) ) ] l_n = - w_n \left[ y_n \cdot \log \frac{1}{1+\exp(-x_n)} + (1 - y_n) \cdot \log (1 - \frac{1}{1+\exp(-x_n)}) \right] ln=−wn[yn⋅log1+exp(−xn)1+(1−yn)⋅log(1−1+exp(−xn)1)]CrossEntropyLoss = softmax + log + NLLloss
l n = − ∑ c = 1 C w c log exp ( x n , c ) exp ( ∑ i = 1 C x n , i ) y n , c l_n = - \sum_{c=1}^C w_c \log \frac{\exp(x_{n,c})}{\exp(\sum_{i=1}^C x_{n,i})} y_{n,c} ln=−c=1∑Cwclogexp(∑i=1Cxn,i)exp(xn,c)yn,c
N L L ( l o g ( s o f t m a x ( i n p u t ) ) , t a r g e t ) = − Σ i = 1 n O n e H o t ( t a r g e t ) i × l o g ( s o f t m a x ( i n p u t ) i ) ( i n p u t ∈ R m × n ) \large \mathbf{NLL(log(softmax(input)),target) = -\Sigma_{i=1}^n OneHot(target)_i\times log(softmax(input)_i)} (input∈Rm×n) NLL(log(softmax(input)),target)=−Σi=1nOneHot(target)i×log(softmax(input)i)(input∈Rm×n)box 的 gt_class --> target_class
- CIOU:以往box检测框的损失函数都会使用的一项。
考虑三种几何参数:重叠面积、中心点距离、长宽比。CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。- Distribution Focal Loss (DFL):使用向量表达边界与基准点的距离,然后结合softmax交叉熵计算得DFL项的loss
将边界距离基准点的距离记为y,则可将基准点转换为(tl, tr),两者对应的权重为(wl, wr)。y.shape = tl.shape = tr.shape= [batch, n, 4]。
tl.view(-1).shape = tr.view(-1).shape = [batc*n*4](假设左边界距离y=5.6,则 t l = 5 tl=5 tl=5, t r = 6 tr=6 tr=6, t l = 0.4 tl=0.4 tl=0.4, w r = 0.6 wr=0.6 wr=0.6)
此时网络输出的边界为pred_dist,pred_dist.shape=[batc*n*4,16]。则损失函数如下,:loss = (F.cross_entropy(pred_dist, tl.view(-1), reduction='none').view(tl.shape) * wl +F.cross_entropy(pred_dist, tr.view(-1), reduction='none').view(tl.shape) * wr).mean(-1, keepdim=True)
4 yolov8 实例分割
4.1 网络结构
从工程实现中可以看到,分割的网络结构与目标检测的网络结构,主干网络、neck模块都是完全一致的,只有在任务侧 有所差异。
分割的head(coef) 与目标检测的head是基本一致的,仅最后一层的输出维度有所差异。
阅读源码并绘制网络结构图如上,可发现 在目标检测的head模块基础上,额外添加了segment的分支:掩码系数分支、原型分支。接下来会介绍该分割分支的具体使用。
3.2 分割的head输出
该部分内容借鉴了论文 YOLACT Real-time Instance Segmentation。
- 【Proto的输出】
网络会在第一个输出层中,输出一组mask原型,其数量工程中设置为32。不同mask为网络学习到不同的掩码信息,值得注意的是单张mask并不意味着mask中只有一个目标的mask。将mask可视化如下图,第一张mask仅人体,第二张为人体+羽毛球拍,第三张为另一张人体mask,第四张为球拍。
需将所有的mask线性叠加然后得到当前目标的最终掩码信息。下图当中示意了默认系数为1的线性叠加,但实际该掩码系数不可能同时为1。则安排了神经网络预测该系数,也就是mask_coef分支。
- 【mask_coef】
网络每个gridceil都有3个输出信息:cls + box + mask_coef。对前两者进行解析可得到,有效的gridceil预测出了目标的类别 和 目标的box,此时可以很容易获取该gridceil中的目标的mask_coef,维度为32,刚好与Proto输出的channel维度32相一致。- 【gridceil中目标的mask的计算】
1 通过mask_coef 和 Proto的线性叠加求出mask,其中 n 为 第n个检出结果: m a s k n = ∑ i = 0 32 m a s k _ c o e f i ∗ P r o t o i mask_n = \sum_{i=0}^{32}mask\_coef_{i}*Proto_{i} maskn=i=0∑32mask_coefi∗Protoi2 仅保留该gridceil检测出的box内的mask,然后再对mask框内的mask的每个像素进行阈值过滤(工程中阈值设为0.5),即得到该目标的最终的mask。
3.3 mask的损失函数
网络的输出经过 3.2 章节的处理后,得到解析后的mask信息
- 训练时,mask与标签进行计算损失函数。也就是并不会对 Proto 和 mask_coef 直接进行监督;仅对每个box内有效的处理后的mask做损失函数的计算。
- 预测时,mask通过阈值处理为2值图,像素=0为背景,像素=1为目标。不包含类别信息,类别信息由head_cls分支的输出提供。
训练时候的损失函数为
def single_mask_loss(self, gt_mask, pred, proto, xyxy, area):"""Mask loss for one image."""## gt_mask: mask的标签## pred: 预测的mask_coef## proto:预测的32个原型mask## xyxy:目标检测框标签,用于选中有效区域的mask## area:目标检测框标签的面积,计算了box内的mask损失,要除以面积以为了平衡大小目标对最终损失的影响。pred_mask = (pred @ proto.view(self.nm, -1)).view(-1, *proto.shape[1:]) # (n, 32) @ (32,80,80) -> (n,80,80)loss = F.binary_cross_entropy_with_logits(pred_mask, gt_mask, reduction='none')return (crop_mask(loss, xyxy).mean(dim=(1, 2)) / area).mean()
5 关节点估计
有待补充完善。。。
相关文章:

【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析
1 YOLO时间线 这里简单列下yolo的发展时间线,对每个版本的提出有个时间概念。 2 yolov8 的简介 工程链接:https://github.com/ultralytics/ultralytics 2.1 yolov8的特点 采用了anchor free方式,去除了先验设置可能不佳带来的影响借鉴Genera…...

5256C 5G终端综合测试仪
01 5256C 5G终端综合测试仪 产品综述: 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能,支持5G终端的产线高速校准及终端发射机…...
Springboot Actuator 环境搭建踩坑
JMX和Springboot Actuator JMX是Java Management Extensions,它是一个Java平台的管理和监控接口。 为什么要搞JMX呢?因为在所有的应用程序中,对运行中的程序进行监控都是非常重要的,Java应用程序也不例外。我们肯定希望知道Java…...

Vue-3.3ESLint
ESLint代码规范 代码规范:一套写代码的约定规则。 JavaScript Standard Style规范说明https://standardjs.com/rules-zhcn.html 代码规范错误 如果你的代码不符合standard的要求,ESlint会跳出来提醒。 比如:在mian.js中随意做一些改动&a…...
STROBE-MR
Welcome to the STROBE-MR website! About: STROBE-MR stands for “Strengthening the Reporting of Observational Studies in Epidemiology using Mendelian Randomization”. Inspired by the original STROBE checklist, the STROBE-MR guidelines were developed to ass…...

Hive安装配置 - 内嵌模式
文章目录 一、Hive运行模式二、安装配置内嵌模式Hive(一)下载hive安装包(二)上传hive安装包(三)解压缩hive安装包(四)配置hive环境变量(五)关联Hadoop&#x…...
html中登录按钮添加回车键登录
原文链接有3种方法,其它2中不会弄,第二种方法成功,下面详细说说 原html的登录部分是 <button class"btn btn-success btn-block waves-effect waves-light" id"button" >登入</button> 在该html中增加 &…...
PCL 空间两平面交线计算
PCL 空间两平面交线计算 std::vector<float> LineInPlanes(std::vector<double> para1, std::vector<double> para2) {std::vector<float...
交替合并字符串
题目要求 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 示例 1: 输入:word1 …...

Linux考试复习整理
文章目录 Linux考试整理一.选择题1.用户的密码现象放置在哪个文件夹?2.删除文件或目录的命令是?3.显示一个文件最后几行的命令是?4.删除一个用户并同时删除用户的主目录5.Linux配置文件一般放在什么目录?6.某文件的组外成员的权限…...

基于geojson-vt和canvas的高性能出图
概述 本文介绍基于geojson-vt和canvas,实现node端高性能出图。 效果 实现 1. canvas绘图 import { createCanvas } from canvasconst tileSize 256; const canvas createCanvas(tileSize, tileSize) const ctx canvas.getContext(2d)2. 处理geojson const g…...

CTF是黑客大赛?新手如何入门CTF?
CTF是啥 CTF 是 Capture The Flag 的简称,中文咱们叫夺旗赛,其本意是西方的一种传统运动。在比赛上两军会互相争夺旗帜,当有一方的旗帜已被敌军夺取,就代表了那一方的战败。在信息安全领域的 CTF 是说,通过各种攻击手…...

电脑开不了机用U盘重装系统Win10教程
如果我们遇到了电脑开不起机的问题,这给我们的正常使用带来了很大的影响。这时候我们可以借助U盘重装系统的方法,轻松应对这一问题。下面小编给大家详细介绍关于用U盘给开不机的电脑重装Win10系统的教程步骤,操作后用户就能正常使用电脑了。 …...

四叉堆在GO中的应用-定时任务timer
堆作为必须掌握的数据结构之一,在众多场景中也得到了广泛的应用。 比较典型的,如java中的优先队列PriorityQueue、算法中的TOP-K问题、最短路径Dijkstra算法等,在这些经典应用中堆都担任着灵魂般的角色。 理论基础 binary heap 再一起回忆…...

Flow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略
Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 讨论在Android应用程序中使用Kotlin Flow高效加载…...

AC修炼计划(AtCoder Regular Contest 165)
传送门:AtCoder Regular Contest 165 - AtCoder 本次习题参考了樱雪猫大佬的题解,大佬的题解传送门如下:Atcoder Regular Contest 165 - 樱雪喵 - 博客园 (cnblogs.com) A - Sum equals LCM 第一题不算特别难 B - Sliding Window Sort 2 对…...
【Express】登录鉴权 JWT
JWT(JSON Web Token)是一种用于实现身份验证和授权的开放标准。它是一种基于JSON的安全传输数据的方式,由三部分组成:头部、载荷和签名。 使用jsonwebtoken模块,你可以在Node.js应用程序中轻松生成和验证JWT。以下是j…...

【微服务 SpringCloud】实用篇 · Ribbon负载均衡
微服务(4) 文章目录 微服务(4)1. 负载均衡原理2. 源码跟踪1)LoadBalancerIntercepor2)LoadBalancerClient3)负载均衡策略IRule4)总结 3. 负载均衡策略3.1 负载均衡策略3.2 自定义负载…...

zabbix-proxy代理服务器配置
下载zabbix源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm 安装 yum -y install zabbix-proxy-mysql zabbix_get 查看相关文件路径 rpm -ql zabbix-proxy-mysql 创建数据库 mysq -uroot -proot mysql> create database…...

【python零基础入门学习】python进阶篇之OOP - 面向对象的程序设计
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...