YOLOv11改进大全:从卷积层到检测头,全方位提升目标检测性能

 

## 1 引言

YOLO(You Only Look Once)系列作为目标检测领域的重要算法,以其**高效推理**和**良好精度**赢得了广泛认可。2024年9月,Ultralytics团队正式发布了YOLOv11,在先前版本基础上引入了**多项架构改进**和**训练优化**,实现了更高的精度和效率。本文将深入探讨YOLOv11的各种改进策略,涵盖卷积层、轻量化设计、注意力机制、损失函数、Backbone、SPPF模块、Neck层和检测头等全方位改进方案。

本文将结合代码示例和实战经验,帮助读者理解如何根据具体任务选择合适的改进策略,全面提升YOLOv11在目标检测任务中的表现。

## 2 YOLOv11基础概述

YOLOv11继承了YOLO系列的核心优势,同时引入了多项创新设计:

```yaml
# YOLOv11基础配置示例
# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants
n: [0.50, 0.25, 1024]  # summary: 319 layers, 2624080 parameters
s: [0.50, 0.50, 1024]  # summary: 319 layers, 9458752 parameters
m: [0.50, 1.00, 512]   # summary: 409 layers, 20114688 parameters

# YOLO11n backbone
backbone:
- [-1, 1, Conv, [64, 3, 2]]   # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
- [-1, 2, C3k2, [256, False, 0.25]]
- [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
- [-1, 2, C3k2, [512, False, 0.25]]
```

YOLOv11的主要创新包括:**增强的特征提取能力**、**优化的效率和速度**、**更少的参数实现更高的精度**(YOLOv11m比YOLOv8m参数少22%但精度更高)、**跨环境适应性**以及**支持多种计算机视觉任务**。

## 3 卷积层改进策略

卷积层是YOLOv11的基础组成部分,改进卷积层能直接提升特征提取能力。

### 3.1 部分卷积(PConv)

```python
import torch
import torch.nn as nn
import torch.nn.functional as F

class PConv(nn.Module):
"""
CVPR-2023 部分卷积PConv
轻量化卷积,降低内存占用
引用:https://developer.aliyun.com/article/1652191
"""
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
super(PConv, self).__init__()
# 主要分支卷积
self.main_conv = nn.Conv2d(
in_channels, out_channels, kernel_size, 
stride, padding, bias=False
)
# 轻量分支卷积
self.light_conv = nn.Sequential(
nn.Conv2d(in_channels, in_channels//4, 1, bias=False),
nn.BatchNorm2d(in_channels//4),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels//4, in_channels//4, kernel_size, 
stride, padding, groups=in_channels//4, bias=False),
nn.BatchNorm2d(in_channels//4),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels//4, out_channels, 1, bias=False)
)
self.bn = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
x_main = self.main_conv(x)
x_light = self.light_conv(x)
return self.relu(self.bn(x_main + x_light))

# 使用示例
# model = PConv(64, 128)
```

PConv通过**分离主要和轻量分支**,在保持特征提取能力的同时显著**降低计算复杂度和内存占用**,特别适合移动端部署。

### 3.2 动态蛇形卷积(Dynamic Snake Convolution)

```python
class DynamicSnakeConv(nn.Module):
"""
ICCV-2023 动态蛇形卷积
改进C3k2模块,增强对曲折边缘的感知能力
引用:https://developer.aliyun.com/article/1652191
"""
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
super(DynamicSnakeConv, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
self.attention = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(out_channels, out_channels//4, 1),
nn.ReLU(inplace=True),
nn.Conv2d(out_channels//4, out_channels, 1),
nn.Sigmoid()
)

def forward(self, x):
x = self.conv(x)
attention_weights = self.attention(x)
return x * attention_weights

# 替换C3k2中的Bottleneck
class C3k2WithSnakeConv(nn.Module):
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
super().__init__()
c_ = int(c2 * e)
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c1, c_, 1, 1)
self.m = nn.Sequential(
*(DynamicSnakeConv(c_, c_) for _ in range(n))
)
self.cv3 = Conv(2 * c_, c2, 1)

def forward(self, x):
return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))
```

动态蛇形卷积通过**可变形卷积机制**增强模型对**不规则形状物体**的感知能力,特别适用于生物医学图像或复杂自然环境中的目标检测。

## 4 轻量化改进策略

模型轻量化是实际应用中的关键需求,特别是在边缘设备上。

### 4.1 EfficientNet骨干网络替换

```python
from efficientnet_pytorch import EfficientNet

class EfficientNetBackbone(nn.Module):
"""
替换骨干网络为EfficientNet v1
高效的移动倒置瓶颈结构
引用:https://developer.aliyun.com/article/1650949
"""
def __init__(self, variant='efficientnet-b0', out_indices=[3, 5, 7]):
super().__init__()
# 加载预训练EfficientNet
self.model = EfficientNet.from_pretrained(variant)
self.out_indices = out_indices
self.out_channels = [self.model._blocks[i]._project_conv.out_channels 
for i in out_indices]

def forward(self, x):
results = []
# EfficientNet的前向传播
x = self.model._swish(self.model._bn0(self.model._conv_stem(x)))

for idx, block in enumerate(self.model._blocks):
x = block(x)
if idx in self.out_indices:
results.append(x)

return results

# 使用示例
# backbone = EfficientNetBackbone('efficientnet-b0')
# print(f"输出通道数: {backbone.out_channels}")
```

EfficientNet通过**复合缩放方法**(平衡网络宽度、深度和分辨率)实现更高效率。如表所示,使用EfficientNet替换原有骨干网络能显著降低参数量和计算量:

| 模型 | 参数量 | 计算量 | 推理速度 |
|------|--------|--------|----------|
| YOLOv11m | 20.0M | 67.6GFLOPs | 3.5ms |
| EfficientNet改进版 | 16.0M | 27.7GFLOPs | 2.1ms |

### 4.2 模型剪枝与量化

```python
import torch
import torch.nn as nn
import torch.nn.utils.prune as prune

class ModelPruner:
"""
模型剪枝工具类
减少模型参数数量,提高推理速度
"""
def __init__(self, model, prune_percentage=0.3):
self.model = model
self.prune_percentage = prune_percentage

def global_prune(self):
# 收集所有可剪枝的参数
parameters_to_prune = []
for name, module in self.model.named_modules():
if isinstance(module, (nn.Conv2d, nn.Linear)):
parameters_to_prune.append((module, 'weight'))

# 全局剪枝
prune.global_unstructured(
parameters_to_prune,
pruning_method=prune.L1Unstructured,
amount=self.prune_percentage,
)

# 永久移除剪枝的权重
for module, param_name in parameters_to_prune:
prune.remove(module, param_name)

return self.model

# 使用示例
# pruner = ModelPruner(model, prune_percentage=0.3)
# pruned_model = pruner.global_prune()
```

模型剪枝通过**移除不重要的权重连接**减少参数数量,结合**量化技术**(将FP32转换为INT8)可以进一步压缩模型大小并加速推理。

## 5 注意力机制改进

注意力机制能让模型更好地关注重要特征区域,提升检测精度。

### 5.1 EMA注意力机制

```python
class EMAAttention(nn.Module):
"""
EMA注意力模块
即插即用,提高远距离建模依赖
引用:https://developer.aliyun.com/article/1651268
"""
def __init__(self, channels, gamma=2, b=1):
super(EMAAttention, self).__init__()
self.gamma = gamma
self.b = b
# 空间注意力分支
self.spatial_attention = nn.Sequential(
nn.Conv2d(channels, channels//8, 1),
nn.ReLU(inplace=True),
nn.Conv2d(channels//8, 1, 1),
nn.Sigmoid()
)
# 通道注意力分支
self.channel_attention = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(channels, channels//8, 1),
nn.ReLU(inplace=True),
nn.Conv2d(channels//8, channels, 1),
nn.Sigmoid()
)

def forward(self, x):
# 空间注意力
spatial_weights = self.spatial_attention(x)
# 通道注意力
channel_weights = self.channel_attention(x)
# 融合注意力
attended_x = x * spatial_weights * channel_weights
return attended_x + x  # 残差连接

# 使用示例
# attention = EMAAttention(256)
# output = attention(input_tensor)
```

EMA注意力通过**并行空间和通道注意力分支**,解决了现有注意力机制中的维度缩减问题,能够为高级特征图产生更好的像素级注意力,**建模长程依赖**并嵌入精确的位置信息。

### 5.2 双向特征金字塔网络(BiFPN)

```python
class BiFPN(nn.Module):
"""
双向特征金字塔网络
高效的多尺度特征融合
"""
def __init__(self, channels, levels=5):
super(BiFPN, self).__init__()
self.levels = levels
# 上采样和下采样模块
self.upsample = nn.Upsample(scale_factor=2, mode='nearest')
self.downsample = nn.MaxPool2d(kernel_size=2, stride=2)

# 特征融合卷积
self.fusion_convs = nn.ModuleList([
nn.Sequential(
nn.Conv2d(channels, channels, 3, padding=1),
nn.BatchNorm2d(channels),
nn.ReLU(inplace=True)
) for _ in range(levels*2)
])

def forward(self, features):
# 自顶向下路径
for i in range(self.levels-1, 0, -1):
features[i-1] = features[i-1] + self.upsample(features[i])
features[i-1] = self.fusion_convs[i](features[i-1])

# 自底向上路径
for i in range(0, self.levels-1, 1):
features[i+1] = features[i+1] + self.downsample(features[i])
features[i+1] = self.fusion_convs[self.levels+i](features[i+1])

return features
```

BiFPN通过**双向信息流**(自顶向下和自底向上)实现更有效的多尺度特征融合,尤其适合处理**尺度变化大**的目标检测任务。

## 6 损失函数改进

损失函数直接影响模型的学习方向和收敛效果。

### 6.1 NWD损失函数

```python
import numpy as np
import torch
import torch.nn as nn

class NWDLoss(nn.Module):
"""
NWD损失函数,提高小目标检测精度
引用:https://developer.aliyun.com/article/1651320
"""
def __init__(self, c=5.0):
super(NWDLoss, self).__init__()
self.c = c  # 归一化常数

def forward(self, pred_boxes, target_boxes):
"""
计算NWD损失
Args:
pred_boxes: 预测框 [x, y, w, h]
target_boxes: 目标框 [x, y, w, h]
Returns:
nwd_loss: NWD损失值
"""
# 将边界框转换为高斯分布表示
pred_gaussian = self.bbox_to_gaussian(pred_boxes)
target_gaussian = self.bbox_to_gaussian(target_boxes)

# 计算Wasserstein距离
wasserstein_dist = self.calculate_wasserstein(pred_gaussian, target_gaussian)

# 计算NWD
nwd = torch.exp(-torch.sqrt(wasserstein_dist) / self.c)

# 损失为1-NWD
return 1 - nwd.mean()

def bbox_to_gaussian(self, boxes):
"""
将边界框转换为高斯分布参数
"""
x, y, w, h = boxes.unbind(dim=-1)
mean = torch.stack([x, y], dim=-1)
var = torch.stack([w**2/12, h**2/12], dim=-1)
return mean, var

def calculate_wasserstein(self, gauss1, gauss2):
"""
计算两个高斯分布之间的Wasserstein距离
"""
mean1, var1 = gauss1
mean2, var2 = gauss2

# 均值差异
mean_diff = torch.sum((mean1 - mean2)**2, dim=-1)

# 方差差异
var_diff = torch.sum((torch.sqrt(var1) - torch.sqrt(var2))**2, dim=-1)

return mean_diff + var_diff

# 使用示例
# nwd_loss = NWDLoss()
# loss = nwd_loss(pred_boxes, target_boxes)
```

NWD(Normalized Wasserstein Distance)损失通过**将边界框建模为高斯分布**并计算分布之间的距离,解决了IoU损失在小目标检测中的问题:**对微小物体的位置偏差过于敏感**、**在无重叠情况下无法提供梯度**等。

### 6.2 分类-定位任务解耦损失

```python
class TaskDecoupledLoss(nn.Module):
"""
分类-定位任务解耦损失
分别优化分类和定位任务
"""
def __init__(self, alpha=0.25, gamma=2.0, lambda_reg=1.0):
super().__init__()
self.cls_loss = nn.BCEWithLogitsLoss()
self.reg_loss = nn.SmoothL1Loss()
self.alpha = alpha
self.gamma = gamma
self.lambda_reg = lambda_reg

def forward(self, cls_pred, reg_pred, cls_target, reg_target):
# 分类损失(Focal Loss)
cls_loss = self.focal_loss(cls_pred, cls_target)

# 定位损失
reg_loss = self.reg_loss(reg_pred, reg_target)

return cls_loss + self.lambda_reg * reg_loss

def focal_loss(self, pred, target):
"""
Focal Loss,解决类别不平衡问题
"""
BCE_loss = F.binary_cross_entropy_with_logits(pred, target, reduction='none')
pt = torch.exp(-BCE_loss)
focal_loss = self.alpha * (1-pt)**self.gamma * BCE_loss
return focal_loss.mean()
```

任务解耦损失通过**独立优化分类和定位目标**,解决了传统损失函数中两个任务相互干扰的问题,尤其适合**复杂场景**中的目标检测。

## 7 Backbone与Neck改进

Backbone和Neck是目标检测器的核心组成部分,直接影响特征提取能力。

### 7.1 双Backbone架构

```python
class DoubleBackbone(nn.Module):
"""
双Backbone架构
利用双backbone提高目标检测的精度
引用:https://blog.csdn.net/qq_64693987/article/details/147400791
"""
def __init__(self, backbone1_cfg, backbone2_cfg, fusion_method='concat'):
super().__init__()
# 初始化两个不同的backbone
self.backbone1 = self.build_backbone(backbone1_cfg)
self.backbone2 = self.build_backbone(backbone2_cfg)

self.fusion_method = fusion_method
self.fusion_layer = self.build_fusion_layer(fusion_method)

def build_backbone(self, cfg):
"""根据配置构建backbone"""
if cfg['type'] == 'CSPDarknet':
return CSPDarknet(**cfg['params'])
elif cfg['type'] == 'EfficientNet':
return EfficientNetBackbone(**cfg['params'])
elif cfg['type'] == 'ConvNeXt':
return ConvNeXtBackbone(**cfg['params'])

def build_fusion_layer(self, method):
"""构建特征融合层"""
if method == 'concat':
return lambda x1, x2: torch.cat([x1, x2], dim=1)
elif method == 'add':
return lambda x1, x2: x1 + x2
elif method == 'attention':
return AttentionFusion(256)  # 假设通道数为256

def forward(self, x):
# 双分支特征提取
features1 = self.backbone1(x)
features2 = self.backbone2(x)

# 多尺度特征融合
fused_features = []
for f1, f2 in zip(features1, features2):
fused = self.fusion_layer(f1, f2)
fused_features.append(fused)

return fused_features

# 使用示例
# backbone_cfg1 = {'type': 'CSPDarknet', 'params': {'depth': 1.0, 'width': 1.0}}
# backbone_cfg2 = {'type': 'EfficientNet', 'params': {'variant': 'efficientnet-b0'}}
# double_backbone = DoubleBackbone(backbone_cfg1, backbone_cfg2, 'concat')
```

双Backbone架构通过**融合不同架构的优势**,提供更丰富的特征表示。常见组合包括:

1.  **CNN + CNN**(轻量级组合):平衡速度和精度
2.  **CNN + Transformer**(语义增强组合):结合局部和全局特征
3.  **CNN + Mamba**(状态建模组合):增强时序建模能力

### 7.2 EFC特征融合模块

```python
class EFC(nn.Module):
"""
EFC:增强层间特征相关性的轻量级特征融合策略
适用于小目标检测
引用:https://cloud.tencent.com/developer/article/2488408
"""
def __init__(self, c1, c2):
super().__init__()
self.conv1 = nn.Conv2d(c1, c2, kernel_size=1, stride=1)
self.conv2 = nn.Conv2d(c2, c2, kernel_size=1, stride=1)
self.conv4 = nn.Conv2d(c2, c2, kernel_size=1, stride=1)
self.bn = nn.BatchNorm2d(c2)
self.sigmoid = nn.Sigmoid()
self.group_num = 16
self.eps = 1e-10

# 门控机制
self.gate_generator = nn.Sequential(
nn.AdaptiveAvgPool2d((1, 1)),
nn.Conv2d(c2, c2, 1, 1),
nn.ReLU(True),
nn.Softmax(dim=1),
)

def forward(self, x1, x2):
# 分组特征关注
global_conv1 = self.conv1(x1)
bn_x = self.bn(global_conv1)
weight_1 = self.sigmoid(bn_x)

global_conv2 = self.conv2(x2)
bn_x2 = self.bn(global_conv2)
weight_2 = self.sigmoid(bn_x2)

# 全局特征融合
X_GLOBAL = global_conv1 + global_conv2
x_conv4 = self.conv4(X_GLOBAL)
X_4_sigmoid = self.sigmoid(x_conv4)
X_ = X_4_sigmoid * X_GLOBAL

# 分组交互
X_ = X_.chunk(4, dim=1)
out = []
for group_id in range(0, 4):
out_1 = self.interact(X_[group_id])
out.append(out_1)

return torch.cat(out, dim=1)
```

EFC模块通过**分组特征关注单元(GFF)** 和**多级特征重构模块(MFR)**,增强了相邻特征层之间的相关性,减少了冗余特征融合,特别适合**小目标检测**任务。

## 8 检测头改进

检测头是目标检测器的最终输出阶段,直接影响检测精度。

### 8.1 DynamicHead检测头

```python
class DynamicHead(nn.Module):
"""
DynamicHead检测头
统一处理尺度感知、空间感知和任务感知
引用:https://cloud.tencent.com/developer/article/2545621
"""
def __init__(self, in_channels, num_classes, num_anchors=3):
super().__init__()
self.in_channels = in_channels
self.num_classes = num_classes
self.num_anchors = num_anchors

# 尺度感知模块
self.scale_attention = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(in_channels, in_channels//4, 1),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels//4, in_channels, 1),
nn.Sigmoid()
)

# 空间感知模块(可变形卷积)
self.spatial_attention = nn.Sequential(
nn.Conv2d(in_channels, in_channels//4, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels//4, in_channels, 3, padding=1),
nn.Sigmoid()
)

# 任务感知模块
self.task_attention = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(in_channels, in_channels//4, 1),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels//4, in_channels*2, 1),
nn.Sigmoid()
)

# 预测层
self.cls_pred = nn.Conv2d(in_channels, num_anchors * num_classes, 1)
self.reg_pred = nn.Conv2d(in_channels, num_anchors * 4, 1)

def forward(self, x):
# 尺度感知
scale_weights = self.scale_attention(x)
x_scale = x * scale_weights

# 空间感知
spatial_weights = self.spatial_attention(x_scale)
x_spatial = x_scale * spatial_weights

# 任务感知
task_weights = self.task_attention(x_spatial)
task_weights_cls, task_weights_reg = task_weights.chunk(2, dim=1)

# 最终预测
cls_output = self.cls_pred(x_spatial * task_weights_cls)
reg_output = self.reg_pred(x_spatial * task_weights_reg)

return cls_output, reg_output
```

DynamicHead通过**统一处理尺度感知、空间感知和任务感知**三个方面,显著提升了检测头的表达能力。实验表明,这种改进能在COCO数据集上提升**1.2%-3.2%的AP值**。

## 9 综合改进实战示例

下面是一个综合多种改进策略的YOLOv11配置示例:

```yaml
# YOLOv11综合改进配置
# 引用:https://developer.aliyun.com/article/1652191

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# Backbone
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]]  # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]]     # 1-P2/4
- [-1, 3, C3k2, [128]]           # 使用改进的C3k2模块
- [-1, 1, Conv, [256, 3, 2]]     # 3-P3/8
- [-1, 6, C3k2, [256]]           # 使用改进的C3k2模块
- [-1, 1, Conv, [512, 3, 2]]     # 5-P4/16
- [-1, 9, C3k2, [512]]           # 使用改进的C3k2模块
- [-1, 1, Conv, [1024, 3, 2]]    # 7-P5/32
- [-1, 3, C3k2, [1024]]          # 使用改进的C3k2模块
- [-1, 1, SPPF, [1024, 5]]       # 9
- [-1, 1, EMAAttention, [1024]]  # 10-添加EMA注意力

# Head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]]  # cat backbone P4
- [-1, 3, C3k2, [512, False]]  # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]]  # cat backbone P3
- [-1, 3, C3k2, [256, False]]  # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]]  # cat head P4
- [-1, 3, C3k2, [512, False]]  # 19 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]]  # cat head P5
- [-1, 3, C3k2, [1024, False]]  # 22 (P5/32-large)

  - [[16, 19, 22], 1, DynamicHead, [nc]]  # 23-DynamicHead检测头
```

## 10 总结与展望

本文全面介绍了YOLOv11的各种改进策略,从卷积层到检测头,涵盖了**轻量化设计**、**注意力机制**、**损失函数优化**等多个方面。这些改进策略可以根据具体任务需求灵活组合使用,显著提升模型在目标检测任务中的性能。

未来YOLO系列的发展方向可能包括:

1.  **更强的多模态融合**:结合RGB、深度、红外等多种传感器数据
2.  **更高效的架构设计**:进一步优化计算效率,适应边缘设备部署
3.  **更智能的自动化设计**:利用NAS技术自动搜索最优架构
4.  **更广泛的任务支持**:统一支持检测、分割、跟踪等多种视觉任务

无论选择哪种改进策略,都需要根据具体任务需求和数据特性进行实验验证。建议读者从单个改进开始,逐步组合多种策略,找到最适合自己任务的方案。

> 以上代码示例仅供参考,实际使用时请根据具体需求进行调整和优化。更多详细实现请参考引用的原始文章和代码库。

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

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

相关文章

JWT全面理解

目录 一、JWT是什么 1、身份认证(最核心用途) 2、信息交换 3、授权控制 二、JWT的核心价值 三、如何理解JWT的结构和工作原理 1、三部分结构解析 2、核心工作流程 四、JWT的使用步骤 1、添加依赖 2、添加配置文件 3、创建实体类 4、创建JWT…

量子文件传输系统:简单高效的文件分享解决方案

🌐 在线体验地址:https://share-file.narutogis.com/ 📤 项目概述 量子文件传输系统是一款基于Python Flask开发的高效文件管理与分享工具,致力于提供简单、安全、可靠的文件传输解决方案。系统支持用户管理、文件上传下载、自动…

基于 GitHub Actions 的零成本自动化部署:把 Vite/Vue3 项目一键发布到 GitHub Pages 的完整实战

1. 实现自动化部署1.1. 创建 vue 项目# 1. 安装/确认 Node.js(>14) node -v # 推荐 20.x# 2. 创建项目(交互式,选 Vue3 Router 等) npm init vuelatest github-actions-demo # 创建vite项目 # 或:v…

minio 文件批量下载

MinIO 批量下载功能说明 1. 功能描述 前端勾选多个对象文件后,一次性将这些对象从 MinIO 拉取并打包成 ZIP,通过浏览器直接下载。整体特性: 支持跨桶批量下载(不同 bucket 的对象可同时下载)。服务端采用流式压缩边…

机器学习11——特征选择与稀疏学习

上一章:机器学习10——降维与度量学习 下一章:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备[TOC] 机器学习实战项目:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到…

整理python快速构建数据可视化前端的Dash库

一.Dash框架# 导入 Dash 相关库 import dash from dash import dcc, html # dcc 是 Dash 核心组件库,html 是 HTML 组件库 from typing import Generic# 创建一个 Dash 应用实例 app dash.Dash(__name__)# 定义应用的布局 app.layout html.Div(children[# 添加一…

RNN循环神经网络(一):基础RNN结构、双向RNN

RNN循环神经网络 什么是循环神经网络? 循环神经网络(Recurrent Neural Network, RNN)是一类专门用于处理序列数据的神经网络架构。与传统的前馈神经网络不同,RNN具有"记忆"能力,能够捕捉数据中的时间依赖关系…

#C语言——刷题攻略:牛客编程入门训练(十):攻克 循环控制(二),轻松拿捏!

🌟菜鸟主页:晨非辰的主页 👀学习专栏:《C语言刷题合集》 💪学习阶段:C语言方向初学者 ⏳名言欣赏:"代码行数决定你的下限,算法思维决定你的上限。" 目录 1. BC82 乘法表…

daily notes[16]

文章目录意大利语单词 **“bello”**一、核心含义二、变形规则:最重要的部分1. 当 “bello” 位于 **名词前面** 时2. 当 “bello” 位于 **名词后面** 或 **动词后面** 时三、用法总结与对比四、其他用法和常见表达references意大利语单词 “bello” 融合了 指示形…

【知识库】计算机二级python操作题(二)

文章目录基本操作题1基本操作题2基本操作题3简单应用题1简单应用题2综合应用题1基本操作题1考生文件夹下存在一个文件PY101.py,请写代码替换横线,不修改其他代码,实现以下功能,随机选择一个手机品牌屏幕输出。 # 请在...处使用一行…

Nginx 服务用户与防盗链配置

目录 Nginx 服务用户与防盗链配置 1. 隐藏版本号 1.1 配置方法 1.2 生效与验证 2. 修改当前程序账号 2.1 操作步骤 3. 缓存时间 3.1 配置方法 3.2 说明 4. 日志分割 4.1 实现方式(脚本自动分割) 5. 连接超时时间 5.1 核心超时指令&#xff0…

域格4G模块通信协议之HTTP(三):下载大文件的两种方式

域格ASR系列模块支持HTTP下载大文件,本文将提供两种方式。一、直接通过URC上报数据基础操作核心指令说明配置说明响应说明应用示例注意点二、HTTP Range分段下载核心指令说明注意点一、直接通过URC上报数据 若文件体积适中,且需要 MCU 即时处理数据&…

Android 图片 OOM 防护机制设计:大图加载、内存复用与多级缓存

1. 为什么图片加载总让 Android 开发抓狂? 图片是 Android 应用中不可或缺的元素,从用户头像到高清壁纸,从商品详情页到动态表情包,图片无处不在。然而,图片加载是内存管理的雷区,稍不留神就可能触发臭名昭著的 OutOfMemoryError(OOM)。为啥图片这么“吃内存”?原因很…

9月9日

TCP 服务器端#include <myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.108.179" //服务器IP地址 int main(int argc, const char *argv[]) {//创建一个用于连接的套接字文件描述符int sfd socket(AF_INET, SOCK_STRE…

Docker生产部署

目录 一、准备工作&#xff1a;理解 Docker 与 Spring Boot 的关系 1. Docker 是什么&#xff1f; 2. Spring Boot 为什么适合 Docker&#xff1f; 二、编写Dockerfile 三、配置管理 挂载外部配置文件 四、用 docker-compose 编排多服务 一、准备工作&#xff1a;理解 Do…

ARM 基础(3)

ARM汇编与C语言函数的相互调用及参数传递汇编调用C函数参数传递规则 前4个参数通过寄存器 R0-R3 传递&#xff0c;超出部分从右向左压栈。32位返回值存于 R0&#xff0c;64位整数用 R0 和 R1&#xff0c;浮点数通过 S0/D0 返回。示例&#xff1a;ARM汇编调用C函数.global _star…

OpenCV计算机视觉笔记合集

参考课程&#xff1a; 【黑马程序员 OpenCV入门教程】 [https://www.bilibili.com/video/BV1Fo4y1d7JL] ZZHow(ZZHow1024) 学习路线 基本的图像处理方法&#xff1a;几何变换&#xff0c;形态学变换&#xff0c;图像平滑&#xff0c;直方图操作&#xff0c;模板匹配&#…

Mybatis-12 第三方缓存-EhCache

配置文档 Ehcache配置文件ehcache.xml Java Ehcache缓存的timeToIdleSeconds和timeToLiveSeconds区别 基本介绍 1.EhCache是一个纯Java的缓存框架&#xff0c;具有快速、精干等特点 2.MyBatis有自己默认的二级缓存&#xff08;前面我们已经使用过了&#xff09;&#xff0c;…

元器件--电容器

文章目录一、技术理论  1、电容定义  2、定义式  3、单位换算  4、电容作用  5、电容特性二、组成结构  1、极板&#xff08;电极&#xff09;​​  ​​2、介质&#xff08;绝缘层&#xff09;​​  3、引线&#xff08;电极引出端&#xff09;​​  4、封装…