YOLOv10改进策略【注意力机制篇】| GAM全局注意力机制: 保留信息以增强通道与空间的相互作用

news2024/11/21 0:22:25

一、本文介绍

本文记录的是基于GAM注意力模块的YOLOv10目标检测改进方法研究GAM注意力模块通过3D排列和重新设计的子模块,能够在通道和空间方面保留信息,避免了先前方法中由于信息减少和维度分离而导致的全局空间-通道交互丢失的问题。本文利用GAM改进YOLOv10,以增强模型的跨维度交互能力。

文章目录

  • 一、本文介绍
  • 二、GAM注意力原理
    • 2.1、设计原理
    • 2.2、优势
  • 三、GAM的实现代码
  • 四、添加步骤
    • 4.1 改进点1
    • 4.2 改进点2⭐
  • 五、添加步骤
    • 5.1 修改ultralytics/nn/modules/block.py
    • 5.2 修改ultralytics/nn/modules/__init__.py
    • 5.3 修改ultralytics/nn/modules/tasks.py
  • 六、yaml模型文件
    • 6.1 模型改进版本一
    • 6.2 模型改进版本二⭐
  • 七、成功运行结果


二、GAM注意力原理

全局注意力机制: 保留信息以增强通道与空间的相互作用

GAM(Global Attention Mechanism)是一种全局注意力机制,其设计目的是减少信息减少并放大全局维度交互特征,以增强深度神经网络的性能。

2.1、设计原理

  1. 整体结构:采用了来自CBAM的顺序通道 - 空间注意力机制,并重新设计了子模块。给定输入特征图 F 1 ∈ R C × H × W F_{1} \in \mathbb{R}^{C ×H ×W} F1RC×H×W,中间状态 F 2 F_{2} F2和输出 F 3 F_{3} F3的定义为:
    • F 2 = M c ( F 1 ) ⊗ F 1 F_{2}=M_{c}\left(F_{1}\right) \otimes F_{1} F2=Mc(F1)F1
    • F 3 = M s ( F 2 ) ⊗ F 2 F_{3}=M_{s}\left(F_{2}\right) \otimes F_{2} F3=Ms(F2)F2
      其中 M c M_{c} Mc M s M_{s} Ms分别是通道和空间注意力图, ⊗ \otimes 表示元素级乘法。
  2. 通道注意力子模块:使用3D排列来保留跨三个维度的信息,然后通过两层MLP(多层感知机)放大跨维度的通道 - 空间依赖性。(MLP是具有压缩比 r r r的编码器 - 解码器结构,与BAM相同。)
  3. 空间注意力子模块:为了关注空间信息,使用两个卷积层进行空间信息融合,并使用与通道注意力子模块相同的压缩比 r r r(与BAM相同)。同时,由于最大池化会减少信息并产生负面影响,所以移除了池化以进一步保留特征图。为了防止参数显著增加,在ResNet50中采用了具有通道打乱的组卷积。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.2、优势

  1. 保留信息:通过3D排列和重新设计的子模块,GAM能够在通道和空间方面保留信息,避免了先前方法中由于信息减少和维度分离而导致的全局空间 - 通道交互的丢失。
  2. 放大交互:能够放大“全局”跨维度交互,捕获所有三个维度(通道、空间宽度和空间高度)上的重要特征,从而增强了跨维度的交互能力。
  3. 性能提升:在CIFAR - 100和ImageNet - 1K数据集上的评估表明,GAM稳定地优于其他几种近期的注意力机制,无论是在ResNet还是轻量级MobileNet上,都能提高性能。例如,在ImageNet - 1K数据集上,对于ResNet18,GAM以更少的参数和更高的效率优于ABN。

论文:https://arxiv.org/pdf/2112.05561v1
源码:https://github.com/dengbuqi/GAM_Pytorch/blob/main/CAM.py

三、GAM的实现代码

GAM模块的实现代码如下:

class GAMAttention(nn.Module):

    def __init__(self, c1, c2, group=True, rate=4):
        super(GAMAttention, self).__init__()

        self.channel_attention = nn.Sequential(
            nn.Linear(c1, int(c1 / rate)),
            nn.ReLU(inplace=True),
            nn.Linear(int(c1 / rate), c1),
        )
        self.spatial_attention = nn.Sequential(
            (
                nn.Conv2d(c1, c1 // rate, kernel_size=7, padding=3, groups=rate)
                if group
                else nn.Conv2d(c1, int(c1 / rate), kernel_size=7, padding=3)
            ),
            nn.BatchNorm2d(int(c1 / rate)),
            nn.ReLU(inplace=True),
            (
                nn.Conv2d(c1 // rate, c2, kernel_size=7, padding=3, groups=rate)
                if group
                else nn.Conv2d(int(c1 / rate), c2, kernel_size=7, padding=3)
            ),
            nn.BatchNorm2d(c2),
        )

    def forward(self, x):
        b, c, h, w = x.shape
        x_permute = x.permute(0, 2, 3, 1).view(b, -1, c)
        x_att_permute = self.channel_attention(x_permute).view(b, h, w, c)
        x_channel_att = x_att_permute.permute(0, 3, 1, 2)
        x = x * x_channel_att

        x_spatial_att = self.spatial_attention(x).sigmoid()
        x_spatial_att = channel_shuffle(x_spatial_att, 4)  # last shuffle
        out = x * x_spatial_att
        return out


def channel_shuffle(x, groups=2):  ##shuffle channel
    # RESHAPE----->transpose------->Flatten
    B, C, H, W = x.size()
    out = x.view(B, groups, C // groups, H, W).permute(0, 2, 1, 3, 4).contiguous()
    out = out.view(B, C, H, W)
    return out


四、添加步骤

4.1 改进点1

模块改进方法1️⃣:直接加入GAMAttention模块
GAMAttention模块添加后如下:

在这里插入图片描述

注意❗:在5.2和5.3小节中需要声明的模块名称为:GAMAttention

4.2 改进点2⭐

模块改进方法2️⃣:基于GAMAttention模块C2f

相较方法一中的直接插入注意力模块,利用注意力模块对卷积等其他模块进行改进,其新颖程度会更高一些,训练精度可能会表现的更高。

第二种改进方法是对YOLOv10中的C2f模块进行改进。GAM 模块能够捕捉通道、空间宽度和空间高度等多个维度的重要特征,加强了跨维度的交互,在将其添加到C2f模块中有助于在分流过程中更好地分配注意力,减少无关信息的干扰,提高特征质量。

改进代码如下:

class C2f_GAM(nn.Module):
    """Faster Implementation of CSP Bottleneck with 2 convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
        expansion.
        """
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
        self.att = GAMAttention(c1, c2)

    def forward(self, x):
        """Forward pass through C2f layer."""
        y = list(self.cv1(x).chunk(2, 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.att(self.cv2(torch.cat(y, 1)))

    def forward_split(self, x):
        """Forward pass using split() instead of chunk()."""
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.att(self.cv2(torch.cat(y, 1)))

在这里插入图片描述

注意❗:在5.2和5.3小节中需要声明的模块名称为:C2f_GAM


五、添加步骤

5.1 修改ultralytics/nn/modules/block.py

此处需要修改的文件是ultralytics/nn/modules/block.py

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

GAMAttentionC2f_GAM模块代码添加到此文件下。

5.2 修改ultralytics/nn/modules/init.py

此处需要修改的文件是ultralytics/nn/modules/__init__.py

__init__.py文件中定义了所有模块的初始化,我们只需要将block.py中的新的模块命添加到对应的函数即可。

GAMAttentionC2f_GAMblock.py中实现,所有要添加在from .block import

from .block import (
    C1,
    C2,
    ...
    GAMAttention,
    C2f_GAM
)

在这里插入图片描述

5.3 修改ultralytics/nn/modules/tasks.py

tasks.py文件中,需要在两处位置添加各模块类名称。

首先:在函数声明中引入GAMAttentionC2f_GAM

在这里插入图片描述

在这里插入图片描述

其次:在parse_model函数中注册GAMAttentionC2f_GAM模块

在这里插入图片描述

在这里插入图片描述


六、yaml模型文件

6.1 模型改进版本一

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

此处以ultralytics/cfg/models/v10/yolov10m.yaml为例,在同目录下创建一个用于自己数据集训练的模型文件yolov10m-GAM.yaml

yolov10m.yaml中的内容复制到yolov10m-GAM.yaml文件下,修改nc数量等于自己数据中目标的数量。
在骨干网络中添加GAMAttention模块,即下方代码中的第45行,只需要填入一个参数,通道数,和前一层通道数一致

📌 GAM 模块能够放大全局维度交互特征,放在此处的目的是有助于更好地捕捉和保留重要的信息,从而增强骨干网络对特征的提取能力。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2fCIB, [1024, True]]
  - [-1, 1, GAMAttention, [1024]]
  - [-1, 1, SPPF, [1024, 5]] # 10
  - [-1, 1, PSA, [1024]] # 11

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 14

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 17 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 14], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2fCIB, [512, True]] # 20 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 11], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True]] # 23 (P5/32-large)

  - [[17, 20, 23], 1, v10Detect, [nc]] # Detect(P3, P4, P5)

6.2 模型改进版本二⭐

此处同样以ultralytics/cfg/models/v10/yolov10m.yaml为例,在同目录下创建一个用于自己数据集训练的模型文件yolov10m-C2f_GAM.yaml

yolov10m.yaml中的内容复制到yolov10m-C2f_GAM.yaml文件下,修改nc数量等于自己数据中目标的数量。

📌 模型的修改方法是将骨干网络中的所有C2f模块替换成C2f_GAM模块

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f_GAM, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f_GAM, [256, True]]
  - [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f_GAM, [512, True]]
  - [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2fCIB, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 1, PSA, [1024]] # 10

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2fCIB, [512, True]] # 19 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)



七、成功运行结果

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

YOLOv10m-GAM

                   from  n    params  module                                       arguments                     
  0                  -1  1      1392  ultralytics.nn.modules.conv.Conv             [3, 48, 3, 2]                 
  1                  -1  1     41664  ultralytics.nn.modules.conv.Conv             [48, 96, 3, 2]                
  2                  -1  2    111360  ultralytics.nn.modules.block.C2f             [96, 96, 2, True]             
  3                  -1  1    166272  ultralytics.nn.modules.conv.Conv             [96, 192, 3, 2]               
  4                  -1  4    813312  ultralytics.nn.modules.block.C2f             [192, 192, 4, True]           
  5                  -1  1     78720  ultralytics.nn.modules.block.SCDown          [192, 384, 3, 2]              
  6                  -1  4   3248640  ultralytics.nn.modules.block.C2f             [384, 384, 4, True]           
  7                  -1  1    228672  ultralytics.nn.modules.block.SCDown          [384, 576, 3, 2]              
  8                  -1  2   1689984  ultralytics.nn.modules.block.C2fCIB          [576, 576, 2, True]           
  9                  -1  1   2200896  ultralytics.nn.modules.block.GAMAttention    [576, 576]                    
 10                  -1  1    831168  ultralytics.nn.modules.block.SPPF            [576, 576, 5]                 
 11                  -1  1   1253088  ultralytics.nn.modules.block.PSA             [576, 576]                    
 12                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 13             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 14                  -1  2   1993728  ultralytics.nn.modules.block.C2f             [960, 384, 2]                 
 15                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 16             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 17                  -1  2    517632  ultralytics.nn.modules.block.C2f             [576, 192, 2]                 
 18                  -1  1    332160  ultralytics.nn.modules.conv.Conv             [192, 192, 3, 2]              
 19            [-1, 14]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 20                  -1  2    831744  ultralytics.nn.modules.block.C2fCIB          [576, 384, 2, True]           
 21                  -1  1    152448  ultralytics.nn.modules.block.SCDown          [384, 384, 3, 2]              
 22            [-1, 11]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 23                  -1  2   1911168  ultralytics.nn.modules.block.C2fCIB          [960, 576, 2, True]           
 24        [17, 20, 23]  1   2282134  ultralytics.nn.modules.head.v10Detect        [1, [192, 384, 576]]          
YOLOv10m-GAM summary: 509 layers, 18686182 parameters, 18686166 gradients, 65.7 GFLOPs

YOLOv10m-C2f_GAM

                   from  n    params  module                                       arguments                     
  0                  -1  1      1392  ultralytics.nn.modules.conv.Conv             [3, 48, 3, 2]                 
  1                  -1  1     41664  ultralytics.nn.modules.conv.Conv             [48, 96, 3, 2]                
  2                  -1  2    253248  ultralytics.nn.modules.block.C2f_GAM         [96, 96, True]                
  3                  -1  1    166272  ultralytics.nn.modules.conv.Conv             [96, 192, 3, 2]               
  4                  -1  4   2017536  ultralytics.nn.modules.block.C2f_GAM         [192, 192, True]              
  5                  -1  1     78720  ultralytics.nn.modules.block.SCDown          [192, 384, 3, 2]              
  6                  -1  4   8053248  ultralytics.nn.modules.block.C2f_GAM         [384, 384, True]              
  7                  -1  1    228672  ultralytics.nn.modules.block.SCDown          [384, 576, 3, 2]              
  8                  -1  2   1689984  ultralytics.nn.modules.block.C2fCIB          [576, 576, 2, True]           
  9                  -1  1    831168  ultralytics.nn.modules.block.SPPF            [576, 576, 5]                 
 10                  -1  1   1253088  ultralytics.nn.modules.block.PSA             [576, 576]                    
 11                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 12             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 13                  -1  2   1993728  ultralytics.nn.modules.block.C2f             [960, 384, 2]                 
 14                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 15             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 16                  -1  2    517632  ultralytics.nn.modules.block.C2f             [576, 192, 2]                 
 17                  -1  1    332160  ultralytics.nn.modules.conv.Conv             [192, 192, 3, 2]              
 18            [-1, 13]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 19                  -1  2    831744  ultralytics.nn.modules.block.C2fCIB          [576, 384, 2, True]           
 20                  -1  1    152448  ultralytics.nn.modules.block.SCDown          [384, 384, 3, 2]              
 21            [-1, 10]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 22                  -1  2   1911168  ultralytics.nn.modules.block.C2fCIB          [960, 576, 2, True]           
 23        [16, 19, 22]  1   2282134  ultralytics.nn.modules.head.v10Detect        [1, [192, 384, 576]]          
YOLOv10m-C2f_GAM summary: 667 layers, 22636006 parameters, 22635990 gradients, 102.1 GFLOPs

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

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

相关文章

『网络游戏』角色创建界面逻辑【11】

创建代码:CreateWnd.cs 编写脚本:CreateWnd.cs 绑定脚本 修改脚本:LoginWnd.cs 绑定事件 修改脚本:Constans.cs 修改脚本:LoginSys.cs 修改脚本:LoginWnd.cs 拖拽框选 运行项目 - 点击开始进入创建角色界面…

柯桥外语培训韩语学习考级韩语中TOPIK常用语法表达

-기 위해서는 -는 것이 좋다 为了......,......比较好 -는 것보다는 -는 것이 좋다 比起......,......比较好 -(으)려면 -아/어/야 한다 如果想......的话,得...... -왜냐하면 -기 때문이다 因为...... -그 이유는 -기 때문이다 理由是…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下,注意:AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

专访:青年制片人林苏楠给影视行业新人的建议

近十年,对影视行业抱有浓厚兴趣,并进入专业院校学习的年轻人越来越多。但他们中的很多人毕业后却选择了其他行业,或者从事影视行业几年后决定转行。这其中的缘由似乎一部分来源于年轻创作者对真实的影视市场的不了解和不适应。 我们这次采访…

GC9118S替代TMI8118的优势分析,可应用在牙刷,电子锁,医疗设备等产品中

GC9118S作为一种新型集成电路,逐渐被视为TMI8118的理想替代品。以下是GC9118S在多个方面的优势,使其能够有效替代TMI8118。 1. 低功耗设计 GC9118S在功耗方面进行了优化,使其在待机和工作状态下都能显著降低能耗。这对于电池供电的设备&…

SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析

文章目录 同步编程&异步编程线程池为什么要使用线程池?Spring自定义线程池SpringBoot轻松调用线程池总结 测试demo链接 同步编程&异步编程 在Java并发编程中,同步和异步是两种常见的处理方式。 同步是指多个任务按顺序执行,一个任务的…

虚拟机三种网络配置方式随笔

1.1桥接模式 虚拟机和物理机同时直接连接物理网络(均作为独立主机) 桥接模式下,虚拟主机与真实主要在VMnet0构成的局域网内通信,同时通过真实主机中的网关与外网通信。由上表可看出,VMnet0直接连接到真实主机的某块真…

AGI时代存内计算芯片的语音识别之旅 —— 知存科技开发板体验与感悟

目录 一、简介二、活动内容2.1 多模态时代,存内计算框架的应用与发展1、多模态时代计算需求2、存内计算技术3、知存科技存内产品 2.2 分布式环境下深度学习任务的高效可靠执行研究2.3 IGZO在后道单片三维集成中的机遇与挑战1、IGZO的背景2、IGZO的优势3、IGZO器件的…

OpenStack 创建自定义的QCOW2格式镜像

目录 创建kvm虚拟机 创建目录上传ISO镜像 将 CentOS 7.4 上传到 /soft 目录下 创建 kvm虚机 使用的磁盘文件 配置kvm虚拟机 修改 KVM 虚机网络配置文件 安装 cloud-init 软件包 编辑 cloud.cfg 文件 编辑 network 文件 编辑 grub 文件 关闭kvm虚拟机 创建 QCOW2 镜…

10.8 C高级-shell脚本3

1、思维导图: 2、练习 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码: #!/bin/bash #分支结构结合test指令完成以下编程 #1判断是否闰年 read …

工业网关设备在智能制造中的应用有哪些?天拓四方

工业网关设备是一种用于连接工业设备和物联网子系统的设备,它能够实现数据采集、远程监控、远程控制和数据传输等功能。基于强大的数据处理和传输能力,工业网关设备能够实时采集各种工业设备的运行数据,并将其传输到云平台或数据中心进行存储…

【java】final关键字详解

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

升级 OpenSSL 的详细步骤(解决 SSH 漏洞的前提)

目录 前言1. 准备工作1.1 安装必要的依赖1.2 下载 OpenSSL 源码 2. 解压和配置2.1 解压文件2.2 配置编译参数 3. 编译和安装3.1 编译源码3.2 安装 OpenSSL 4. 验证安装5. 解决 SSH 漏洞的必要性6. 结语 前言 在信息安全的时代,服务器的安全性至关重要。特别是在互联…

颠覆再临!OpenAI Canvas让AI写作与编程焕然一新

目录 在Canvas界面中,你可以:Canvas有哪些强大功能?写作助手的升级编程功能的提升 网友反响如何?[如何直接使用ChatGPT4o、o1、OpenAI Canvas](https://www.nezhasoft.cn/) 👇 [ChatGPT o1网页入口在文末](https://www…

Java软件架构师结合实际项目经验总结软件架构的发展进程与原理(重点讲微服务架构怎么来的)

软件架构师结合实际项目经验总结软件架构的发展进程与原理 一、前言 笔者自己一直从事软件开发工作,算上大四实习1年,一直到今年整整12年,这期间有些人已经转了管理岗或者转行,已经完全不敲代码了!笔者依然在一线编码…

tp5 fastadmin列表页图片批量压缩并下载

记录&#xff1a;tp5 fastadmin对列表页选中数据的多张图片进行压缩并下载。 html代码 <a href"javascript:;" class"btn btn-info btn-apple btn-disabled disabled {:$auth->check(zhuanli/zhuanli/xiazai)?:hide}" title"批量下载专利证书…

关于学习神经网络的一些感悟

intro 本文主要是笔者学习神经网络时一些思考的感悟&#xff0c;由于本人对人工智能方向了解甚浅&#xff0c;所以记录的理解会有不正确的地方&#xff0c;欢迎批评指正&#xff01; 深度学习与传统机器学习算法的一个显著区别&#xff1a;对于传统的机器学习算法&#xff0c;可…

Sealos Devbox 发布,珍爱生命,远离 CI/CD

水滴攻击太阳系用的是最原始的攻击方式&#xff1a;撞击&#xff01;却又如此有效率。 当我们搞了一堆容器、编排、CI/CD、DevOps&#xff0c;发明了一大堆没什么用的名词之后&#xff0c;最终发现这些操作都是花里胡哨&#xff0c;让开发者越陷越深。 最终你会发现一个真理&…

2句话说通 一体化模型与矢量模型的不同

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道࿰

Mendix 创客访谈录|平台造平台真的可以吗?– 记西门子自由流业务系统的实战

本期创客 瞿凯歌 北京无尖科技有限公司 实施部技术负责人 大家好&#xff0c;我叫瞿凯歌&#xff0c;毕业于计算机科学技术&#xff0c;7年软件开发经验。目前任职于北京无尖科技有限公司&#xff0c;担任实施部技术负责人。 我们公司专注于企业数字化转型业务&#xff0c;利用…