YOLOv9改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

一、本文介绍

本文记录的是利用GnConv优化YOLOv9的目标检测方法研究。YOLOv9在进行目标检测时,需要对不同层次的特征进行融合。GnConv可以考虑更高阶的空间交互,能够更好地捕捉特征之间的复杂关系,从而增强特征融合的效果,提高模型对目标的检测能力。

文章目录

  • 一、本文介绍
  • 二、HorNet原理介绍
    • 2.1、GnConv设计原理
    • 2.2、GnConv计算公式
    • 2.3、优势
  • 三、GnConv的实现代码
  • 四、添加步骤
    • 4.1 修改common.py
      • 4.1.1 创新模块⭐
    • 4.2 修改yolo.py
  • 五、yaml模型文件
    • 5.1 模型改进⭐
  • 六、成功运行结果


二、HorNet原理介绍

HorNet: 利用递归门控卷积实现高效高阶空间交互

GnConv(Recursive Gated Convolution,递归门控卷积)是论文中提出的一种高效操作,用于实现长期和高阶空间交互,其设计原理、计算公式和优势如下:

2.1、GnConv设计原理

  • 输入自适应交互与门控卷积Vision Transformer的成功主要依赖于对视觉数据中空间交互的适当建模,与简单使用静态卷积核聚合相邻特征的CNN不同,Vision Transformer应用多头自注意力来动态生成权重以混合空间标记,但自注意力关于输入大小的二次复杂度在很大程度上阻碍了其应用,尤其是在需要更高分辨率特征图的下游任务中。在这项工作中,作者寻求一种更有效和高效的方法来执行空间交互,使用门控卷积(gConv)来实现输入自适应的空间混合。
  • 高阶交互与递归门控:在通过gConv实现了高效的一阶空间交互后,作者设计了递归门控卷积(GnConv)来通过引入高阶交互进一步增强模型容量。具体来说,首先使用多个线性投影层( ϕ i n \phi_{in} ϕin)获得一组投影特征( p 0 p_0 p0 q k q_k qk),然后通过递归的方式执行门控卷积( p k + 1 = f k ( q k ) ⊙ g k ( p k ) / α p_{k + 1} = f_k(q_k) \odot g_k(p_k) / \alpha pk+1=fk(qk)gk(pk)/α),其中 f k f_k fk是一组深度卷积层, g k g_k gk用于匹配不同阶的维度,最后将最后一次递归步骤的输出 q n q_n qn送入投影层 ϕ o u t \phi_{out} ϕout以获得 g n C o n v g^{n}Conv gnConv的结果。从递归公式可以看出, p k p_k pk的交互阶数在每一步后都会增加1,因此 g n C o n v gnConv gnConv实现了 n n n阶空间交互。
  • 大核卷积与长期交互:为了使 G n C o n v GnConv GnConv能够捕捉长期交互,作者采用了两种实现方式来处理深度卷积 f f f
    • 7×7卷积:7×7是Swin TransformersConvNext的默认窗口/核大小,研究表明该核大小在ImageNet分类和各种下游任务中产生良好性能,因此作者遵循此配置以公平地与代表性的Vision Transformer和现代CNN进行比较。
    • 全局滤波器(GF):GF层通过将频域特征与可学习的全局滤波器相乘,相当于在空间域中进行具有全局核大小和循环填充的卷积。作者使用了GF层的修改版本,即处理一半的通道与全局滤波器相乘,另一半与3×3深度卷积相乘,并仅在后期阶段使用GF层以保留更多局部细节。

2.2、GnConv计算公式

门控卷积输出

x ∈ R H W × C x \in \mathbb{R}^{H W \times C} xRHW×C为输入特征,门控卷积 y = g C o n v ( x ) y = gConv(x) y=gConv(x)的输出可写为:
[ p 0 H W × C , q 0 H W × C ] = ϕ i n ( x ) ∈ R H W × 2 C , y = f ( q 0 ) ⊙ p 0 ∈ R H W × C , y = ϕ o u t ( p 1 ) ∈ R H W × C , \begin{array}{r} {\left[p_{0}^{H W \times C}, q_{0}^{H W \times C}\right]=\phi_{in }(x) \in \mathbb{R}^{H W \times 2 C},} \\ y = f\left(q_{0}\right) \odot p_{0} \in \mathbb{R}^{H W \times C}, \\ y = \phi_{out }\left(p_{1}\right) \in \mathbb{R}^{H W \times C}, \end{array} [p0HW×C,q0HW×C]=ϕin(x)RHW×2C,y=f(q0)p0RHW×C,y=ϕout(p1)RHW×C,

其中 ϕ i n \phi_{in} ϕin ϕ o u t \phi_{out} ϕout是线性投影层以执行通道混合, f f f是深度卷积。注意到 p 1 ( i , c ) = ∑ j ∈ Ω i w i → j c q 0 ( j , c ) p 0 ( i , c ) p_{1}^{(i, c)}=\sum_{j \in \Omega_{i}} w_{i \to j}^{c} q_{0}^{(j, c)} p_{0}^{(i, c)} p1(i,c)=jΩiwijcq0(j,c)p0(i,c),其中 Ω i \Omega_{i} Ωi是以为 i i i中心的局部窗口, w i → j w_{i \to j} wij代表卷积权重。

  • 递归门控卷积
    [ p 0 H W × C 0 , q 0 H W × C 0 , … , q n − 1 H W × C n − 1 ] = ϕ i n ( x ) ∈ R H W × ( C 0 + ∑ 0 ≤ k ≤ n − 1 C k ) , p k + 1 = f k ( q k ) ⊙ g k ( p k ) / α , k = 0 , 1 , … , n − 1 , \begin{aligned} &\left[p_{0}^{H W \times C_{0}}, q_{0}^{H W \times C_{0}}, \ldots, q_{n - 1}^{H W \times C_{n - 1}}\right]=\phi_{in }(x) \in \mathbb{R}^{H W \times\left(C_{0} + \sum_{0 \leq k \leq n - 1} C_{k}\right)}, \\ &p_{k + 1} = f_{k}\left(q_{k}\right) \odot g_{k}\left(p_{k}\right) / \alpha, k = 0, 1, \ldots, n - 1, \end{aligned} [p0HW×C0,q0HW×C0,,qn1HW×Cn1]=ϕin(x)RHW×(C0+0kn1Ck),pk+1=fk(qk)gk(pk)/α,k=0,1,,n1,
    其中 g k g_{k} gk的定义为: g k = { I d e n t i t y , k = 0 L i n e a r ( C k − 1 , C k ) , 1 ≤ k ≤ n − 1 g_{k}=\begin{cases}Identity, & k = 0 \\Linear\left(C_{k - 1}, C_{k}\right), & 1 \leq k \leq n - 1\end{cases} gk={Identity,Linear(Ck1,Ck),k=01kn1
  • 计算复杂度:总FLOPs为: F L O P s ( g n C o n v ) < H W C ( 2 K 2 + 11 3 × C + 2 ) FLOPs\left(g^{n}Conv\right) < HW C\left(2K^{2} + \frac{11}{3} \times C + 2\right) FLOPs(gnConv)<HWC(2K2+311×C+2),其中 K K K是深度卷积的核大小。

在这里插入图片描述

2.3、优势

  • 高效:基于卷积的实现避免了自注意力的二次复杂度。在执行空间交互时逐渐增加通道宽度的设计也使能够以有限的复杂度实现更高阶的交互。
  • 可扩展:将自注意力中的二阶交互扩展到任意阶,以进一步提高建模能力。由于不对空间卷积的类型做假设,因此(gnConv)与各种核大小和空间混合策略兼容。
  • 平移等变性:完全继承了标准卷积的平移等变性,这为主要视觉任务引入了有益的归纳偏差,并避免了局部注意力带来的不对称性。

论文:https://arxiv.org/pdf/2207.14284
源码:https://github.com/raoyongming/HorNet

三、GnConv的实现代码

GnConv模块的实现代码如下:


def get_dwconv(dim, kernel, bias):return nn.Conv2d(dim, dim, kernel_size=kernel, padding=(kernel-1)//2 ,bias=bias, groups=dim)class gnConv(nn.Module):def __init__(self, dim, order=5, gflayer=None, h=14, w=8, s=1.0):super().__init__()self.order = orderself.dims = [dim // 2 ** i for i in range(order)]self.dims.reverse()self.proj_in = nn.Conv2d(dim, 2*dim, 1)if gflayer is None:self.dwconv = get_dwconv(sum(self.dims), 7, True)else:self.dwconv = gflayer(sum(self.dims), h=h, w=w)self.proj_out = nn.Conv2d(dim, dim, 1)self.pws = nn.ModuleList([nn.Conv2d(self.dims[i], self.dims[i+1], 1) for i in range(order-1)])self.scale = sdef forward(self, x, mask=None, dummy=False):# B, C, H, W = x.shape gnconv [512]by iscyy/airfused_x = self.proj_in(x)pwa, abc = torch.split(fused_x, (self.dims[0], sum(self.dims)), dim=1)dw_abc = self.dwconv(abc) * self.scaledw_list = torch.split(dw_abc, self.dims, dim=1)x = pwa * dw_list[0]for i in range(self.order -1):x = self.pws[i](x) * dw_list[i+1]x = self.proj_out(x)return x

四、添加步骤

4.1 修改common.py

此处需要修改的文件是models/common.py

common.py中定义了网络结构的通用模块,我们想要加入新的模块就只需要将模块代码放到这个文件内即可。

4.1.1 创新模块⭐

模块改进方法:1️⃣先加入gnConv模块
将上方的实现代码粘贴到common.py文件夹下,gnConv模块添加后如下:

在这里插入图片描述

2️⃣基于gnConvRepNCSPELAN4

第二种改进方法是对YOLOv9中的RepNCSPELAN4模块进行改进。将gnConv模块RepNCSPELAN4 结合后,替换其中的普通卷积可以使YOLOv9实现更高阶的空间交互,更好地捕捉特征之间的复杂关系,从而提高模型的建模能力。

改进代码如下:

class GnRepNCSPELAN4(nn.Module):# csp-elandef __init__(self, c1, c2, c3, c4, c5=1):  # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()self.c = c3//2self.cv1 = Conv(c1, c3, 1, 1)self.cv2 = nn.Sequential(RepNCSP(c3//2, c4, c5), gnConv(c4))self.cv3 = nn.Sequential(RepNCSP(c4, c4, c5), gnConv(c4))self.cv4 = Conv(c3+(2*c4), c2, 1, 1)def forward(self, x):y = list(self.cv1(x).chunk(2, 1))y.extend((m(y[-1])) for m in [self.cv2, self.cv3])return self.cv4(torch.cat(y, 1))def forward_split(self, x):y = list(self.cv1(x).split((self.c, self.c), 1))y.extend(m(y[-1]) for m in [self.cv2, self.cv3])return self.cv4(torch.cat(y, 1))

在这里插入图片描述

注意❗:在4.2小节中的yolo.py文件中需要声明的模块名称为:gnConvGnRepNCSPELAN4

4.2 修改yolo.py

此处需要修改的文件是models/yolo.py

yolo.py用于函数调用,我们只需要将common.py中定义的新的模块名添加到parse_model函数下即可。

gnConv模块以及GnRepNCSPELAN4模块添加后如下:

在这里插入图片描述


五、yaml模型文件

5.1 模型改进⭐

在代码配置完成后,配置模型的YAML文件。

此处以models/detect/yolov9-c.yaml为例,在同目录下创建一个用于自己数据集训练的模型文件yolov9-c-GnRepNCSPELAN4.yaml

yolov9-c.yaml中的内容复制到yolov9-c-GnRepNCSPELAN4.yaml文件下,修改nc数量等于自己数据中目标的数量。
在骨干网络中,将四个RepNCSPELAN4模块替换成GnRepNCSPELAN4模块

# YOLOv9# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()# anchors
anchors: 3# YOLOv9 backbone
backbone:[[-1, 1, Silence, []],  # conv down[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 2-P2/4# elan-1 block[-1, 1, GnRepNCSPELAN4, [256, 128, 64, 1]],  # 3# avg-conv down[-1, 1, ADown, [256]],  # 4-P3/8# elan-2 block[-1, 1, GnRepNCSPELAN4, [512, 256, 128, 1]],  # 5# avg-conv down[-1, 1, ADown, [512]],  # 6-P4/16# elan-2 block[-1, 1, GnRepNCSPELAN4, [512, 512, 256, 1]],  # 7# avg-conv down[-1, 1, ADown, [512]],  # 8-P5/32# elan-2 block[-1, 1, GnRepNCSPELAN4, [512, 512, 256, 1]],  # 9]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]],  # 10# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 7], 1, Concat, [1]],  # cat backbone P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 13# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 5], 1, Concat, [1]],  # cat backbone P3# elan-2 block[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 16 (P3/8-small)# avg-conv-down merge[-1, 1, ADown, [256]],[[-1, 13], 1, Concat, [1]],  # cat head P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 19 (P4/16-medium)# avg-conv-down merge[-1, 1, ADown, [512]],[[-1, 10], 1, Concat, [1]],  # cat head P5# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)# multi-level reversible auxiliary branch# routing[5, 1, CBLinear, [[256]]], # 23[7, 1, CBLinear, [[256, 512]]], # 24[9, 1, CBLinear, [[256, 512, 512]]], # 25# conv down[0, 1, Conv, [64, 3, 2]],  # 26-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 27-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 28# avg-conv down fuse[-1, 1, ADown, [256]],  # 29-P3/8[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30  # elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 31# avg-conv down fuse[-1, 1, ADown, [512]],  # 32-P4/16[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 34# avg-conv down fuse[-1, 1, ADown, [512]],  # 35-P5/32[[25, -1], 1, CBFuse, [[2]]], # 36# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 37# detection head# detect[[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)]

六、成功运行结果

分别打印网络模型可以看到GnRepNCSPELAN4模块已经加入到模型中,并可以进行训练了。

yolov9-c-GnRepNCSPELAN4

                from  n    params  module                                  arguments                     0                -1  1         0  models.common.Silence                   []                            1                -1  1      1856  models.common.Conv                      [3, 64, 3, 2]                 2                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               3                -1  1    212864  models.common.RepNCSPELAN4              [128, 256, 128, 64, 1]        4                -1  1    164352  models.common.ADown                     [256, 256]                    5                -1  1    847616  models.common.RepNCSPELAN4              [256, 512, 256, 128, 1]       6                -1  1    656384  models.common.ADown                     [512, 512]                    7                -1  1   2857472  models.common.RepNCSPELAN4              [512, 512, 512, 256, 1]       8                -1  1    656384  models.common.ADown                     [512, 512]                    9                -1  1   2209152  models.common.GnRepNCSPELAN4            [512, 512, 512, 256, 1]       
10                -1  1    656896  models.common.SPPELAN                   [512, 512, 256]               
11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
12           [-1, 7]  1         0  models.common.Concat                    [1]                           
13                -1  1   3119616  models.common.RepNCSPELAN4              [1024, 512, 512, 256, 1]      
14                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
15           [-1, 5]  1         0  models.common.Concat                    [1]                           
16                -1  1    912640  models.common.RepNCSPELAN4              [1024, 256, 256, 128, 1]      
17                -1  1    164352  models.common.ADown                     [256, 256]                    
18          [-1, 13]  1         0  models.common.Concat                    [1]                           
19                -1  1   2988544  models.common.RepNCSPELAN4              [768, 512, 512, 256, 1]       
20                -1  1    656384  models.common.ADown                     [512, 512]                    
21          [-1, 10]  1         0  models.common.Concat                    [1]                           
22                -1  1   3119616  models.common.RepNCSPELAN4              [1024, 512, 512, 256, 1]      
23                 5  1    131328  models.common.CBLinear                  [512, [256]]                  
24                 7  1    393984  models.common.CBLinear                  [512, [256, 512]]             
25                 9  1    656640  models.common.CBLinear                  [512, [256, 512, 512]]        
26                 0  1      1856  models.common.Conv                      [3, 64, 3, 2]                 
27                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
28                -1  1    212864  models.common.RepNCSPELAN4              [128, 256, 128, 64, 1]        
29                -1  1    164352  models.common.ADown                     [256, 256]                    
30  [23, 24, 25, -1]  1         0  models.common.CBFuse                    [[0, 0, 0]]                   
31                -1  1    847616  models.common.RepNCSPELAN4              [256, 512, 256, 128, 1]       
32                -1  1    656384  models.common.ADown                     [512, 512]                    
33      [24, 25, -1]  1         0  models.common.CBFuse                    [[1, 1]]                      
34                -1  1   2857472  models.common.RepNCSPELAN4              [512, 512, 512, 256, 1]       
35                -1  1    656384  models.common.ADown                     [512, 512]                    
36          [25, -1]  1         0  models.common.CBFuse                    [[2]]                         
37                -1  1   2857472  models.common.RepNCSPELAN4              [512, 512, 512, 256, 1]       
38[31, 34, 37, 16, 19, 22]  1  21725312  DualDDetect                             [80, [512, 512, 512, 256, 512, 512]]
yolov9-c-GnRepNCSPELAN4 summary: 974 layers, 50533760 parameters, 50533728 gradients, 239.4 GFLOPs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142904.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2024/9/17 pytorch-卷积神经网络

一、torch.nn pytorch有很多接口&#xff0c;其中的torch.nn可以让我们方便的调用以便生成神经网络各层 1.torch.nn.Module 是一个构成神经网络层的一个基本类别&#xff0c;一般生成一个类别来继承nn.module torch.tensor(a)将a初始化为一个tensor类型数据 一般这种已经固…

09_Python流程控制_分支

流程控制 流程控制是管理程序执行顺序的重要组成部分。分支&#xff08;也称为条件语句&#xff09;是流程控制的一种形式&#xff0c;它允许程序根据某些条件的真假来选择执行不同的代码路径。 顺序结构&#xff1a;按部就班执行选择结构&#xff1a;根据条件不同执行循环结…

【图像匹配】基于‌墨西哥帽小波(Marr小波)算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于‌墨西哥帽小波&#xff08;Marr小波&#xff09;算法的图像匹配&#xff0c;用…

代码随想录训练营 Day62打卡 图论part11 Floyd 算法 A * 算法

代码随想录训练营 Day62打卡 图论part11 Floyd 算法 例题&#xff1a;卡码97. 小明逛公园 题目描述 小明喜欢去公园散步&#xff0c;公园内布置了许多的景点&#xff0c;相互之间通过小路连接&#xff0c;小明希望在观看景点的同时&#xff0c;能够节省体力&#xff0c;走最短…

MOE论文汇总2

TASK-CUSTOMIZED MASKED AUTOENCODER VIA MIXTURE OF CLUSTER-CONDITIONAL Experts 这篇论文提出了一种新颖的自监督学习方法&#xff0c;名为“Mixture of Cluster-conditional Experts (MoCE)”&#xff0c;旨在解决传统Masked Autoencoder (MAE)在不同下游任务中可能遇到的负…

Linux基础3-基础工具4(git,冯诺依曼计算机体系结构)

上篇文章&#xff1a;Linux基础3-基础工具3&#xff08;make,makefile,gdb详解&#xff09;-CSDN博客 本章重点&#xff1a; 1. git简易使用 2. 冯诺依曼计算机体系结构介绍 一. git使用 1.1 什么是git? git是用于管理代码版本的一种工具&#xff0c;我们在如GitHub&#xf…

并发带来的对象一致性问题

多线程操作带来数据不一致情况分析&#xff0c;简单demo。 public class Object_IS {private Student_Object so new Student_Object("张三", 123);public static void main(String[] args) throws InterruptedException {Object_IS os new Object_IS();os.test1(…

利用语义搜索和混合查询策略提升RAG系统的准确性

人工智能咨询培训老师叶梓 转载标明出处 在构建基于大模型&#xff08;LLM&#xff09;的生成式问答系统&#xff08;Generative Q&A&#xff09;时&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;方法被广泛采用。RAG通过结合检索…

Leetcode—删除有序数组的重复项

题目描述 思路 思路&#xff1a;定义两个指针/变量&#xff0c;dst指向第一个位置&#xff0c;scr指向下一个位置&#xff0c;判断scr和dst位置的数据。 case1&#xff1a;相等&#xff0c;scr; case2: 不相等&#xff0c;dst,nums[dst]nums[scr],scr; 画图解释 定义两个指针…

基于SpringBoot+Vue+MySQL的社区医院管理系统

系统展示 系统背景 在当前医疗体系日益完善的背景下&#xff0c;社区医院作为基层医疗服务的重要一环&#xff0c;其管理效率和服务质量直接关系到居民的健康福祉。为了提升社区医院的管理水平&#xff0c;优化患者就医体验&#xff0c;我们设计了一套基于SpringBoot、Vue.js与…

09年408考研真题解析-计算机网络

[题34]在无噪声情况下&#xff0c;若某通信链路的带宽为3kHz&#xff0c;采用4个相位&#xff0c;每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输速率是&#xff08;B&#xff09; A.12 kbps B.24 kbps C.48 kbps D.96 kbps 解析&#xff…

主流的Java的webapi接口模板特点分析

Java 作为一种广泛应用于企业级开发的编程语言&#xff0c;其在 Web API 开发中具有重要的地位。随着 Java 生态系统的不断发展&#xff0c;市面上涌现了多种不同的 Web API 框架和设计模式。不同的 Web API 模板在设计上各有特点&#xff0c;适合不同类型的开发需求。本文将详…

从0-1 用AI做一个赚钱的小红书账号(不是广告不是广告)

大家好&#xff0c;我是胡广&#xff01;是不是被标题吸引过来的呢&#xff1f;是不是觉得自己天赋异禀&#xff0c;肯定是那万中无一的赚钱天才。哈哈哈&#xff0c;我告诉你&#xff0c;你我皆是牛马&#xff0c;不要老想着突然就成功了&#xff0c;一夜暴富了&#xff0c;瞬…

【Java 优选算法】双指针(下)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 有效三角形的个数 题目链接 解法 解法1:暴力枚举--->O(n^3) 解法2:利用单调性,使用双指针来解决---->O(n^2) 优化:对整个数组进行排序先固定最大数在最大数的左…

微服务_入门1

文章目录 一、 认识微服务二、 微服务演变2.1、 单体架构2.2、 分布式架构2.3、 微服务2.4、 微服务方案对比 三、 注册中心3.1、 Eureka3.2、 Nacos3.2.1、服务分级存储模型3.2.2、权重配置3.2.3、环境隔离 一、 认识微服务 二、 微服务演变 随着互联网行业的发展&#xff0c;…

Spark Streaming基础概论

1. 简介 1.1 什么是 Spark Streaming&#xff1f; Spark Streaming 是 Apache Spark 的一个扩展模块&#xff0c;专门用于处理实时数据流。它通过将数据流切分为一系列小批次&#xff08;微批次&#xff09;进行处理&#xff0c;使得开发者能够使用与批处理相同的 API 来处理…

【MRI基础】混叠伪影

基本概念 混叠&#xff08;aliasing&#xff09;&#xff0c;也称为环绕伪影(wrap around artifacts)&#xff0c;是一种常见的伪影&#xff0c;当视场 (FOV) 小于实际成像物体时&#xff0c;可能会在磁共振成像 (MRI) 中出现。空间定位由选定组织样本内的自旋频率决定。选定视…

正点原子阿尔法ARM开发板-IMX6ULL(六)——通过官方SDK完成实验

文章目录 一、引言1.1 cc.h1.2 main.c1.2 fsl_common.h、MCIMX6Y2.h、fsl_iomuxc.h1.3 对于宏定义能多个参数 其他 一、引言 在开发过程中&#xff0c;如果一个人来写寄存器、汇编等东西&#xff0c;会变得特别繁琐&#xff0c;好在官方NXP官方给出了SDK包&#xff0c; 1.1 c…

解决IDEA每次创建新项目时都要指定Maven仓库和Maven配置文件的问题

文章目录 0. 前言1. 打开新项目的设置2. 搜索 Maven 相关的配置3. 更改Maven主路径、配置文件、本地仓库4. 更改新项目的Maven配置后没生效 0. 前言 在 IDEA 中每次创建新项目时&#xff0c;使用的都是默认的 Maven 仓库和默认的配置文件&#xff0c;需要我们手动修改&#xf…

对称密码中的密钥是如何实现安全配送的?

对称密码在设计时就存在一个天然的缺陷&#xff0c;就是要求通信双方都要持有相同的密钥。确保密钥的安全传输和防止密钥泄露&#xff0c;往往比加密算法本身更为复杂和困难。一旦密钥被第三方获取&#xff0c;通信的安全性就会受到严重威胁&#xff0c;从而可能暴露敏感信息。…