YOLOv5改进 | 主干网络 | ODConv + ConvNeXt 增强目标特征提取能力
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡
专栏目录: 《YOLOv5入门 + 改进涨点》专栏介绍 & 专栏目录 |目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进
ConvNeXt是一种新型的纯卷积神经网络架构,它借鉴了Vision Transformers的元素并对标准ResNet进行了改进。这种架构通过采用大规模设计、优化模块、宏观设计变更以及ViT中的训练技巧,实现了在图像分类、目标检测和语义分割等多种视觉任务上与Transformers相媲美的性能,同时保持了标准ConvNets的简洁性和高效性。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
专栏地址:YOLOv5改进+入门——持续更新各种有效涨点方法——点击即可跳转
目录
1. 原理
2. 将ConvNeXt添加到YOLOv5中
2.1 代码实现
2.2 新增yaml文件
2.3 注册模块
2.4 执行程序
3. 完整代码分享
4. GFLOPs
5. 进阶
6. 总结
1. 原理

ConvNeXt 是一种新的卷积神经网络架构,其设计受到了现代深度学习模型的启发,特别是 Transformer 模型。ConvNeXt 旨在结合卷积神经网络(CNN)和 Transformer 的优势,以达到更高的性能和更好的计算效率。以下是 ConvNeXt 的主要原理和设计思想:
1. 背景与动机
随着 Transformer 模型在计算机视觉任务中的崛起,如 Vision Transformer (ViT) 和 Swin Transformer,研究者们开始探索如何改进传统的 CNN 以缩小与 Transformer 模型在性能上的差距。ConvNeXt 的设计初衷是通过现代化的设计理念来提升传统 CNN 的性能。
2. 架构设计
ConvNeXt 在保留 CNN 基本结构的同时,引入了一些现代化的设计元素,包括更深的网络、更大的卷积核以及新的归一化方法。其主要组成部分如下:
基础模块
ConvNeXt 的基本构件是 ConvNeXt Block,它类似于 ResNet 的残差块,但在结构和细节上有所改进。一个典型的 ConvNeXt Block 包括以下几部分:
-
深度卷积(Depthwise Convolution):使用更大的卷积核(例如 7x7),提高局部感受野。
-
逐点卷积(Pointwise Convolution):1x1 卷积,用于跨通道的信息融合。
-
Layer Normalization:替代传统的批量归一化(Batch Normalization),提供更稳定的训练过程。
-
GELU 激活函数:使用更平滑的激活函数,以改善非线性特性。
-
跳跃连接(Skip Connections):与 ResNet 类似,保留了跳跃连接以防止梯度消失问题。
模块化设计
ConvNeXt 的整体架构是通过堆叠多个 ConvNeXt Block 来构建的,并通过在不同阶段改变特征图的通道数和分辨率,以构建一个多尺度的表示。
3. 关键改进点
更大的卷积核
使用更大的卷积核(例如 7x7)可以有效地增加感受野,使得每个卷积操作能够捕捉到更大范围的上下文信息。与传统的 3x3 卷积相比,更大的卷积核可以减少网络的深度,同时保持甚至提高性能。
Layer Normalization
Layer Normalization 适用于较小的批次和变长输入,能够提供更稳定的训练过程。相较于 Batch Normalization,Layer Normalization 在不同任务和数据集上的表现更为一致。
更深的网络
通过堆叠更多的卷积层和增加网络的深度,ConvNeXt 能够捕捉更复杂的特征表示,从而提升模型的表达能力和性能。
高效的参数化设计
ConvNeXt 通过精心设计的卷积层和激活函数,尽量减少参数量和计算开销,使得网络在保持高性能的同时,具有更高的计算效率。
4. 实验结果
在各类计算机视觉任务中,如图像分类、目标检测和语义分割,ConvNeXt 展现出了与最新的 Transformer 模型相媲美的性能,同时保持了 CNN 的高效计算特点。这表明,通过现代化的设计理念,传统的 CNN 也能够达到顶尖的性能。
总结
ConvNeXt 是对传统 CNN 的一次重要改进,通过引入更大的卷积核、Layer Normalization、GELU 激活函数和更深的网络结构,成功地将 CNN 的性能提升到了新的高度。它证明了即使在 Transformer 模型日益流行的今天,卷积神经网络依然具有巨大的潜力和发展空间。
2. 将ConvNeXt添加到YOLOv5中
2.1 代码实现
关键步骤一:将下面代码粘贴到/yolov5-6.1/models/common.py文件中
#------------------------------------Convnext start -------------------------------------
#ConvNextBlock
class ConvNextBlock(nn.Module):def __init__(self, inputdim, dim, drop_path=0., layer_scale_init_value=1e-6, kersize = 7): #demo: [64, 64, 1] 1 denotes the number of repeatssuper().__init__()#匹配yolov5配置文件加入outdim输出通道# self.flag = True if dim == outdim else Falseself.dwconv = nn.Conv2d(dim, dim, kernel_size=kersize, padding=kersize // 2, groups=dim) # depthwise convself.norm = LayerNorm_s(dim, eps=1e-6)self.pwconv1 = nn.Linear(dim, 4 * dim) self.act = nn.GELU()self.pwconv2 = nn.Linear(4 * dim, dim)self.gamma = nn.Parameter(layer_scale_init_value * torch.ones((dim)),requires_grad=True) if layer_scale_init_value > 0 else Noneself.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()def forward(self, x):# if self.flag == False:# raise ValueError(# f"Expected input out to have {dim} channels, but got {outdim} channels instead")input = xx = self.dwconv(x)x = x.permute(0, 2, 3, 1) # (N, C, H, W) -> (N, H, W, C)x = self.norm(x)x = self.pwconv1(x)x = self.act(x)x = self.pwconv2(x)if self.gamma is not None:x = self.gamma * xx = x.permute(0, 3, 1, 2) # (N, H, W, C) -> (N, C, H, W)x = input + self.drop_path(x)return xclass LayerNorm_s(nn.Module):def __init__(self, normalized_shape, eps=1e-6, data_format="channels_last"):super().__init__()self.weight = nn.Parameter(torch.ones(normalized_shape))self.bias = nn.Parameter(torch.zeros(normalized_shape))self.eps = epsself.data_format = data_formatif self.data_format not in ["channels_last", "channels_first"]:raise NotImplementedErrorself.normalized_shape = (normalized_shape,)def forward(self, x):if self.data_format == "channels_last":return F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps)elif self.data_format == "channels_first":u = x.mean(1, keepdim=True)s = (x - u).pow(2).mean(1, keepdim=True)x = (x - u) / torch.sqrt(s + self.eps)x = self.weight[:, None, None] * x + self.bias[:, None, None]return xclass DropPath(nn.Module):"""Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks)."""def __init__(self, drop_prob=None):super(DropPath, self).__init__()self.drop_prob = drop_probdef forward(self, x):return drop_path_f(x, self.drop_prob, self.training)def drop_path_f(x, drop_prob: float = 0., training: bool = False):"""Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).This is the same as the DropConnect impl I created for EfficientNet, etc networks, however,the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper...See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted forchanging the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use'survival rate' as the argument."""if drop_prob == 0. or not training:return xkeep_prob = 1 - drop_probshape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNetsrandom_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device)random_tensor.floor_() # binarizeoutput = x.div(keep_prob) * random_tensorreturn output
#------------------------------------Convnext end -------------------------------------
ConvNeXt 是一种现代化的卷积神经网络架构,专注于结合卷积神经网络(CNN)和 Transformer 的优势。处理图片的主要流程如下:
1. 输入图片预处理
对输入图片进行预处理,例如调整大小和归一化。将图片调整为固定的尺寸,并将像素值归一化到一定范围,以便网络能够一致地处理输入数据。
2. 初始卷积层
使用一个初始的标准卷积层将输入图片转换为初步的特征图。这一步将图片的 RGB 通道转化为具有更多特征通道的特征图,提供后续处理的基础。
3. 深度卷积块 (ConvNeXt Block)
ConvNeXt 的核心由多个深度卷积块组成,每个块包含几个关键步骤:
-
深度卷积:使用更大的卷积核(如 7x7)进行深度卷积,能够捕捉更广泛的上下文信息,同时计算效率较高。
-
层归一化:对卷积输出进行层归一化,提供更稳定的训练过程,适用于较小的批次和变长输入。
-
GELU 激活函数:使用 GELU 激活函数代替传统的 ReLU,改善非线性特性,提供更平滑的激活。
-
逐点卷积:通过 1x1 卷积进行逐点卷积,用于跨通道的信息融合,提高特征表达能力。
4. 多尺度特征提取
网络分为不同的阶段(如 Stage 1, Stage 2, Stage 3, Stage 4),每个阶段提取不同尺度的特征。在每个阶段,通过改变特征图的通道数和分辨率,逐步提取更高级和抽象的特征表示。
5. 全局平均池化
在最后阶段,对特征图进行全局平均池化,将每个通道的特征值进行平均,生成一个固定大小的向量表示。这一步有助于将空间特征整合为全局特征,简化后续的分类任务。
6. 全连接层
将全局平均池化的输出送入全连接层,生成最终的分类结果或其他任务的输出(如目标检测、语义分割等)。全连接层将高维特征映射到所需的输出类别。
7. 输出结果
输出模型的预测结果,用于后续的任务处理或评估。这一步通常包括将网络的输出映射到具体的标签或类别,以实现目标应用的具体要求。
总结
ConvNeXt 通过现代化的设计理念,结合了深度卷积、层归一化、GELU 激活函数和逐点卷积,提升了传统卷积神经网络的性能和计算效率。其处理图片的流程涉及从预处理输入图片、逐层提取特征,到最终生成预测结果的各个步骤,体现了卷积神经网络在高效特征提取和分类任务中的强大能力。
2.2 新增yaml文件
关键步骤二:在下/yolov5-6.1/models下新建文件 yolov5_ConvNeXt.yaml并将下面代码复制进去
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 1 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [32, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2, 2]], # 1-P2/4[-1, 1, C3, [64]], [-1, 1, Conv, [128, 3, 2]], # 3-P3/8[-1, 2, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 5-P4/16[-1, 1, ConvNextBlock, [256, 256, 9, 7]],[-1, 1, Conv, [512, 3, 2]], # 7-P5/32[-1, 1, C3, [512]],[-1, 1, SPPF, [512, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 1, C3, [256, False]], # 13[-1, 1, Conv, [128, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 1, C3, [128, False]], # 17 (P3/8-small)[-1, 1, Conv, [128, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 1, C3, [256, False]], # 20 (P4/16-medium)[-1, 1, Conv, [256, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 1, C3, [512, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
温馨提示:本文只是对yolov5基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。
# YOLOv5n
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple# YOLOv5s
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple# YOLOv5l
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple# YOLOv5m
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple# YOLOv5x
depth_multiple: 1.33 # model depth multiple
width_multiple: 1.25 # layer channel multiple
2.3 注册模块
关键步骤三:在yolo.py中注册 添加“ConvNextBlock",

2.4 执行程序
在train.py中,将cfg的参数路径设置为yolov5_ConvNeXt.yaml的路径
建议大家写绝对路径,确保一定能找到

🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享
https://pan.baidu.com/s/1KHZBKJtvJHw1NS6IRkCNjA?pwd=rccf
提取码: rccf
4. GFLOPs
关于GFLOPs的计算方式可以查看:百面算法工程师 | 卷积基础知识——Convolution
未改进的GFLOPs

改进后的GFLOPs

5. 进阶
融合ODConvd和ConNeXt可能会进一步提升检测的效果。
ODConv:YOLOv5改进 | 卷积模块| 动态卷积模块ODConv【完整代码 + 小白必备】——点击即可跳转
yaml文件
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 1 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [32, 6, 2, 2]], # 0-P1/2[-1, 1, ODConv_3rd, [128, 3, 2, 2]], # 1-P2/4[-1, 1, C3, [64]], [-1, 1, Conv, [128, 3, 2]], # 3-P3/8[-1, 2, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 5-P4/16[-1, 1, ConvNextBlock, [256, 256, 9, 7]],[-1, 1, Conv, [512, 3, 2]], # 7-P5/32[-1, 1, C3, [512]],[-1, 1, SPPF, [512, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 1, C3, [256, False]], # 13[-1, 1, Conv, [128, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 1, C3, [128, False]], # 17 (P3/8-small)[-1, 1, Conv, [128, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 1, C3, [256, False]], # 20 (P4/16-medium)[-1, 1, Conv, [256, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 1, C3, [512, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
6. 总结
ConvNeXt 是一种现代化的卷积神经网络架构,其设计融合了传统卷积神经网络(CNN)和 Transformer 模型的优势,主要原理包括使用更大的卷积核以扩展感受野、引入层归一化(Layer Normalization)替代批量归一化(Batch Normalization)以提供更稳定的训练、采用 GELU 激活函数代替 ReLU 提升非线性表达能力、通过逐点卷积进行通道间信息融合、并在不同阶段通过调整特征图的通道数和分辨率提取多尺度特征。结合这些改进,ConvNeXt 能在保持高计算效率的同时显著提升模型性能,特别是在图像分类、目标检测和语义分割等计算机视觉任务中。
相关文章:
YOLOv5改进 | 主干网络 | ODConv + ConvNeXt 增强目标特征提取能力
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 …...
TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍
TIA博途WinCC通过VB脚本从 Excel中读取数据的具体方法介绍 添加 一个PLC,设置PLC的IP地址,如下图所示, 添加全局DB块,新建几个变量,如下图所示, 在数据块中添加了 tag1 …… tag6 ,共 6 个浮点数类型的变量,用来接收通过 WinCC 从 Excel 文件中读取的数据。 添加 HMI…...
第5篇 区块链的技术架构:节点、网络和数据结构
区块链技术听起来很高大上,但其实它的核心架构并不难理解。今天我们就用一些简单的例子和有趣的比喻,来聊聊区块链的技术架构:节点、网络和数据结构。 节点:区块链的“细胞” 想象一下,区块链就像是一个大型的组织&a…...
vue长列表,虚拟滚动
1.新建子组件,将数据传递过去(几万条数据的数组,一次性展示多少条,每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…...
【实战场景】记一次UAT jvm故障排查经历
【实战场景】记一次UAT jvm故障排查经历 开篇词:干货篇:1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇:我是杰叔叔,一名…...
线性代数--行列式1
本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项,便于之后的考研复习使用。 首先,对于普通的二阶和三阶行列式,我们可以直接对其进行拆开,展开。 而对于n阶行列式 其行列式的值等于它的任意…...
tensorflow神经网络
训练一个图像识别模型,使用TensorFlow,需要以下步骤。 1. 安装所需的库 首先,确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…...
Python基础001
Python输出语句 print输出字符串 print("中国四大名著:","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是:") p…...
【udp报文】udp报文未自动分片,报文过长被拦截问题定位
问题现象 某局点出现一个奇怪的现象,客户端给服务端发送消息,服务端仅能收到小部分消息,大部分消息从客户端发出后,服务端都未收到。 问题定位 初步分析 根据现象初步分析,有可能是网络原因导致消息到服务端不可达&a…...
某网页gpt的JS逆向
原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码(复制即用) 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…...
【python脚本】批量检测sql延时注入
文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术,当传统的基于错误信息或数据回显的注入方法不可行时,例如当Web应用进行了安全配置,不显示任何错误信息或敏感数据时&#x…...
在C++中如何理解const关键字的不同用法(如const变量、const成员函数、const对象等)
在C中,const关键字是一个非常重要的修饰符,它用于指明变量、函数参数、成员函数或对象的内容是不可变的。理解const的不同用法对于编写高质量、易维护的C代码至关重要。下面详细解释const在几种不同上下文中的用法和含义。 1. const变量 当变量被声明为…...
JavaSEJava8 时间日期API + 使用心得
文章目录 1. LocalDate2. LocalTime3. LocalDateTime3.1创建 LocalDateTime3.2 LocalDateTime获取方法 4. LocalDateTime转换方法4.1 LocalDateTime增加或者减少时间的方法4.2 LocalDateTime修改方法 5. Period6. Duration7. 格式转换7.1 时间日期转换为字符串7.2 字符串转换为…...
【亲测解决】Python时间问题
微信公众号:leetcode_algos_life,代码随想随记 小红书:412408155 CSDN:https://blog.csdn.net/woai8339?typeblog ,代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始,计划开始】…...
Linux屏幕驱动开发调试笔记
引言 首先了解下什么是MIPI-DSI: MIPI-DSI是一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set)&#…...
Nginx Http缓存的必要性!启发式缓存有什么弊端?
👀 Nginx Http缓存的必要性!启发式缓存有什么弊端? 简介启发式缓存引发的问题nginx缓存配置 简介 我们在使用React或者Vue开发项目中会使用hash、chunkhash、contenthash来给静态资源文件进行命名。这带来的好处便是当我们部署完项目后&…...
【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)
【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型) 一, 文档介绍二, 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三, MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…...
Mysql和ES使用汇总
一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id,通过ES查询获取查询商品的列表中展示的数据,通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的; 为什么ES一般…...
Android中使用performClick触发点击事件
Android中使用performClick触发点击事件 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Android开发中如何使用 performClick() 方法来触发点击…...
重生之我要学后端01--后端语言选择和对应框架选择
编程语言 后端开发通常需要掌握至少一种编程语言。以下几种语言在后端开发中非常流行: Java:广泛用于企业级应用程序。Python:因其易学性和强大的库支持(如Django和Flask)而受欢迎。Node.js(JavaScript&a…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
