YOLOv2训练详细实践指南

1. YOLOv2架构与原理详解

1.1 核心改进点

YOLOv2相比YOLOv1的主要改进:

  • 采用Darknet-19作为backbone(相比VGG更高效)
  • 引入Batch Normalization提高稳定性与收敛速度
  • 使用anchor boxes机制代替直接预测边界框
  • 引入维度聚类确定anchor boxes尺寸
  • 使用passthrough层融合高分辨率特征
  • 支持多尺度训练适应不同输入尺寸
  • 采用新的分类树结构支持更多类别识别

1.2 检测原理

YOLOv2将图像划分为S×S网格,每个网格预测B个边界框,每个边界框包含5+C个预测值:

  • 边界框中心坐标(x,y):相对于网格单元归一化值
  • 宽高(w,h):相对于整个图像的归一化值
  • 置信度:预测框包含物体的概率与IoU乘积
  • C个类别概率:条件类别概率

1.3 损失函数详解

YOLOv2的损失函数包含以下组成部分:

  • 边界框位置损失(坐标和尺寸回归)
  • 置信度损失(有无物体的二分类)
  • 分类损失(条件类别预测)

损失函数表达式:

 

Loss = λcoord * 位置损失 + 置信度损失 + λclass * 分类损失

其中:

  • 位置损失使用均方误差(对w和h应用平方根变换)
  • 分类损失使用交叉熵
  • λcoord通常设为5,λclass通常设为1

2. 环境与数据准备(详细步骤)

2.1 环境配置详解

Darknet框架安装
 

bash

# 克隆Darknet仓库
git clone https://github.com/AlexeyAB/darknet.git
cd darknet# 修改Makefile启用GPU和CUDNN
# 修改这些参数为1: GPU=1, CUDNN=1, OPENCV=1# 编译
make
PyTorch实现安装
 

bash

# 安装依赖
pip install torch torchvision
git clone https://github.com/eriklindernoren/PyTorch-YOLOv3.git  # 很多PyTorch实现兼容YOLOv2
cd PyTorch-YOLOv3
pip install -r requirements.txt

2.2 数据准备流程

数据标注

使用标注工具如LabelImg、CVAT等进行标注,导出YOLO格式:

 

<class_id> <x_center> <y_center> <width> <height>
数据集结构
 

dataset/
├── images/
│   ├── train/
│   ├── valid/
│   └── test/
├── labels/
│   ├── train/
│   ├── valid/
│   └── test/
├── train.txt  # 包含训练图像的绝对路径
├── valid.txt  # 包含验证图像的绝对路径
├── test.txt   # 包含测试图像的绝对路径
└── classes.names  # 类别名称列表
生成路径文件脚本
 

python

import os
import globimage_dir = "dataset/images/train"
with open("train.txt", "w") as f:for img_path in glob.glob(os.path.join(image_dir, "*.jpg")):f.write(os.path.abspath(img_path) + "\n")
配置文件创建

创建obj.data文件:

 

classes = 20  # 类别数量
train = data/train.txt
valid = data/valid.txt
names = data/obj.names
backup = backup/

创建obj.names文件(包含所有类别名称,每行一个):

 

person
car
dog
...

2.3 数据增强详细配置

在配置文件中设置增强参数
 

# 在.cfg文件中设置数据增强参数
angle = 0          # 旋转角度范围
saturation = 1.5   # 饱和度调整系数
exposure = 1.5     # 曝光调整系数
hue = .1           # 色调调整系数
jitter = .3        # 随机抖动
flip = 1           # 启用水平翻转
自定义数据增强策略(PyTorch实现)
 

python

def augment_image(img, labels):# 随机水平翻转if random.random() < 0.5:img = img.flip(-1)if labels is not None:labels[:, 1] = 1 - labels[:, 1]  # 调整x坐标# 颜色抖动hue_shift = np.random.uniform(-0.1, 0.1)sat_shift = np.random.uniform(0.8, 1.2)val_shift = np.random.uniform(0.8, 1.2)# 随机尺度变化# 随机裁剪# 平移# 等更多增强操作...return img, labels

3. YOLOv2网络配置详解

3.1 完整.cfg文件示例与解析

 

ini

[net]
# 训练参数
batch=64
subdivisions=8
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation=1.5
exposure=1.5
hue=.1learning_rate=0.001
burn_in=1000
max_batches=500000
policy=steps
steps=400000,450000
scales=.1,.1# 输入处理
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky# 降采样
[maxpool]
size=2
stride=2# Darknet-19 骨干网络
# ...省略中间层...# 检测层配置
[convolutional]
filters=1024
size=3
stride=1
pad=1
activation=leaky[convolutional]
size=1
stride=1
pad=1
filters=125  # (4+1+20)*5=125,5个anchor,20个类别
activation=linear[region]
anchors = 1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071
bias_match=1
classes=20
coords=4
num=5
softmax=1
jitter=.3
rescore=1nms_kind=greedynms
nms_thresh=0.45

3.2 关键参数详细解析

输入配置
  • width/height: 训练输入尺寸,常见配置有416×416, 608×608等
  • channels: 输入通道数,通常为3(RGB)
  • angle/saturation/exposure/hue: 数据增强参数
训练参数
  • batch: 每次迭代的样本数,受GPU显存限制
  • subdivisions: 将一个batch分成几部分处理,解决显存不足问题
  • learning_rate: 初始学习率
  • burn_in: warm-up训练的迭代次数
  • max_batches: 最大训练迭代次数
  • steps/scales: 学习率衰减的节点和系数
网络结构参数
  • batch_normalize: 是否使用BN层
  • filters: 卷积核数量
  • size: 卷积核尺寸
  • stride: 卷积步长
  • pad: 是否进行padding
  • activation: 激活函数类型(leaky/linear/logistic等)
检测层参数
  • anchors: 预定义的anchor boxes尺寸
  • classes: 类别数量
  • num: anchor box数量
  • jitter: 数据增强中的随机扰动系数
  • nms_thresh: 非极大值抑制阈值

3.3 自定义配置文件生成

如果有特殊需求,可以修改现有配置文件:

 

bash

# 复制并修改现有配置文件
cp cfg/yolov2.cfg cfg/yolov2-custom.cfg# 修改关键参数
# 1. 修改[net]部分的批次大小、学习率等
# 2. 修改最后一个卷积层的filters=(classes + 5) * num
# 3. 修改[region]部分的classes数量
# 4. 根据K-means结果修改anchors值

4. 训练过程详解

4.1 预训练与迁移学习详细步骤

 

bash

# 下载预训练权重
wget https://pjreddie.com/media/files/darknet19_448.conv.23# 使用预训练权重开始训练
./darknet detector train data/obj.data cfg/yolov2-custom.cfg darknet19_448.conv.23# 或使用PyTorch实现
python train.py --data_config config/custom.data --pretrained_weights weights/darknet19_448.conv.23 --cfg config/yolov2-custom.cfg

迁移学习策略:

  1. 冻结Darknet-19 backbone的前15层
  2. 仅训练检测层3-5个epoch
  3. 解冻全部网络进行训练

冻结层PyTorch代码示例:

 

python

# 冻结backbone部分
for i, (name, param) in enumerate(model.named_parameters()):if i < 45:  # 前15层卷积层(每层包含conv+bn+leaky_relu)param.requires_grad = False

4.2 学习率策略详解

Warmup策略

在开始训练时使用较小学习率,逐渐增加到初始设定值:

 

burn_in=1000  # 前1000次迭代使用warmup

在这1000次迭代中,学习率会从接近0逐渐增加到设定的0.001

阶段性衰减
 

policy=steps
steps=400000,450000  # 在这些迭代次数时调整学习率
scales=.1,.1  # 学习率衰减系数

上述配置表示:

  • 0-400000迭代:使用初始学习率0.001
  • 400000-450000迭代:学习率变为0.0001
  • 450000以后:学习率变为0.00001
余弦退火策略(PyTorch实现)
 

python

def cosine_annealing_lr(optimizer, epoch, max_epoch, init_lr=0.001, min_lr=0.00001):"""余弦退火学习率调整"""cosine_lr = min_lr + 0.5 * (init_lr - min_lr) * (1 + np.cos(np.pi * epoch / max_epoch))for param_group in optimizer.param_groups:param_group['lr'] = cosine_lrreturn cosine_lr

4.3 多尺度训练实现

在Darknet中开启多尺度训练:

 

random=1  # 启用多尺度训练

多尺度训练的PyTorch实现:

 

python

def multi_scale_training(images, targets, min_size=320, max_size=608, step=32):# 每10个批次随机改变输入尺寸if iteration % 10 == 0:random_size = random.randrange(min_size, max_size + 1, step)model.module.img_size = random_size# 调整图像尺寸images = F.interpolate(images, size=model.module.img_size, mode="bilinear", align_corners=False)return images, targets

4.4 训练监控与可视化

TensorBoard集成(PyTorch实现)
 

python

from torch.utils.tensorboard import SummaryWriter# 初始化TensorBoard
writer = SummaryWriter(log_dir="logs")# 在训练循环中记录
def train():for epoch in range(epochs):# 训练一个epoch# ...# 记录损失和指标writer.add_scalar("Loss/train", train_loss, epoch)writer.add_scalar("mAP", mAP, epoch)writer.add_scalar("Recall", recall, epoch)# 可视化模型预测结果if epoch % 10 == 0:writer.add_images("Predictions", plot_predictions(model, val_loader), epoch)
实时训练图表(Darknet)

Darknet框架会自动生成训练曲线图。可以通过以下命令查看实时训练状态:

 

bash

# 训练时开启图形化显示
./darknet detector train data/obj.data cfg/yolov2-custom.cfg darknet19_448.conv.23 -map

5. Anchor Boxes优化详解

5.1 K-means聚类计算最优anchor

 

bash

# 使用Darknet内置工具
./darknet detector calc_anchors data/obj.data -num_of_clusters 5 -width 416 -height 416

PyTorch实现K-means聚类:

 

python

def kmeans_anchors(dataset, n_anchors=5, img_size=416):"""使用K-means计算最优anchor boxes"""# 收集所有标注框的宽高比wh = []for _, labels in dataset:if labels.size(0) == 0:continuewh.append(labels[:, 3:5] * img_size)  # 转换为像素尺寸wh = torch.cat(wh, 0)# K-means聚类from scipy.cluster.vq import kmeanscentroids, _ = kmeans(wh.numpy(), n_anchors)# 排序并返回anchors = torch.from_numpy(centroids).float()anchors = anchors.sort(dim=0)[0]return anchors

5.2 Anchor Boxes配置调优

基于聚类结果,可以根据不同的检测需求进行进一步优化:

  1. 目标大小分布分析:统计目标框大小分布,确保anchor覆盖常见尺寸
  2. IoU阈值调整:计算聚类anchor与原始边界框的平均IoU,确保满足最低IoU要求(通常>0.5)
  3. 宽高比分析:确保anchor boxes覆盖各种常见的宽高比

优化后的anchors通常按从小到大排序,并在配置文件中更新:

 

# 在.cfg文件中更新
[region]
anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828

计算anchors与数据集的匹配度:

 

python

def calc_anchors_iou(dataset, anchors):"""计算anchors与实际边界框的平均IoU"""ious = []for _, labels in dataset:if labels.size(0) == 0:continuewh = labels[:, 3:5]  # 宽高for box in wh:# 计算与每个anchor的IoUbox_area = box[0] * box[1]anchor_area = anchors[:, 0] * anchors[:, 1]inter_w = torch.min(box[0], anchors[:, 0])inter_h = torch.min(box[1], anchors[:, 1])inter_area = inter_w * inter_hiou = inter_area / (box_area + anchor_area - inter_area)# 记录与最佳anchor的IoUious.append(iou.max().item())# 平均IoUreturn sum(ious) / len(ious)

6. 高级训练技巧详解

6.1 Focal Loss实现(解决类别不平衡)

 

python

def focal_loss(pred, target, gamma=2.0, alpha=0.25):"""Focal Loss实现pred: 预测值 [B,C]target: 目标值 [B]"""# 计算交叉熵ce_loss = F.cross_entropy(pred, target, reduction='none')# 计算ptpt = torch.exp(-ce_loss)# 计算focal lossfocal_loss = alpha * (1 - pt) ** gamma * ce_lossreturn focal_loss.mean()

应用Focal Loss替代常规分类损失:

 

python

# 在YOLOv2损失函数中替换类别损失部分
class_loss = focal_loss(pred_cls, target_cls, gamma=2.0)

6.2 标签平滑技术详解

 

python

def label_smoothing(target, classes, epsilon=0.1):"""标签平滑target: 原始one-hot标签 [B,C]epsilon: 平滑系数"""# 平滑后的值smooth_target = (1 - epsilon) * target + epsilon / classesreturn smooth_target

应用标签平滑:

 

python

# 原始标签转one-hot
target_one_hot = F.one_hot(target, num_classes)# 应用标签平滑
smooth_target = label_smoothing(target_one_hot, num_classes, epsilon=0.1)# 计算交叉熵损失
loss = -torch.sum(smooth_target * torch.log(pred), dim=1).mean()

6.3 混合精度训练实现

PyTorch实现混合精度训练:

 

python

# 导入Apex库
from apex import amp# 初始化模型和优化器
model = YOLOv2(...)
optimizer = torch.optim.SGD(...)# 将模型和优化器转换为混合精度
model, optimizer = amp.initialize(model, optimizer, opt_level="O1")# 训练循环中
def train():# 前向传播outputs = model(images)loss = compute_loss(outputs, targets)# 反向传播with amp.scale_loss(loss, optimizer) as scaled_loss:scaled_loss.backward()optimizer.step()

6.4 梯度累积技术(解决小批量问题)

 

python

def train_with_gradient_accumulation(dataloader, model, optimizer, accumulation_steps=2):"""梯度累积训练accumulation_steps: 累积的步数"""model.train()optimizer.zero_grad()for i, (images, targets) in enumerate(dataloader):# 前向传播outputs = model(images)loss = compute_loss(outputs, targets)# 损失缩放(除以累积步数)loss = loss / accumulation_steps# 反向传播loss.backward()# 每accumulation_steps步更新一次参数if (i + 1) % accumulation_steps == 0:optimizer.step()optimizer.zero_grad()

6.5 在线难例挖掘(OHEM)实现

 

python

def online_hard_example_mining(losses, batch_size, hard_ratio=0.7):"""在线难例挖掘losses: 每个样本的损失 [batch_size]hard_ratio: 难例比例"""# 计算要保留的难例数量num_hard = int(batch_size * hard_ratio)# 对损失排序_, indices = losses.sort(descending=True)# 创建掩码,标记难例hard_mask = torch.zeros_like(losses, dtype=torch.bool)hard_mask[indices[:num_hard]] = Truereturn hard_mask# 在训练循环中使用
def train_with_ohem():# 计算每个样本的损失(不求平均)loss_per_sample = compute_loss_per_sample(outputs, targets)# 应用OHEMhard_mask = online_hard_example_mining(loss_per_sample, batch_size)# 只对难例计算平均损失final_loss = loss_per_sample[hard_mask].mean()# 反向传播final_loss.backward()

7. 常见问题详细解决方案

7.1 训练不稳定问题

当训练过程中出现损失值波动大或NaN值时:

  1. 梯度爆炸处理
 

python

def clip_gradients(model, max_norm=10.0):"""梯度裁剪"""torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm)
  1. 学习率调整
 

python

# 降低初始学习率
learning_rate = 0.0005  # 从0.001降至0.0005# 增加warmup迭代次数
burn_in = 2000  # 从1000增至2000
  1. 批量归一化问题处理
 

python

# 增加BN层的eps参数
bn_layer = nn.BatchNorm2d(num_features, eps=1e-5)  # 默认为1e-5# 使用更合适的动量参数
bn_layer = nn.BatchNorm2d(num_features, momentum=0.01)  # 默认为0.1

7.2 过拟合详细解决方案

  1. 数据增强增强版
 

python

# 更激进的数据增强
transforms = Compose([RandomRotate(10),           # 随机旋转±10度RandomHSV(0.1, 0.5, 0.5),   # 颜色抖动增强RandomTranslate(0.2),       # 随机平移图像RandomScale(0.2),           # 随机缩放RandomErasing(p=0.5),       # 随机擦除RandomMixUp(dataset, alpha=0.2),  # MixUp增强Normalize()                 # 标准化
])
  1. 正则化组合
 

python

# L2正则化
weight_decay = 0.0005# Dropout层
dropout_layer = nn.Dropout(0.5)# 特征层增加dropout
def forward(self, x):# 提取特征features = self.backbone(x)# 在特征提取和检测头之间添加dropoutif self.training:features = self.dropout(features)# 检测头detections = self.detection_head(features)return detections
  1. 早停机制详细实现
 

python

def train_with_early_stopping(model, train_loader, val_loader, patience=10):"""早停训练patience: 容忍验证集性能不提升的轮数"""best_map = 0no_improve_epochs = 0for epoch in range(max_epochs):# 训练一个epochtrain_one_epoch(model, train_loader)# 在验证集上评估current_map = validate(model, val_loader)# 检查是否有改进if current_map > best_map:best_map = current_mapno_improve_epochs = 0# 保存最佳模型save_checkpoint(model, 'best_model.pth')else:no_improve_epochs += 1# 早停检查if no_improve_epochs >= patience:print(f"Early stopping at epoch {epoch}")break

7.3 欠拟合详细解决方案

  1. 增加网络容量
 

python

# 在配置文件中增加卷积层数量或滤波器数量
# 例如将Darknet-19扩展为Darknet-53# 例如增加卷积层滤波器数量
[convolutional]
filters=512  # 从256增加到512
size=3
stride=1
pad=1
activation=leaky
  1. 减小正则化强度
 

python

# 减小权重衰减
weight_decay = 0.0002  # 从0.0005减小到0.0002# 减少Dropout比例
dropout_layer = nn.Dropout(0.3)  # 从0.5减少到0.3
  1. 增加学习率
 

python

# 适当增加学习率
learning_rate = 0.002  # 从0.001增加到0.002# 使用循环学习率
def cyclic_learning_rate(optimizer, epoch, base_lr=0.001, max_lr=0.005, cycle_len=10):"""循环学习率"""cycle = np.floor(1 + epoch / cycle_len)x = np.abs(epoch / cycle_len - 2 * cycle + 1)lr = base_lr + (max_lr - base_lr) * max(0, 1 - x)for param_group in optimizer.param_groups:param_group['lr'] = lrreturn lr

8. 评估与部署详解

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

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

相关文章

详解如何复现DeepSeek R1:从零开始利用Python构建

DeepSeek R1 的整个训练过程&#xff0c;说白了就是在其基础模型&#xff08;也就是 deepseek V3&#xff09;之上&#xff0c;用各种不同的强化学习方法来“雕琢”它。 咱们从一个小小的本地运行的基础模型开始&#xff0c;一边跟着 DeepSeek R1 技术报告 的步骤&#xff0c;…

MCP Server 开发实战 | 大模型无缝对接 Grafana

前言 随着大模型的飞速发展&#xff0c;越来越多的 AI 创新颠覆了过往很多产品的使用体验。但你是否曾想过&#xff0c;在向大型语言模型提问时&#xff0c;它能否根据你的需求精准返回系统中的对应数据&#xff1f;例如&#xff0c;当用户查询 Grafana 服务时&#xff0c;模型…

块存储、文件存储和对象存储的特点、应用场景及区别

块存储、文件存储和对象存储的特点、应用场景及区别 块存储 特点&#xff1a;块存储将数据分割成固定大小的块&#xff0c;每个块都有唯一的标识符。数据以块为单位进行读写操作&#xff0c;适合需要高性能和低延迟的场景。 应用场景&#xff1a;数据库存储、虚拟机磁盘、高性能…

OpenCv--换脸

引言 在当今数字化时代&#xff0c;图像处理技术的发展日新月异。换脸技术作为其中一项极具趣味性和挑战性的应用&#xff0c;吸引了众多开发者和爱好者的目光。OpenCV 作为一款强大的开源计算机视觉库&#xff0c;为我们实现换脸提供了丰富的工具和方法。本文将深入探讨如何使…

安卓基础(SQLite)

基础 import sqlite3# 连接到数据库 conn sqlite3.connect(mydatabase.db) cursor conn.cursor()# 执行查询 cursor.execute("SELECT * FROM users") rows cursor.fetchall()for row in rows:print(row)# 关闭连接 conn.close() 创建一个继承自 SQLiteOpenHelpe…

QuickAPI 核心能力解析:构建数据服务化的三位一体生态

在企业数据资产化运营的进程中&#xff0c;如何打破数据开发与共享的效率瓶颈&#xff0c;实现从 “数据可用” 到 “数据好用” 的跨越&#xff1f;麦聪软件的 QuickAPI 给出了系统性答案。作为 SQL2API 理念的标杆产品&#xff0c;QuickAPI 通过SQL 编辑器、数据 API、数据市…

《计算机视觉度量:从特征描述到深度学习》—生成式人工智能在工业检测的应用

2022 年 11 月 30 日一个很重要的标志事件就是chatgpt的出现&#xff0c;打开了生成式人工智能的开端。这也许会是一个历史性的时刻&#xff0c;今天是2025年4月&#xff0c;过去两年多&#xff0c;那个时刻目前回想还是对本人造成了冲击&#xff0c;一个完全有自主分析能力的生…

【软件测试】自动化测试框架Pytest + Selenium的使用

Pytest Selenium 是一种常见的自动化测试框架组合&#xff0c;用于编写和执行 Web 应用程序的自动化测试。Pytest 是一个强大的 Python 测试框架&#xff0c;而 Selenium 是一个用于浏览器自动化的工具&#xff0c;二者结合使用可以高效地进行 Web 应用的功能测试、UI 测试等。…

煤矿湿喷砂浆搅拌机组创新设计与关键技术研究

引言&#xff1a;湿喷工艺在煤矿支护中的革命性意义 在深部煤矿巷道支护领域&#xff0c;湿喷混凝土技术以其回弹率低&#xff08;<15%&#xff09;、粉尘浓度小&#xff08;<10mg/m&#xff09;的显著优势&#xff0c;逐步取代传统干喷工艺。作为湿喷工艺的核心设备&am…

如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权

如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权&#xff1f; 处理 ONLYOFFICE 文档服务器与 Java Web 应用之间的安全认证和授权&#xff0c;通常涉及以下几个关键步骤和技术&#xff1a; 1. JWT (JSON Web Token) 认证 启用 JWT&#xff1a; ONLYOFFICE 文档…

无参数RCE

无参数RCE&#xff08;Remote Code Execution&#xff0c;远程代码执行&#xff09; 是一种通过利用目标系统中的漏洞&#xff0c;在不直接传递用户可控参数的情况下&#xff0c;实现远程执行任意代码的攻击技术。与传统的RCE攻击不同&#xff0c;无参数RCE不依赖外部输入参数…

OL9设置oracle23ai数据库开机自启动

1、设置oracle用户的环境变量信息 [oracleOracleLinuxR9U5 ~]$vim ~/.bash_profile # Set Oracle environment variables for Oracle 23c AI export ORACLE_HOME/opt/oracle/product/23ai/dbhomeFree export ORACLE_SIDFREE export PATH$ORACLE_HOME/bin:$PATH export LD_LIB…

AI agents系列之智能体框架介绍

1. 引言 智能体AI Agents框架通过赋予自主系统动态感知、推理和行动的能力&#xff0c;彻底改变了AI领域。本节将探讨智能体框架的核心概念&#xff0c;并重点介绍为什么开源解决方案对现代AI开发的创新和可扩展性至关重要。 1.1 什么是智能体框架&#xff1f; 智能体框架代…

【数据资产入表】数据确权

&#xfeff;#数据要素[话题]#&#xfeff; &#xfeff;#数据资源盘点[话题]#&#xfeff; &#xfeff;#数据资产盘点[话题]#&#xfeff; &#xfeff;#数据资产[话题]#&#xfeff; &#xfeff;#数据资产入表[话题]#&#xfeff; &#xfeff;#数据盘点[话题]#&…

关于vxe-select得filter-method 自定义方法得使用,忽略大小写匹配

vxe-select使用模糊匹配时&#xff0c;filter-method自定义匹配方法&#xff0c;模糊忽略大小写进行匹配数据 <vxe-select v-model"marketingId":options"marketingOptions"transfer clearable placeholder"市场"filterable :filter-method&…

AIDL 中如何传递 Parcelable 对象

目录 1. 直接在 AIDL 中定义 Parcelable 对象2. 自定义 Parcelable 对象的传递3. 以 Rect 类为例的 Parcelable 实现4. 注意安全性5. 小结1. 直接在 AIDL 中定义 Parcelable 对象 背景说明 从 Android 10(API 级别 29)开始,AIDL 允许直接在 .aidl 文件中定义 Parcelable 对…

【LangChain核心组件】Retrieval(检索)模块

在AI技术日新月异的今天&#xff0c;大型语言模型&#xff08;LLM&#xff09;的局限性也逐渐显现——它们无法有效处理特定领域知识和用户私有数据。这正是检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;技术崛起的根本原因。作为当前最…

Java使用WebSocket视频拆帧进度处理与拆帧图片推送,结合Apipost进行调试

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>Configuration public class WebSocketConfig {/*** 启动 WebSocket 服务器*/Beanpublic ServerEndpointE…

XSS攻击(反射型、存储型、dom型、PDF、SWF、SVG)

一、XSS攻击是什么 XSS是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中 Web 里面的脚本代码会被执行&#xff0c;从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。 二、XSS分类 反射型XSS 常见情况是…

vue + element-plus自定义表单验证(修改密码业务)

写一个vue组件Password.vue 没有表单验证只有3个表单项 <template><div><el-form><el-form-item label"旧密码"><el-input></el-input></el-form-item><el-form-item label"新密码"><el-input>&l…