YOLOv8改进 | 模块缝合 | C2f融合PKINet提升遥感图像的检测性能【完整代码】

news2024/9/21 14:39:48

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


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


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


本文介绍了多边形核初始网络(PKINet)应对遥感图像目标检测的挑战,通过无扩张的多尺度卷积核提取目标特征,并结合上下文锚点注意力(CAA)模块捕获长距离上下文,有效提升了在多个遥感检测基准数据集上的性能。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

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

目录

1. 原理

2. 将C2f_PKIModule添加到yolov8网络中

2.1 C2f_PKIModule代码实现

2.2 C2f_PKIModule的神经网络模块代码解析

2.3 更改init.py文件

2.4 添加yaml文件

2.5 注册模块

2.6 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:Poly Kernel Inception Network for Remote Sensing Detection——点击即可跳转

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

PKINet,即多核初始网络,专为遥感物体检测而设计,可解决物体尺度变化大和背景多样化等挑战。PKINet 背后的关键思想是:

1. 多尺度卷积:PKINet 使用初始式深度卷积和不同大小的内核来捕获不同尺度上的物体特征,而无需依赖扩张。这种方法可确保密集的特征提取,同时最大限度地减少由大核卷积引起的问题,例如背景噪声。

2. 上下文锚点注意 (CAA):为了满足对远程上下文信息的需求,PKINet 采用了利用全局平均池化和 1D 条带卷积的 CAA 模块。这有助于捕获远距离像素之间的关系并增强中心区域特征,从而提高对较大物体和上下文信息的理解。

3. 跨阶段部分 (CSP) 结构:网络分为多个阶段,其中输入分为两条路径:一条通过前馈网络 (FFN) 处理,另一条通过 PKI 块处理,后者包括多尺度卷积和 CAA 模块。此结构可在局部和全局上下文中实现高效的特征提取。

总体而言,PKINet 通过比以前的方法更有效地解决尺度变化和上下文挑战,在遥感基准上取得了更好的性能。

2. 将C2f_PKIModule添加到yolov8网络中

2.1 C2f_PKIModule代码实现

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

from ultralytics.utils.torch_utils import make_divisible

class PKIModule_CAA(nn.Module):
    def __init__(self, ch, h_kernel_size = 11, v_kernel_size = 11) -> None:
        super().__init__()
        
        self.avg_pool = nn.AvgPool2d(7, 1, 3)
        self.conv1 = Conv(ch, ch)
        self.h_conv = nn.Conv2d(ch, ch, (1, h_kernel_size), 1, (0, h_kernel_size // 2), 1, ch)
        self.v_conv = nn.Conv2d(ch, ch, (v_kernel_size, 1), 1, (v_kernel_size // 2, 0), 1, ch)
        self.conv2 = Conv(ch, ch)
        self.act = nn.Sigmoid()
    
    def forward(self, x):
        attn_factor = self.act(self.conv2(self.v_conv(self.h_conv(self.conv1(self.avg_pool(x))))))
        return attn_factor
    

class PKIModule(nn.Module):
    def __init__(self, inc, ouc, kernel_sizes=(3, 5, 7, 9, 11), expansion=1.0, with_caa=True, caa_kernel_size=11, add_identity=True) -> None:
        super().__init__()
        hidc = make_divisible(int(ouc * expansion), 8)
        
        self.pre_conv = Conv(inc, hidc)
        self.dw_conv = nn.ModuleList(nn.Conv2d(hidc, hidc, kernel_size=k, padding=autopad(k), groups=hidc) for k in kernel_sizes)
        self.pw_conv = Conv(hidc, hidc)
        self.post_conv = Conv(hidc, ouc)
        
        if with_caa:
            self.caa_factor = PKIModule_CAA(hidc, caa_kernel_size, caa_kernel_size)
        else:
            self.caa_factor = None
        
        self.add_identity = add_identity and inc == ouc
    
    def forward(self, x):
        x = self.pre_conv(x)
        
        y = x
        x = self.dw_conv[0](x)
        x = torch.sum(torch.stack([x] + [layer(x) for layer in self.dw_conv[1:]], dim=0), dim=0)
        x = self.pw_conv(x)
        
        if self.caa_factor is not None:
            y = self.caa_factor(y)
        if self.add_identity:
            y = x * y
            x = x + y
        else:
            x = x * y

        x = self.post_conv(x)
        return x
    
class C2f_PKIModule(C2f):
    def __init__(self, c1, c2, n=1, kernel_sizes=(3, 5, 7, 9, 11), expansion=1.0, with_caa=True, caa_kernel_size=11, add_identity=True, g=1, e=0.5):
        super().__init__(c1, c2, n, True, g, e)
        self.m = nn.ModuleList(PKIModule(self.c, self.c, kernel_sizes, expansion, with_caa, caa_kernel_size, add_identity) for _ in range(n))

2.2 C2f_PKIModule的神经网络模块代码解析

此代码定义了三个类,PKIModule_CAAPKIModuleC2f_PKIModule,它们是自定义神经网络模块,可能受到用于遥感图像中物体检测的 Poly Kernel Inception Network (PKINet) 的启发。让我们分解每个类:

1. PKIModule_CAA

此模块实现了上下文锚点注意 (CAA) 机制来捕获长距离依赖关系。

  • __init__ 方法:

  • avg_pool:应用 2D 平均池化操作,内核大小为 7,步长为 1。

  • conv1:处理池化输入的卷积层(可能是标准的,在其他地方定义为 Conv)。

  • h_conv:沿水平方向的深度卷积,具有可自定义的内核大小。

  • v_conv:沿垂直方向的深度卷积,具有可自定义的内核大小。

  • conv2:另一个卷积层,用于处理深度卷积的输出。

  • act:一个 S 型激活函数,用于产生注意力因子。

  • forward 方法:

  • 输入 x 通过上面定义的操作序列进行处理,产生一个 attn_factor,通过捕获长距离上下文信息来增强输入特征。

2. PKIModule

此模块表示一个特征提取块,它结合了多尺度卷积并可选地集成 CAA 机制。

  • __init__ 方法:

  • pre_conv:处理输入通道的卷积层。

  • dw_conv:具有不同内核大小的深度卷积列表,用于捕获多个尺度的特征。

  • pw_conv:结合深度卷积输出的点式卷积 (1x1)。

  • post_conv:另一个处理最终输出的卷积层。

  • caa_factor:如果 with_caaTrue,则为可选的 CAA 模块,用于捕获长距离依赖关系。

  • add_identity:一个标志,指示在输入和输出通道相同时是否添加残差连接(身份映射)。

  • forward 方法:

  • 输入 xpre_conv 处理。

  • 输出通过 dw_conv 中的每个深度卷积,并将结果相加。

  • 如果存在 caa_factor,它会使用上下文信息增强输入特征(y)。

  • 根据 add_identity,输出要么与输入相加(残差连接),要么乘以 CAA 增强特征。

  • 最后,post_conv 处理输出,然后返回它。

3. C2f_PKIModule

此模块扩展了类 C2f(可能是在其他地方定义的自定义类),以按顺序包含多个 PKIModule 实例。

  • __init__ 方法:

  • 它使用提供的参数和 PKIModule 实例列表初始化 C2f

  • PKIModule 实例配置了 kernel_sizesexpansionwith_caaadd_identity 等参数来控制其行为。

  • forward 方法(继承自 C2f):

  • 前向传递将涉及通过列表中的每个 PKIModule 处理输入。

此代码有效地实现了受 PKINet 架构启发的神经网络模块,其组件旨在捕获多尺度特征和远程上下文信息,以实现稳健的特征提取。

2.3 更改init.py文件

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

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

2.4 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_C2f_PKIModule.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_PKIModule, [128, [3, 5, 7, 9, 11], 1.0, True, 11, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f_PKIModule, [256, [3, 5, 7, 9, 11], 1.0, True, 11, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f_PKIModule, [512, [3, 5, 7, 9, 11], 1.0, True, 11, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f_PKIModule, [1024, [3, 5, 7, 9, 11], 1.0, True, 11, 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, [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, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [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_PKIModule, [128, [3, 5, 7, 9, 11], 1.0, True, 11, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f_PKIModule, [256, [3, 5, 7, 9, 11], 1.0, True, 11, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f_PKIModule, [512, [3, 5, 7, 9, 11], 1.0, True, 11, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f_PKIModule, [1024, [3, 5, 7, 9, 11], 1.0, True, 11, 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, [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, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [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.5 注册模块

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

2.6 执行程序

在train.py中,将model的参数路径设置为yolov8_C2f_PKIModule.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      9152  ultralytics.nn.modules.block.C2f_PKIModule   [32, 32, 1, [3, 5, 7, 9, 11], 1.0, True, 11, True]
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]
  4                  -1  2     43520  ultralytics.nn.modules.block.C2f_PKIModule   [64, 64, 2, [3, 5, 7, 9, 11], 1.0, True, 11, True]
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]
  6                  -1  2    132096  ultralytics.nn.modules.block.C2f_PKIModule   [128, 128, 2, [3, 5, 7, 9, 11], 1.0, True, 11, True]
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]
  8                  -1  1    288256  ultralytics.nn.modules.block.C2f_PKIModule   [256, 256, 1, [3, 5, 7, 9, 11], 1.0, True, 11, 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    148224  ultralytics.nn.modules.block.C2f             [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    123648  ultralytics.nn.modules.block.C2f             [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    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]
 22        [15, 18, 21]  1    897664  ultralytics.nn.modules.head.Detect           [80, [64, 128, 256]]
YOLOv8_C2f_Parc summary: 345 layers, 2915280 parameters, 2915264 gradients, 8.5 GFLOPs

3. 完整代码分享

https://pan.baidu.com/s/13Cd-UuqTe4Gn7dXNAVtKmw?pwd=x29m

提取码: x29m 

4. GFLOPs

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

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

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

6. 总结

PKIModule 是一种旨在提高特征提取能力的卷积模块,特别针对具有多尺度和复杂上下文信息的图像。它通过多个不同大小的深度可分离卷积核并行提取输入特征的多尺度信息,以捕捉图像中不同尺度的物体特征。随后,这些多尺度的特征通过逐点卷积层进行融合,确保在特征提取过程中保持丰富的上下文信息。此外,PKIModule 可以选择性地包含一个上下文锚注意力模块(CAA),该模块通过捕捉长距离的上下文依赖关系来进一步增强特征表示。最后,模块还支持残差连接,将输入特征与输出特征结合,以保留输入信息并防止梯度消失。整体而言,PKIModule 通过有效的多尺度卷积和注意力机制,提高了对图像中不同尺度和上下文复杂性特征的捕捉能力,适用于需要高精度特征提取的计算机视觉任务。

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

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

相关文章

MySQL系列—7.内存结构

目录 1.Buffer Pool 2.Redo Log Buffer 3.change buffer InnoDB内存结构主要分为4个部分: Buffer Pool Change Pool #写缓存 Log Buffer #日志缓存 Adaptive Hash Index #自适应hash索引 1.Buffer Pool 也是B树结构 1.当读一条数据时,会先检查是…

去中心化身份验证:Web3时代数字身份的革新

随着Web3时代的到来,去中心化技术正在重新定义数字身份验证的方式。传统的身份验证方法常常依赖于中心化的数据库和中介机构,这些系统不仅易受攻击,还可能侵犯用户的隐私。而去中心化身份验证(DID, Decentralized Identifier&…

SDN与SD-WAN:共同点和区别分析

软件定义网络(SDN)是一种革新性的网络架构,而软件定义广域网(SD-WAN)则是基于SDN技术发展而来的网络解决方案。两者有许多共同点,但它们之间也存在显著差异。本文将详细分析SDN与SD-WAN的共同和区别。 SDN的…

cv2.error: OpenCV(4.10.0) :-1: error: (-5:Bad argument) in function ‘resize‘

cv2.error: OpenCV(4.10.0):-1: error: (-5:Bad argument)in function resize 安装好Echomimic之后,上传图片和音频进行生成视频的时候报错了,在服务器端查看报错信息如下: 解决方法&#xff1a…

uniapp / uniapp x UI 组件库推荐大全

在 uniapp 开发中,我们大多数都会使用到第三方UI 组件库,提起 uniapp 的UI组件库,我们最常使用的应该就是uview了吧,但是随着日益增长的需求,uview 在某些情况下已经不在满足于我们的一些开发需求,尽管它目…

在线压缩pdf,无需安装就可轻易压缩pdf文件

PDF文件因其跨平台兼容性和良好的阅读体验,成为工作学习中不可或缺的一部分。然而,随着文件体积的增大,如何有效压缩PDF文件成为了许多人的迫切需求。很多小伙伴想要通过在线的方式来压缩PDF文件,下面给大家分享一种在线压缩方法&…

前端布局利器:Flex布局

曾经的我们使用传统布局方式,我们深刻的体会着1px除不尽,三等分,居中,塌陷等等让我们升血压的问题。传统的布局方式:布局繁琐,需要使用大量的HTML和CSS代码来实现简单的布局。灵活性差,难以实现…

腾讯视频:让自媒体创作者“怀才有遇”

在这个信息快速流通的自媒体时代,时间变得越来越碎片化,短剧、短番与短节目则凭借着短小精悍、内容紧凑的特点,完美契合了碎片化的时间消费习惯。这些短的内容被观众喜爱的同时,也让许多自媒体创作者找到了致富之路。 相对于大IP…

Redis Desktop Manager 0.8.8.384 安装与使用详解

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

【软件安装】PyCharm安装教程(MAC)

一、准备阶段 准备软件安装包和jetbrains crack 包 二、软件安装 (1)运行pycharm安装包 等待程序运行 (2)运行jetbrains crack 安装包 运行补丁安装 (3)打开pycharm软件 等待系统验证后,打开…

【路径规划】移动机器人路径规划算法的实现

摘要 本文实现了移动机器人路径规划算法,包括Dijkstra、A*和基于无向图的动态规划算法。通过在复杂障碍环境中测试这些算法,评估了它们在路径最优性、计算效率和适应性方面的性能。本文提出的算法结合了不同的启发式和优化策略,为机器人路径…

kubectl的deployment和service

目录 概念 kubectl的基础命令 *每天常用的查看集群的基本信息 deployment的部署方式 deployment 的特点 基于deployment创建pod 手动缩容 service的类型以及工作原理 创建service service的类型 修改service的类型为nodeport **nodeport实验:对外暴露端…

产品网络低价乱价,有哪些控价方法?

电商平台的兴起让产品销售渠道更加多元化,但同时也带来了价格混乱的问题。产品网络低价现象频发,不仅扰乱了市场秩序,损害了品牌形象, 还严重影响了正规渠道经销商的利益。针对这一问题,产品控价成为了企业和品牌方亟待…

【动态规划】子数组系列二(数组中连续的一段)

子数组系列一(数组中连续的一段) 1.等差数列划分2.最长湍流子数组3.单词拆分4.环绕字符串中唯一的子字符串 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起…

【多场景应用】基于杰发科技AC7840x的Mini LED背光驱动设计

应用场景: 在汽车应用中,Mini LED背光驱动设计主要用于仪表盘、中控屏和车载娱乐系统等显示屏。这项技术可以显著提升显示效果,提供更高的亮度、更深的黑色和更广的色域,使得图像更加生动逼真,尤其在强光和宽温度范围…

【类模板】类模板的基本范式

一、类模板的概念 类模板与一般的模板一样,都是通过给定的模板参数,生成具体的类,也就是实例化一个特定的类。这个概念和函数模板差不多。 例如,在 C C C中的 s t d : : v e c t o r std::vector std::vector容器就是一个经典的…

AWS账号关闭后的影响:您需要知道的一切

亚马逊网络服务(AWS)作为全球领先的云计算平台,为众多企业和个人提供了便捷、高效的云服务。然而,当用户决定关闭其AWS账号时,可能会对其现有的服务和资源产生重大影响。我们九河云将通过本文将深入探讨AWS账号关闭后的…

树莓派3B驱动ST7735(Python)

一 环境准备 之前做了PICO驱动ST7735,这次再进一步,用树莓派3B来驱动。还是先上图。 最开始还是根据GPT的指引来做的。SPI的细节就不多说了,之前在PICO的时候说过了。 总线学习3--SPI-CSDN博客 二 实现细节 连接方式如下: VCC …

猛兽财经:AMD股票值得长期投资吗?

来源:猛兽财经 作者:猛兽财经 过去三年对AMD来说可谓压力山大,由于个人电脑(PC)市场的疲软,AMD的股价一直承受着巨大的压力(AMD的股价在过去三年中仅上涨了44%,远远低于费城半导体指数56%的涨幅&#xff…

快速申请公网、内网IP地址SSL证书

在当今社会,网络安全越来越重要。SSL证书不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名等。但是只有IP地址可以用来申请SSL证书吗?答案当然是可以的,而且申请也非常容易。下面是快速申请流程&#…