YOLOv8改进 | 融合改进 | C2f融合轻量化视觉Transformer【完整代码】

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


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


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


本文给大家带来的是CloFormer,CloFormer是一种轻量级视觉变换器,通过上下文感知的局部增强提高性能。它结合了全局共享权重和特定上下文权重,提出AttnConv卷积运算符来聚合和增强局部特征。实验显示CloFormer在多种视觉任务上表现优异。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。 

 专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转 订阅学习不迷路   

目录

1. 原理

2. 将C2f_CloAtt代码添加到YOLOv8中

YOLOv8%E4%B8%AD-toc" style="margin-left:40px;">2.1 C2f_CloAtt的代码实现

2.2 更改__init__.py文件

2.3 添加yaml文件

2.4 注册模块

2.5 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:Rethinking Local Perception in Lightweight Vision Transformer——点击即可跳转

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

CloFormer 是一款轻量级视觉转换器,旨在平衡效率和性能,尤其适用于移动友好型应用。它引入了一个名为 AttnConv 的新模块,通过整合共享权重和上下文感知权重的优势来增强局部感知,这两个权重通常分别在卷积神经网络 (CNN) 和转换器中使用。

CloFormer 的关键原则:

上下文感知局部增强 (AttnConv):

  • AttnConv 是 CloFormer 的核心创新,结合了传统卷积和注意力机制的元素。它使用深度卷积 (DWconv) 通过全局共享权重来收集局部信息,这是 CNN 的特点。随后是门控机制,该机制生成上下文感知权重以增强这些局部特征。与传统的自注意力相比,该机制引入了更强的非线性,使模型能够更好地捕捉图像中的高频细节。

双分支架构

  • CloFormer 采用双分支结构。一个分支使用 AttnConv 捕获高频局部信息,而另一个分支使用原始注意机制的修改版本捕获低频全局信息。全局分支通过在处理键和值标记之前对其进行下采样来减少计算负载,从而使模型更高效。

局部和全局信息的融合

  • 局部和全局分支的输出被连接起来,然后通过全连接层进行处理。这种设计使 CloFormer 能够同时捕获和利用图像中的高频(详细)和低频(全局)信息,这对于图像分类、对象检测和语义分割等任务至关重要。

效率和性能

  • CloFormer 旨在以有限的计算资源有效运行,使其适合部署在移动设备上。与其他轻量级模型相比,它以更少的参数和更低的 FLOP(每秒浮点运算次数)实现了具有竞争力的准确度。

应用:

  • CloFormer 已在各种视觉任务(如图像分类、对象检测和语义分割)中进行了测试,并在每项任务中都表现出色。

总之,CloFormer 创新地结合了卷积网络和变换器的优势,特别是在处理局部和全局信息方面,使其成为移动和边缘应用的强大而高效的模型。

2. 将C2f_CloAtt代码添加到YOLOv8中

YOLOv8%E4%B8%AD">2.1 C2f_CloAtt的代码实现

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

python">
from efficientnet_pytorch.model import MemoryEfficientSwishclass AttnMap(nn.Module):def __init__(self, dim):super().__init__()self.act_block = nn.Sequential(nn.Conv2d(dim, dim, 1, 1, 0),MemoryEfficientSwish(),nn.Conv2d(dim, dim, 1, 1, 0))def forward(self, x):return self.act_block(x)class EfficientAttention(nn.Module):def __init__(self, dim, num_heads=8, group_split=[4, 4], kernel_sizes=[5], window_size=4, attn_drop=0., proj_drop=0., qkv_bias=True):super().__init__()assert sum(group_split) == num_headsassert len(kernel_sizes) + 1 == len(group_split)self.dim = dimself.num_heads = num_headsself.dim_head = dim // num_headsself.scalor = self.dim_head ** -0.5self.kernel_sizes = kernel_sizesself.window_size = window_sizeself.group_split = group_splitconvs = []act_blocks = []qkvs = []for i in range(len(kernel_sizes)):kernel_size = kernel_sizes[i]group_head = group_split[i]if group_head == 0:continueconvs.append(nn.Conv2d(3*self.dim_head*group_head, 3*self.dim_head*group_head, kernel_size,1, kernel_size//2, groups=3*self.dim_head*group_head))act_blocks.append(AttnMap(self.dim_head*group_head))qkvs.append(nn.Conv2d(dim, 3*group_head*self.dim_head, 1, 1, 0, bias=qkv_bias))if group_split[-1] != 0:self.global_q = nn.Conv2d(dim, group_split[-1]*self.dim_head, 1, 1, 0, bias=qkv_bias)self.global_kv = nn.Conv2d(dim, group_split[-1]*self.dim_head*2, 1, 1, 0, bias=qkv_bias)self.avgpool = nn.AvgPool2d(window_size, window_size) if window_size!=1 else nn.Identity()self.convs = nn.ModuleList(convs)self.act_blocks = nn.ModuleList(act_blocks)self.qkvs = nn.ModuleList(qkvs)self.proj = nn.Conv2d(dim, dim, 1, 1, 0, bias=qkv_bias)self.attn_drop = nn.Dropout(attn_drop)self.proj_drop = nn.Dropout(proj_drop)def high_fre_attntion(self, x: torch.Tensor, to_qkv: nn.Module, mixer: nn.Module, attn_block: nn.Module):'''x: (b c h w)'''b, c, h, w = x.size()qkv = to_qkv(x) #(b (3 m d) h w)qkv = mixer(qkv).reshape(b, 3, -1, h, w).transpose(0, 1).contiguous() #(3 b (m d) h w)q, k, v = qkv #(b (m d) h w)attn = attn_block(q.mul(k)).mul(self.scalor)attn = self.attn_drop(torch.tanh(attn))res = attn.mul(v) #(b (m d) h w)return resdef low_fre_attention(self, x : torch.Tensor, to_q: nn.Module, to_kv: nn.Module, avgpool: nn.Module):'''x: (b c h w)'''b, c, h, w = x.size()q = to_q(x).reshape(b, -1, self.dim_head, h*w).transpose(-1, -2).contiguous() #(b m (h w) d)kv = avgpool(x) #(b c h w)kv = to_kv(kv).view(b, 2, -1, self.dim_head, (h*w)//(self.window_size**2)).permute(1, 0, 2, 4, 3).contiguous() #(2 b m (H W) d)k, v = kv #(b m (H W) d)attn = self.scalor * q @ k.transpose(-1, -2) #(b m (h w) (H W))attn = self.attn_drop(attn.softmax(dim=-1))res = attn @ v #(b m (h w) d)res = res.transpose(2, 3).reshape(b, -1, h, w).contiguous()return resdef forward(self, x: torch.Tensor):'''x: (b c h w)'''res = []for i in range(len(self.kernel_sizes)):if self.group_split[i] == 0:continueres.append(self.high_fre_attntion(x, self.qkvs[i], self.convs[i], self.act_blocks[i]))if self.group_split[-1] != 0:res.append(self.low_fre_attention(x, self.global_q, self.global_kv, self.avgpool))return self.proj_drop(self.proj(torch.cat(res, dim=1)))class Bottleneck_CloAtt(Bottleneck):"""Standard bottleneck With CloAttention."""def __init__(self, c1, c2, shortcut=True, g=1, k=..., e=0.5):super().__init__(c1, c2, shortcut, g, k, e)self.attention = EfficientAttention(c2)def forward(self, x):"""'forward()' applies the YOLOv5 FPN to input data."""return x + self.attention(self.cv2(self.cv1(x))) if self.add else self.attention(self.cv2(self.cv1(x)))class C2f_CloAtt(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_CloAtt(self.c, self.c, shortcut, g, k=(3, 3), e=1.0) for _ in range(n))

CloFormer处理图像的流程可以概括为以下几个关键步骤,每个步骤对应模型中的不同模块和操作:

1. 输入处理和初始特征提取

  • 图像输入:输入图像首先被分成不重叠的图像块(patches),类似于传统的Vision Transformer (ViT)。

  • 线性嵌入:每个图像块通过线性层进行嵌入,将其映射到一个高维空间中,形成初始的特征表示。

2. 局部与全局信息处理分支

CloFormer具有两个主要分支,分别处理局部高频信息和全局低频信息:

  • 局部分支(AttnConv)

    • 局部感知(DWConv):在这一分支中,使用深度卷积(Depthwise Convolution, DWConv)来提取局部信息。DWConv通过共享权重,在不增加计算量的情况下,有效地捕捉图像块中的局部特征。

    • 上下文感知权重(Context-Aware Weights):随后,通过一个门控机制,根据输入的上下文生成特定的权重,对提取的局部特征进行调整。这一步通过引入非线性,使得模型能够更好地增强局部细节。

  • 全局分支(Modified Global Attention)

    • 降采样处理:全局分支在处理之前,首先对键和值(Key和Value)进行降采样,以减少计算复杂度。

    • 注意力机制:随后应用一个简化的全局注意力机制,在较低分辨率下计算全局的特征表示。这有助于模型捕捉图像中的全局低频信息,如大范围的结构和形状。

3. 特征融合

  • 通道拼接:来自局部分支和全局分支的特征在通道维度上进行拼接,将两种不同频率的信息融合在一起。

  • 全连接层:拼接后的特征通过全连接层进行处理,从而生成更加综合的特征表示。

4. 输出预测

  • 分类头或其他任务头:最终融合后的特征输入到任务特定的头部(例如分类头、检测头),用于生成最终的预测结果。这个步骤根据任务的不同,可以是图像分类、目标检测、语义分割等。

总结

CloFormer通过其独特的双分支架构,首先将输入图像块进行嵌入和特征提取,然后分别通过局部感知分支(AttnConv)和全局感知分支处理局部和全局信息,最后将两者融合进行进一步处理,生成最终的任务预测结果。这样的设计使得CloFormer能够在保持计算效率的同时,有效地捕捉图像中的细节和整体结构。

2.2 更改__init__.py文件

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

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

2.3 添加yaml文件

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

python"># 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 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [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_CloAtt, [512, True]]- [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32- [-1, 3, C2f_CloAtt, [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, [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【语义分割】
python"># 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 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [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_CloAtt, [512, True]]- [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32- [-1, 3, C2f_CloAtt, [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, [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文件解读——点击即可跳转  


python"># 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 注册模块

关键步骤四:在task.py的parse_model函数添加C2f_CloAtt下面的内容

2.5 执行程序

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

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

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

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

python">                   from  n    params  module                                    arguments0                  -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    240128  ultralytics.nn.modules.block.C2f_CloAtt      [128, 128, 2, True]7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]8                  -1  1    539648  ultralytics.nn.modules.block.C2f_CloAtt      [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    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_CloAtt summary: 276 layers, 3279056 parameters, 3279040 gradients, 9.0 GFLOPs

3. 完整代码分享

python">https://pan.baidu.com/s/1Qy2va41OxbmHA-25XUi7oA?pwd=571i

提取码: 571i 

4. GFLOPs

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

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

现在手上没有卡了,等过段时候有卡了把这补上,需要的同学自己测一下

5. 进阶

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

6. 总结

CloFormer是一种轻量级视觉Transformer,专为移动设备设计,通过引入AttnConv模块有效地平衡了模型的性能与计算效率。CloFormer的核心创新在于其AttnConv模块,它结合了卷积神经网络(CNN)和自注意力机制的优势。在AttnConv中,首先使用深度卷积(DWconv)利用全局共享权重来聚合局部信息,然后通过一种门控机制生成上下文感知的权重,以增强这些局部特征。这种设计比传统的局部自注意力机制引入了更强的非线性,使模型能够更好地捕捉图像中的高频细节信息。

CloFormer采用了双分支架构,一支通过AttnConv处理高频的局部信息,另一支通过简化的标准注意力机制处理低频的全局信息。为了减少计算量,全局分支在计算注意力之前对键和值(Key和Value)进行了降采样。两个分支的输出会在通道维度上进行拼接,随后经过全连接层处理,从而使模型能够同时捕捉并利用图像中的高频与低频信息。

CloFormer的设计目标是在有限的计算资源下仍能表现出色,特别适用于移动设备。它在图像分类、目标检测和语义分割等视觉任务中展示了卓越的性能,且相比其他轻量级模型,具有更少的参数和更低的FLOPs(浮点运算次数),充分体现了其高效性和性能优越性。


http://www.ppmy.cn/devtools/95384.html

相关文章

python实现每天定时发送邮件

文章目录 步骤 1: 安装所需的库步骤 2: 编写发送电子邮件的 Python 脚本步骤 3: 配置电子邮件发送服务步骤 4: 运行脚本进一步扩展 要编写一个用于自动发送每日电子邮件报告的 Python 脚本,并配置它在每天的特定时间发送电子邮件,使用 smtplib 和 emai…

【功能全局变量】设计模式讲解

1.什么是功能全局变量(FGV)? FGV是一种标准的LabVIEW数据结构,允许对数据或资源进行受控访问,通常允许执行各种操作。每次调用FGV时,框图只会执行一次,要么进行数据更新,要么进行读取…

MySQL——单表查询(二)按条件查询(2)带 IN 关键字的查询

IN 关键字用于判断某个字段的值是否在指定集合中,如果字段的值在集合中,则满足条件,该字段所在的记录将被查询出来。其语法格式如下所示: SELECT *|字段名 1,字段名 2,… FROM 表名 WHERE 字段名 [NOT〕IN(元素 1,元素 2,…) 在上…

WPS真题题库导入刷题小程序:百思考个人使用经验分享

这篇文章的诞生,是因为我即将踏上一场超级有趣的挑战——备考全国计算机等级二级WPS Office高级应用与设计的冒险之旅! WPS的分值: 单项选择题20分(含公共基础知识部分10分)。 WPS处理文字文档操作题30分。 WPS处理电子表格操作题30分。 …

Electron:摄像头录制和屏幕录制

摄像头录制 main.js const { app, BrowserWindow} require(electron)let mainWin null const createWindow () > {mainWin new BrowserWindow({width: 800,height: 600,title: 自定义菜单,webPreferences: {// 允许渲染进程使用nodejsnodeIntegration: true,// 允许渲…

SpringBoot-配置加载顺序

目录 前言 样例 内部配置加载顺序 ​ 样例 小结 前言 我之前写的配置文件,都是放在resources文件夹,根据当前目录下,优先级的高低,判断谁先被加载。但实际开发中,我们写的配置文件并不是,都放…

ComfyUI - 在服务器中部署 AIGC 绘画的 ComfyUI 工具 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/141140498 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 ComfyU…

A股触底强反弹,后市如何演绎?

今天的A股,让人瞬间惊呆了,盘面上出现2个耐人寻味的重要信号,一起来看看: 1、今天亚太地区日经指数大涨3.45%,外围基本上收复失地了。而大A吓趴下后,一路探底到前低2845点附近了。 2、盘面上出现两个耐人寻…

出国留学如何兼顾学习与生活?

留学无疑首先是一种人生经历,这种经历是一直待在国内没法体验。留学不仅仅是学知识,也是了解、融入西方社会的一条重要通道。学习之外的东西,对于留学生个人形成完整的人生观、世界观以及价值观是非常重要的。呼吸清新的空气,体会…

计算机的错误计算(六十)

摘要 用另一种方法计算计算机的错误计算(五十五)中案例:先使自变量与 取余,再计算取余后的余弦值,这时,得到了不同的输出。因此,即使不清楚正确结果,Python 与 Visual Studio 也各自…

UCOSIII消息队列详解

目录 1. 基本概念 2. 消息池 3. 消息队列的运作机制 4. 阻塞机制 5. 消息队列的应用场景 6. 注意事项 7.代码实现 7.1 创建消息队列 7.2 请求消息 7.3 发送消息 UCOSIII(也称为μC/OS-III)中的消息队列是一种常用于任务间通信的数据结构&#…

Tomcat部署及优化

前端 可以说是 中间件 前端 web服务器 后端 可以说是 中间件 tomcat 微服务 1、tomcat 概述 tomcat就是处理动态页面的(动态页面:可以让用户进行交互的一种web的页面) Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免…

Ted靶机

信息收集: 靶机地址:https://www.vulnhub.com/entry/ted-1,327/ (1)ip扫描 nmap 192.168.254.0/24 -sn | grep -B 2 00:0C:29:FF:7F:9A (2)端口扫描 nmap -p- -A 192.168.254.159 (3&#x…

Docker——常用命令

1.Docker是做什么的? Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。它可以帮助我们下载应用镜像,创建并运行镜…

ubuntu20.04安装k8s和kubesphere

前提 已经安装docker 机器使用小写的hostname hostname建议你的机器把hostname改成小写,不然您会踩坑 官网的教程已经足够详实,推荐看官网教程 https://kubesphere.io/docs/v3.4/quick-start/all-in-one-on-linux/ 安装依赖 sudo apt install connt…

MySQL 查询分组内最新的第一条数据

目录 1、MySQL 5版本的写法 2、MySQL 8版本的写法 由于MySQL 5不支持窗口函数,因此不能使用PARTITION()、ROW_NUMBER() 🌰:获取每个班级中最新注册的学号人员信息 也就是从 user_info 学生表中获取每个 class_id 班级的最新一条记录 1、…

LogicFlow工作流在React和Vue3中的使用

LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和简单灵活的节点自定义、插件等拓展机制,方便我们快速在业务系统内满足类流程图的需求。 核心能力 可视化模型:通过 LogicFlow 提供的直观可视化界面&#xff0c…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取,还是运用的是requests方法 首先进入此网站中,选取你想要爬取的视频,进入视频播放页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要的一些…

鸿萌数据恢复服务: 如何修复 SQL Server 数据库错误 829?

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时,鸿萌是众多国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商&#xff0c…

程序CPU100% | 内存泄漏通用排查步骤

真正的问题了有很多种,这里只是讲一下解决问题的方法和思路 这类场景不多,但总是会有,遇到了就是学习和实操的机会 实际上也没有很难,了解基础,借助ai工具和排查工具,一样可以解决问题 CPU100% 原因&am…