YOLOv5目标构建与损失计算
YOLOv5目标构建与损失计算
- YOLOv5目标构建与损失计算
- 构建目标
- 关键步骤解析:
- 计算损失
- 关键实现细节解析
- 各损失分量说明
YOLOv5目标构建与损失计算
YOLOv5作为单阶段目标检测的经典算法,其高效的检测性能离不开精心设计的训练目标构建和损失计算策略。本文将深入解析YOLOv5源码中build_targets目标构建函数和ComputeLoss损失计算类的实现原理,揭开模型优化背后的关键技术。详细代码参考 YOLOv5 Github项目代码。
构建目标
以下是添加构建训练目标代码:
def build_targets(self, p, targets):"""构建模型训练目标,从输入目标(image,class,x,y,w,h)准备损失计算所需的类别、边界框、索引和锚点Args:p (list): 模型预测输出,每个元素对应一个检测层的输出特征图targets (Tensor): 输入目标,形状为(nt, 6),每行格式为(image_idx, class, x, y, w, h)Returns:tcls (list): 每个检测层对应的目标类别tbox (list): 每个检测层对应的目标边界框(相对于网格的xywh)indices (list): 每个检测层对应的(image_idx, anchor_idx, grid_y, grid_x)anch (list): 每个检测层对应的锚框尺寸"""# 获取锚点数量和目标数量na, nt = self.na, targets.shape[0] # number of anchors, targetstcls, tbox, indices, anch = [], [], [], [] # 初始化类别、边界框、索引和锚点列表# 归一化增益,将目标坐标从归一化形式转换到网格空间gain = torch.ones(7, device=self.device) # 7维对应(image_idx, class, x, y, w, h, anchor_idx)# 创建锚点索引,形状(na, nt),用于标识每个目标对应的锚点ai = torch.arange(na, device=self.device).float().view(na, 1).repeat(1, nt)# 将目标重复na次,并添加锚点索引,形状变为(na, nt, 7)targets = torch.cat((targets.repeat(na, 1, 1), ai[..., None]), 2)# 设置网格偏移参数g = 0.5 # 偏移量阈值,用于中心点偏移判断off = torch.tensor( # 定义5种偏移量(中心+四个方向)[[0, 0], # 中心[1, 0], # 右[0, 1], # 下[-1, 0], # 左[0, -1], # 上],device=self.device,).float() * g # 应用偏移系数# 遍历每个检测层(不同尺度的特征图)for i in range(self.nl):# 获取当前层的锚点尺寸和特征图形状anchors = self.anchors[i] # 当前层锚点尺寸,形状(na, 2)shape = p[i].shape # 预测特征图形状(batch_size, anchors, grid_y, grid_x, params)# 设置归一化增益(将xywh转换到当前特征图尺度)gain[2:6] = torch.tensor(shape)[[3, 2, 3, 2]] # xyxy增益为特征图的宽高# 将目标坐标转换到当前特征图尺度t = targets * gain # 形状(na, nt, 7)if nt: # 存在目标时处理# 计算目标宽高与锚点宽高的比例r = t[..., 4:6] / anchors[:, None] # wh比例,形状(na, nt, 2)# 筛选满足宽高比例阈值的锚点(最大比例小于hyp['anchor_t'])j = torch.max(r, 1 / r).max(2)[0] < self.hyp["anchor_t"] # 形状(na, nt)t = t[j] # 过滤后的目标,形状(nt1, 7)# 计算网格偏移量gxy = t[:, 2:4] # 目标在特征图上的xy坐标,形状(nt1, 2)gxi = gain[[2, 3]] - gxy # 反向坐标(用于边界判断)# 生成偏移掩码(判断是否需要向相邻网格分配目标)j, k = ((gxy % 1 < g) & (gxy > 1)).T # 右、下方向偏移条件l, m = ((gxi % 1 < g) & (gxi > 1)).T # 左、上方向偏移条件j = torch.stack((torch.ones_like(j), j, k, l, m)) # 合并所有条件,形状(5, nt1)# 扩展目标到5个偏移位置(中心+四个方向)t = t.repeat((5, 1, 1))[j] # 形状(5, nt1, 7) -> (nt2, 7)offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j] # 对应偏移量,形状(nt2, 2)else: # 无目标时处理t = targets[0] # 取空目标offsets = 0 # 无偏移# 解包处理后的目标数据bc = t[:, :2] # (image_idx, class)gxy = t[:, 2:4] # 网格xy坐标gwh = t[:, 4:6] # 网格wh尺寸a = t[:, 6] # 锚点索引# 转换数据类型并拆分a = a.long().view(-1) # 锚点索引转为长整型(b, c) = bc.long().T # 图像索引和类别# 计算目标所在的网格坐标(考虑偏移)gij = (gxy - offsets).long()gi, gj = gij.T # 分解为x,y坐标# 将网格坐标限制在特征图范围内gj = gj.clamp_(0, shape[2] - 1)gi = gi.clamp_(0, shape[3] - 1)# 存储当前层的信息indices.append((b, a, gj, gi)) # 图像索引、锚点索引、网格y,xtbox.append(torch.cat((gxy - gij, gwh), 1)) # 相对于网格的xy和原始whanch.append(anchors[a]) # 对应的锚点尺寸tcls.append(c) # 目标类别return tcls, tbox, indices, anch
关键步骤解析:
-
锚点匹配
通过计算目标宽高与锚点宽高的比例,筛选出宽高比小于阈值anchor_t
的锚点。这确保目标被分配到最合适尺寸的锚点。 -
网格偏移处理
当目标中心靠近网格边界时(偏移量g=0.5
),将目标分配给相邻的网格。这增加了正样本数量,有助于模型学习。 -
多尺度分配
不同检测层(不同特征图尺度)处理不同大小的目标。通过gain
将归一化坐标转换到对应特征图尺度,实现多尺度训练。 -
数据格式转换
最终输出的tbox
存储相对于网格单元的坐标偏移和原始宽高,用于计算定位损失。indices
则记录目标对应的位置信息,用于从预测结果中提取对应预测值。
该函数核心思想是将每个目标分配到最合适的特征图层、网格位置和锚点尺寸,同时考虑中心点偏移以增加匹配机会,最终构建用于计算分类和定位损失的训练目标。
计算损失
以下是添加详细注释后的YOLOv5损失计算代码:
class ComputeLoss:"""计算YOLOv5模型的总损失,包含分类损失、边界框损失和置信度损失"""sort_obj_iou = False # 是否对目标IoU进行排序(默认关闭)def __init__(self, model, autobalance=False):"""初始化损失计算模块Args:model: 要计算损失的模型autobalance: 是否自动平衡各检测层的损失权重"""device = next(model.parameters()).device # 获取模型所在设备h = model.hyp # 获取超参数配置# 定义基础损失函数BCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["cls_pw"]], device=device)) # 分类损失BCEobj = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["obj_pw"]], device=device)) # 置信度损失# 标签平滑参数(正样本和负样本的平滑系数)self.cp, self.cn = smooth_BCE(eps=h.get("label_smoothing", 0.0))# Focal Loss配置(如果gamma>0则启用)g = h["fl_gamma"]if g > 0:BCEcls = FocalLoss(BCEcls, g) # 分类Focal LossBCEobj = FocalLoss(BCEobj, g) # 置信度Focal Loss# 获取模型Detect层m = de_parallel(model).model[-1] # 获取最后一个模块(Detect)# 设置各检测层的损失平衡系数(不同尺度的特征图赋予不同权重)self.balance = {3: [4.0, 1.0, 0.4]}.get(m.nl, [4.0, 1.0, 0.25, 0.06, 0.02]) # P3-P7的默认系数self.ssi = list(m.stride).index(16) if autobalance else 0 # 用于自动平衡的参考层(stride=16的层)# 存储关键参数self.BCEcls = BCEclsself.BCEobj = BCEobjself.gr = 1.0 # IoU比例系数(用于混合标签)self.hyp = hself.autobalance = autobalanceself.na = m.na # 每层的锚点数量self.nc = m.nc # 类别数量self.nl = m.nl # 检测层数量self.anchors = m.anchors # 锚点尺寸self.device = devicedef __call__(self, p, targets):"""计算总损失Args:p: 模型预测输出列表,每个元素对应一个检测层的预测结果targets: 真实标签张量,形状为(nt, 6),每行格式为(image_idx, class, x, y, w, h)Returns:(总损失, 各损失分量) 元组"""# 初始化各损失分量lcls = torch.zeros(1, device=self.device) # 分类损失lbox = torch.zeros(1, device=self.device) # 边界框损失lobj = torch.zeros(1, device=self.device) # 置信度损失# 构建训练目标(关键步骤)tcls, tbox, indices, anchors = self.build_targets(p, targets) # 获取匹配后的目标# 遍历每个检测层计算损失for i, pi in enumerate(p): # i: 层索引, pi: 该层预测结果b, a, gj, gi = indices[i] # 分解匹配结果:# b: 图片索引, a: 锚点索引# gj, gi: 网格y,x坐标tobj = torch.zeros(pi.shape[:4], dtype=pi.dtype, device=self.device) # 初始化目标置信度张量n = b.shape[0] # 当前层的目标数量if n:# 分解预测结果(使用split替代新版tensor_split以兼容旧版本)pxy, pwh, _, pcls = pi[b, a, gj, gi].split((2, 2, 1, self.nc), 1)# --------------------- 边界框回归损失计算 ---------------------# 解码预测框坐标(基于YOLOv5的改进解码方式)pxy = pxy.sigmoid() * 2 - 0.5 # 将xy预测值从(0,1)映射到(-0.5,1.5)pwh = (pwh.sigmoid() * 2) ** 2 * anchors[i] # 将wh预测值从(0,4)映射到(0,4*anchor)pbox = torch.cat((pxy, pwh), 1) # 组合成完整预测框(xywh格式)# 计算CIoU损失iou = bbox_iou(pbox, tbox[i], CIoU=True).squeeze() # 形状(n,)lbox += (1.0 - iou).mean() # 平均IoU损失# --------------------- 置信度目标生成 ---------------------iou = iou.detach().clamp(0).type(tobj.dtype) # 分离计算图并确保非负if self.sort_obj_iou: # 按IoU排序(可选)j = iou.argsort()b, a, gj, gi, iou = b[j], a[j], gj[j], gi[j], iou[j]if self.gr < 1: # 混合真实标签和预测置信度(当gr=1时完全使用预测值)iou = (1.0 - self.gr) + self.gr * ioutobj[b, a, gj, gi] = iou # 将IoU作为置信度目标# --------------------- 分类损失计算 ---------------------if self.nc > 1: # 仅当类别数>1时计算分类损失t = torch.full_like(pcls, self.cn, device=self.device) # 初始化目标为负样本t[range(n), tcls[i]] = self.cp # 设置正样本位置lcls += self.BCEcls(pcls, t) # 计算分类BCE损失# --------------------- 置信度损失计算 ---------------------obji = self.BCEobj(pi[..., 4], tobj) # 置信度损失(pi[...,4]是原始预测值)lobj += obji * self.balance[i] # 加权后的置信度损失if self.autobalance: # 自动平衡各层损失权重self.balance[i] = self.balance[i] * 0.9999 + 0.0001 / obji.detach().item()# --------------------- 损失加权与整合 ---------------------if self.autobalance: # 归一化平衡系数self.balance = [x / self.balance[self.ssi] for x in self.balance]lbox *= self.hyp["box"] # 边界框损失加权lobj *= self.hyp["obj"] # 置信度损失加权lcls *= self.hyp["cls"] # 分类损失加权bs = tobj.shape[0] # 获取batch size# 返回总损失和各损失分量(总损失乘以batch size)return (lbox + lobj + lcls) * bs, torch.cat((lbox, lobj, lcls)).detach()
关键实现细节解析
-
预测框解码
- XY坐标:通过sigmoid缩放至(0,1)后,乘以2减0.5,将中心点范围从网格中心的±0.5扩展到相邻网格(-0.5到1.5),增强对小目标的检测能力
- WH尺寸:使用sigmoid的(0,4)次方缩放,保证预测框尺寸不超过4倍锚框尺寸,避免梯度爆炸
-
损失自动平衡
- 通过
balance
数组为不同检测层分配不同权重(浅层特征权重更高) - 当
autobalance=True
时,根据各层损失动态调整权重,使各层损失贡献均衡
- 通过
-
置信度目标生成
- 使用预测框与真实框的IoU作为监督信号(
tobj
),而非固定1.0 - 引入
gr
参数(梯度比率)实现标签平滑:iou = (1.0 - gr) + gr * iou
- 使用预测框与真实框的IoU作为监督信号(
-
分类标签平滑
- 正样本标签值设为
cp
(如0.95),负样本设为cn
(如0.05) - 缓解类别不平衡问题,防止模型过度自信
- 正样本标签值设为
-
多尺度训练策略
- 不同检测层(P3-P5或P3-P7)处理不同尺度的目标
- 通过
balance
参数平衡浅层(小目标)和深层(大目标)的损失贡献
各损失分量说明
损失类型 | 计算公式 | 作用说明 |
---|---|---|
定位损失 | (1 - CIoU)均值 × hyp[‘box’] | 优化预测框的位置和尺寸准确性 |
置信度损失 | BCE(obj_pred, scaled_iou) × hyp[‘obj’] | 评估目标存在性置信度 |
分类损失 | BCE(cls_pred, smoothed_labels) × hyp[‘cls’] | 提高类别识别准确率 |
该实现通过动态目标分配、多尺度损失平衡和先进的IoU计算方式,有效提升了YOLOv5的检测性能。
相关文章:
YOLOv5目标构建与损失计算
YOLOv5目标构建与损失计算 YOLOv5目标构建与损失计算构建目标关键步骤解析: 计算损失关键实现细节解析各损失分量说明 YOLOv5目标构建与损失计算 YOLOv5作为单阶段目标检测的经典算法,其高效的检测性能离不开精心设计的训练目标构建和损失计算策略。本文…...
【Linux】ELF与动静态库的“暗黑兵法”:程序是如何跑起来的?
目录 一、什么是库? 1. C标准库(libc) 2. C标准库(libstdc) 二、静态库 1. 静态库的生成 2. 静态库的使用 三、动态库 1. 动态库的生成 2. 动态库的使用 3. 库运行的搜索路径。 (1)原因…...
【图书管理系统】用户注册系统实现详解
引言 本系统允许用户输入用户名和密码,前端通过AJAX请求将数据发送到后端,后端验证并存储用户信息,同时为每个用户创建一个专属图书表。尽管这是一个基础实现,但它展示了前后端分离开发的核心思想。博客还将讨论潜在的优化点&…...
FastDFS分布式文件系统架构学习(一)
FastDFS分布式文件系统架构学习 1. FastDFS简介 FastDFS是一个开源的轻量级分布式文件系统,由淘宝资深架构师余庆设计并开发。它专为互联网应用量身定制,特别适合以中小文件(如图片、文档、音视频等)为载体的在线服务。FastDFS不…...
Oracle 内存优化
Oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是 SGA和 PGA(process global area or private global area)。对于 SGA 区域内的内存来说,是共享的全局的。在 UNIX 上,必须为 Oracle 设置共享内存段(可以是一个或者多…...
算法题(149):矩阵消除游戏
审题: 本题需要我们找到消除矩阵行与列后可以获得的最大权值 思路: 方法一:贪心二进制枚举 这里的矩阵消除时,行与列的消除会互相影响,所以如果我们先统计所有行和列的总和,然后选择消除最大的那一行/列&am…...
AI:NLP 情感分析
💬 从零开始掌握情感分析:NLP 初学者实战指南 本文适合自然语言处理(NLP)入门者,聚焦于最热门应用之一——情感分析(Sentiment Analysis)。无论你是学生、工程师,还是数据爱好者,都可以通过本文了解情感分析的原理、方法和实现技巧。 🧠 一、什么是情感分析? 情感…...
LearnOpenGL---着色器
着色器的例子 文章目录 着色器的例子1.颜色变化的三角形2.构造三个顶点颜色不同的一个三角形 1.颜色变化的三角形 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <cmath>void framebuffer_size_callback(GLFWwindow* …...
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(一)修改顶点
几何着色器 以下是OpenGL图像管线的主要阶段: 几何着色器(Geometry Shader) 几何着色器是OpenGL管线中的一个可选阶段,位于顶点着色器和片段着色器之间。它能够动态地生成或修改图元(primitives)。 主…...
如何利用 Java 爬虫获得某书笔记详情:实战指南
在知识分享和学习的领域,许多平台提供了丰富的书籍笔记和学习资源。通过 Java 爬虫技术,我们可以高效地获取这些笔记的详细信息,以便进行进一步的分析和整理。本文将详细介绍如何利用 Java 爬虫获取某书笔记详情,并提供完整的代码…...
【关联git本地仓库,上传项目到github】
目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀!!! 1.下载git git下载地址:https://git-scm.com/downloads 下载安装后创建快捷地址:(此处比较…...
计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
NMR(N-Modular Redundancy,N 模冗余)是一种通用的容错设计架构,通过引入 N 个冗余模块(N ≥ 3 且为奇数),并采用多数投票机制,来提升系统的容错能力与可靠性。单个模块如果可靠性小于…...
配置代理服务器访问github、google
配置代理服务器访问github、google 背景与原理配置环境配置步骤云主机配置Windows客户端创建SSH隧道安装 Windows 内置 OpenSSHssh config 配置文件创建动态代理隧道 浏览器代理设置 验证浏览器访问google、githubssh 访问github 背景与原理 由于网络政策限制,中国…...
Java API学习笔记
一.类 1. String 类 不可变性:String对象创建后不可修改,每次操作返回新对象 String str "Hello"; str.length(); str.charAt(0); str.substring(1, 4); str.indexOf("l"); str.equals("hel…...
C++ map容器: 插入操作
1. map插入操作基础 map是C STL中的关联容器,存储键值对(key-value pairs)。插入元素时有四种主要方式,各有特点: 1.1 头文件与声明 #include <map> using namespace std;map<int, string> mapStu; // 键为int,值…...
Linux SSH 远程连接全攻略:从加密原理到实战配置(含图解)
一、SSH 加密体系核心理论 (一)对称加密与非对称加密对比解析 1. 加密算法分类与应用场景 类型代表算法密钥数量加密速度安全性特点典型用途对称加密AES、3DES1 个★★★★☆密钥传输风险高会话数据加密非对称加密RSA、ECC2 个★★☆☆☆公钥可公开&a…...
项目制作流程
一、使用 CRA 创建项目 npx create-react-app name 二、按照业务规范整理项目目录 (重点src目录) 三、安装插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基础路由 Router 1. 安装路由包 react-router-dom …...
ctr查看镜像
# 拉取镜像到 k8s.io 命名空间 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 验证镜像是否已下载 sudo nerdctl --namespace k8s.io images 下载镜像到k8s.io名称空间下 nerdctl --namespace k8s.io pull zookeeper:3.6.2 sudo ctr image pull --namespace k8s.io …...
【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析
【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性: 作为人工智能的核心技术之一,神经网络通过模拟人脑神经元的工作机制,成为解决复杂模式识别、预测和决策任务的利器。从图像分…...
discuz X3.5批量新建用户
<?php define(IN_DISCUZ, true); require ./source/class/class_core.php; // 确保管理员权限(可选,增加安全性)删除这一段加粗则可以直接使用. if ($_G[adminid] ! 1) { exit(Access denied. Only admin allowed.); } C::app()->…...
symfonos: 1靶场
symfonos: 1 来自 <https://www.vulnhub.com/entry/symfonos-1,322/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.252 3&…...
C# String 格式说明符
标准格式说明符数字格式说明符C 或 c:货币格式D 或 d:十进制数字格式E 或 e:科学计数法格式。F 或 f:固定点格式G 或 g:常规格式N 或 n:数字格式P 或 p:百分比格式X 或 x:十六进制格…...
Python高级特性深度解析:从熟练到精通的跃迁之路
Python高级特性深度解析:从熟练到精通的跃迁之路 引言 对于已经掌握Python基础语法的开发者而言,如何突破瓶颈进入高手行列?本文将从Python的高级特性入手,深入剖析那些能让代码更优雅、效率更高的技术点,助你完成从…...
【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等
前言 又到熟悉的前言,接到个需求,要引入高德地图api,我就记录一下,要是有帮助记得点赞、收藏、关注😁。 后续有时间会慢慢完善一些文章:(画饼时间) map组件自定义气泡、mark标记点…...
贪心、分治和回溯算法
1. 贪心算法 1.1. 贪心算法的概念 定义:在求解过程中,始终做出当前状态下看起来“最优”的选择,不回退。核心思想:每一步都选择当前最优解,期望最后得到全局最优解。 适用问题的特征: 问题可以分解成多个…...
window自带截图快捷键
Win Shift S:按此组合键后,会出现截图模式选择框,可选择矩形截图、任意形状截图、窗口截图和全屏幕截图,然后使用 “Ctrl V” 粘贴截图内容...
简单使用Slidev和PPTist
简单使用Slidev和PPTist 1 简介 前端PPT制作有很多优秀的工具包,例如:Slidev、revealjs、PPTist等,Slidev对Markdown格式支持较好,适合与大模型结合使用,选哟二次封装;revealjs适合做数据切换,…...
1.2.2
某智慧养老平台的心率监测模块目前存在数据准确性不高、异常预警响应慢等问题,影响了老年人健康监测的体验和服务质量。作为人工智能训练师,你需要结合业务知识和人工智能技术,对该模块进行优化设计与实现。 (1)列出心…...
LeeCode 101.对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 提示: 树中节点数目在范围 [1, 1000] 内-100 < Node.val < 100 进阶:你可以运用递归和迭代两种方法解决这个问题吗? 答案 && 测试代码: #include &…...
面向GIS的Android studio移动开发(二)--在地图上绘制电子围栏
电子围栏,校园跑的常客,也是定位打卡必不可少的东西 主要代码: 创建电子围栏代码 // 添加多边形地理围栏(兼容2023版SDK)private void addPolygon(String fenceName, List<LatLng> points) {if (points null…...
《从零开始:Spring Cloud Eureka 配置与服务注册全流程》
关于Eureka的学习,主要学习如何搭建Eureka,将order-service和product-service都注册到Eureka。 1.为什么使用Eureka? 我在实现一个查询订单功能时,希望可以根据订单中productId去获取对应商品的详细信息,但是产品服务和订单服…...
能力验证及大练兵活动第一期
计算机 请根据计算机检材,回答以下问题: (10道题,共19.0分) 1. 计算机中曾挂载的Bitlocker加密分区的恢复密钥后6位为?(答案格式:6位数字) (1.0分) 答案:700755 2. 请写出曾远程连…...
TASK03【Datawhale 组队学习】搭建向量知识库
文章目录 向量及向量知识库词向量与向量向量数据库 数据处理数据清洗文档分割 搭建并使用向量数据库 向量及向量知识库 词向量与向量 词向量(word embedding)是一种以单词为单位将每个单词转化为实数向量的技术。词向量背后的主要想理念是相似或相关的…...
ProfibusDP转ModbusRTU的实用攻略
ProfibusDP转ModbusRTU的实用攻略 在工业自动化领域中,Profibus DP和Modbus RTU是两种常见的通信协议。 Profibus DP是一种广泛应用于过程控制和工厂自动化的现场总线标准,具有高实时性和可靠性。 而Modbus RTU则是一种串行通信协议,常用于…...
基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究
摘要:本文探讨在去中心化商业趋势下,开源AI智能名片链动21模式S2B2C商城小程序源码如何助力企业挖掘数据价值、打破信息孤岛,实现商业高效扩散。通过分析该技术组合的架构与功能,结合实际案例,揭示其在用户关系拓展、流…...
iOS 工厂模式
iOS 工厂模式 文章目录 iOS 工厂模式前言工厂模式简单工厂案例场景分析苹果类优点缺点 小结 工厂模式客户端调用**优点****缺点** 抽象工厂模式三个模式对比 前言 笔者之前学习了有关于设计模式的六大原则,之前简单了解过这个工厂模式,今天主要是重新学习一下这个模式,正式系统…...
LaTeX OCR - 数学公式识别系统
文章目录 一、关于 LaTeX OCR1、项目概览架构图2、相关链接资源3、功能特性 二、安装配置基础环境要求Linux 安装Mac 安装 三、使用指南1、快速训练(小数据集)2、完整训练(大数据集) 四、可视化功能训练过程可视化预测过程可视化 …...
Go 语言即时通讯系统开发日志-日志day2-5:架构设计与日志封装
Go语言即时通讯系统开发日志day2 计划:学习go中MySQL,Redis的使用,使用MySQL和Redis完成一个单聊demo。 总结:现在每天下午用来开发这个项目,如果有课的话可能学习时间只有3-4个小时,再加上今天的学习效率不…...
@JsonProperty和@JSONField 使用
JsonProperty和JSONField注解的区别 1.底层框架不同 JsonProperty 是Jackson实现的 JSONField 是fastjson实现的 2.用法不同 (1)bean序列化为Json: JsonProperty: ObjectMapper().writeValueAsString(Object value) JSONField&…...
从代码学习深度学习 - 近似训练 PyTorch版
文章目录 前言负采样 (Negative Sampling)层序Softmax (Hierarchical Softmax)代码示例总结前言 在自然语言处理(NLP)领域,词嵌入(Word Embeddings)技术如Word2Vec(包括Skip-gram和CBOW模型)已经成为一项基础且强大的工具。它们能够将词语映射到低维稠密向量空间,使得…...
代码上传gitte仓库
把代码push上去就行...
系统架构设计(十四):解释器风格
概念 解释器风格是一种将程序的每个语句逐条读取并解释执行的体系结构风格。程序在运行时不会先被编译为机器码,而是动态地由解释器分析并执行其语义。 典型应用:Python 解释器、JavaScript 引擎、Bash Shell、SQL 引擎。 组成结构 解释器风格系统的…...
掌握LINQ:查询语法与方法语法全解析
文章目录 引言1. 查询语法 vs 方法语法1.1 查询语法 (Query Syntax)1.2 方法语法 (Method Syntax)1.3 两种语法的比较 2. 基本的 LINQ 查询结构2.1 数据源2.2 查询操作2.3 查询执行 3. 查询表达式中的关键字3.1 基本关键字fromwhereselectorderbygroup byjoin 3.2 其他常用关键…...
Go 后端中双 token 的实现模板
下面是一个典型的 Go 后端双 Token 认证机制 实现模板,使用 Gin 框架 JWT Redis,结构清晰、可拓展,适合实战开发。 项目结构建议 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 从请求…...
GESP编程能力等级认证C++3级1-数组1
1 GESP编程能力等级认证C3级 1.1 GESP简介 GESP是CCF 编程能力等级认证的简称,它为青少年计算机和编程学习者提供学业能力验证的规则和平台。GESP 覆盖中小学阶段,符合年龄条件的青少年均可参加认证。 1.2 GESP的分级 C 编程测试划分为一至八级&…...
FreeRTOS “探究任务调度机制魅力”
引入 现如今随着单片机的资源越来越多,主频越来越高,在面临更复杂的功能实现以及对MCU性能的充分压榨,会RTOS已经成为一个必要的技能,新手刚开始学习的时候就很好奇“为什么代码可以放到两个循环里同时运行?”。接下来…...
BGP策略实验练习
要求: 1、使用PreVal策略,确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略,确保R4通过R3到达192.168.11.0/24 3、配置MED策略,确保R4到达R3到达192.168.11.0/24 4、使用Local Preference策略,确保R1通过R2到达192…...
Office 中 VBE 的共同特点与区别
1. Excel VBE 核心对象 #mermaid-svg-IklDO11Hu656bdGS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IklDO11Hu656bdGS .error-icon{fill:#552222;}#mermaid-svg-IklDO11Hu656bdGS .error-text{fill:#552222;stro…...
Linux虚拟文件系统(1)
1 虚拟文件系统(VFS) 虚拟文件系统(Virtual File System, VFS)作为内核的子系统。,它为用户空间的应用程序提供了一个统一的文件系统接口。通过VFS,不同的文件系统可以共存于同一个操作系统中,…...
目标检测评估指标mAP详解:原理与代码
目标检测评估指标mAP详解:原理与代码 目标检测评估指标mAP详解:原理与代码一、前言:为什么需要mAP?二、核心概念解析2.1 PR曲线(Precision-Recall Curve)2.2 AP计算原理 三、代码实现详解3.1 核心函数ap_pe…...