当前位置: 首页 > news >正文

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

img

改进后的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.新建子组件&#xff0c;将数据传递过去(几万条数据的数组&#xff0c;一次性展示多少条&#xff0c;每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…...

【实战场景】记一次UAT jvm故障排查经历

【实战场景】记一次UAT jvm故障排查经历 开篇词&#xff1a;干货篇&#xff1a;1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇&#xff1a;我是杰叔叔&#xff0c;一名…...

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项&#xff0c;便于之后的考研复习使用。 首先&#xff0c;对于普通的二阶和三阶行列式&#xff0c;我们可以直接对其进行拆开&#xff0c;展开。 而对于n阶行列式 其行列式的值等于它的任意…...

tensorflow神经网络

训练一个图像识别模型&#xff0c;使用TensorFlow&#xff0c;需要以下步骤。 1. 安装所需的库 首先&#xff0c;确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…...

Python基础001

Python输出语句 print输出字符串 print("中国四大名著&#xff1a;","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是&#xff1a;") p…...

【udp报文】udp报文未自动分片,报文过长被拦截问题定位

问题现象 某局点出现一个奇怪的现象&#xff0c;客户端给服务端发送消息&#xff0c;服务端仅能收到小部分消息&#xff0c;大部分消息从客户端发出后&#xff0c;服务端都未收到。 问题定位 初步分析 根据现象初步分析&#xff0c;有可能是网络原因导致消息到服务端不可达&a…...

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码&#xff08;复制即用&#xff09; 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…...

【python脚本】批量检测sql延时注入

文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术&#xff0c;当传统的基于错误信息或数据回显的注入方法不可行时&#xff0c;例如当Web应用进行了安全配置&#xff0c;不显示任何错误信息或敏感数据时&#x…...

在C++中如何理解const关键字的不同用法(如const变量、const成员函数、const对象等)

在C中&#xff0c;const关键字是一个非常重要的修饰符&#xff0c;它用于指明变量、函数参数、成员函数或对象的内容是不可变的。理解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时间问题

微信公众号&#xff1a;leetcode_algos_life&#xff0c;代码随想随记 小红书&#xff1a;412408155 CSDN&#xff1a;https://blog.csdn.net/woai8339?typeblog &#xff0c;代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始&#xff0c;计划开始】&#xf…...

Linux屏幕驱动开发调试笔记

引言 首先了解下什么是MIPI-DSI&#xff1a; MIPI-DSI是一种应用于显示技术的串行接口&#xff0c;兼容DPI(显示像素接口&#xff0c;Display Pixel Interface)、DBI(显示总线接口&#xff0c;Display Bus Interface)和DCS(显示命令集&#xff0c;Display Command Set)&#…...

Nginx Http缓存的必要性!启发式缓存有什么弊端?

&#x1f440; Nginx Http缓存的必要性&#xff01;启发式缓存有什么弊端&#xff1f; 简介启发式缓存引发的问题nginx缓存配置 简介 我们在使用React或者Vue开发项目中会使用hash、chunkhash、contenthash来给静态资源文件进行命名。这带来的好处便是当我们部署完项目后&…...

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建&#xff08;设备型&#xff09; 一&#xff0c; 文档介绍二&#xff0c; 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三&#xff0c; MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…...

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id&#xff0c;通过ES查询获取查询商品的列表中展示的数据&#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的&#xff1b; 为什么ES一般…...

Android中使用performClick触发点击事件

Android中使用performClick触发点击事件 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Android开发中如何使用 performClick() 方法来触发点击…...

重生之我要学后端01--后端语言选择和对应框架选择

编程语言 后端开发通常需要掌握至少一种编程语言。以下几种语言在后端开发中非常流行&#xff1a; Java&#xff1a;广泛用于企业级应用程序。Python&#xff1a;因其易学性和强大的库支持&#xff08;如Django和Flask&#xff09;而受欢迎。Node.js&#xff08;JavaScript&a…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...