当前位置: 首页 > article >正文

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

文章目录

  • 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
  • 前言
  • YOLOV1的模型结构
    • YOLOV1模型的基本执行流程
    • YOLOV1模型的网络参数
    • YOLOV1模型的训练方式
  • YOLOV1的核心思想
    • 前向传播阶段
      • 网格单元(grid cell)的概念及其作用
      • 输出结果的后处理过程以及作用
    • 反向传播阶段
  • 总结


前言

YOLOV1是由华盛顿大学的Joseph Redmon等人《You Only Look Once:
Unified, Real-Time Object Detection【CVPR-2016】》【论文地址】一文中提出的首个单阶段目标检测模型,核心思想是将目标检测转化为回归问题求解,并基于一个单独的端到端(end-to-end)网络,利用全卷积神经网络直接从整张原始图像中预测物体的位置和类别,无需生成候选区域,从而大大提高了检测速度。

传统的目标检测方法通常包括候选区域生成、特征提取、分类和边界框回归等步骤,这些步骤通常是分开进行的,导致处理速度较慢。随着深度学习技术尤其是卷积神经网络(CNN)的发展,研究人员开始尝试将CNN应用于目标检测任务中。在YOLOv1出现之前,主流的目标检测算法如R-CNN系列采用了两阶段的方法:首先生成一系列可能包含物体的候选区域(region proposals),然后对这些候选区域进行分类和边界框回归。这种方法虽然精度较高,但计算成本大、速度慢,因为它们需要对每个候选区域单独处理。


YOLOV1的模型结构

YOLOV1模型的基本执行流程

下图是博主根据原论文提供的YOLOV1模型结构重新绘制的详细结构示意图:

基本流程: 将图像reshape成448×448的图像,24个卷积层对输入图像进行特征提取生成一个7×7×1024的特征图,将这个特征图拉平后,第1个全连接层将卷积得到的分布式特征映射到样本标记空间,把输入图像的所有卷积特征整合到一起,第二个全连接层将所有神经元得到的卷积特征进行维度转换,最后reshape成7×7×30的特征图,其中包含了检测框的位置、大小、置信度以及分类条件概率。
YOLO网络借鉴了GoogLeNet,结构简单,包含卷积、池化、激活函数以及全连接层,其中使用了1x1卷积用于多通道信息融合。

YOLOV1模型的网络参数

YOLOV1网络参数: YOLOV1网络借鉴了GoogLeNet,结构简单,包含卷积、池化、激活函数以及全连接层,其中使用了1x1卷积用于多通道信息融合。除了最后一全连接层使用了线性激活函数外(可以理解成没有进行任何激活操作),其余卷积层和全连接层的激活函数为Leaky ReLU。

YOLOV1模型的训练方式

YOLOV1训练分为两个阶段:

  1. 在ImageNet分类数据集上预训练分类模型。网络模型的输入为224x224,前20层卷积层作为模型的特征提取网络,随后利用全局平均池化层进行池化操作,最后利用全连接层进行1000分类;
  2. 将分类模型调整为检测模型。将网络模型的输入调整为448x448,去除全局平均池化层,并新加入4个卷积层和2个全连接层,最后将模型的输出调整为7×7×30这样的向量大小。

在训练中使用了Dropout与数据增强方法来防止过拟合。

YOLOV1的核心思想

前向传播阶段

网格单元(grid cell)的概念及其作用

网格单元的划分: YOLOV1模型输出7×7分辨率大小的特征图,标记出输出特征图每个像素在原始图片上的对应区域,即将原始图片划分为7×7个小方格大小的图片区域块,每个区域块大小为64×64。

将原始图片划分为7×7个小方格并不是真正的将图片划分为7×7块小图像区域,只不过是输出的特征图的分辨率大小为7×7,其中每个1×1的特征像素都有对应的图像区域。

网格单元的作用: 每个grid cell预测多个边界框(YOLOV1中选择2个),预测结果包含俩部分信息:

  1. 边界框的基本信息:每个框固定包含5个元素,分别为是中心坐标x和y,检测框的宽高w和h以及对应检测框的置信度c;
  2. 多类别物体的概率值:类似于图像分类任务,根据实际的任务需求的不同,类别物体个数是不固定,因此YOLOV1最终的输出是5×2+类别物体个数,当前任务的是30=2×5+20。

当前任务的每个grid cell输出的数据维度为30×1,而7×7个方格输出的维度即为7×7×30,检查框的个数为7×7×2。

注意:这里一个grid cell只能预测一个物体类别,而不是一个检测框预测一个类别,因为俩个检测框通用(绑定)同一个多类别物体的概率值,后续的YOLO版本对其进行了改进。


网格单元边界框位置解析: 红色区域指定当前grid cell,白点表示当前grid cell左上角坐标(0,0);橙色和浅绿色代表当前grid cell的俩个边界框;橙色点和浅绿色表示这两个边界框的中心坐标,且中心坐标一定在当前grid cell内部;边界框左边和上边的不同颜色的值分别表示对应的边界框的高和宽。

坐标值是经过归一化后的值(在0-1之间),以左上坐标(0,0)的为坐标起始点参考;同样边界框的宽高也是经过归一化后的值,表示边界框的宽高相对于原始图像的宽高(448×448)的比值。


网格单元边界框置信度解析: 置信度 C C C用于评估模型预测的边界框内包含某个对象的可能性以及该边界框的准确性。
C = Pr ⁡ ( O b j e c t ) × I O U p r e d t r u t h C = \Pr (O{\rm{bject}}) \times IOU_{{\rm{pred}}}^{{\rm{truth}}} C=Pr(Object)×IOUpredtruth

  1. 包含对象的可能性 P r ( O b j e c t ) Pr (O{\rm{bject}}) Pr(Object):指的是模型对于某个边界框内存在特定对象的确信程度,反映了模型认为该边界框确实包含了某个对象的信心水平,认为在当前边界框内有一个或多个对象存在的概率。这个概率,并非指具体某个类别对象在边界框内的概率,而是任意一个类别对象在边界框内的概率,只要不是背景的;
  2. 边界框的准确性 I O U p r e d t r u t h IOU_{{\rm{pred}}}^{{\rm{truth}}} IOUpredtruth:通过计算预测边界框与真实边界框(ground truth)之间的交并比(Intersection over Union, IoU)来衡量的,IoU是介于0到1之间的值,表示两个边界框重叠面积占它们合并面积的比例。值越接近1,说明预测的边界框与真实边界框越吻合。同时在非极大值抑制计算中IOU作为其中的重要指标。

网格单元类别概率值解析: 每个小方格都会输出对应的20个类别中概率最高的类别,输出的概率利用Softmax函数进行映射,维度为20×1。20个类别个数并不是固定的,而是随任务不同而不同,只是当前博文展示的任务类别是20,

注意:如上图,边界框并不是每个相同分类的小方格拼接在一起后绘制出的总区域,而是前面提到的每个小方格单独预测的。

网格单元内容总结: 在边界框示意图中,置信度越大,边界框越粗,证明其中存在目标的可能性越大;在概率图中,标记出物体类别概率的最大的类。

到此为止,网格单元(grid cell)的所扮演的角色以及其作用已经全部讲解完成,下一步则是对网格单元的输出结果进行筛选。

输出结果的后处理过程以及作用

类别置信度筛选: 在有物体的情况下,对应类别的物体的置信度,其公式为:
C i = Pr ⁡ ( C l a s s i ∣ O b j e c t ) × Pr ⁡ ( O b j e c t ) × I O U p r e d t r u t h {C_i} = \Pr (Clas{s_i}|O{\rm{bject}}) \times \Pr (O{\rm{bject}}) \times IOU_{{\rm{pred}}}^{{\rm{truth}}} Ci=Pr(ClassiObject)×Pr(Object)×IOUpredtruth
从公式中不难理解论文作者表达的含义:置信度即表示一种自信程度,包含了边界框内有物体的自信程度、物体归属于某个类型的自信程度以及边界框将将整个物体包括进来的自信程度。下图中框上的数值表示类别置信度的值,可以通过设置类别置信度阈值,剔除一部分置信度低于阈值的边界框。

根据博主的经验,因为类别置信度和置信度的性质和作用相似,因此一般不会通过设置类别置信度阈值来筛选合格的边界框,而是直接通过设置置信度阈值就进行筛选,可以省略计算类别置信度这个步骤。

非极大值抑制筛选: NMS(Non-Maximum Suppression)主要目的是在检测到的多个重叠边界框中选择最准确的一个作为最终结果,去除多余的重叠框。每个类别的所有边界框之间单独进行互相比较,不同类别边界框之间不会互相比较,并且不同类别间是并行处理的。

以检测狗为例,NMS算法流程:

  • 得分排序:根据每个边界框的置信度得分对所有框进行排序作为候选列表;
  • 选择最高分:选取得分最高的边界框作为一个确定有效的检测结果,加入到已选列表中成为已选框,并从候选列表中移除它;
  • 抑制操作:计算所有候选框与所有已选框之间的IoU。依次取出删除候选列表中的候选框,和所有已选框进行IoU比较,假设当前候选框与某个已选框的IoU大于设定的阈值,则认为这两个框高度重合,删除得分较低的那个框,保留得分高的框在已选列表中;反之,假设当前候选框与某个已选框的IoU小于设定的阈值,则将候选框加入到已选列表中成为新的已选框。

后处理总结: 所有输出的边界框经过置信度阈值过滤和NMS过滤后得到最终确定有效的筛选结果。

反向传播阶段

损失函数: YOLOV1原论文作者提供的损失函数公式为:
L o s s = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x i ∧ ) 2 − ( y i − y i ∧ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w i ∧ ) 2 − ( h i − h i ∧ ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C i ∧ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C i ∧ ) 2 + ∑ i = 0 S 2 1 i j o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p i ∧ ( c ) ) 2 L{\rm{oss}} = {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {{x_i} - \mathop {{x_i}}\limits^ \wedge } \right)}^2} - {{\left( {{y_i} - \mathop {{y_i}}\limits^ \wedge } \right)}^2}} \right] + {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {\sqrt {{w_i}} - \sqrt {\mathop {{w_i}}\limits^ \wedge } } \right)}^2} - {{\left( {\sqrt {{h_i}} - \sqrt {\mathop {{h_i}}\limits^ \wedge } } \right)}^2}} \right] + \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} + {\lambda _{{\rm{noobj}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{noobj}}}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} + \sum\limits_{{\rm{i}} = 0}^{{S^2}} {1_{ij}^{obj}\sum\limits_{c \in classes} {{{\left( {{p_i}\left( c \right) - \mathop {{p_i}}\limits^ \wedge \left( c \right)} \right)}^2}} } Loss=λcoordi=0S2j=0B1ijobj[(xixi)2(yiyi)2]+λcoordi=0S2j=0B1ijobj (wi wi )2(hi hi )2 +i=0S2j=0B1ijobj(CiCi)2+λnoobji=0S2j=0B1ijnoobj(CiCi)2+i=0S21ijobjcclasses(pi(c)pi(c))2

  • ∑ i = 0 S 2 \sum\limits_{{\rm{i}} = 0}^{{S^2}} {} i=0S2表示遍历所有网格单元并进行累加;
  • ∑ j = 0 B \sum\limits_{{\rm{j}} = 0}^B {} j=0B表示遍历所有预测边界框并进行累加;
  • ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{obj}}}} } i=0S2j=0B1ijobj表示第 i i i个网格中第 j j j个边界框有对象时为1,否则为0;
  • ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{noobj}}}} } i=0S2j=0B1ijnoobj表示第 i i i个网格中第 j j j个边界框没有对象时为1,否则为0;
  • ∑ i = 0 S 2 1 i j o b j ∑ c ∈ c l a s s e s \sum\limits_{{\rm{i}} = 0}^{{S^2}} {1_{ij}^{obj}\sum\limits_{c \in classes} {} } i=0S21ijobjcclasses表示第 i i i个网格中有对象时为1,否则为0;
  • λ c o o r d {\lambda _{{\rm{coord}}}} λcoord λ n o o b j {\lambda _{{\rm{noobj}}}} λnoobj是平衡系数(分别是5和0.5),通常情况下,图片中只有少数几个目标,而绝大部分区域是没有目标的,因此加上平衡系数以避免过渡学习到没有目标的区域。

坐标损失: 包含了两个损失值,一个是边界框中心点坐标损失,一个是边界框大小损失。
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x i ∧ ) 2 − ( y i − y i ∧ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w i ∧ ) 2 − ( h i − h i ∧ ) 2 ] {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {{x_i} - \mathop {{x_i}}\limits^ \wedge } \right)}^2} - {{\left( {{y_i} - \mathop {{y_i}}\limits^ \wedge } \right)}^2}} \right] + {\lambda _{{\rm{coord}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } \left[ {{{\left( {\sqrt {{w_i}} - \sqrt {\mathop {{w_i}}\limits^ \wedge } } \right)}^2} - {{\left( {\sqrt {{h_i}} - \sqrt {\mathop {{h_i}}\limits^ \wedge } } \right)}^2}} \right] λcoordi=0S2j=0B1ijobj[(xixi)2(yiyi)2]+λcoordi=0S2j=0B1ijobj (wi wi )2(hi hi )2
边界框中心点坐标损失采用的是平方差,容易理解的常规操作,不再解释。边界框大小损失则先对宽 w w w,高 h h h进行开根
号,然后再计算平方差。原因如下图所示,以宽 w w w为例,宽度相差一致的情况下,不开根号计算标注框和预测框的损失,大目标检测和小目标检测没有任何区别,损失都是一样的;但在开根计算损失时,小目标检测的损失是比大目标检测的损失大,加强了小目标损失的影响,抑制了大目标损失的影响,这种设计更符合实际情况。

举个例子,满分10分和满分100分的俩种评价体系中,9分和8分之间1分的影响,远比90分和89分的之间1分的影响更为突出,更应该关注8分到9分的提升。

置信度损失: 当有对象时, P r ( O b j e c t ) = 1 Pr (O{\rm{bject}})=1 Pr(Object)=1,因此置信度的标签值 C i ∧ {\mathop {{C_i}}\limits^ \wedge } Ci是预测框和标注框之间的交并比 I o U IoU IoU;当没对象时, P r ( O b j e c t ) = 0 Pr (O{\rm{bject}})=0 Pr(Object)=0,因此标签值 C i ∧ {\mathop {{C_i}}\limits^ \wedge } Ci为0。

注意!!!这里并非是有对象时置信度的标签值 C i ∧ = 1 {\mathop {{C_i}}\limits^ \wedge }=1 Ci=1。但后续yolo版本对这里作出了调整,改成了 C i ∧ = 1 {\mathop {{C_i}}\limits^ \wedge }=1 Ci=1

∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C i ∧ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C i ∧ ) 2 \sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{obj}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} + {\lambda _{{\rm{noobj}}}}\sum\limits_{{\rm{i}} = 0}^{{S^2}} {\sum\limits_{{\rm{j}} = 0}^B {1_{ij}^{{\rm{noobj}}}} } {\left( {{C_i} - \mathop {{C_i}}\limits^ \wedge } \right)^2} i=0S2j=0B1ijobj(CiCi)2+λnoobji=0S2j=0B1ijnoobj(CiCi)2

概率损失: 所有网格单元中,只让有目标对象的网格单元参与计算。
∑ i = 0 S 2 1 i j o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p i ∧ ( c ) ) 2 \sum\limits_{{\rm{i}} = 0}^{{S^2}} {1_{ij}^{obj}\sum\limits_{c \in classes} {{{\left( {{p_i}\left( c \right) - \mathop {{p_i}}\limits^ \wedge \left( c \right)} \right)}^2}} } i=0S21ijobjcclasses(pi(c)pi(c))2


总结

尽可能简单、详细的介绍了YOLOV1模型的结构,深入讲解了YOLOV1核心思想。

相关文章:

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...

云钥科技多通道工业相机解决方案设计

项目应用场景分析与需求挑战 1. 应用场景 ‌目标领域‌:工业自动化检测(如精密零件尺寸测量、表面缺陷检测)、3D立体视觉(如物体建模、位姿识别)、动态运动追踪(如高速生产线监控)等。 ‌核心…...

从零到一:ESP32与豆包大模型的RTC连续对话实现指南

一、对话效果演示 ESP32与豆包大模型的RTC连续对话 二、ESP-ADF 介绍 乐鑫 ESP-ADF(Espressif Audio Development Framework)是乐鑫科技(Espressif Systems)专为 ESP32 系列芯片开发的一款音频开发框架。它旨在简化基于 ESP32 芯…...

【深度学习与实战】2.3、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)

为了求解损失函数 对 的导数,并利用最小二乘法向量形式求解 的值‌ 这是‌线性回归‌的平方误差损失函数,目标是最小化预测值 与真实值 之间的差距。 ‌损失函数‌: 考虑多个样本的情况,损失函数为所有样本的平方误差之和&a…...

【Django】教程-2-前端-目录结构介绍

【Django】教程-1-安装创建项目目录结构介绍 3. 前端文件配置 3.1 目录介绍 在app下创建static文件夹, 是根据setting中的配置来的 STATIC_URL ‘static/’ templates目录,编写HTML模板(含有模板语法,继承,{% static ‘xx’ …...

JS判断对象是否为空的方法

在 JavaScript 中,判断一个对象是否为空对象(即没有自身可枚举属性),可以通过以下方法实现: 方法 1:使用 Object.keys() javascript function isEmptyObject(obj) {// 确保是普通对象(排除 n…...

详解list容器

1.list的介绍 list的底层结构是双向带头循环链表,允许随机的插入和删除,但其内存空间不是连续的。随机访问空间能力差,需要从头到尾遍历节点,不像vector一样高效支持 2.list的使用 构造函数 1.默认构造函数:创建一个…...

leetcode_977. 有序数组的平方_java

977. 有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/ 1.题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1…...

Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理

在现代企业级应用开发中,前后端分离已成为主流模式,前端负责界面呈现,后端专注提供 RESTful API 接口。然而,接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3,为开发者…...

前端面经分享(25/03/26)

北京一家做AI解决方案的公司,技术一面,15k-20k,要求3-5年 你们React项目里路由模式用的什么React里class组件和function组件都用过吗常用Hook,解释一下他们的作用useEffect第二个参数填空数组和不填有什么区别React组件通信的常用…...

Matlab基础知识与常见操作【无痛入门】

【1】Matlab基本概念 【2】Matlab程序设计 【3】Matlab图形绘制 以上三篇文章为Matlab主要的应用场景,我在学习的过程中做一下记录,方便以后回顾。 接下来介绍下Matlab的工作界面,以及如何高效率的应用Matlab的帮助手册。在我看来&#x…...

HTTP协议手写服务器

目录 一、请求的是Web根目录 二、GET方法通过URL传参 三、根据资源类型对应出Content-Type值 四、Http代码 项目完整源代码:Http 周不才/cpp_linux study - 码云 - 开源中国 一、请求的是Web根目录 如果URL中请求的资源是Web根目录,则自动跳转到主…...

网络探索之旅:网络原理(第二弹)

上篇文章,小编分享了应用层和传输层深入的一点的知识,那么接下来,这篇文章,继续分享网络层和数据链路层。 网络层 了解这个网络层,那么其实就是重点来了解下IP这个协议 对于这个协议呢,其实也是和前面的…...

深入剖析 JVM:从组成原理到调优实践

深入剖析 JVM:从组成原理到调优实践 深入剖析 JVM:从组成原理到调优实践一、JVM 组成架构:运行 Java 程序的 “幕后引擎”1.1 内存结构:数据存储的 “分区管理”1.2 执行引擎:字节码的 “翻译官”1.3 本地方法接口&…...

阿里云下一代可观测时序引擎-MetricStore 2.0

作者:徐昊(博澍) 背景 作为可观测场景使用频度最高的数据类型,Metrics 时序数据在可观测领域一直占有着重要地位,无论是从全局视角来观测系统整体状态,还是从大范围数据中定位某一个异常的位置&#xff0…...

从入门到精通【 MySQL】 数据库约束与设计

文章目录 📕1. 数据库约束✏️1.1 NOT NULL 非空约束✏️1.2 DEFAULT 默认值约束✏️1.3 UNIQUE 唯一约束✏️1.4 PRIMARY KEY 主键约束✏️1.5 FOREIGN KEY 外键约束✏️1.6 CHECK 约束 📕2. 数据库设计✏️2.1 第一范式✏️2.2 第二范式✏️2.3 第三范…...

使用LLaMAFactory微调Qwen大模型

一、环境配置与工具安装 1. 硬件要求 GPU:至少1块NVIDIA GPU(推荐RTX 4090/A100/H100,显存≥16GB)。内存:≥64GB系统内存。存储:≥100GB硬盘空间用于模型与数据集存储。2. 软件依赖 Python 3.8+:需安装CUDA支持的PyTorch版本(如torch==2.0.1+cu117)。 依赖库:通过以…...

Dubbo 通信流程 - 服务的调用

Dubbo 客户端的使用 在 Dubbo 应用中,往类成员注解 DubboReference,服务启动后便可以调用到远端: Component public class InvokeDemoFacade {AutowiredDubboReferenceprivate DemoFacade demoFacade;public String hello(String name){// …...

【数据结构】哈夫曼树

哈夫曼树 在学习哈夫曼树之前,先了解以下几个概念: 一:**路径长度:**在一棵树中,从一个节点到另一个节点所经过的“边”的数量,被我们称为两个节点之间的路径长度。 二:**树的路径长度&#xf…...

HCIP(TCP)(2)

1. TCP三次握手 SYN (同步序列编号) 报文: 客户端发送 SYN 报文,开始建立连接,并初始化序列号。 SYN-ACK (同步序列编号-确认) 报文: 服务器收到 SYN 报文后,回复 SYN-ACK 报文,确认连接请求,并初始化自己的序列号和确…...

VMware Ubuntu 网络配置全攻略:从断网到畅通无阻

一、网络连接模式选择(先搞懂原理) VMware提供三种网络模式,就像手机的不同网络套餐: 模式适用场景特点类比NAT个人上网/新手首选虚拟机共享主机IP,能上网但隐身家用WiFi桥接服务器/需要被局域网访问虚拟机会获得独立…...

基于Web的交互式智能成绩管理系统设计

目录 摘要 绪论 一、应用背景 二、行业发展现状 三、程序开发的重要意义 四、结语 1 代码 2 数据初始化模块 3 界面布局模块 4 核心功能模块 5 可视化子系统 6 扩展功能模块 7 架构设计亮点 功能总结 一、核心数据管理 二、智能分析体系 三、可视化系统 四、扩…...

第 12 章(番外)| Solidity 安全前沿趋势 × 审计生态 × 职业路径规划

🌐 第 12 章(番外)| Solidity 安全前沿趋势 审计生态 职业路径规划 ——做得了审计,也接得了项目,走进 Web3 安全工程师的职业实战地图 ✅ 本章导读 Solidity 安全,不只是代码安全、业务安全、审计安全…...

输出3行3列矩阵的鞍点

【问题描述】在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。任意输入一个3行3列矩阵,请设计程序输出其鞍点。 【输入形式】每行3个数,输入3列 【输出形式】输出所有鞍点;如果没有…...

k8s日志管理

k8s日志管理 k8s查看日志查看集群中不是完全运行状态的pod查看deployment日志查看service日志进入pod的容器内查看日志 管理k8s组件日志kubectl logs查看日志原理 管理k8s应用日志收集k8s日志思路收集标准输出收集容器中日志文件 k8s查看节点状态失败k8s部署prometheus监控 k8s…...

【数据结构】顺序表-元素去重

数据元素 结点定义,复杂数据类型,可用作整体性的管理系统。如果单独研究某些数据,比如只看学号或成绩,那么直接使用int之类的简单数据类型亦可。对应修改:typedef int Elemtype; typedef struct student{ //定义学生…...

物理安全——问答

目录 1、计算机的物理安全包含哪些内容 1. 设备保护 2. 访问控制 3. 电力与环境安全 4. 数据存储保护 5. 硬件防护 6. 监控与审计 7. 灾难恢复与应急响应 8. 拆卸与维修安全 2、物理安全有哪些需要关注的问题 1、计算机的物理安全包含哪些内容 1. 设备保护 防止盗窃&…...

element-plus中,Loading 加载组件的使用

一.基本使用 给一个组件&#xff0c;如&#xff1a;table表格&#xff0c;加上v-loading"true"即可。 举例&#xff1a;复制如下代码。 <template><el-table v-loading"loading" :data"tableData" style"width: 100%"><…...

Mybatis_Plus中的常用注解

目录 1、TableName TableId TableId的type属性 TableField 1、TableName 经过以上的测试&#xff0c;在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在 Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操…...

云数据库概念

1.云数据库概念 云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法&#xff0c;它极大地增强了数据库的存储能力&#xff0c;消除了人员、硬件、软件的重复配置&#xff0c;让软、硬件升级变得更加容易。云…...