目标检测篇---R-CNN梳理
目标检测系列文章
第一章 R-CNN
目录
- 目标检测系列文章
- 📄 论文标题
- 🧠 论文逻辑梳理
- 1. 引言部分梳理 (动机与思想)
- 📝 三句话总结
- 🔍 方法逻辑梳理
- 🚀 关键创新点
- 🔗 方法流程图
- 补充
- 边界框回归 (BBR)
- 1. BBR 的目标与核心思想
- 2. BBR 实现细节
- 输入 (Input)
- 目标变换 (Target Transformation)
- 模型 (Model)
- 训练 (Training)
- 推理/应用 (Inference/Application)
- 3. 关键疑问解答
- Q1: 为什么预测“变换” ( t ∗ t_* t∗) 而不是直接预测坐标 ( G x , G y , G w , G h G_x, G_y, G_w, G_h Gx,Gy,Gw,Gh)?
- Q2: 边界框回归器权重 w ∗ \mathbf{w}_* w∗ 是什么以及如何工作?
- Q3: 为什么还要单独训练一个SVM用作分类器呢?直接把CNN网络微调最后一层分类成21类(1类背景)作为分类器不更直接么
- 一些常见技术:
- 难例挖掘 (Hard Negative Mining):
- 非极大值抑制 Non-Maximum Suppression:
📄 论文标题
R-CNN: Rich feature hierarchies for accurate object detection and semantic segmentation (CVPR 2014)
作者:Ross Girshick ;Jeff Donahue;Trevor Darrell;Jitendra Malik
团队:UC Berkeley
🧠 论文逻辑梳理
1. 引言部分梳理 (动机与思想)
| Aspect | Description (Motivation / Core Idea) |
|---|---|
| 问题背景 (Problem) | 2012 年之前,基于传统手工特征(如 SIFT, HOG)结合机器学习模型(如 SVM, DPM)的目标检测方法性能趋于饱和,遇到了瓶颈。 |
| 机遇 (Opportunity) | 与此同时,深度卷积神经网络 (CNN) 在大规模图像分类任务(如 ImageNet LSVRC)上取得了突破性进展,展现了强大的特征学习和表达能力。 |
| 挑战 (Challenge) | 如何将 CNN 强大的分类能力有效地应用于需要精确定位的目标检测任务?CNN 通常处理固定大小的输入图像,而检测需要在图像不同位置识别不同大小的物体。 |
| 核心思想 (Core Idea) | “Regions with CNN features” (R-CNN):将目标检测任务分解为两个阶段:首先使用某种机制(如 Selective Search)生成与类别无关的候选区域 (Region Proposals),然后对每个区域独立地使用 CNN 提取特征并进行分类和位置修正。 |
| 核心假设 (Hypothesis) | 应用深度 CNN 从候选区域中提取的丰富、有层次的特征,将显著提升目标检测的准确率,远超传统方法。 |
📝 三句话总结
| 方面 | 内容 |
|---|---|
| ❓发现的老问题 |
|
| 💡提出的新方法 (R-CNN) |
|
| ⚡新方法的局限性 |
|
🔍 方法逻辑梳理
R-CNN 本身不是一个单一的端到端模型,而是一个处理流水线 (Pipeline)。
-
模型输入:
- 一张
RGB图像。
- 一张
-
处理流程:
- 候选区域生成 (Region Proposal - 外部模块):
- 输入: 原始图像。
- 处理: 运行
Selective Search算法。 - 输出: 约 2000 个候选区域的坐标 [ P 1 , P 2 , . . . , P 2 k ] [P_1, P_2, ..., P_{2k}] [P1,P2,...,P2k]。
- 特征提取 (CNN Feature Extractor):
- 输入: 图像和所有候选区域 P i P_i Pi。
- 处理 (Encoder 角色):
- 对每个 P i P_i Pi,从原图中裁剪出对应区域的图像块。
- 将图像块强制
变形 (warp)到 CNN 输入尺寸 (e.g., 227x227)。 - 将变形后的图像块送入微调后的
AlexNet进行前向传播。 - 提取特定层的激活值作为特征(如
pool5层特征 ϕ p o o l 5 ( P i ) \phi_{pool5}(P_i) ϕpool5(Pi) 或fc7层 4096 维向量 ϕ f c 7 ( P i ) \phi_{fc7}(P_i) ϕfc7(Pi) )。
- 输出: 每个候选区域 P i P_i Pi 对应的高维特征向量 ϕ ( P i ) \phi(P_i) ϕ(Pi)。
- 分类 (Classifier - SVMs):
- 输入: 特征向量 ϕ f c 7 ( P i ) \phi_{fc7}(P_i) ϕfc7(Pi)。
- 处理: 将特征向量输入到 N + 1 N+1 N+1 个(N 个物体类别 +
1 个背景类别)独立训练好的线性SVM中。 - 输出: P i P_i Pi 属于每个类别的置信度得分。
- 定位精修 (Localizer - BBRs):
- 输入:
pool5特征向量 ϕ p o o l 5 ( P i ) \phi_{pool5}(P_i) ϕpool5(Pi)(对于被SVM判为非背景的 P i P_i Pi)。 - 处理: 根据 P i P_i Pi 被判定的类别 c c c,使用该类别专属的
BBR线性模型,基于 ϕ p o o l 5 ( P i ) \phi_{pool5}(P_i) ϕpool5(Pi) 预测一个 ( d x , d y , d w , d h ) (d_x, d_y, d_w, d_h) (dx,dy,dw,dh) 变换。 - 输出: 经过变换修正后的更精确的边界框 G ^ i \hat{G}_i G^i。
- 输入:
- 后处理 (Post-processing - NMS):
- 输入: 所有带有类别、分数和(可能修正后)边界框的候选区域。
- 处理: 对每个类别,应用非极大值抑制 (
NMS) 算法,去除重叠度高且分数较低的冗余检测框。 - 输出: 最终的检测结果列表,每个结果包含类别、置信度和最终边界框。
- 候选区域生成 (Region Proposal - 外部模块):
-
模型输出:
- 图像中检测到的物体列表,每个物体包含:类别标签、置信度分数、精修后的边界框坐标。
-
训练过程 (Multi-stage):
- CNN 微调 (Fine-tuning):
- 使用
ImageNet预训练的AlexNet作为起点。 - 用目标检测数据集中的
warped region proposals进行微调。将与真实物体IoU> 0.5 的 proposal 视为对应类别的正样本,其余视为负样本(背景)。最后一层替换为 N+1 路 Softmax。
- 使用
- SVM 训练:
- 使用微调后的 CNN 提取所有 proposals 的
fc7特征并存盘。 - 对每个类别,训练一个二元线性
SVM。使用真实边界框作为正样本,与所有真实物体IoU< 0.3的 proposals 作为负样本。使用难例挖掘 (Hard Negative Mining)。
- 使用微调后的 CNN 提取所有 proposals 的
- BBR 训练:
- 对每个类别,筛选出与该类某个真实边界框
IoU较高的 proposals P P P。 - 提取这些 P P P 的
pool5特征 ϕ p o o l 5 ( P ) \phi_{pool5}(P) ϕpool5(P)。 - 训练线性回归模型,预测从 P P P 到其对应真实边界框 G G G 的变换参数 ( t x , t y , t w , t h ) (t_x, t_y, t_w, t_h) (tx,ty,tw,th)。
- 对每个类别,筛选出与该类某个真实边界框
- CNN 微调 (Fine-tuning):
🚀 关键创新点
-
创新点 1: CNN 特征用于检测 (CNN Features for Detection)
- 为什么要这样做? 传统手工特征表达能力有限,无法很好地应对物体的多样性。CNN 被证明能学习到更鲁棒、更具判别力的层次化特征。
- 不用它会怎样? 检测精度会停留在 DPM 等方法的水平,难以大幅提升,无法充分利用深度学习带来的红利。
-
创新点 2: 区域提议 + CNN 结合 (Region Proposals + CNN)
- 为什么要这样做? CNN 需要固定尺寸输入,而检测需要在图像各处定位物体。区域提议提供了物体可能位置的“候选”,将检测问题转化为对大量候选区域的“分类”问题,使得 CNN 可以被应用。
- 不用它会怎样? 如果直接在整图上用 CNN 滑窗,计算量巨大且难以处理不同尺寸和长宽比的物体;如果直接让 CNN 输出坐标,在当时的技术条件下难以实现精确且鲁棒的定位。这种结合是当时应用 CNN 进行检测的关键桥梁。
-
创新点 3: 迁移学习 (Transfer Learning: Pre-training + Fine-tuning)
- 为什么要这样做? 目标检测数据集通常比大型分类数据集(如
ImageNet)小得多。直接在小数据集上训练深度 CNN 容易过拟合。预训练让模型学习通用的视觉模式,微调则使其适应特定检测任务。 - 不用它会怎样? 在有限的检测数据上从头训练深度 CNN 效果会差很多,难以收敛到好的性能,无法有效利用
ImageNet等大规模数据集蕴含的知识。
- 为什么要这样做? 目标检测数据集通常比大型分类数据集(如
-
创新点 4: 边界框回归 (Bounding Box Regression)
- 为什么要这样做?
Selective Search等区域提议方法产生的候选框定位通常不够精确。 - 不用它会怎样? 检测框的定位精度会受限于区域提议的质量,即使分类正确,框的位置也可能不够准,导致在需要高
IoU匹配的应用或评估指标下性能下降。BBR进一步提升了定位精度。
- 为什么要这样做?
总而言之,R-CNN 通过巧妙地结合区域提议和强大的 CNN 特征,并利用迁移学习,成功地将深度学习引入目标检测领域,极大地提升了检测精度,开启了后续一系列基于深度学习的检测算法(Fast R-CNN, Faster R-CNN 等)的发展。
🔗 方法流程图

补充
边界框回归 (BBR)

1. BBR 的目标与核心思想
- 目标: 解决由
Selective Search等方法产生的候选区域框 P P P (Proposal) 定位不够精确的问题。【相当于有了先验候选区域P,进一步利用先验】 - 核心思想: 学习一个映射关系,根据从候选区域 P P P 提取的 CNN 特征,预测出将 P P P 调整到更接近真实边界框 G G G (Ground Truth) 所需的变换参数,从而得到一个更精确的预测框 G ^ \hat{G} G^
2. BBR 实现细节
输入 (Input)
- 候选区域框 P = ( P x , P y , P w , P h ) P = (P_x, P_y, P_w, P_h) P=(Px,Py,Pw,Ph),其中 ( P x , P y ) (P_x, P_y) (Px,Py) 是中心坐标, P w , P h P_w, P_h Pw,Ph 是宽高。
- 从该区域提取的 CNN 特征向量,R-CNN 中特指
pool5层特征 ϕ 5 ( P ) \phi_5(P) ϕ5(P)。
目标变换 (Target Transformation)
BBR 不直接预测 G G G 的坐标,而是预测从 P P P 到 G G G 的相对变换量 t ∗ t_* t∗ ( ∗ * ∗ 代表 x , y , w , h x, y, w, h x,y,w,h):
- t x = ( G x − P x ) / P w t_x = (G_x - P_x) / P_w tx=(Gx−Px)/Pw (中心 x 平移量,宽度归一化)
- t y = ( G y − P y ) / P h t_y = (G_y - P_y) / P_h ty=(Gy−Py)/Ph (中心 y 平移量,高度归一化)
- t w = log ( G w / P w ) t_w = \log(G_w / P_w) tw=log(Gw/Pw) (宽度对数缩放)
- t h = log ( G h / P h ) t_h = \log(G_h / P_h) th=log(Gh/Ph) (高度对数缩放)
这些 t ∗ t_* t∗ 是模型训练时的真实标签。
模型 (Model)
- 对每个物体类别训练一组独立的线性回归模型。
- 模型以
pool5特征 ϕ 5 ( P ) \phi_5(P) ϕ5(P) 为输入,预测变换参数 d ∗ ( P ) d_*(P) d∗(P):
d ∗ ( P ) = w ∗ T ϕ 5 ( P ) d_*(P) = \mathbf{w}_*^T \phi_5(P) d∗(P)=w∗Tϕ5(P)
其中 w ∗ \mathbf{w}_* w∗ 是对应类别、对应变换维度 ( ∗ ) (*) (∗) 的学习到的权重向量。
训练 (Training)
- 数据选择: 只选用与某个真实框 G G G 重叠度高 (e.g., I o U ≥ 0.6 IoU \ge 0.6 IoU≥0.6) 的候选框 P P P 进行训练。
- 标签计算: 对每个训练样本 ( P i , G i ) (P^i, G^i) (Pi,Gi),计算真实的变换目标 t ∗ i t_*^i t∗i。
- 模型学习: 使用带 L 2 L_2 L2 正则化的最小二乘法 (岭回归) 寻找最优权重 w ∗ \mathbf{w}_* w∗,最小化预测误差:
w ∗ = arg min w ^ ∗ ∑ i = 1 N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2 + λ ∥ w ^ ∗ ∥ 2 \mathbf{w}_* = \arg\min_{\hat{\mathbf{w}}_*} \sum_{i=1}^N (t_*^i - \hat{\mathbf{w}}_*^T \phi_5(P^i))^2 + \lambda \|\hat{\mathbf{w}}_*\|^2 w∗=argw^∗mini=1∑N(t∗i−w^∗Tϕ5(Pi))2+λ∥w^∗∥2
推理/应用 (Inference/Application)
- 对于一个通过 SVM 分类器判定为某类别 c c c 的候选框 P P P,提取其 ϕ 5 ( P ) \phi_5(P) ϕ5(P) 特征。
- 使用该类别 c c c 对应的已训练好的权重 w ∗ c \mathbf{w}_*^c w∗c 预测变换参数 d ∗ ( P ) d_*(P) d∗(P):
d x ( P ) = ( w x c ) T ϕ 5 ( P ) d_x(P) = (\mathbf{w}_x^c)^T \phi_5(P) dx(P)=(wxc)Tϕ5(P), d y ( P ) = ( w y c ) T ϕ 5 ( P ) d_y(P) = (\mathbf{w}_y^c)^T \phi_5(P) dy(P)=(wyc)Tϕ5(P), … - 将预测的变换 d ∗ ( P ) d_*(P) d∗(P) 应用于原始框 P P P,得到修正后的预测框 G ^ = ( G ^ x , G ^ y , G ^ w , G ^ h ) \hat{G} = (\hat{G}_x, \hat{G}_y, \hat{G}_w, \hat{G}_h) G^=(G^x,G^y,G^w,G^h):
- G ^ x = P w d x ( P ) + P x \hat{G}_x = P_w d_x(P) + P_x G^x=Pwdx(P)+Px
- G ^ y = P h d y ( P ) + P y \hat{G}_y = P_h d_y(P) + P_y G^y=Phdy(P)+Py
- G ^ w = P w exp ( d w ( P ) ) \hat{G}_w = P_w \exp(d_w(P)) G^w=Pwexp(dw(P))
- G ^ h = P h exp ( d h ( P ) ) \hat{G}_h = P_h \exp(d_h(P)) G^h=Phexp(dh(P))
3. 关键疑问解答
Q1: 为什么预测“变换” ( t ∗ t_* t∗) 而不是直接预测坐标 ( G x , G y , G w , G h G_x, G_y, G_w, G_h Gx,Gy,Gw,Gh)?
- 简化学习任务: 预测相对的、归一化的“微调量”比预测绝对坐标更容易学习,尤其是对于线性模型。模型只需关注如何根据特征修正当前的 P P P。
- 尺度不变性: 变换 t ∗ t_* t∗ 的定义(归一化平移、对数缩放)使得
学习目标对物体的大小和位置不敏感,模型更鲁棒。例如,无论 P P P 大小如何,只要物体中心在 P P P 中心右侧 10% 宽度处, t x t_x tx 就大约是 0.1。 - 避免困难的绝对映射: 直接预测绝对坐标需要模型处理非常大的输出范围,对输入特征的微小变化可能导致输出剧烈变化,学习不稳定。预测变换将问题约束在一个更合理、更易于学习的空间。
- 利用 P 的信息: 预测变换显式地
利用了候选框 $P$ 作为“起点”或“参考点”。【先验】
再提一点,预测“变换” ($t_*$) 是根据损失函数来定义的:
w ∗ = arg min w ^ ∗ ∑ i = 1 N ( t ∗ i − w ^ ∗ T ϕ 5 ( P i ) ) 2 + λ ∥ w ^ ∗ ∥ 2 \mathbf{w}_* = \arg\min_{\hat{\mathbf{w}}_*} \sum_{i=1}^N (t_*^i - \hat{\mathbf{w}}_*^T \phi_5(P^i))^2 + \lambda \|\hat{\mathbf{w}}_*\|^2 w∗=argw^∗mini=1∑N(t∗i−w^∗Tϕ5(Pi))2+λ∥w^∗∥2
Q2: 边界框回归器权重 w ∗ \mathbf{w}_* w∗ 是什么以及如何工作?
- 来源: 权重向量 w ∗ \mathbf{w}_* w∗ 不是预设的,而是通过监督学习训练得到的。训练过程通过最小化预测变换 d ∗ d_* d∗ 与真实目标变换 t ∗ t_* t∗ 之间的误差(如上述岭回归损失函数),找到最优的 w ∗ \mathbf{w}_* w∗ 数值。
- 本质: w ∗ \mathbf{w}_* w∗ 是线性回归模型的核心参数。对于特定类别、特定变换维度(如“猫”类别的 x 变换),就有一组对应的权重 w x c a t \mathbf{w}_x^{cat} wxcat。
- 作用机制: 通过点积运算 ( d ∗ ( P ) = w ∗ T ϕ 5 ( P ) d_*(P) = \mathbf{w}_*^T \phi_5(P) d∗(P)=w∗Tϕ5(P)) 实现。这个运算本质上是一个加权求和:
d ∗ ( P ) = ∑ j = 1 K w j f j d_*(P) = \sum_{j=1}^K w_j f_j d∗(P)=j=1∑Kwjfj
其中 f j f_j fj 是 ϕ 5 ( P ) \phi_5(P) ϕ5(P) 特征向量的第 j j j 维, w j w_j wj 是 w ∗ \mathbf{w}_* w∗ 向量的第 j j j 个权重。 - 意义: 每个权重 w j w_j wj 代表了第 j j j 个 CNN 特征 f j f_j fj 对于预测该特定变换 d ∗ d_* d∗ 的重要性和影响方向。训练好的 w ∗ \mathbf{w}_* w∗ 编码了从数据中学到的知识:即哪些视觉特征模式(体现在 ϕ 5 ( P ) \phi_5(P) ϕ5(P) 中)指示了需要对边界框进行何种几何调整。它将高维的特征向量“翻译”成一个代表调整量的标量值。
Q3: 为什么还要单独训练一个SVM用作分类器呢?直接把CNN网络微调最后一层分类成21类(1类背景)作为分类器不更直接么
-
实证性能提升: R-CNN 论文的实验结果表明,在提取了 CNN 特征(特别是 fc7 特征)之后,使用 线性 SVM 进行分类,其 mAP (mean Average Precision) 结果显著优于直接使用微调后的 CNN 的 Softmax 输出。
-
训练策略和样本定义的差异:
-
CNN微调通常相对宽松。例如,与真实边界框 IoU 大于 0.5 的候选区域就被视为对应类别的正样本,用于微调 Softmax。负样本(背景)的选择也相对简单。
-
SVM 训练,只有真实边界框本身被视为对应类别的正样本。对于负样本,作者采用了
难例挖掘 (Hard Negative Mining) 策略
一些常见技术:
难例挖掘 (Hard Negative Mining):
先用一部分负样本训练 SVM,然后将训练好的 SVM 应用到大量的、与任何真实物体 IoU 都很低的候选区域(这些都是“简单”或“潜在困难”的背景样本)上。找出那些被 SVM 错误地分为前景(即“难例” Hard Negatives)的背景样本,将这些难例加入负样本集中,重新训练 SVM。 这个过程使得 SVM 特别擅长区分那些容易与真实物体混淆的背景区域,从而提高了分类的准确性。而 CNN 微调阶段的 Softmax 通常没有经过这样专门针对难例的优化。
非极大值抑制 Non-Maximum Suppression:
对于一组指向同一物体的、相互重叠的边界框,只保留那个置信度分数最高的框,并抑制(删除)掉其他与它重叠度过高的框。

相关文章:
目标检测篇---R-CNN梳理
目标检测系列文章 第一章 R-CNN 目录 目标检测系列文章📄 论文标题🧠 论文逻辑梳理1. 引言部分梳理 (动机与思想) 📝 三句话总结🔍 方法逻辑梳理🚀 关键创新点🔗 方法流程图补充边界框回归 (BBR)1. BBR 的…...
C#处理网络传输中不完整的数据流
1、背景 在读取byte数组的场景(例如:读取文件、网络传输数据)中,特别是网络传输的场景中,非常有可能接收了不完整的byte数组,在将byte数组转换时,因字符的缺失/增多,转为乱码。如下…...
HTML 初识
段落标签 <p><!-- 段落标签 -->Lorem ipsum dolor sit amet consectetur adipisicing elit. Fugiat, voluptate iure. Obcaecati explicabo sint ipsum impedit! Dolorum omnis voluptas sint unde sed, ipsa molestiae quo sapiente quos et ad reprehenderit.&l…...
MATLAB 训练CNN模型 yolo v4
学生对小车控制提出了更好的要求,能否加入深度学习模型。 考虑到小车用matlab来做,yolo v5及以上版本都需要在pytorch下训练,还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…...
【前端】跟着maxkb学习logicflow流程图画法
文章目录 背景1. 选定学习对象-maxkb应用逻辑编排2. 确定实现框架3. 关键逻辑:查看app-node.js4. 学习开始节点绘制流程数据形式 5. 给节点增加表单输入框遇到过的问题 背景 看看前端如何绘制流程图,界面好看点。 "logicflow/core": "1.…...
数据结构-C语言版本(八)字符串
数据结构中的字符串:概念、操作与实战 第一部分 字符串的分类及常见形式 字符串是由零个或多个字符组成的有限序列,是编程中最基础也最重要的数据结构之一。 1. C语言中的字符串表示 字符数组形式 char str1[10] {H, e, l, l, o, \0};字符串字面量…...
Arduino示例代码讲解:Project 07 - Keyboard 键盘
Arduino示例代码讲解:Project 07 - Keyboard 键盘 Project 07 - Keyboard 键盘程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数读取电位器值:打印电位器值:播放音调:运行过程注意事项Project 07 - Keyboard 键盘 /*Arduino Starter Kit e…...
oracle expdp/impdp 用法详解
oracle expdp/impdp 用法详解 创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建。 create directory db_bak as d:\test\dump; 查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是…...
【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE)
【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE) 1. 漏洞描述 Apache OFBiz 是一个开源的企业资源规划(ERP)系统。它提供了一套企业应用程序,用于集成和自动化企业的许多业务流程。 这个漏洞是由于对 CVE-2023-51467 的…...
超详细VMware虚拟机扩容磁盘容量-无坑版
1.环境: 虚拟机:VMware Workstation 17 Pro-17.5.2 Linux系统:Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 (1)在虚拟机关机的状态下,虚拟机硬盘扩容之前必…...
每日一题算法——移除链表元素、反转链表
移除链表元素 力扣题目链接 我的解法: 注意细节:要删掉移除的元素。 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while(head!nullptr){if(head->valval){headhead->next;}}ListNode* nowhead head;while(n…...
全面理解Linux 系统日志:核心文件与查看方法
全文目录 1 Linux 系统日志分类及功能1.1 通用日志1.1.1 /var/log/messages1.1.2 /var/log/syslog 1.2 安全相关日志1.2.1 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)1.2.2 /var/log/audit/au…...
机器学习-08-关联规则更新
总结 本系列是机器学习课程的系列课程,主要介绍机器学习中关联规则和协同过滤。 参考 机器学习(三):Apriori算法(算法精讲) Apriori 算法 理论 重点 【手撕算法】【Apriori】关联规则Apriori原理、代码…...
Flutter与FastAPI的OSS系统实现
作者:孙嘉成 目录 一、对象存储 二、FastAPI与对象存储 2.1 缤纷云S4服务API对接与鉴权实现 2.2 RESTful接口设计与异步路由优化 三、Flutter界面与数据交互开发 3.1 应用的创建 3.2页面的搭建 3.3 文件的上传 关键词:对象存储、FastAPI、Flutte…...
Kubernetes控制平面组件:API Server详解(二)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
MySQL-锁机制3-意向共享锁与意向排它锁、死锁
文章目录 一、意向锁二、死锁应该如何避免死锁问题? 总结 一、意向锁 在表获取共享锁或者排它锁时,需要先检查该表有没有被其它事务获取过X锁,通过意向锁可以避免大量的行锁扫描,提升表获取锁的效率。意向锁是一种表级锁…...
报告系统状态的连续日期 mysql + pandas(连续值判断)
本题用到知识点:row_number(), union, date_sub(), to_timedelta()…… 目录 思路 pandas Mysql 思路 链接:报告系统状态的连续日期 思路: 判断连续性常用的一个方法,增量相同的两个列的差值是固定的。 让日期与行号 * 天数…...
pytest自动化中关于使用fixture是否影响用例的独立性
第一个问题:难道使用fixture 会影响用例独立吗? ✅ 简单回答: 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的,那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&a…...
Token与axios拦截器
目录 一、Token 详解 1. Token 的定义与作用 2. Token 的工作流程 3. Token 的优势 4. Token 的安全实践 5. JWT 结构示例 二、Axios 拦截器详解 1. 拦截器的作用 2. 请求拦截器 3. 响应拦截器 4. 拦截器常见场景 5. 移除拦截器 三、完整代码示例 四、总结 五、…...
unity3d实现物体闪烁
unity3d实现物体闪烁,代码如下: using UnityEngine;public class Test : MonoBehaviour {//创建一个常量,用来接收时间的变化值private float shake;//通过控制物体的MeshRenderer组件的开关来实现物体闪烁的效果private MeshRenderer BoxColliderClick…...
C#—Lazy<T> 类型(延迟初始化/懒加载模式)
C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类,用于实现延迟初始化(懒加载)模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象,直到第一次实际需要时才进行初始化。 主要特点 延迟初始化:…...
Spring Boot 项目启动命令解析
Spring Boot 项目启动命令参数 一、启动命令基础格式 java [JVM参数] [Spring Boot参数] -jar your-project.jar必选部分:java -jar your-project.jar 启动可执行 JAR 包。 可选部分: JVM 参数:控制 Java 虚拟机行为(如内存、垃…...
为什么 Docker 容器中有额外的目录(如 `/dev`、`/proc`、`/sys`)?及 `docker run` 详细执行过程
、当你使用 docker run 启动一个基于极简镜像(如 scratch 或手动构建的镜像)的容器时,发现容器内出现了 /dev、/proc、/sys 等目录,即使你的镜像中并未包含这些目录。这是因为 Docker 在启动容器时,会自动挂载一些必要…...
Tailwind 武林奇谈:bg-blue-400 失效,如何重拾蓝衣神功?
前言 江湖有云,Tailwind CSS,乃前端武林中的轻功秘籍。习得此技,排版如行云流水,配色似御风随形,收放自如,随心所欲。 某日,小侠你奋笔敲码,正欲施展“蓝衣神功”(bg-blue-400),让按钮怒气冲冠、蓝光满面,怎料一招使出,画面竟一片白茫茫大地真干净,毫无半点杀气…...
【Docker 运维】Java 应用在 Docker 容器中启动报错:`unable to allocate file descriptor table`
文章目录 一、根本原因二、判断与排查方法三、解决方法1、限制 Docker 容器的文件描述符上限2、在执行脚本中动态设置ulimit的值3、升级至 Java 11 四、总结 容器内执行脚本时报错如下,Java 进程异常退出: library initialization failed - unable to a…...
开始放飞之先搞个VSCode
文章目录 开始放飞之先搞个VSCode重要提醒安装VSCode下载MinGW-w64回到VSCode中去VSCode原生调试键盘问题遗留问题参考文献 开始放飞之先搞个VSCode 突然发现自己的新台式机上面连个像样的编程环境都没有,全是游戏了!!!ÿ…...
基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间,最大完工时间,最小间隙时间。 2…...
【仿Mudou库one thread per loop式并发服务器实现】SERVER服务器模块实现
SERVER服务器模块实现 1. Buffer模块2. Socket模块3. Channel模块4. Poller模块5. EventLoop模块5.1 TimerQueue模块5.2 TimeWheel整合到EventLoop5.1 EventLoop与线程结合5.2 EventLoop线程池 6. Connection模块7. Acceptor模块8. TcpServer模块 1. Buffer模块 Buffer模块&…...
基于Redis实现高并发抢券系统的数据同步方案详解
在高并发抢券系统中,我们通常会将用户的抢券结果优先写入 Redis,以保证系统响应速度和并发处理能力。但数据的最终一致性要求我们必须将这些结果最终同步到 MySQL 的持久化库中。本文将详细介绍一种基于线程池 Redis Hash 扫描的异步数据同步方案&#…...
SPL 量化 序言
序言 量化交易是通过数学模型、统计学方法和计算机技术,将市场行为转化为可执行的交易策略的自动化投资方式。其核心是通过大数据分析、机器学习和金融工程等技术,从历史数据中挖掘市场规律,预测价格趋势并生成交易信号。 量化交易的实现通…...
