当前位置: 首页 > news >正文

济南网站建设(选聚搜网络)wordpress七牛云镜像

济南网站建设(选聚搜网络),wordpress七牛云镜像,用织梦做的网站好还是cms,天津建设网站哪家好改进yolo11-RepNCSPELAN等200全套创新点大全#xff1a;厨房食材检测图像分割系统源码#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意#xff1a;由于项目一直在更新迭代#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系…改进yolo11-RepNCSPELAN等200全套创新点大全厨房食材检测图像分割系统源码数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意由于项目一直在更新迭代上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可能为老版本新版本在老版本的基础上升级如下实际效果以升级的新版本为准 1适配了YOLOV11的“目标检测”模型和“实例分割”模型通过加载相应的权重.pt文件即可自适应加载模型。 2支持“图片识别”、“视频识别”、“摄像头实时识别”三种识别模式。 3支持“图片识别”、“视频识别”、“摄像头实时识别”三种识别结果保存导出解决手动导出容易卡顿出现爆内存存在的问题识别完自动保存结果并导出到tempDir中。 4支持Web前端系统中的标题、背景图等自定义修改。 另外本项目提供训练的数据集和训练教程,暂不提供权重文件best.pt,需要您按照教程进行训练后实现图片演示和Web前端界面演示的效果。 2.视频效果展示 2.1 视频效果展示 3.背景 研究背景与意义 随着智能家居和自动化厨房的迅速发展厨房食材的智能识别与管理成为了一个重要的研究方向。传统的厨房管理方式往往依赖于人工识别和记录不仅效率低下而且容易出现错误。基于深度学习的图像识别技术尤其是YOLOYou Only Look Once系列模型因其高效的实时检测能力而备受关注。YOLOv11作为该系列的最新版本具备更强的特征提取能力和更快的处理速度为厨房食材的自动识别提供了新的可能性。 本研究旨在基于改进的YOLOv11模型构建一个厨房食材检测图像分割系统。该系统将利用包含4500张图像的多样化数据集涵盖了包括苹果、米饭、黑胡椒、花椰菜等在内的四类食材。这些食材不仅在家庭烹饪中常见也在健康饮食和营养管理中扮演着重要角色。通过对这些食材的精准识别与分割系统能够实现对厨房库存的实时监控帮助用户更好地管理食材减少浪费并提升烹饪效率。 此外随着人们对健康饮食的关注食材的种类和品质日益受到重视。通过引入深度学习技术研究将推动厨房智能化的发展提升用户的烹饪体验。该系统的实现不仅有助于家庭用户的日常生活还可为餐饮行业提供数据支持优化食材采购和库存管理具有广泛的应用前景和市场价值。因此本研究不仅具有重要的学术意义也具备良好的实际应用潜力为未来的智能厨房发展奠定基础。 4.数据集信息展示 4.1 本项目数据集详细数据类别数类别名 nc: 32 names: [‘Apple’, ‘Basmatirice’, ‘Blackpepper’, ‘Broccoli’, ‘Brownsugar’, ‘Butter’, ‘Buttermilk’, ‘Buttonmushroom’, ‘Cashewnut’, ‘Chickenstock’, ‘Cilantro’, ‘Cinnamon’, ‘Egg’, ‘Flour’, ‘Garlic’, ‘Greenpepper’, ‘Lemon’, ‘Mayonnaise’, ‘Medjooldates’, ‘Mustard’, ‘Onion’, ‘Peas’, ‘Potato’, ‘Redbeans’, ‘Redpepper’, ‘Salt’, ‘Springonion’, ‘Tomato’, ‘Vegetableoil’, ‘Whitesugar’, ‘milk’, ‘yeast’] 该项目为【图像分割】数据集请在【训练教程和Web端加载模型教程第三步】这一步的时候按照【图像分割】部分的教程来训练 4.2 本项目数据集信息介绍 本项目数据集信息介绍 本项目所使用的数据集名为“Ingredients”其主要目的是为了训练和改进YOLOv11的厨房食材检测图像分割系统。该数据集包含32个类别涵盖了多种常见的厨房食材旨在为图像分割任务提供丰富的样本和多样化的特征。这些类别包括了从新鲜水果到调味品、从干货到乳制品的多种食材具体类别有苹果、巴斯马蒂米、黑胡椒、西兰花、红糖、黄油、酪乳、按钮蘑菇、腰果、鸡肉高汤、香菜、肉桂、鸡蛋、面粉、大蒜、青椒、柠檬、蛋黄酱、梅德乔尔枣、芥末、洋葱、豌豆、土豆、红豆、红椒、盐、春洋葱、西红柿、植物油、白糖、牛奶和酵母等。 数据集的多样性使其能够有效地捕捉不同食材在各种烹饪场景中的外观特征这对于提高YOLOv11在厨房环境中的检测精度至关重要。每个类别的食材都经过精心挑选确保涵盖了家庭烹饪中常见的食材类型从而增强模型的实用性和适应性。此外数据集中的图像经过精细标注确保每个食材的边界清晰便于进行高质量的图像分割训练。 通过使用“Ingredients”数据集研究团队期望能够提升YOLOv11在复杂厨房环境中的检测能力使其能够准确识别和分割出各种食材。这不仅有助于自动化厨房管理还为智能烹饪助手的开发奠定了基础。整体而言该数据集的构建为图像分割技术在食品识别领域的应用提供了坚实的支持推动了相关研究的深入发展。 5.全套项目环境部署视频教程零基础手把手教学 5.1 所需软件PyCharm和Anaconda安装教程第一步 5.2 安装Python虚拟环境创建和依赖库安装视频教程第二步 6.改进YOLOv11训练教程和Web_UI前端加载模型教程零基础手把手教学 6.1 改进YOLOv11训练教程和Web_UI前端加载模型教程第三步 按照上面的训练视频教程链接加载项目提供的数据集运行train.py即可开始训练 Epoch gpu_mem box obj cls labels img_size1/200 20.8G 0.01576 0.01955 0.007536 22 1280: 100%|██████████| 849/849 [14:4200:00, 1.04s/it]Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 213/213 [01:1400:00, 2.87it/s]all 3395 17314 0.994 0.957 0.0957 0.0843Epoch gpu_mem box obj cls labels img_size2/200 20.8G 0.01578 0.01923 0.007006 22 1280: 100%|██████████| 849/849 [14:4400:00, 1.04s/it]Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 213/213 [01:1200:00, 2.95it/s]all 3395 17314 0.996 0.956 0.0957 0.0845Epoch gpu_mem box obj cls labels img_size3/200 20.8G 0.01561 0.0191 0.006895 27 1280: 100%|██████████| 849/849 [10:5600:00, 1.29it/s]Class Images Labels P R mAP.5 mAP.5:.95: 100%|███████ | 187/213 [00:5200:00, 4.04it/s]all 3395 17314 0.996 0.957 0.0957 0.0845项目数据集下载链接 7.原始YOLOv11算法讲解 YOLOv11改进方向 与YOLOv 10相比YOLOv 11有了巨大的改进包括但不限于 增强的模型结构模型具有改进的模型结构以获取图像处理并形成预测GPU优化这是现代ML模型的反映GPU训练ML模型在速度和准确性上都更好。速度YOLOv 11模型现在经过增强和GPU优化以用于训练。通过优化这些模型比它们的前版本快得多。在速度上达到了25%的延迟减少更少的参数更少的参数允许更快的模型但v11的准确性不受影响更具适应性更多支持的任务YOLOv 11支持多种类型的任务、多种类型的对象和多种类型的图像。 YOLOv11功能介绍 Glenn Jocher和他的团队制作了一个令人敬畏的YOLOv 11迭代并且在图像人工智能的各个方面都提供了YOLO。YOLOv 11有多种型号包括 对象检测-在训练时检测图像中的对象图像分割-超越对象检测分割出图像中的对象姿态检测-当用点和线训练时绘制一个人的姿势定向检测OBB类似于对象检测但包围盒可以旋转图像分类-在训练时对图像进行分类 使用Ultralytics Library这些模型还可以进行优化以 跟踪-可以跟踪对象的路径易于导出-库可以以不同的格式和目的导出多场景-您可以针对不同的对象和图像训练模型 此外Ultralytics还推出了YOLOv 11的企业模型该模型将于10月31日发布。这将与开源的YOLOv 11模型并行但将拥有更大的专有Ultralytics数据集。YOLOv 11是“建立在过去的成功”的其他版本的之上。 YOLOv11模型介绍 YOLOv 11附带了边界框模型无后缀实例分割-seg姿态估计-pose定向边界框-obb和分类-cls。 这些也有不同的尺寸纳米n小s中m大l超大x。 ![img](https://img- blog.csdnimg.cn/img_convert/e2ac12a32b7ca425217ea8391736d9ca.png) YOLOv11模型 YOLOv11与前版本对比 与YOLOv10和YOLOv8相比YOLOv11在Ultralytics的任何帖子中都没有直接提到。所以我会收集所有的数据来比较它们。感谢Ultralytics 检测 ![img](https://img- blog.csdnimg.cn/img_convert/e7bc7f5fbb8ca2db5460668b96237f2d.png) YOLOv11检测统计 ![img](https://img- blog.csdnimg.cn/img_convert/b6836b131f872e1fd122404157de1e86.png) YOLOv10检测统计 其中Nano的mAPval在v11上为39.5v10上为38.5Small为47.0 vs 46.3Medium为51.5 vs 51.1Large为53.4 vs 53.2Extra Large为54.7vs 54.4。现在这可能看起来像是一种增量增加但小小数的增加可能会对ML模型产生很大影响。总体而言YOLOv11以0.3 mAPval的优势追平或击败YOLOv10。 现在我们必须看看速度。在延迟方面Nano在v11上为1.55 , v10上为1.84Small为2.46 v2.49Medium为4.70 v4.74Large为6.16 v7.28Extra Large为11.31 v10.70。延迟越低越好。YOLOv11提供了一个非常低的延迟相比除了特大做得相当差的前身。 总的来说Nano模型是令人振奋的速度更快性能相当。Extra Large在性能上有很好的提升但它的延迟非常糟糕。 分割 ![img](https://img- blog.csdnimg.cn/img_convert/c4280d74fb735c5efdeec096ddafe027.png) YOLOV11 分割统计 ![img](https://img- blog.csdnimg.cn/img_convert/8500756f76cb2277280639aab069a22a.png) YOLOV9 分割统计 ![img](https://img- blog.csdnimg.cn/img_convert/a1f20d5fcab6323c2aea543136374876.png) YOLOV8 分割数据 总体而言YOLOv 11上的分割模型在大型和超大型模型方面比上一代YOLOv 8和YOLOv 9做得更好。 YOLOv 9 Segmentation没有提供任何关于延迟的统计数据。比较YOLOv 11延迟和YOLOv 8延迟发现YOLOv 11比YOLOv 8快得多。YOLOv 11将大量GPU集成到他们的模型中因此期望他们的模型甚至比CPU测试的基准更快 姿态估计 ![img](https://img- blog.csdnimg.cn/img_convert/b8e15e57098723453b6cdc9eda75118e.png) YOLOV11姿态估计统计 ![img](https://img- blog.csdnimg.cn/img_convert/515264f7dd14fed8e2ece60c1c94806b.png) YOLOV8姿态估计统计 YOLOv 11的mAP 50 -95统计量也逐渐优于先前的YOLOv 8除大型外。然而在速度方面YOLOv 11姿势可以最大限度地减少延迟。其中一些延迟指标是版本的1/4通过对这些模型进行GPU训练优化我可以看到指标比显示的要好得多。 定向边界框 ![img](https://img- blog.csdnimg.cn/img_convert/fa4ce5fe7fdc44bb11a9b5d1842e32a6.png) YOLOv11 OBB统计 ![img](https://img- blog.csdnimg.cn/img_convert/68f498919bc731806f5b24c0a0f317f5.png) YOLOv8 OBB统计 OBB统计数据在mAP 50上并不是很好只有非常小的改进在某种程度上小于检测中的微小改进。然而从v8到v11的速度减半这表明YOLOv11在速度上做了很多努力。 最后分类 ![img](https://img- blog.csdnimg.cn/img_convert/99c9a2edbcb11ba9bc66e1dc7006ed75.png) YOLOv 11 CLS统计 ![img](https://img- blog.csdnimg.cn/img_convert/4aa0a6e2dba8fc65ed529c1487665eb7.png) YOLOv8 CLS统计 从v8到v11准确性也有了微小的提高。然而速度大幅上升CPU速度更快的型号。 8.200种全套改进YOLOV11创新点原理讲解 8.1 200种全套改进YOLOV11创新点原理讲解大全 由于篇幅限制每个创新点的具体原理讲解就不全部展开具体见下列网址中的改进模块对应项目的技术原理博客网址【Blog】创新点均为模块化搭建原理适配YOLOv5~YOLOv11等各种版本 改进模块技术原理博客【Blog】网址链接 8.2 精选部分改进YOLOV11创新点原理讲解 这里节选部分改进创新点展开原理讲解(完整的改进原理见上图和改进模块技术原理博客链接【如果此小节的图加载失败可以通过CSDN或者Github搜索该博客的标题访问原始博客原始博客图片显示正常】 ### CBAM空间注意力机制 近年来随着深度学习研究方向的火热注意力机制也被广泛地应用在图像识别、语音识别和自然语言处理等领域注意力机制在深度学习任务中发挥着举足轻重的作用。注意力机制借鉴于人类的视觉系统例如人眼在看到一幅画面时会倾向于关注画面中的重要信息而忽略其他可见的信息。深度学习中的注意力机制和人类视觉的注意力机制相似通过扫描全局数据从大量数据中选择出需要重点关注的、对当前任务更为重要的信息然后对这部分信息分配更多的注意力资源从这些信息中获取更多所需要的细节信息而抑制其他无用的信息。而在深度学习中则具体表现为给感兴趣的区域更高的权重经过网络的学习和调整得到最优的权重分配形成网络模型的注意力使网络拥有更强的学习能力加快网络的收敛速度。 注意力机制通常可分为软注意力机制和硬注意力机制[4-5]。软注意力机制在选择信息时不是从输入的信息中只选择1个而会用到所有输入信息只是各个信息对应的权重分配不同然后输入网络模型进行计算;硬注意力机制则是从输入的信息中随机选取一个或者选择概率最高的信息但是这一步骤通常是不可微的导致硬注意力机制更难训练。因此软注意力机制应用更为广泛按照原理可将软注意力机制划分为:通道注意力机制channel attention)、空间注意力机制(spatial attention和混合域注意力机制(mixed attention)。 通道注意力机制的本质建立各个特征通道之间的重要程度对感兴趣的通道进行重点关注弱化不感兴趣的通道的作用;空间注意力的本质则是建模了整个空间信息的重要程度然后对空间内感兴趣的区域进行重点关注弱化其余非感兴趣区域的作用;混合注意力同时运用了通道注意力和空间注意力两部分先后进行或并行形成对通道特征和空间特征同时关注的注意力模型。 卷积层注意力模块(Convolutional Block Attention ModuleCBAM是比较常用的混合注意力模块其先后集中了通道注意力模块和空间注意力模块网络中加入该模块能有效提高网络性能减少网络模型的计算量模块结构如图所示。输入特征图首先经过分支的通道注意力模块然后和主干的原特征图融合得到具有通道注意力的特征图接着经过分支的空间注意力模块在和主干的特征图融合后得到同时具有通道特征注意力和空间特征注意力的特征图。CBAM模块不改变输入特征图的大小因此该模块是一个“即插即用”的模块可以插入网络的任何位置。 通道注意力模块的结构示意图如图所示通道注意力模块分支并行地对输入的特征图进行最大池化操作和平均池化操作然后利用多层感知机对结果进行变换得到应用于两个通道的变换结果最后经过sigmoid激活函数将变换结果融合得到具有通道注意力的通道特征图。 空间注意力模块示意图如图所示将通道注意力模块输出的特征图作为该模块的输入特征图首先对输入特征图进行基于通道的最大池化操作和平均池化操作将两部分得到的结果拼接起来然后通过卷积得到降为Ⅰ通道的特征图最后通过sigmoid激活函数生成具有空间注意力的特征图。 9.系统功能展示 图9.1.系统支持检测结果表格显示 图9.2.系统支持置信度和IOU阈值手动调节 图9.3.系统支持自定义加载权重文件best.pt(需要你通过步骤5中训练获得) 图9.4.系统支持摄像头实时识别 图9.5.系统支持图片识别 图9.6.系统支持视频识别 图9.7.系统支持识别结果文件自动保存 图9.8.系统支持Excel导出检测结果数据 10. YOLOv11核心改进源码讲解 10.1 wtconv2d.py 以下是对代码中最核心部分的分析和详细注释。代码的主要功能是实现一个基于小波变换的卷积层WTConv2d并提供小波变换和逆小波变换的功能。 import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Function import pywt# 创建小波滤波器 def create_wavelet_filter(wave, in_size, out_size, typetorch.float):# 创建小波对象w pywt.Wavelet(wave)# 获取小波的分解滤波器dec_hi torch.tensor(w.dec_hi[::-1], dtypetype) # 高频滤波器dec_lo torch.tensor(w.dec_lo[::-1], dtypetype) # 低频滤波器# 生成分解滤波器的组合dec_filters torch.stack([dec_lo.unsqueeze(0) * dec_lo.unsqueeze(1),dec_lo.unsqueeze(0) * dec_hi.unsqueeze(1),dec_hi.unsqueeze(0) * dec_lo.unsqueeze(1),dec_hi.unsqueeze(0) * dec_hi.unsqueeze(1)], dim0)# 扩展滤波器以适应输入通道数dec_filters dec_filters[:, None].repeat(in_size, 1, 1, 1)# 获取小波的重构滤波器rec_hi torch.tensor(w.rec_hi[::-1], dtypetype).flip(dims[0])rec_lo torch.tensor(w.rec_lo[::-1], dtypetype).flip(dims[0])# 生成重构滤波器的组合rec_filters torch.stack([rec_lo.unsqueeze(0) * rec_lo.unsqueeze(1),rec_lo.unsqueeze(0) * rec_hi.unsqueeze(1),rec_hi.unsqueeze(0) * rec_lo.unsqueeze(1),rec_hi.unsqueeze(0) * rec_hi.unsqueeze(1)], dim0)# 扩展滤波器以适应输出通道数rec_filters rec_filters[:, None].repeat(out_size, 1, 1, 1)return dec_filters, rec_filters# 小波变换 def wavelet_transform(x, filters):b, c, h, w x.shape # 获取输入的形状pad (filters.shape[2] // 2 - 1, filters.shape[3] // 2 - 1) # 计算填充# 进行卷积操作x F.conv2d(x, filters.to(x.dtype).to(x.device), stride2, groupsc, paddingpad)x x.reshape(b, c, 4, h // 2, w // 2) # 重新调整形状return x# 逆小波变换 def inverse_wavelet_transform(x, filters):b, c, _, h_half, w_half x.shape # 获取输入的形状pad (filters.shape[2] // 2 - 1, filters.shape[3] // 2 - 1) # 计算填充x x.reshape(b, c * 4, h_half, w_half) # 重新调整形状# 进行转置卷积操作x F.conv_transpose2d(x, filters.to(x.dtype).to(x.device), stride2, groupsc, paddingpad)return x# 定义小波变换的函数 class WaveletTransform(Function):staticmethoddef forward(ctx, input, filters):ctx.filters filters # 保存滤波器with torch.no_grad():x wavelet_transform(input, filters) # 执行小波变换return xstaticmethoddef backward(ctx, grad_output):grad inverse_wavelet_transform(grad_output, ctx.filters) # 计算梯度return grad, None# 定义逆小波变换的函数 class InverseWaveletTransform(Function):staticmethoddef forward(ctx, input, filters):ctx.filters filters # 保存滤波器with torch.no_grad():x inverse_wavelet_transform(input, filters) # 执行逆小波变换return xstaticmethoddef backward(ctx, grad_output):grad wavelet_transform(grad_output, ctx.filters) # 计算梯度return grad, None# 定义基于小波变换的卷积层 class WTConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size5, stride1, biasTrue, wt_levels1, wt_typedb1):super(WTConv2d, self).__init__()assert in_channels out_channels # 输入通道数必须等于输出通道数self.in_channels in_channelsself.wt_levels wt_levelsself.stride stride# 创建小波滤波器self.wt_filter, self.iwt_filter create_wavelet_filter(wt_type, in_channels, in_channels, torch.float)self.wt_filter nn.Parameter(self.wt_filter, requires_gradFalse) # 不需要训练的小波滤波器self.iwt_filter nn.Parameter(self.iwt_filter, requires_gradFalse) # 不需要训练的逆小波滤波器# 初始化小波变换和逆小波变换的函数self.wt_function wavelet_transform_init(self.wt_filter)self.iwt_function inverse_wavelet_transform_init(self.iwt_filter)# 基础卷积层self.base_conv nn.Conv2d(in_channels, in_channels, kernel_size, paddingsame, stride1, groupsin_channels, biasbias)self.base_scale _ScaleModule([1, in_channels, 1, 1]) # 缩放模块# 小波卷积层self.wavelet_convs nn.ModuleList([nn.Conv2d(in_channels * 4, in_channels * 4, kernel_size, paddingsame, stride1, groupsin_channels * 4, biasFalse) for _ in range(self.wt_levels)])self.wavelet_scale nn.ModuleList([_ScaleModule([1, in_channels * 4, 1, 1], init_scale0.1) for _ in range(self.wt_levels)])# 如果步幅大于1定义步幅操作if self.stride 1:self.stride_filter nn.Parameter(torch.ones(in_channels, 1, 1, 1), requires_gradFalse)self.do_stride lambda x_in: F.conv2d(x_in, self.stride_filter.to(x_in.dtype).to(x_in.device), biasNone, strideself.stride, groupsin_channels)else:self.do_stride Nonedef forward(self, x):# 前向传播x_ll_in_levels [] # 存储低频信息x_h_in_levels [] # 存储高频信息shapes_in_levels [] # 存储形状信息curr_x_ll x # 当前低频输入# 小波变换阶段for i in range(self.wt_levels):curr_shape curr_x_ll.shapeshapes_in_levels.append(curr_shape) # 记录当前形状if (curr_shape[2] % 2 0) or (curr_shape[3] % 2 0):curr_pads (0, curr_shape[3] % 2, 0, curr_shape[2] % 2) # 处理奇数尺寸curr_x_ll F.pad(curr_x_ll, curr_pads) # 填充curr_x self.wt_function(curr_x_ll) # 执行小波变换curr_x_ll curr_x[:, :, 0, :, :] # 取低频部分shape_x curr_x.shapecurr_x_tag curr_x.reshape(shape_x[0], shape_x[1] * 4, shape_x[3], shape_x[4]) # 重新调整形状curr_x_tag self.wavelet_scale[i](self.wavelet_convs[i](curr_x_tag)) # 执行小波卷积curr_x_tag curr_x_tag.reshape(shape_x) # 还原形状x_ll_in_levels.append(curr_x_tag[:, :, 0, :, :]) # 存储低频信息x_h_in_levels.append(curr_x_tag[:, :, 1:4, :, :]) # 存储高频信息next_x_ll 0 # 初始化下一个低频输出# 逆小波变换阶段for i in range(self.wt_levels - 1, -1, -1):curr_x_ll x_ll_in_levels.pop() # 取出低频信息curr_x_h x_h_in_levels.pop() # 取出高频信息curr_shape shapes_in_levels.pop() # 取出形状信息curr_x_ll curr_x_ll next_x_ll # 结合当前低频和上一个低频curr_x torch.cat([curr_x_ll.unsqueeze(2), curr_x_h], dim2) # 合并低频和高频信息next_x_ll self.iwt_function(curr_x) # 执行逆小波变换next_x_ll next_x_ll[:, :, :curr_shape[2], :curr_shape[3]] # 修剪到原始形状x_tag next_x_ll # 得到最终输出assert len(x_ll_in_levels) 0 # 确保低频信息已处理完x self.base_scale(self.base_conv(x)) # 执行基础卷积和缩放x x x_tag # 合并小波变换结果if self.do_stride is not None:x self.do_stride(x) # 如果有步幅执行步幅操作return x# 定义缩放模块 class _ScaleModule(nn.Module):def __init__(self, dims, init_scale1.0, init_bias0):super(_ScaleModule, self).__init__()self.dims dimsself.weight nn.Parameter(torch.ones(*dims) * init_scale) # 初始化权重self.bias None # 暂不使用偏置def forward(self, x):return torch.mul(self.weight, x) # 执行缩放操作代码核心部分分析 小波滤波器的创建create_wavelet_filter 函数用于生成小波变换和逆变换所需的滤波器利用 pywt 库来获取小波的分解和重构滤波器。小波变换和逆小波变换wavelet_transform 和 inverse_wavelet_transform 函数实现了小波变换和逆变换的具体操作使用卷积和转置卷积来处理输入数据。自定义的函数WaveletTransform 和 InverseWaveletTransform 类继承自 Function实现了小波变换和逆变换的前向和反向传播逻辑。WTConv2d 类这是核心的卷积层实现结合了小波变换和基础卷积能够处理多层小波变换支持不同的步幅和层数。缩放模块_ScaleModule 类用于对卷积输出进行缩放确保输出的数值范围适合后续处理。 整体来看这段代码实现了一个结合小波变换的卷积层能够在深度学习模型中有效地提取多尺度特征。 这个文件 wtconv2d.py 实现了一个基于小波变换的二维卷积层主要用于图像处理和特征提取。它结合了小波变换和传统卷积操作提供了一种新的方式来处理图像数据。 首先文件导入了必要的库包括 PyTorch 和 PyWavelets。接着定义了一些辅助函数和类。create_wavelet_filter 函数用于生成小波变换和逆小波变换所需的滤波器。这些滤波器是通过指定的小波类型如 Daubechies 小波来创建的并根据输入和输出通道的数量进行适当的调整。 wavelet_transform 和 inverse_wavelet_transform 函数分别实现了小波变换和逆小波变换的操作。它们使用了 PyTorch 的卷积函数利用小波滤波器对输入数据进行处理并通过适当的重塑操作来调整输出的形状。 接下来定义了两个类 WaveletTransform 和 InverseWaveletTransform它们继承自 torch.autograd.Function。这两个类实现了前向和反向传播的逻辑允许在训练过程中计算梯度。前向传播中调用了小波变换或逆小波变换而反向传播则计算相应的梯度。 wavelet_transform_init 和 inverse_wavelet_transform_init 函数用于初始化小波变换和逆小波变换的应用函数这些函数在后续的卷积操作中被调用。 WTConv2d 类是这个模块的核心部分继承自 nn.Module。在初始化方法中设置了输入和输出通道数、卷积核大小、步幅等参数并创建了小波滤波器和逆小波滤波器。该类还定义了基本的卷积层和多个小波卷积层以及用于处理步幅的操作。 在 forward 方法中首先对输入数据进行小波变换并将结果分为低频和高频部分。然后依次对每一层的小波变换结果进行卷积和缩放操作。最后通过逆小波变换将结果合并得到最终的输出。 _ScaleModule 类是一个简单的缩放模块用于对输入进行缩放操作通常用于调整卷积输出的尺度。 总体来说这个文件实现了一个复杂的卷积层通过结合小波变换和传统卷积提供了一种新的图像处理方法能够有效提取图像特征并进行多层次的处理。 10.2 pkinet.py 以下是代码中最核心的部分并附上详细的中文注释 import math import torch import torch.nn as nnclass DropPath(nn.Module):实现随机深度Drop Path功能的模块。随机深度是一种正则化技术用于在训练过程中随机丢弃某些路径以减少过拟合。Args:drop_prob (float): 被丢弃路径的概率。默认值为0.1。def __init__(self, drop_prob: float 0.1):super().__init__()self.drop_prob drop_prob # 存储丢弃概率def forward(self, x: torch.Tensor) - torch.Tensor:前向传播函数应用随机深度。Args:x (torch.Tensor): 输入张量。Returns:torch.Tensor: 经过随机深度处理后的输出张量。if self.drop_prob 0. or not self.training: # 如果丢弃概率为0或不在训练模式下直接返回输入return xkeep_prob 1 - self.drop_prob # 计算保留概率shape (x.shape[0], ) (1, ) * (x.ndim - 1) # 处理不同维度的张量random_tensor keep_prob torch.rand(shape, dtypex.dtype, devicex.device) # 生成随机张量output x.div(keep_prob) * random_tensor.floor() # 应用随机深度return outputclass PKINet(nn.Module):多核心卷积网络Poly Kernel Inception Network类。该网络使用多个不同大小的卷积核进行特征提取结合了Inception模块的思想。Args:arch (str): 网络架构类型。可选值为T, S, B。out_indices (Sequence[int]): 输出的层索引。drop_path_rate (float): 随机深度的丢弃概率。frozen_stages (int): 冻结的阶段索引。norm_eval (bool): 是否在评估模式下使用归一化。norm_cfg (Optional[dict]): 归一化层的配置字典。act_cfg (Optional[dict]): 激活函数的配置字典。init_cfg (Optional[dict]): 权重初始化配置字典。def __init__(self, arch: str S, out_indices: Sequence[int] (0, 1, 2, 3, 4), drop_path_rate: float 0.1):super().__init__()self.out_indices out_indices # 输出层索引self.stages nn.ModuleList() # 存储网络的各个阶段# 初始化网络的各个阶段# 这里省略了具体的阶段初始化过程def forward(self, x):前向传播函数执行网络的前向计算。Args:x (torch.Tensor): 输入张量。Returns:tuple: 各个输出层的结果。outs [] # 存储输出结果for i, stage in enumerate(self.stages):x stage(x) # 通过每个阶段处理输入if i in self.out_indices: # 如果当前阶段在输出索引中outs.append(x) # 将输出添加到结果列表中return tuple(outs) # 返回输出结果def PKINET_T():构建并返回T类型的PKINet模型。return PKINet(T)def PKINET_S():构建并返回S类型的PKINet模型。return PKINet(S)def PKINET_B():构建并返回B类型的PKINet模型。return PKINet(B)if __name__ __main__:model PKINET_T() # 创建T类型的PKINet模型inputs torch.randn((1, 3, 640, 640)) # 创建随机输入张量res model(inputs) # 通过模型进行前向传播for i in res:print(i.size()) # 打印每个输出的尺寸代码核心部分解释 DropPath 类实现了随机深度的功能通过在训练过程中随机丢弃某些路径来防止过拟合。PKINet 类构建了多核心卷积网络包含多个阶段的特征提取模块。根据不同的架构类型T、S、B初始化不同的网络结构。前向传播在 PKINet 的 forward 方法中依次通过每个阶段处理输入并根据输出索引返回相应的输出结果。模型构建函数提供了方便的函数来创建不同类型的 PKINet 模型。 这个程序文件 pkinet.py 实现了一个名为 PKINet 的深度学习模型主要用于计算机视觉任务。该模型基于多核Poly Kernel卷积和注意力机制具有较高的灵活性和可扩展性。以下是对文件中各个部分的详细说明。 首先文件导入了一些必要的库包括 math、torch 和 torch.nn以及一些可能的第三方库如 mmcv 和 mmengine用于构建神经网络模块和处理模型参数初始化。若这些库未安装则会捕获导入错误并继续执行。 接下来定义了一些辅助函数和类。drop_path 函数实现了随机深度Stochastic Depth技术用于在训练过程中随机丢弃某些路径以增强模型的泛化能力。DropPath 类则是对这一功能的封装继承自 nn.Module。 autopad 函数用于自动计算卷积操作的填充以确保输出的空间维度与输入一致。make_divisible 函数则用于确保通道数可以被指定的因子整除通常用于卷积层的通道数调整。 接下来的几个类 BCHW2BHWC 和 BHWC2BCHW 用于在不同的张量维度格式之间转换GSiLU 实现了一种新的激活函数结合了全局平均池化和 Sigmoid 函数。 CAA 类实现了上下文锚点注意力机制Context Anchor Attention用于增强特征的表达能力。ConvFFN 类实现了一个多层感知机MLP通过卷积模块构建适用于特征变换。 Stem 和 DownSamplingLayer 类分别实现了模型的初始层和下采样层负责特征的初步提取和尺寸的缩小。InceptionBottleneck 类则实现了带有 Inception 模块的瓶颈结构支持多种卷积核大小和扩展因子。 PKIBlock 类是模型的核心构建块结合了前面提到的组件形成了多核卷积的复合结构。PKIStage 类则是由多个 PKIBlock 组成的阶段负责处理特征的多层次提取。 最后PKINet 类是整个模型的封装定义了网络的结构和前向传播过程。它支持多种架构设置如 T、S、B并在初始化时根据指定的架构设置构建相应的层次结构。模型的权重初始化通过 init_weights 方法进行确保各层的参数在训练开始时具有合理的初始值。 在文件的最后部分定义了三个函数 PKINET_T、PKINET_S 和 PKINET_B用于实例化不同版本的 PKINet 模型。__main__ 部分则是一个简单的测试示例创建了一个 PKINET_T 模型并生成了随机输入进行前向传播输出每个阶段的特征图尺寸。 总体而言这个文件实现了一个复杂的深度学习模型结合了多种现代卷积神经网络的设计理念适用于图像处理和计算机视觉任务。 10.3 RFAConv.py 以下是保留的核心代码部分并附上详细的中文注释 import torch import torch.nn as nn from einops import rearrangeclass h_sigmoid(nn.Module):实现h-sigmoid激活函数def __init__(self, inplaceTrue):super(h_sigmoid, self).__init__()self.relu nn.ReLU6(inplaceinplace) # 使用ReLU6作为基础def forward(self, x):return self.relu(x 3) / 6 # 计算h-sigmoidclass h_swish(nn.Module):实现h-swish激活函数def __init__(self, inplaceTrue):super(h_swish, self).__init__()self.sigmoid h_sigmoid(inplaceinplace) # 使用h-sigmoid作为基础def forward(self, x):return x * self.sigmoid(x) # 计算h-swishclass RFAConv(nn.Module):实现RFA卷积模块def __init__(self, in_channel, out_channel, kernel_size, stride1):super().__init__()self.kernel_size kernel_size# 权重生成模块self.get_weight nn.Sequential(nn.AvgPool2d(kernel_sizekernel_size, paddingkernel_size // 2, stridestride),nn.Conv2d(in_channel, in_channel * (kernel_size ** 2), kernel_size1, groupsin_channel, biasFalse))# 特征生成模块self.generate_feature nn.Sequential(nn.Conv2d(in_channel, in_channel * (kernel_size ** 2), kernel_sizekernel_size, paddingkernel_size // 2, stridestride, groupsin_channel, biasFalse),nn.BatchNorm2d(in_channel * (kernel_size ** 2)),nn.ReLU())# 最终卷积层self.conv nn.Conv2d(in_channel, out_channel, kernel_sizekernel_size, stridekernel_size)def forward(self, x):b, c x.shape[0:2] # 获取输入的批次大小和通道数weight self.get_weight(x) # 生成权重h, w weight.shape[2:] # 获取特征图的高和宽# 计算加权特征weighted weight.view(b, c, self.kernel_size ** 2, h, w).softmax(2) # 对权重进行softmax处理feature self.generate_feature(x).view(b, c, self.kernel_size ** 2, h, w) # 生成特征# 计算加权后的特征weighted_data feature * weightedconv_data rearrange(weighted_data, b c (n1 n2) h w - b c (h n1) (w n2), n1self.kernel_size, n2self.kernel_size) # 重排数据return self.conv(conv_data) # 返回卷积结果class SE(nn.Module):实现Squeeze-and-Excitation模块def __init__(self, in_channel, ratio16):super(SE, self).__init__()self.gap nn.AdaptiveAvgPool2d((1, 1)) # 全局平均池化self.fc nn.Sequential(nn.Linear(in_channel, in_channel // ratio, biasFalse), # 从c到c/rnn.ReLU(),nn.Linear(in_channel // ratio, in_channel, biasFalse), # 从c/r到cnn.Sigmoid())def forward(self, x):b, c x.shape[0:2] # 获取输入的批次大小和通道数y self.gap(x).view(b, c) # 进行全局平均池化并调整形状y self.fc(y).view(b, c, 1, 1) # 通过全连接层return y # 返回通道注意力class RFCBAMConv(nn.Module):实现RFCBAM卷积模块def __init__(self, in_channel, out_channel, kernel_size3, stride1):super().__init__()self.kernel_size kernel_size# 特征生成模块self.generate nn.Sequential(nn.Conv2d(in_channel, in_channel * (kernel_size ** 2), kernel_size, paddingkernel_size // 2, stridestride, groupsin_channel, biasFalse),nn.BatchNorm2d(in_channel * (kernel_size ** 2)),nn.ReLU())# 权重生成模块self.get_weight nn.Sequential(nn.Conv2d(2, 1, kernel_size3, padding1, biasFalse), nn.Sigmoid())self.se SE(in_channel) # Squeeze-and-Excitation模块# 最终卷积层self.conv nn.Conv2d(in_channel, out_channel, kernel_sizekernel_size, stridekernel_size)def forward(self, x):b, c x.shape[0:2] # 获取输入的批次大小和通道数channel_attention self.se(x) # 计算通道注意力generate_feature self.generate(x) # 生成特征h, w generate_feature.shape[2:] # 获取特征图的高和宽generate_feature generate_feature.view(b, c, self.kernel_size ** 2, h, w) # 调整形状generate_feature rearrange(generate_feature, b c (n1 n2) h w - b c (h n1) (w n2), n1self.kernel_size, n2self.kernel_size) # 重排数据# 计算加权特征unfold_feature generate_feature * channel_attentionmax_feature, _ torch.max(generate_feature, dim1, keepdimTrue) # 计算最大特征mean_feature torch.mean(generate_feature, dim1, keepdimTrue) # 计算均值特征receptive_field_attention self.get_weight(torch.cat((max_feature, mean_feature), dim1)) # 计算感受野注意力conv_data unfold_feature * receptive_field_attention # 加权特征return self.conv(conv_data) # 返回卷积结果代码说明 h_sigmoid 和 h_swish实现了h-sigmoid和h-swish激活函数常用于轻量级神经网络中。RFAConv实现了RFA卷积模块通过生成特征和权重来增强特征表达能力。SE实现了Squeeze-and-Excitation模块用于通道注意力机制。RFCBAMConv实现了RFCBAM卷积模块结合了特征生成、通道注意力和感受野注意力机制。 这些模块可以用于构建更复杂的神经网络增强网络的特征提取能力和表达能力。 这个程序文件 RFAConv.py 实现了一些基于卷积神经网络的模块主要包括 RFAConv、RFCBAMConv 和 RFCAConv。这些模块结合了注意力机制和卷积操作旨在提升特征提取的能力。 首先文件中定义了两个激活函数模块h_sigmoid 和 h_swish。h_sigmoid 是一种改进的 sigmoid 函数使用了 ReLU6 作为基础能够在输入范围内进行平滑处理。h_swish 则是将 h_sigmoid 应用于输入形成了一种新的激活函数。 接下来是 RFAConv 类的定义。这个类的构造函数中定义了几个主要的子模块包括一个用于生成权重的卷积层和一个用于生成特征的卷积层。forward 方法中输入数据经过权重生成和特征生成后利用 softmax 计算权重并与特征相乘最后通过重排和卷积操作输出结果。 SE 类实现了 Squeeze-and-Excitation (SE) 模块。它通过全局平均池化和全连接层来计算通道注意力输出的注意力权重用于增强特征图中的重要通道。 RFCBAMConv 类是一个结合了 SE 模块的卷积层。它首先生成特征然后计算通道注意力接着利用最大池化和平均池化来生成感受野注意力最后将这些注意力应用于生成的特征上输出经过卷积处理的结果。 最后RFCAConv 类实现了一个结合了空间和通道注意力的卷积模块。它通过生成特征、池化操作和全连接层来计算注意力权重并将这些权重应用于生成的特征图最终通过卷积层输出结果。 整体来看这个文件中的模块通过引入注意力机制增强了卷积神经网络在特征提取过程中的表现适用于各种计算机视觉任务。 10.4 UniRepLKNet.py 以下是代码中最核心的部分并附上详细的中文注释 import torch import torch.nn as nn import torch.nn.functional as Fclass GRNwithNHWC(nn.Module): GRN (Global Response Normalization) 层该层在 ConvNeXt V2 中首次提出旨在提高模型的性能。输入假设为 (N, H, W, C) 格式。def __init__(self, dim, use_biasTrue):super().__init__()self.use_bias use_bias# 初始化可学习参数 gamma 和 betaself.gamma nn.Parameter(torch.zeros(1, 1, 1, dim))if self.use_bias:self.beta nn.Parameter(torch.zeros(1, 1, 1, dim))def forward(self, x):# 计算输入的 L2 范数Gx torch.norm(x, p2, dim(1, 2), keepdimTrue)# 归一化Nx Gx / (Gx.mean(dim-1, keepdimTrue) 1e-6)# 应用归一化和可学习参数if self.use_bias:return (self.gamma * Nx 1) * x self.betaelse:return (self.gamma * Nx 1) * xclass SEBlock(nn.Module):Squeeze-and-Excitation Block提出于 SENet 中输入假设为 (N, C, H, W) 格式。def __init__(self, input_channels, internal_neurons):super(SEBlock, self).__init__()# 下采样卷积self.down nn.Conv2d(in_channelsinput_channels, out_channelsinternal_neurons,kernel_size1, stride1, biasTrue)# 上采样卷积self.up nn.Conv2d(in_channelsinternal_neurons, out_channelsinput_channels,kernel_size1, stride1, biasTrue)self.input_channels input_channelsself.nonlinear nn.ReLU(inplaceTrue)def forward(self, inputs):# 自适应平均池化x F.adaptive_avg_pool2d(inputs, output_size(1, 1))x self.down(x) # 下采样x self.nonlinear(x) # 激活x self.up(x) # 上采样x F.sigmoid(x) # Sigmoid 激活return inputs * x.view(-1, self.input_channels, 1, 1) # 逐通道缩放class UniRepLKNetBlock(nn.Module):UniRepLKNet 的基本构建块包含卷积、归一化、激活等操作。def __init__(self, dim, kernel_size, drop_path0., deployFalse, use_sync_bnFalse):super().__init__()# 深度卷积self.dwconv nn.Conv2d(dim, dim, kernel_sizekernel_size, stride1, paddingkernel_size // 2,dilation1, groupsdim, biasdeploy)# 归一化层self.norm nn.BatchNorm2d(dim) if not deploy else nn.Identity()# Squeeze-and-Excitation 模块self.se SEBlock(dim, dim // 4)# 前馈网络self.pwconv1 nn.Linear(dim, dim * 4)self.act nn.GELU()self.pwconv2 nn.Linear(dim * 4, dim)self.drop_path nn.Identity() if drop_path 0. else nn.Dropout(drop_path)def forward(self, inputs):# 逐层前向传播x self.dwconv(inputs) # 深度卷积x self.norm(x) # 归一化x self.se(x) # Squeeze-and-Excitationx self.pwconv1(x) # 前馈网络x self.act(x) # 激活x self.pwconv2(x) # 输出return self.drop_path(x) inputs # 残差连接class UniRepLKNet(nn.Module):UniRepLKNet 模型的主类包含多个 UniRepLKNetBlock 以构建深度网络。def __init__(self, in_chans3, num_classes1000, depths(3, 3, 27, 3), dims(96, 192, 384, 768)):super().__init__()self.stages nn.ModuleList()for i in range(len(depths)):# 每个阶段添加多个 UniRepLKNetBlockstage nn.Sequential(*[UniRepLKNetBlock(dimdims[i], kernel_size3) for _ in range(depths[i])])self.stages.append(stage)def forward(self, x):# 前向传播for stage in self.stages:x stage(x) # 逐阶段前向传播return x # 返回最终输出# 实例化模型并进行前向传播 if __name__ __main__:inputs torch.randn((1, 3, 640, 640)) # 随机输入model UniRepLKNet() # 创建模型实例res model(inputs) # 前向传播print(res.shape) # 输出结果的形状代码核心部分说明 GRNwithNHWC: 实现了全局响应归一化层能够自适应地调整输入特征的分布。SEBlock: 实现了Squeeze-and-Excitation模块通过学习通道间的关系来增强特征表示。UniRepLKNetBlock: 该模块是UniRepLKNet的基本构建块包含深度卷积、归一化、激活和前馈网络支持残差连接。UniRepLKNet: 这是整个模型的主类负责构建多个阶段每个阶段由多个UniRepLKNetBlock组成并在前向传播中逐层处理输入。 通过这些核心部分的组合UniRepLKNet能够有效地处理各种输入数据并进行特征提取。 这个程序文件实现了一个名为UniRepLKNet的深度学习模型主要用于音频、视频、点云、时间序列和图像识别。该模型基于多个先进的深度学习架构包括RepLKNet、ConvNeXt、DINO和DeiT等。文件中包含了多个类和函数下面是对其主要部分的详细说明。 首先文件导入了必要的PyTorch库和其他模块包括用于层的定义、功能激活、权重初始化等。接着定义了一些辅助类例如GRNwithNHWC、NCHWtoNHWC和NHWCtoNCHW。这些类用于实现特定的操作如全局响应归一化GRN和数据格式转换。 在模型的核心部分定义了一个名为get_conv2d的函数用于根据输入参数选择合适的卷积实现支持原生卷积和高效的iGEMM大核卷积实现。该函数会根据卷积的参数如通道数、核大小、步幅等来决定使用哪种实现。 接下来定义了SEBlock类它实现了Squeeze-and-Excitation模块能够增强模型对重要特征的关注。该模块通过自适应平均池化和全连接层来调整特征通道的权重。 DilatedReparamBlock类是UniRepLKNet的一个重要组成部分它实现了扩张卷积的重参数化允许在推理时合并多个卷积分支以提高效率。该类根据不同的核大小和扩张率配置多个卷积层并在前向传播中进行计算。 UniRepLKNetBlock类则是UniRepLKNet的基本构建块结合了卷积、归一化、激活函数和Squeeze-and-Excitation模块。它还支持在训练和推理模式之间切换以优化性能。 UniRepLKNet类是整个模型的主类接受多个参数来配置模型的输入通道数、类别数、深度、特征维度等。它包含了多个下采样层和主阶段每个阶段由多个UniRepLKNetBlock组成。模型的前向传播方法根据输出模式特征或分类结果来处理输入数据。 此外文件还提供了一些函数用于加载不同配置的UniRepLKNet模型例如unireplknet_a、unireplknet_f等这些函数可以根据需要加载预训练权重。 最后文件的主程序部分创建了一个随机输入并实例化了一个UniRepLKNet模型加载了预训练权重并进行了一次前向传播。然后模型切换到推理模式并再次进行前向传播最后打印了两次输出的差异。 整体来看这个程序文件实现了一个灵活且高效的深度学习模型能够处理多种类型的数据适用于各种计算机视觉和信号处理任务。 注意由于此博客编辑较早上面“10.YOLOv11核心改进源码讲解”中部分代码可能会优化升级仅供参考学习以“11.完整训练Web前端界面200种全套创新点源码、数据集获取由于版权原因本博客仅提供【原始博客的链接】原始博客提供下载链接”的内容为准。 11.完整训练Web前端界面200种全套创新点源码、数据集获取由于版权原因本博客仅提供【原始博客的链接】原始博客提供下载链接 参考原始博客1: https://gitee.com/Vision-Studios/Ingredients88 参考原始博客2: https://github.com/Qunmasj-Vision-Studio/Ingredients88
http://www.hkea.cn/news/14257520/

相关文章:

  • 网站运营一般做那些分析口碑营销名词解释
  • 注册网站要注意什么做移动网站快速排
  • 台州网站建设公司哪个好网站制作需要什么人员
  • 营销网站建设创意wordpress底部美化
  • 网站建设设计文档模板怎么帮别人做网站
  • 建设工程人才招聘信息网站wordpress 时间轴插件
  • 谁可以做网站优化排名推广做网站网站被抓没盈利
  • 租网站需要多少钱网站建设多少钱比较合适
  • 网站建设时间计划书互联网平台公司有哪些
  • 效果图网站密码破解网站建设的目标是什么?提供了哪些栏目?
  • 正规刷手机单做任务网站海口网站建设呢
  • 企业网站建设价钱修改wordpress 表格
  • 自建微网站服务器旅游网站建设受众分析
  • 网站备案掉了海口网站制作
  • 枣阳网站开发公司哪家好网站建设如何财务处理
  • 网站网页策略上线一个网站需要多少钱
  • 常州专业网站建设公司咨询wordpress会员插件
  • wordpress搭建英文网站打开小程序入口直接进入
  • 罗湖医院网站建设商洛网站建设公司电话
  • 做外贸网站公司网站源码什么意思
  • 网站设计原型图怎么做网站建设套餐怎么样
  • php 企业网站管理系统免费学编程国内网站
  • 凤翔做网站wordpress getshell
  • 手机版网站设计广西网站建设公司电话
  • 怎么做网站代拍常州网站建设公司排名
  • 广州市黄埔区建设局网站缙云 网站建设
  • 怎么搭建自己的网站挣钱百度安装应用
  • 济南企业建站网站建设与管理适合女生吗
  • 美橙互联 网站备案厦门 外贸商城网站
  • 合肥网站建设培训中心磁县邯郸网站建设