YOLOv8改进 | 融合改进 | C2f 融合Efficient Multi-Scale Conv提升检测效果【改进结构图+完整代码】

news2024/11/27 12:36:48

 秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有90+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转


一个高效且有效的解码机制在医学图像分割中至关重要。然而,这些解码机制通常伴随着高昂的计算成本。本文将介绍Efficient Multi-Scale Conv,这是一个新的高效多尺度卷积注意力解码器,旨在优化性能和计算效率。利用独特的多尺度深度卷积块,通过多尺度卷积显著增强特征图。还采用了通道、空间和分组(大核)门控注意力机制,这些机制在捕捉复杂空间关系的同时,能够聚焦于显著区域。通过使用分组和深度卷积,非常高效,并且具有良好的可扩展性。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转 

目录

1.原理

2. 将C2f_DRB添加到yolov8网络中

2.1 C2f_DRB 代码实现

2.2 更改init.py文件

2.3 添加yaml文件

2.4 改进后的网络结构图

2.5 注册模块

2.6 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1.原理

论文地址:EMCAD: Efficient Multi-scale Convolutional Attention Decoding for Medical Image Segmentation——点击即可跳转 

官方代码: 官方代码仓库——点击即可跳转

高效多尺度卷积,如论文“EMCAD:用于医学图像分割的高效多尺度卷积注意力解码”中所述,围绕着提高卷积神经网络 (CNN) 用于医学图像分割的效率和有效性的想法。核心创新是在基于注意力的解码框架中使用多尺度深度卷积块,旨在优化特征图的处理以实现高分辨率分割,同时降低计算开销。

关键组件和原理:

多尺度卷积注意力模块 (MSCAM)

  • MSCAM 通过结合三种类型的注意力来细化特征图:

  • 通道注意力:专注于选择信息量最大的通道。

  • 空间注意力:通过强调最相关的空间区域来捕获局部上下文信息。

  • 多尺度卷积块 (MSCB):通过使用深度卷积以不同尺度处理特征来增强特征。与传统卷积层相比,这使模型能够以更低的计算成本捕获各种尺度和分辨率的细节。

深度卷积

  • 使用深度卷积代替标准卷积在每个通道上独立执行操作,这大大减少了所需的参数和计算量。

  • 通过在多个尺度上执行这些卷积,模型可以同时有效地捕获精细细节和更广泛的上下文,这对于准确的医学图像分割至关重要。

大核分组注意力门 (LGAG)

  • 此组件旨在通过将特征图与网络中较早层的跳过连接相结合来细化特征图。它使用大核(例如 3x3)组卷积,允许以较少的计算成本捕获更大的空间上下文,有助于在减少所需操作数的同时保持高精度。

效率提升

  • 整体架构设计为计算高效且高效。例如,当与标准分层视觉编码器集成时,与最先进的方法相比,EMCAD 可以显著减少参数和浮点运算 (FLOP) 的数量,同时保持或提高分割精度。

高效多尺度卷积 方法利用这些原理来解决平衡计算效率和分割性能的挑战,特别是在医学成像领域,高精度至关重要,但计算资源可能有限。

2. 将C2f_EMSC添加到yolov8网络中

2.1 C2f_EMSC 代码实现

关键步骤一将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/block.py中,并在该文件的__all__中添加“C2f_EMSC”


from einops import rearrange

class EMSConv(nn.Module):
    # Efficient Multi-Scale Conv
    def __init__(self, channel=256, kernels=[3, 5]):
        super().__init__()
        self.groups = len(kernels)
        min_ch = channel // 4
        assert min_ch >= 16, f'channel must Greater than {64}, but {channel}'
        
        self.convs = nn.ModuleList([])
        for ks in kernels:
            self.convs.append(Conv(c1=min_ch, c2=min_ch, k=ks))
        self.conv_1x1 = Conv(channel, channel, k=1)
        
    def forward(self, x):
        _, c, _, _ = x.size()
        x_cheap, x_group = torch.split(x, [c // 2, c // 2], dim=1)
        x_group = rearrange(x_group, 'bs (g ch) h w -> bs ch h w g', g=self.groups)
        x_group = torch.stack([self.convs[i](x_group[..., i]) for i in range(len(self.convs))])
        x_group = rearrange(x_group, 'g bs ch h w -> bs (g ch) h w')
        x = torch.cat([x_cheap, x_group], dim=1)
        x = self.conv_1x1(x)
        
        return x

class EMSConvP(nn.Module):
    # Efficient Multi-Scale Conv Plus
    def __init__(self, channel=256, kernels=[1, 3, 5, 7]):
        super().__init__()
        self.groups = len(kernels)
        min_ch = channel // self.groups
        assert min_ch >= 16, f'channel must Greater than {16 * self.groups}, but {channel}'
        
        self.convs = nn.ModuleList([])
        for ks in kernels:
            self.convs.append(Conv(c1=min_ch, c2=min_ch, k=ks))
        self.conv_1x1 = Conv(channel, channel, k=1)
        
    def forward(self, x):
        x_group = rearrange(x, 'bs (g ch) h w -> bs ch h w g', g=self.groups)
        x_convs = torch.stack([self.convs[i](x_group[..., i]) for i in range(len(self.convs))])
        x_convs = rearrange(x_convs, 'g bs ch h w -> bs (g ch) h w')
        x_convs = self.conv_1x1(x_convs)
        
        return x_convs

class Bottleneck_EMSC(Bottleneck):
    def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
        super().__init__(c1, c2, shortcut, g, k, e)
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, k[0], 1)
        self.cv2 = EMSConv(c2)

class C3_EMSC(C3):
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        super().__init__(c1, c2, n, shortcut, g, e)
        c_ = int(c2 * e)  # hidden channels
        self.m = nn.Sequential(*(Bottleneck_EMSC(c_, c_, shortcut, g, k=((1, 1), (3, 3)), e=1.0) for _ in range(n)))

class C2f_EMSC(C2f):
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        super().__init__(c1, c2, n, shortcut, g, e)
        self.m = nn.ModuleList(Bottleneck_EMSC(self.c, self.c, shortcut, g, k=(3, 3), e=1.0) for _ in range(n))

EMSC(Efficient Multi-scale Convolutional Attention Decoding)在处理图像时,通过多步骤的流程来进行高效的医疗图像分割。以下是其主要流程的详细说明:

1. 特征提取(Feature Extraction)

  • 输入的医疗图像首先通过预训练的分层视觉编码器(例如,CNN或Transformer架构)进行处理,提取出多阶段的特征图。编码器将图像分解为不同层次的特征表示,通常包括四个主要阶段的特征图(X1, X2, X3, X4)。

2. 多尺度卷积注意模块(MSCAM)

  • 每个阶段提取的特征图首先进入多尺度卷积注意模块(MSCAM)。MSCAM使用通道注意力、空间注意力和多尺度卷积块来细化这些特征图:

    • 通道注意力(Channel Attention)增强那些对任务最有贡献的通道。

    • 空间注意力(Spatial Attention)聚焦在图像中最相关的空间区域。

    • 多尺度卷积块(MSCB)使用多尺度的深度卷积来捕获不同尺度和分辨率的特征,保证细节与全局信息的兼顾。

3. 大核分组注意力门(LGAG)

  • 经过MSCAM处理后的特征图会通过大核分组注意力门(LGAG)进行进一步优化。LGAG融合了当前特征图与来自跳跃连接(skip connection)的特征,利用大核分组卷积在更大的局部上下文中捕获重要特征,同时减少计算负担。

4. 上采样与特征增强(Upsampling and Feature Enhancement)

  • 优化后的特征图通过高效上卷积块(EUCB)进行上采样,使其分辨率逐步恢复到原始输入图像的大小。在上采样的过程中,EUCB进一步增强特征图,以确保最终的分割结果具有高分辨率和准确性。

5. 分割输出(Segmentation Output)

  • 在每个特征提取阶段的末端,通过分割头(Segmentation Head)生成阶段性的分割图。这些分割图会在最后累加,得到最终的分割输出图。

6. 多阶段集成与输出

  • EMSC通过集成来自多个阶段的分割图,结合细化后的特征,最终生成精准的医疗图像分割结果。这个过程确保了分割输出既具有细节分辨能力,又能捕捉全局信息,适应不同分辨率和尺度的需求。

这种处理流程使得EMSC在保持高精度的同时,极大地降低了计算开销和参数数量,适用于资源受限的医疗图像处理任务。

2.2 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数   

然后在下面的__all__中声明函数 

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_C2f_EMSC.yaml文件,粘贴下面的内容

  •  OD【目标检测】
# 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: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 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, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f_EMSC, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f_EMSC, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9

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

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

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f_EMSC, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f_EMSC, [1024]]  # 21 (P5/32-large)

  - [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)
  • Seg【语义分割】
# 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: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 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, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f_EMSC, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f_EMSC, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9

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

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

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f_EMSC, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f_EMSC, [1024]]  # 21 (P5/32-large)

  - [[15, 18, 21], 1, Segment, [nc, 32, 256]] # Segment(P3, P4, P5)

温馨提示:因为本文只是对yolov8基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。不明白的同学可以看这篇文章: yolov8yaml文件解读——点击即可跳转  


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
max_channels: 1024 # max_channels
 
# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
max_channels: 1024 # max_channels
 
# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
max_channels: 512 # max_channels
 
# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
max_channels: 768 # max_channels
 
# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
max_channels: 512 # max_channels

2.4 改进后的网络结构图

  • EMSC convolution module 
EMSC convolution module
  • YOLOv8-EMSC network architecture 
YOLOv8-EMSC network architecture

2.5 注册模块

关键步骤四:在task.py的parse_model函数中注册

2.6 执行程序

在train.py中,将model的参数路径设置为yolov8_C2f_EMSC.yaml的路径

建议大家写绝对路径,确保一定能找到

from ultralytics import YOLO
import warnings
warnings.filterwarnings('ignore')
from pathlib import Path
 
if __name__ == '__main__':
 
 
    # 加载模型
    model = YOLO("ultralytics/cfg/v8/yolov8.yaml")  # 你要选择的模型yaml文件地址
    # Use the model
    results = model.train(data=r"你的数据集的yaml文件地址",
                          epochs=100, batch=16, imgsz=640, workers=4, name=Path(model.cfg).stem)  # 训练模型

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

                   from  n    params  module                                       arguments
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]
  2                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]
  4                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]
  6                  -1  2    149632  ultralytics.nn.modules.block.C2f_EMSC        [128, 128, 2, True]
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]
  8                  -1  1    364160  ultralytics.nn.modules.block.C2f_EMSC        [256, 256, 1, True]
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 12                  -1  1    124224  ultralytics.nn.modules.block.C2f_EMSC        [384, 128, 1]
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 15                  -1  1     37248  ultralytics.nn.modules.block.C2f             [192, 64, 1]
 16                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 18                  -1  1     99648  ultralytics.nn.modules.block.C2f_EMSC        [192, 128, 1]
 19                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 21                  -1  1    396928  ultralytics.nn.modules.block.C2f_EMSC        [384, 256, 1]
 22        [15, 18, 21]  1    897664  ultralytics.nn.modules.head.Detect           [80, [64, 128, 256]]
YOLOv8_C2f_EMSC summary: 273 layers, 2868944 parameters, 2868928 gradients, 8.4 GFLOPs

3. 完整代码分享

https://pan.baidu.com/s/1C4E-st_VC2qg9ACSGpx4rQ?pwd=z2e1

提取码: z2e1 

4. GFLOPs

关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

可以与其他的注意力机制或者损失函数等结合,进一步提升检测效果

6. 总结

Efficient Multi-Scale Convolution (EMCAD)通过引入多尺度深度卷积块和注意力机制,优化了医疗图像分割中的解码过程。EMCAD利用多尺度卷积捕捉不同尺度和分辨率的特征,结合通道注意力和空间注意力机制,有效增强了特征图的表达能力。通过使用深度卷积和大核分组注意力门,EMCAD在减少计算量的同时,保持了对复杂空间关系和重要区域的准确捕捉。最终,这种设计大幅降低了模型的参数量和计算复杂度,在提高分割精度的同时实现了计算资源的高效利用。 

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

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

相关文章

[已解决]mac远程连接windows桌面:parallels client连接遇到的问题

[已解决]mac远程连接windows桌面:parallels client连接遇到的问题 问题一:网络不通问题二:远程windows防火墙导致无法连接问题三:远程桌面服务未启动问题四:家庭版(非专业版)windows导致的无法使…

Xilinx FPGA 7系列 GTX/GTH Transceivers

1概述 Xilinx 7系列FPGA全系所支持的GT,GT资源是Xilinx系列FPGA的重要卖点,也是做高速接口的基础,GT的意思是Gigabyte Transceiver,G比特收发器。不管是PCIE、SATA、MAC等,都需要用到GT资源来做数据高速串化和解串处理…

2379.得到K个黑块的最少涂色次数

目录 题目描述 示例1: 示例2: 提示: 解题思路 滑动窗口法 概念 应用场景及特点: 思路 流程展示 代码 复杂度分析 题目描述 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 W 要么是 B…

Vsphere连接ESXI主机创建虚拟机并安装操作系统

🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…

软碟通刻盘装系统出现错误代码0X800700D解决方案

install.wim大小超过4G,fat32不支持单个文件4G以上的文件。 可以按winR,在弹出的windows程序员运行窗口用cmd命令,调出命令提示符,然后执行convert H:/FS:NTFS命令即可(H为我的U盘盘符,这个根据个人的盘符来定&#xf…

【Linux入门】Liunx权限

文章目录 前言一、用户的概念1.用户的概念2.用户切换1)普通用户切换到超级用户2)超级用户切换到普通用户 二、权限管理1.文件访问者的分类(人)2.文件类型和访问权限(事物属性) 三、文件类型1.基本权限2.文件…

开放式耳机好还是入耳式耳机好?本文章为你讲解

闲话少说,今天的这篇文章就是我个人整理出来对开放式耳机的一些认知分享,就是相当于一份开放式耳机的选购攻略,标准再多也没有使用感好来的直接!感兴趣的朋友一起来了解 什么样的耳机是开放式的 首先区别于封闭式的入耳耳机&…

linux文件——用户缓冲区——概念深度理解、IO模拟实现

前言:本篇文章主要讲解文件缓冲区。 讲解的方式是通过抛出问题, 然后通过分析问题, 将缓冲区的概念与原理一步一步地讲解。同时, 本节内容在最后一部分还会带友友们模拟实现一下c语言的printf, fprintf接口&#xff0c…

5IUX极简主页搜索源码/自定义你的浏览器主页

5IUX极简主页搜索源码,自定义你的浏览器主页。在使用各种导航首页时,我们时常被满屏的广告和资讯所困扰,这款源码可以让你自己设计一个不受干扰的浏览器主页。它不是镜像,也不是代理,只是用作浏览器主页,同…

最近算法岗笔试题整理

目录 1. 子串和子序列的区别? 2. 给一个featuremap 矩阵,行列都代表机器翻译用到的不同的单词的依赖程度,判断这个矩阵是哪个模型生成的? 3. 判断递归函数的时间复杂度 4. K-means 组关键数,选一个K得到SSE&#x…

对于初学者来说,如何选择一个合适的FPGA学习路径?

初学者入门还是相对简单的, 学fpga有专业要求: 一般是电子信息类、自动化类、计算机类等相关专业都是比较合适入行的。 FPGA岗位一般要求熟悉数字电路设计,以及C、verilog等,能够看懂原理图。 像其他专业也可以入行,但…

东南亚超市门店客流统计分析,了解客流高峰期,分析客户喜好

在东南亚的超市中,客流统计分析正成为提升运营效率和了解客户需求的重要手段。 一、客流统计系统集成 先进的客流统计系统通过在超市入口、关键通道和各个区域安装智能传感器,能够准确地记录进出超市的客流量。这些传感器与数据分析软件相结合&#xff0…

SQL基础——SQL分类

声明:以下内容为根据黑马数据库视频教程,个人整理的笔记,方便记录学习。 SQL基础之SQL分类 SQL分类详细知识导图SQL四种类型的全称和说明案例SQL语句编写DDL数据库操作表操作 DML添加数据修改数据删除数据 DQL条件查询聚合函数分组查询排序查…

众善企业助力脱贫攻坚,共建美好未来

在我国全面建设社会主义现代化国家的进程中,脱贫攻坚是一项重要的民生工程。众善企业作为社会的一份子,积极响应国家号召,以实际行动践行企业社会责任,为广大贫困地区提供帮扶,助力脱贫攻坚。 一、众善企业的责任担当 …

【IEEE】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024,10月18-20)

第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)定于2024年10月18-20日在中国杭州隆重举行。 本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向,着力反映国际机器学习和计算机应用相关技术研究的最新进展。 ICMLCA 2024已上线至IEEE官网…

代码随想录算法训练营第二十二天(回溯 一)

开始学习回溯! 回溯理论基础 代码随想录文章链接:代码随想录 文章摘要: 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 在二叉树系列中,我们已经不止一次,提到了回溯。 回溯是递归的副产品,只…

贪吃蛇(Qt版)

目录 一、项目介绍 界面一:游戏大厅界面 界面二:关卡选择界面 界面三:游戏界面 最终游戏效果: 二、项目创建与资源配置 1. 创建项目 2. 添加项目资源文件 三、项目实现 1. 游戏大厅界面 2. 关卡选择界面 3. 游戏房间界…

重装后的电脑怎么分区?轻松优化存储空间

电脑重装系统是解决许多软件问题和提升性能的有效方法。然而,重装系统后,合理的硬盘分区不仅能提高数据管理效率,还有助于保护系统安全。本文将详细介绍如何在重装电脑后进行合理的分区,帮助您更好地管理和使用您的电脑。 一、了解…

傅里叶变换与拉普拉斯变换:联系、区别及其应用

1. 傅里叶变换和拉普拉斯变换的定义 1.1 傅里叶变换的定义 傅里叶变换是将时间域信号转换为频率域信号的数学工具,由正向和逆变换组成。它将信号分解为正弦波和余弦波的组合,适用于周期性和非周期性信号分析。 1.2 拉普拉斯变换的定义 拉普拉斯变换是…

武汉流星汇聚:跨境电商领航者,以自营经验赋能万企,共绘出海蓝图

在数字经济浪潮席卷全球的今天,跨境电商作为国际贸易的新引擎,正以前所未有的速度改变着全球商业格局。在这片充满机遇的蓝海中,武汉流星汇聚电子商务有限公司犹如一颗璀璨的流星,划破长空,以其独特的优势和卓越的成就…