【完整源码+数据集+部署教程】【零售和消费品&存货】超市购物车商品检测系统源码&素材集全套:改进yolo11-DySnakeConv

news/2025/11/20 11:29:22/文章来源:https://www.cnblogs.com/yangykaifa/p/19246321

背景意义

随着电子商务的迅猛发展和消费者购物习惯的改变,传统超市面临着前所未有的挑战与机遇。超市购物车商品检测系统的需求日益增加,旨在提升购物体验、优化库存管理和提高运营效率。近年来,计算机视觉技术的快速进步为这一领域提供了新的解决方案,尤其是基于深度学习的目标检测算法。YOLO(You Only Look Once)系列模型因其高效的实时检测能力而受到广泛关注,尤其是在复杂的零售环境中。

本研究旨在基于改进的YOLOv11模型,构建一个高效的超市购物车商品检测系统。该系统将能够实时识别购物车中的商品,提升结账效率,减少人工干预,同时为超市提供准确的库存数据。为实现这一目标,我们使用了包含13,000张图像的特定数据集,涵盖了多种商品类别,包括糖果、谷物、清洁用品、饮料、护肤品和零食等。这些商品的多样性为模型的训练提供了丰富的样本,有助于提高检测的准确性和鲁棒性。

通过对YOLOv11模型的改进,我们期望在检测速度和精度之间取得更好的平衡,尤其是在处理超市这种动态环境下的复杂场景时。该研究不仅具有重要的理论意义,推动了目标检测技术在零售领域的应用,也具有显著的实际价值,能够为超市管理者提供决策支持,提升顾客的购物体验,最终推动零售行业的智能化转型。通过构建这一系统,我们希望为未来的智能购物环境奠定基础,助力零售行业的数字化升级。

图片效果

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

数据集信息

本项目所使用的数据集名为“Grocery”,旨在为改进YOLOv11的超市购物车商品检测系统提供丰富的训练素材。该数据集包含10个不同类别的商品,涵盖了超市中常见的多种商品类型,以便于系统在实际应用中能够准确识别和分类。这10个类别分别为:迷你巧克力糖(candy_minipralines_lindt)、蜂蜜坚果麦片(cereal_cheerios_honeynut)、清洁剂(cleaning_snuggle_henkel)、手工纱线(craft_yarn_caron_01)、绿茶饮料(drink_greentea_itoen)、鲜奶油饮料(drink_whippingcream_lucerne)、护肤乳液(lotion_essentially_nivea)、千层面(pasta_lasagne_barilla)、意大利饼干(snack_biscotti_ghiott_01)以及谷物能量棒(snack_granolabar_naturevalley)。

数据集的构建过程中,特别注重商品的多样性和代表性,以确保模型在训练后能够适应不同的购物环境和商品种类。每个类别的商品都经过精心挑选,确保其在超市购物车中出现的频率较高,从而提高模型的实用性和准确性。此外,数据集中每个商品的图像均经过标注,包含了商品的边界框信息,这对于YOLOv11模型的训练至关重要。

通过使用“Grocery”数据集,研究团队期望能够提升YOLOv11在商品检测任务中的性能,使其在实际超市环境中能够更快速、准确地识别购物车中的商品。这不仅有助于提高购物效率,还能为顾客提供更好的购物体验。随着深度学习技术的不断进步,利用这样一个多样化且高质量的数据集进行训练,将为超市智能化管理和自动化购物提供坚实的基础。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心代码

以下是经过简化和注释的核心代码部分,保留了主要的类和功能,同时添加了详细的中文注释:

import torch
import torch.nn as nn
import torch.nn.functional as F

class DWConv2d(nn.Module):
“”" 深度可分离卷积类 “”"
def init(self, dim, kernel_size, stride, padding):
super().init()
# 使用分组卷积实现深度可分离卷积
self.conv = nn.Conv2d(dim, dim, kernel_size, stride, padding, groups=dim)

def forward(self, x: torch.Tensor):'''x: 输入张量,形状为 (b, h, w, c)'''x = x.permute(0, 3, 1, 2)  # 转换为 (b, c, h, w)x = self.conv(x)  # 进行卷积操作x = x.permute(0, 2, 3, 1)  # 转换回 (b, h, w, c)return x

class MaSA(nn.Module):
“”" 多头自注意力机制类 “”"
def init(self, embed_dim, num_heads, value_factor=1):
super().init()
self.factor = value_factor
self.embed_dim = embed_dim
self.num_heads = num_heads
self.head_dim = self.embed_dim * self.factor // num_heads
self.key_dim = self.embed_dim // num_heads
self.scaling = self.key_dim ** -0.5

    # 定义线性变换层self.q_proj = nn.Linear(embed_dim, embed_dim, bias=True)self.k_proj = nn.Linear(embed_dim, embed_dim, bias=True)self.v_proj = nn.Linear(embed_dim, embed_dim * self.factor, bias=True)self.lepe = DWConv2d(embed_dim, 5, 1, 2)  # 深度可分离卷积用于位置编码self.out_proj = nn.Linear(embed_dim * self.factor, embed_dim, bias=True)
def forward(self, x: torch.Tensor, rel_pos):'''x: 输入张量,形状为 (b, h, w, c)rel_pos: 位置关系张量'''bsz, h, w, _ = x.size()q = self.q_proj(x)  # 计算查询k = self.k_proj(x)  # 计算键v = self.v_proj(x)  # 计算值lepe = self.lepe(v)  # 位置编码k *= self.scaling  # 缩放键# 重新排列张量以适应多头注意力qr = q.view(bsz, h, w, self.num_heads, -1).permute(0, 3, 1, 2, 4)kr = k.view(bsz, h, w, self.num_heads, -1).permute(0, 3, 1, 2, 4)# 计算注意力权重qk_mat = torch.matmul(qr, kr.transpose(-1, -2)) + rel_pos  # 添加位置关系qk_mat = torch.softmax(qk_mat, -1)  # 归一化# 计算输出output = torch.matmul(qk_mat, v.view(bsz, h, w, self.num_heads, -1).permute(0, 3, 1, 2, 4))output = output.permute(0, 3, 1, 2, 4).flatten(-2, -1) + lepe  # 添加位置编码output = self.out_proj(output)  # 线性变换输出return output

class FeedForwardNetwork(nn.Module):
“”" 前馈神经网络类 “”"
def init(self, embed_dim, ffn_dim, activation_fn=F.gelu, dropout=0.0):
super().init()
self.fc1 = nn.Linear(embed_dim, ffn_dim) # 第一层线性变换
self.fc2 = nn.Linear(ffn_dim, embed_dim) # 第二层线性变换
self.dropout = nn.Dropout(dropout) # dropout层
self.activation_fn = activation_fn # 激活函数

def forward(self, x: torch.Tensor):'''x: 输入张量,形状为 (b, h, w, c)'''x = self.fc1(x)  # 第一层x = self.activation_fn(x)  # 激活x = self.dropout(x)  # dropoutx = self.fc2(x)  # 第二层return x

class VisRetNet(nn.Module):
“”" 视觉回归网络类 “”"
def init(self, in_chans=3, num_classes=1000, embed_dims=[96, 192, 384, 768], depths=[2, 2, 6, 2], num_heads=[3, 6, 12, 24]):
super().init()
self.patch_embed = PatchEmbed(in_chans=in_chans, embed_dim=embed_dims[0]) # 图像分块嵌入
self.layers = nn.ModuleList() # 存储各层

    # 构建各层for i_layer in range(len(depths)):layer = BasicLayer(embed_dim=embed_dims[i_layer], depth=depths[i_layer], num_heads=num_heads[i_layer])self.layers.append(layer)
def forward(self, x):x = self.patch_embed(x)  # 进行图像分块嵌入for layer in self.layers:x = layer(x)  # 逐层前向传播return x

定义模型构造函数

def RMT_T():
model = VisRetNet(
embed_dims=[64, 128, 256, 512],
depths=[2, 2, 8, 2],
num_heads=[4, 4, 8, 16]
)
return model

if name == ‘main’:
model = RMT_T() # 创建模型
inputs = torch.randn((1, 3, 640, 640)) # 随机输入
res = model(inputs) # 前向传播
print(res.size()) # 输出结果的形状
代码说明:
DWConv2d:实现了深度可分离卷积,用于处理输入张量。
MaSA:实现了多头自注意力机制,计算查询、键、值并进行注意力加权。
FeedForwardNetwork:实现了前馈神经网络,包含两层线性变换和激活函数。
VisRetNet:构建了一个视觉回归网络,包含图像分块嵌入和多个基本层。
RMT_T:模型构造函数,创建一个小型的视觉回归网络实例。
此代码为一个简化的视觉回归网络的实现,适合用于理解和扩展深度学习模型的结构。

这个程序文件 rmt.py 实现了一个基于视觉变换器(Vision Transformer)的网络模型,名为 VisRetNet,并提供了不同规模的模型构造函数(如 RMT_T, RMT_S, RMT_B, RMT_L)。该模型主要用于处理图像数据,具有图像嵌入、块结构、注意力机制等特性。

首先,文件中导入了必要的库,包括 PyTorch 和一些自定义的层和模块。接着定义了一些基础组件,例如 DWConv2d(深度可分离卷积)、RelPos2d(二维相对位置编码)、MaSAd 和 MaSA(多头自注意力机制的变体)等。这些组件是构建模型的基础,负责处理输入数据的不同方面。

DWConv2d 类实现了深度可分离卷积,主要用于降低计算复杂度。RelPos2d 类则用于生成相对位置编码,这在处理图像时能够帮助模型更好地理解空间关系。MaSAd 和 MaSA 类实现了不同形式的自注意力机制,前者支持分块处理,后者则处理整个输入。

接下来,FeedForwardNetwork 类实现了前馈神经网络,通常用于在注意力层之后进行特征变换。RetBlock 类则是一个包含注意力机制和前馈网络的基本块,支持层归一化和残差连接。

PatchMerging 类用于将输入特征图分割成多个小块,并进行合并,以便在模型的不同层之间传递信息。BasicLayer 类则构建了一个基本的变换器层,包含多个 RetBlock 组件,并在必要时进行下采样。

LayerNorm2d 和 PatchEmbed 类分别实现了二维层归一化和图像到补丁的嵌入过程,后者将输入图像转换为嵌入特征。

VisRetNet 类是整个模型的核心,负责构建整个网络结构。它包含多个层,每一层由多个块组成,并支持不同的超参数配置,如嵌入维度、深度、头数等。模型的前向传播过程包括图像补丁嵌入、经过各层的处理以及特征提取。

最后,文件提供了四个不同规模的模型构造函数(RMT_T, RMT_S, RMT_B, RMT_L),这些函数根据不同的参数设置创建不同规模的 VisRetNet 模型。程序的最后部分是一个测试示例,创建了一个小型模型并对随机输入进行了前向传播,输出每个特征图的尺寸。

总体来说,这个文件实现了一个复杂的视觉变换器模型,结合了多种先进的深度学习技术,适用于图像处理任务。

10.3 lsknet.py
以下是经过简化并添加详细中文注释的核心代码部分:

import torch
import torch.nn as nn
from functools import partial

class Mlp(nn.Module):
“”" 多层感知机(MLP)模块 “”"
def init(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):
super().init()
out_features = out_features or in_features # 输出特征数
hidden_features = hidden_features or in_features # 隐藏层特征数
self.fc1 = nn.Conv2d(in_features, hidden_features, 1) # 第一层卷积
self.dwconv = DWConv(hidden_features) # 深度卷积
self.act = act_layer() # 激活函数
self.fc2 = nn.Conv2d(hidden_features, out_features, 1) # 第二层卷积
self.drop = nn.Dropout(drop) # Dropout层

def forward(self, x):""" 前向传播 """x = self.fc1(x)x = self.dwconv(x)x = self.act(x)x = self.drop(x)x = self.fc2(x)x = self.drop(x)return x

class Attention(nn.Module):
“”" 注意力模块 “”"
def init(self, d_model):
super().init()
self.proj_1 = nn.Conv2d(d_model, d_model, 1) # 线性投影
self.activation = nn.GELU() # 激活函数
self.spatial_gating_unit = LSKblock(d_model) # 空间门控单元
self.proj_2 = nn.Conv2d(d_model, d_model, 1) # 线性投影

def forward(self, x):""" 前向传播 """shortcut = x.clone()  # 残差连接x = self.proj_1(x)x = self.activation(x)x = self.spatial_gating_unit(x)x = self.proj_2(x)x = x + shortcut  # 残差连接return x

class Block(nn.Module):
“”" 网络块,包括注意力和MLP “”"
def init(self, dim, mlp_ratio=4., drop=0., drop_path=0., act_layer=nn.GELU):
super().init()
self.attn = Attention(dim) # 注意力模块
self.mlp = Mlp(in_features=dim, hidden_features=int(dim * mlp_ratio), act_layer=act_layer, drop=drop) # MLP模块
self.drop_path = nn.Identity() if drop_path <= 0. else DropPath(drop_path) # 随机深度

def forward(self, x):""" 前向传播 """x = x + self.drop_path(self.attn(x))  # 添加注意力模块的输出x = x + self.drop_path(self.mlp(x))  # 添加MLP模块的输出return x

class LSKNet(nn.Module):
“”" LSKNet网络结构 “”"
def init(self, img_size=224, in_chans=3, embed_dims=[64, 128, 256, 512], depths=[3, 4, 6, 3]):
super().init()
self.num_stages = len(depths) # 网络阶段数

    for i in range(self.num_stages):# 初始化每个阶段的嵌入层和块patch_embed = OverlapPatchEmbed(img_size=img_size // (2 ** i), in_chans=in_chans if i == 0 else embed_dims[i - 1], embed_dim=embed_dims[i])block = nn.ModuleList([Block(dim=embed_dims[i]) for _ in range(depths[i])])setattr(self, f"patch_embed{i + 1}", patch_embed)setattr(self, f"block{i + 1}", block)
def forward(self, x):""" 前向传播 """outs = []for i in range(self.num_stages):patch_embed = getattr(self, f"patch_embed{i + 1}")block = getattr(self, f"block{i + 1}")x, _, _ = patch_embed(x)  # 嵌入层for blk in block:x = blk(x)  # 块的前向传播outs.append(x)  # 保存每个阶段的输出return outs

class DWConv(nn.Module):
“”" 深度卷积模块 “”"
def init(self, dim=768):
super(DWConv, self).init()
self.dwconv = nn.Conv2d(dim, dim, 3, padding=1, groups=dim) # 深度卷积

def forward(self, x):""" 前向传播 """return self.dwconv(x)

def lsknet_t(weights=‘’):
“”" 创建LSKNet_t模型并加载权重 “”"
model = LSKNet(embed_dims=[32, 64, 160, 256], depths=[3, 3, 5, 2])
if weights:
model.load_state_dict(torch.load(weights)[‘state_dict’])
return model

if name == ‘main’:
model = lsknet_t(‘lsk_t_backbone.pth’) # 创建模型
inputs = torch.randn((1, 3, 640, 640)) # 随机输入
for i in model(inputs):
print(i.size()) # 输出每个阶段的特征图大小
代码说明:
Mlp:实现了一个多层感知机模块,包含两个卷积层和一个深度卷积层,使用Dropout进行正则化。
Attention:实现了一个注意力机制模块,包含线性投影和空间门控单元。
Block:定义了一个网络块,包含注意力模块和MLP模块,支持残差连接。
LSKNet:主网络结构,包含多个阶段,每个阶段由嵌入层和多个块组成。
DWConv:实现了深度卷积,用于特征提取。
lsknet_t:用于创建LSKNet_t模型并加载预训练权重的函数。
这个程序文件定义了一个名为 lsknet.py 的深度学习模型,主要用于图像处理任务。它使用了 PyTorch 框架,并实现了一种名为 LSKNet 的网络结构。以下是对代码的详细讲解。

首先,文件导入了必要的库,包括 PyTorch 的核心模块和一些辅助函数。接着,定义了一个名为 Mlp 的类,这个类实现了一个多层感知机(MLP),包含两个卷积层和一个深度卷积层。它的前向传播方法依次通过这些层,并在每个层之间应用激活函数和 dropout。

接下来,定义了 LSKblock 类,这是 LSKNet 的核心构建块之一。该类使用了多个卷积层来提取特征,并通过不同的方式计算注意力机制。具体来说,它首先通过深度卷积和空间卷积获取特征,然后将这些特征进行融合,最后通过一个卷积层生成最终的注意力输出。

Attention 类则实现了一个注意力机制,包含两个投影层和一个 LSKblock。在前向传播中,它将输入通过投影层,激活函数,注意力块,然后再通过另一个投影层,最后与输入相加,形成残差连接。

Block 类是 LSKNet 的基本单元,结合了注意力机制和 MLP。它使用批归一化层对输入进行标准化,并通过 DropPath 实现随机深度的功能,以增强模型的泛化能力。

OverlapPatchEmbed 类用于将输入图像分割成重叠的补丁,并进行嵌入。它通过卷积层将输入通道转换为嵌入维度,并进行归一化处理。

LSKNet 类是整个网络的主体,负责构建不同阶段的网络结构。它根据输入参数设置不同的嵌入维度、深度和其他超参数,并在前向传播中依次通过各个阶段的嵌入、块和归一化层。

DWConv 类实现了深度卷积操作,用于特征提取。

此外,文件中还定义了 update_weight 函数,用于更新模型的权重。它会检查权重字典中的每个键是否存在于模型字典中,并且形状是否匹配。

最后,提供了两个函数 lsknet_t 和 lsknet_s,分别用于创建不同配置的 LSKNet 模型,并可以选择加载预训练权重。

在文件的最后部分,提供了一个示例代码块,展示了如何实例化 lsknet_t 模型并进行一次前向传播,输出每个阶段的特征图的尺寸。

整体来看,这个文件实现了一个复杂的深度学习模型,结合了多种先进的网络结构和技术,适用于图像分类或其他视觉任务。

10.4 utils.py
以下是代码中最核心的部分,并附上详细的中文注释:

import torch
import torch.nn.functional as F

def multi_scale_deformable_attn_pytorch(
value: torch.Tensor,
value_spatial_shapes: torch.Tensor,
sampling_locations: torch.Tensor,
attention_weights: torch.Tensor,
) -> torch.Tensor:
“”"
多尺度可变形注意力机制。

参数:
- value: 输入特征图,形状为 (bs, C, num_heads, embed_dims)
- value_spatial_shapes: 特征图的空间形状,形状为 (num_levels, 2)
- sampling_locations: 采样位置,形状为 (bs, num_queries, num_heads, num_levels, num_points, 2)
- attention_weights: 注意力权重,形状为 (bs, num_heads, num_queries, num_levels, num_points)
返回:
- output: 经过多尺度可变形注意力机制处理后的输出,形状为 (bs, num_queries, num_heads * embed_dims)
"""
bs, _, num_heads, embed_dims = value.shape  # 获取输入特征图的形状
_, num_queries, _, num_levels, num_points, _ = sampling_locations.shape  # 获取采样位置的形状
# 将输入特征图按照空间形状分割成多个特征图
value_list = value.split([H_ * W_ for H_, W_ in value_spatial_shapes], dim=1)
# 将采样位置转换到[-1, 1]范围
sampling_grids = 2 * sampling_locations - 1
sampling_value_list = []
# 遍历每个尺度的特征图
for level, (H_, W_) in enumerate(value_spatial_shapes):# 将特征图调整形状以便进行采样value_l_ = value_list[level].flatten(2).transpose(1, 2).reshape(bs * num_heads, embed_dims, H_, W_)# 调整采样网格的形状sampling_grid_l_ = sampling_grids[:, :, :, level].transpose(1, 2).flatten(0, 1)# 使用双线性插值进行特征图的采样sampling_value_l_ = F.grid_sample(value_l_, sampling_grid_l_, mode="bilinear", padding_mode="zeros", align_corners=False)sampling_value_list.append(sampling_value_l_)
# 调整注意力权重的形状
attention_weights = attention_weights.transpose(1, 2).reshape(bs * num_heads, 1, num_queries, num_levels * num_points
)
# 计算最终输出
output = ((torch.stack(sampling_value_list, dim=-2).flatten(-2) * attention_weights).sum(-1).view(bs, num_heads * embed_dims, num_queries)
)
return output.transpose(1, 2).contiguous()  # 返回形状为 (bs, num_queries, num_heads * embed_dims) 的输出

代码核心部分说明:
输入参数:

value:输入特征图,包含多个头部和嵌入维度。
value_spatial_shapes:特征图的空间形状,指示每个尺度的高度和宽度。
sampling_locations:用于采样的空间位置。
attention_weights:每个查询对应的注意力权重。
处理流程:

将输入特征图分割为多个尺度的特征图。
将采样位置转换为[-1, 1]范围,以适应grid_sample函数。
对每个尺度的特征图进行采样,使用双线性插值。
计算加权后的采样特征图,并生成最终输出。
输出:

返回经过多尺度可变形注意力机制处理后的特征图,形状为 (bs, num_queries, num_heads * embed_dims)。
这个程序文件 utils.py 是一个用于实现一些常用功能的模块,主要与深度学习和计算机视觉中的多尺度可变形注意力机制相关。代码中使用了 PyTorch 库,包含了一些初始化、数学运算和注意力机制的实现。

首先,文件导入了一些必要的库,包括 copy、math、numpy 和 torch,以及 PyTorch 的神经网络模块和功能模块。接着,定义了一个 all 列表,指定了模块中可导出的公共接口。

_get_clones 函数用于创建一个给定模块的克隆列表。它接受一个模块和一个整数 n,返回一个包含 n 个克隆模块的 ModuleList,这在构建具有多个相同层的网络时非常有用。

bias_init_with_prob 函数用于根据给定的先验概率初始化卷积或全连接层的偏置值。它使用了对数几率的公式,将概率转换为偏置值,以便在训练过程中更好地引导模型。

linear_init 函数用于初始化线性模块的权重和偏置。它根据模块的权重形状计算一个边界值,并使用均匀分布初始化权重和偏置,这有助于模型的收敛。

inverse_sigmoid 函数计算给定张量的反 sigmoid 函数。它首先将输入张量限制在 [0, 1] 的范围内,然后通过对数运算计算反 sigmoid 值,这在某些模型中用于梯度反向传播时的计算。

multi_scale_deformable_attn_pytorch 函数实现了多尺度可变形注意力机制。它接受多个输入参数,包括值张量、空间形状、采样位置和注意力权重。函数首先对输入进行形状处理,然后使用 F.grid_sample 函数进行双线性插值,从而根据采样位置获取相应的值。最后,通过加权求和的方式计算输出,返回经过处理的张量。

总体来说,这个模块提供了一些基础的工具和函数,旨在支持深度学习模型中复杂的注意力机制,尤其是在处理多尺度特征时的应用。

源码文件

在这里插入图片描述

源码获取

欢迎大家点赞、收藏、关注、评论啦 、查看获取联系方式

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

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

相关文章

2025 最新工业开关厂家推荐排行榜:电感式 / 电容式 / 光电开关等优质国产企业权威甄选环形接近开关/磁感应式接近开关/限位开关/红外开关/接近开关/磁性开关/光电开关公司推荐

引言 在智能制造深度落地与国产化替代加速推进的当下,开关作为工业自动化、安全防护、消费电子等领域的核心基础部件,其品质稳定性、技术适配性与服务响应速度直接决定生产效率与产品可靠性。当前市场中,开关品牌数…

TradingAgents-CN:面向中文用户的多智能体与大模型股票分析学习平台。

TradingAgents-CN:面向中文用户的多智能体与大模型股票分析学习平台。面向中文用户的多智能体与大模型股票分析学习平台。帮助你系统化学习如何使用多智能体交易框架与 AI 大模型进行合规的股票研究与策略实验,不提供…

AI无人机助力生态智慧农田倒伏检测与防控,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型创建构建无人机航拍智慧生态农田场景下稻田作物倒伏智能化检测预警系统

AI无人机助力生态智慧农田倒伏检测与防控,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型创建构建无人机航拍智慧生态农田场景下稻田作物倒伏智能化检测预警系统2025-11-20 11:22 tlnshuju 阅读(0) 评论…

iOS代码架构

iOS 代码架构的核心目标是 解耦、可维护、可测试,避免代码写成 “大泥球”(Massive ViewController)。主流架构均围绕 “职责拆分” 设计,以下是 iOS 开发中最常用、最实用的 4 种架构,用大白话 + 代码示例 + 适用…

在Ubuntu下,通过Docker安装 Pgsql 18

pgssql 18的目录有了新的变化,需要注意将现面的标红框的内容替换为:/var/lib/postgresql/18/base 活到老,学到老。

2025年酸化水生成器优质厂家权威推荐榜单:酸水设备/酸化水机器/酸化水设备企业精选

随着医疗、食品加工等行业对消毒灭菌要求的不断提高,酸化水生成器凭借其高效、环保的特性,市场需求持续增长。作为水处理设备领域的细分产品,酸化水生成器通过电解原理生成具有杀菌作用的酸性氧化电位水,在医疗器械…

2025年度合肥电销外呼行业商家推荐榜单

摘要 在数字化营销转型的浪潮下,电销外呼系统依然是金融、教育、企业客服服务等行业触达客户最直接、最高效的手段。然而,随着外呼行业规范化发展,“高频封号”、“接通率低”的问题已成为制约外呼行业增长的痛点。…

P19_神经网络-非线性激活

P19_神经网络-非线性激活19.1打开pytorch官网 1.打开torch.nn-Non-linear Activations-ReLU 可见:ReLU当输入为正值时输出为自身,当输入为负值时输出为0。2.打开torch.nn-Non-linear Activations-Sigmoid Sigmoid是连…

2025年系统门窗隔热条/国标隔热条/隔热条厂家实力前十排行榜

随着建筑节能标准的不断提升,系统门窗隔热条行业在2025年迎来快速发展期。本文基于市场调研数据、用户口碑评价和技术参数对比,为您呈现2025年系统门窗隔热条品牌综合排名。本排行榜由行业专家团队从产品质量、技术创…

基于全变差的压缩感知视频图像重构算法

基于全变差(Total Variation, TV)的压缩感知视频图像重构算法一、算法原理与数学模型 1. 压缩感知基础框架\(Φ∈RMN\):测量矩阵(压缩比\(M/N<1\)) \(D\):二维差分矩阵(TV正则化项) \(λ\):正则化参数(控…

数据说话,节能落地:MyEMS 开源系统,让能源消耗可视化、优化可执行

在 “双碳” 目标深化推进的当下,企业、园区、公共建筑等主体的能源管理正从 “粗放式减排” 向 “精细化降本” 转型。然而,多数能源管理者仍面临共性痛点:能耗数据分散在电表、水表、燃气表等不同设备中,难以整合…

解码标杆营销逻辑,纷享管理服务实战课圆满落幕

近日,纷享销客在北京举办的“打造所向披靡的营销铁军”专项实战培训圆满结束。来自各个领域的企业决策者、营销负责人等精英齐聚一堂,通过系统学习与深度研讨,破解营销增长难题,共探体系化作战新路径。 本次培训由…

2025年国内烘干设备实力厂家口碑推荐排行榜:四川蜀冷冷暖设备领跑

摘要 随着农产品加工行业对节能环保需求的不断提升,热泵烘干设备市场迎来快速发展。2025年国内烘干设备厂家技术竞争愈发激烈,本文基于市场调研数据和技术参数评测,为您呈现当前市面上最具实力的烘干设备厂家排行榜…

2025企业级ITSM产品推荐:年度IT服务管理升级指南

【企业ITSM产品选型指南】2025年主流ITSM解决方案测评显示,燕千云等6大平台各具优势。核心建议:优先选择能支撑AIOps转型、满足安全合规要求且具备长期平台价值的解决方案,如燕千云等适配中国企业需求的平台。面对日…

2025年11月网架/钢结构/光伏支架钢管厂家TOP10:江苏华力钢管登顶

摘要 随着我国基建投资的持续增长和装配式建筑的普及,网架钢结构行业在2025年迎来新一轮发展机遇。本文基于行业数据、技术实力、客户口碑等多维度评估,为您呈现当前网架品牌综合排名,并为有采购需求的用户提供详细…

2025年评价高的高承重静音阻尼轨道厂家推荐及选购指南

2025年评价高的高承重静音阻尼轨道厂家推荐及选购指南行业背景与市场趋势随着现代家居和办公空间对功能性、舒适性和美观性要求的不断提高,高承重静音阻尼轨道作为高端家具五金的核心部件,市场需求呈现稳定增长态势。…

2025年国内烘干设备厂家排行榜:四川蜀冷冷暖设备领跑行业

摘要 随着国家对节能减排政策的持续推进和农业现代化需求的不断提升,2025年国内烘干设备行业迎来新一轮发展机遇。本文基于市场调研数据和技术评测结果,对当前市面上主流烘干设备厂家进行综合排名分析,为有采购需求…

2025 年 11 月宣传片拍摄团队最新推荐榜:北京通州宣传片拍摄、宣传片剪辑、宣传片制作、产品宣传片、企业宣传片拍摄团队推荐

引言 在品牌竞争全球化的当下,宣传片作为视觉传播核心载体,对企业塑造形象、传递价值的作用愈发关键。但当前行业存在设备落后、创意同质化、服务不规范等问题,导致企业资源浪费且难以达成传播目标。 为助力企业精准…

MyEMS:开源基因 能源智慧,为各类场景定制高效节能管理方案

在 “双碳” 目标引领全球能源转型、企业面临能耗成本攀升与环保压力双重挑战的当下,传统能源管理模式的 “粗放化、封闭化、同质化” 短板日益凸显 —— 数据孤岛导致能耗节点难追溯、封闭系统限制功能拓展、通用方案…

性能压测 并发用户数 与 吞吐量、错误率之间的关系 - BKY007

并发用户数:是指模拟用户实际去 请求的用户数量,模拟每个人去操作。 吞吐量:可以是 流量 也 可以是业务量。 持续时间1分钟 10个用户并发,按每秒1个线程数来计算 请求数= 10用户60分钟1个线程= 600次请求。 吞…