YOLO v8目标检测(三)模型训练与正负样本匹配

YOLO v8目标检测

损失函数理论

在YOLO v5模型中,cls, reg, obj代表的是三个不同的预测组成部分,对应的损失函数如下:

  1. cls: 这代表类别预测(classification)。对应的损失是类别预测损失(loss_cls)。这个损失计算的是模型预测的类别与真实类别之间的差异。它使用的是二元交叉熵损失(BCE Loss)。

  2. reg: 这代表边界框回归(bounding box regression)。对应的损失是IoU损失(loss_iou)。这个损失计算的是模型预测的边界框与真实边界框之间的交并比(IoU)差异。这里的交并比是通过IoU损失函数计算得出的。

  3. obj: 这代表目标存在概率(objectness)。对应的损失是对象存在概率损失(loss_obj)。这个损失计算的是模型预测的目标存在概率与真实存在概率之间的差异。这也是用二元交叉熵损失(BCE Loss)计算的。

在引出v8的损失函数之前,首先对分类损失的相关概念进行总结。

信息量

定义:事件包含的信息量大小(事件发生的难度有多大)。

  • 小概率事件,它发生的难度比较大,所以有较大的信息量

  • 大概率事件,它发生的难度比较小,所以有较小的信息量

概率和信息量是负相关的

性质:两个事件同时发生的信息量等于两个事件的信息量相加I(AB)=I(A) + I(B)

满足对数函数的性质

I ( x ) : = log ⁡ 2 ( 1 p ( x ) ) = − log ⁡ 2 ( p ( x ) ) I(x):=\log _{2}\left(\frac{1}{p_{(x)}}\right)=-\log _{2}\left(p_{(x)}\right) I(x):=log2(p(x)1)=log2(p(x))

I ( A B ) = log ⁡ 2 ( 1 p ( A B ) ) = log ⁡ 2 ( 1 p ( A ) p ( B ) ) = log ⁡ 2 ( 1 p ( A ) ) + log ⁡ 2 ( 1 p ( B ) ) = I ( A ) + I ( B ) I(A B)=\log _{2}\left(\frac{1}{p(A B)}\right)=\log _{2}\left(\frac{1}{p(A) p(B)}\right)=\log _{2}\left(\frac{1}{p(A)}\right)+\log _{2}\left(\frac{1}{p(B)}\right)=I(A)+I(B) I(AB)=log2(p(AB)1)=log2(p(A)p(B)1)=log2(p(A)1)+log2(p(B)1)=I(A)+I(B)

举例:抛硬币, 正面概率 P(A) = 0.2, 反面概率 P(B) = 0.8
I ( A ) = − log ⁡ 2 ( 0.2 ) = 2.32 , I ( B ) = − log ⁡ 2 ( 0.8 ) = 0.32 I(A)=-\log _{2}(0.2)=2.32, \quad I(B)=-\log _{2}(0.8)=0.32 I(A)=log2(0.2)=2.32,I(B)=log2(0.8)=0.32
小概率事件有较大的信息量,大概率事件有较小的信息量

信息熵

定义:概率分布 的信息量期望: H(p) := E(I(x)),期望使用的就是概率论中离散型随机变量的计算公式

H ( p ) = ∑ p i I i p = − ∑ p i log ⁡ 2 ( p i ) H(p)=\sum p_{i} I_{i}^{p}=-\sum p_{i} \log _{2}\left(p_{i}\right) H(p)=piIip=pilog2(pi)

作用:用来评估概率模型的不确定性程度

  • 不确定性越大,信息熵越大

  • 不确定性越小,信息熵越小

例1 : 抛硬币, 正面概率 P(A) = 0.5, 反面概率 P(B) = 0.5
H ( p ) = ∑ p i I i p = p ( A ) ⋅ log ⁡ 2 ( 1 / p ( A ) ) + p ( B ) ⋅ log ⁡ 2 ( 1 / p ( B ) ) = 0.5 ⋅ log ⁡ 2 ( 1 / 0.5 ) + 0.5 ⋅ log ⁡ 2 ( 1 / 0.5 ) = 0.5 ⋅ 1 + 0.5 ⋅ 1 = 1 \begin{aligned} H(p) & =\sum p_{i} I_{i}^{p} \\ & =p_{(A)} \cdot \log _{2}\left(1 / p_{(A)}\right)+p_{(B)} \cdot \log _{2}\left(1 / p_{(B)}\right) \\ & =0.5 \cdot \log _{2}(1 / 0.5)+0.5 \cdot \log _{2}(1 / 0.5) \\ & =0.5 \cdot 1+0.5 \cdot 1 \\ & =1 \end{aligned} H(p)=piIip=p(A)log2(1/p(A))+p(B)log2(1/p(B))=0.5log2(1/0.5)+0.5log2(1/0.5)=0.51+0.51=1

例二:抛硬币, 正面概率 P(A) = 0.2, 反面概率 P(B) = 0.8
H ( p ) = ∑ p i I i p = p ( A ) ⋅ log ⁡ 2 ( 1 / p ( A ) ) + p ( B ) ⋅ log ⁡ 2 ( 1 / p ( B ) ) = 0.2 ⋅ log ⁡ 2 ( 1 / 0.2 ) + 0.8 ⋅ log ⁡ 2 ( 1 / 0.8 ) = 0.2 ⋅ 2.32 + 0.8 ⋅ 0.32 = 0.72 \begin{aligned} H(p) & =\sum p_{i} I_{i}^{p} \\ & =p_{(A)} \cdot \log _{2}\left(1 / p_{(A)}\right)+p_{(B)} \cdot \log _{2}\left(1 / p_{(B)}\right) \\ & =0.2 \cdot \log _{2}(1 / 0.2)+0.8 \cdot \log _{2}(1 / 0.8) \\ & =0.2 \cdot 2.32+0.8 \cdot 0.32 \\ & =0.72 \end{aligned} H(p)=piIip=p(A)log2(1/p(A))+p(B)log2(1/p(B))=0.2log2(1/0.2)+0.8log2(1/0.8)=0.22.32+0.80.32=0.72

结论:

  • 若概率密度均匀,产生的随机变量的不确定性就更高,则熵的值就更大

  • 若概率密度聚拢,产生的随机变量的不确定性就更低,则熵的值较小

交叉熵 Cross Entropy

假设 真实概率分布为 p、预测概率分布 (估计概率分布)为 q

定义:预测概率分布q 对真实的概率分布 p 的平均信息量的估计,叫做交叉熵

H ( p , q ) = ∑ p i I i q = − ∑ p i log ⁡ 2 ( q i ) H(p, q)=\sum p_{i} I_{i}^{q}=-\sum p_{i} \log _{2}\left(q_{i}\right) H(p,q)=piIiq=pilog2(qi)

例1 : 抛硬币, 正面真实概率 p(A) = 0.5, 反面真实概率 p(B) = 0.5 ; 正面估计概率 q(A) = 0.2, 反面估计概率 q(B) = 0.8
H ( p , q ) = − ∑ p i log ⁡ 2 ( q i ) = p ( A ) ⋅ log ⁡ 2 ( 1 / q ( A ) ) + p ( B ) ⋅ log ⁡ 2 ( 1 / q ( B ) ) = 0.5 ⋅ log ⁡ 2 ( 1 / 0.2 ) + 0.5 ⋅ log ⁡ 2 ( 1 / 0.8 ) = 0.5 ⋅ 2.32 + 0.5 ⋅ 0.32 = 1.32 \begin{aligned} H(p, q) & =-\sum p_{i} \log _{2}\left(q_{i}\right) \\ & =p_{(A)} \cdot \log _{2}\left(1 / q_{(A)}\right)+p_{(B)} \cdot \log _{2}\left(1 / q_{(B)}\right) \\ & =0.5 \cdot \log _{2}(1 / 0.2)+0.5 \cdot \log _{2}(1 / 0.8) \\ & =0.5 \cdot 2.32+0.5 \cdot 0.32 \\ & =1.32 \end{aligned} H(p,q)=pilog2(qi)=p(A)log2(1/q(A))+p(B)log2(1/q(B))=0.5log2(1/0.2)+0.5log2(1/0.8)=0.52.32+0.50.32=1.32

例2:抛硬币,正面真实概率p(A)=0.5,反面真实概率p(B)=0.5;正面估计概率p(A)=0.4、反面估计概率p(B)=0.6
H ( p , q ) = − ∑ p i log ⁡ 2 ( q i ) = p ( A ) ⋅ log ⁡ 2 ( 1 / q ( A ) ) + p ( B ) ⋅ log ⁡ 2 ( 1 / q ( B ) ) = 0.5 ⋅ log ⁡ 2 ( 1 / 0.4 ) + 0.5 ⋅ log ⁡ 2 ( 1 / 0.6 ) = 0.5 ⋅ 1.32 + 0.5 ⋅ 0.74 = 1.03 \begin{aligned} H(p, q) & =-\sum p_{i} \log _{2}\left(q_{i}\right) \\ & =p_{(A)} \cdot \log _{2}\left(1 / q_{(A)}\right)+p_{(B)} \cdot \log _{2}\left(1 / q_{(B)}\right) \\ & =0.5 \cdot \log _{2}(1 / 0.4)+0.5 \cdot \log _{2}(1 / 0.6) \\ & =0.5 \cdot 1.32+0.5 \cdot 0.74 \\ & =1.03 \end{aligned} H(p,q)=pilog2(qi)=p(A)log2(1/q(A))+p(B)log2(1/q(B))=0.5log2(1/0.4)+0.5log2(1/0.6)=0.51.32+0.50.74=1.03

结论:

  1. 预估概率分布与真实概率分布越接近,交叉熵越小

  2. 交叉熵的值总是大于熵的值(根据吉布斯不等式)

若 ∑ i = 1 n p i = ∑ i = 1 n q i = 1 , 且 p i , q i ∈ ( 0 , 1 ] , 则有 : − ∑ i = 1 n p i log ⁡ p i ≤ − ∑ i = 1 n p i log ⁡ q i , 等号成立当且仅当 p i = q i ∀ i 若 \sum_{i=1}^{n} p_{i}=\sum_{i=1}^{n} q_{i}=1 , 且 p_{i}, q_{i} \in(0,1] , 则有: -\sum_{i=1}^{n} p_{i} \log p_{i} \leq-\sum_{i=1}^{n} p_{i} \log q_{i} \text {, } 等号成立当且仅当 p_{i}=q_{i} \forall i i=1npi=i=1nqi=1,pi,qi(0,1],则有:i=1npilogpii=1npilogqi等号成立当且仅当pi=qii

相对熵

KL散度以Kullback和Leibler的名字命名,也被称为相对熵

作用:用于衡量2个概率分布之间的差异

D K L ( p ∥ q ) = ∑ p i [ I q − I p ] # I q − I p 为信息量之差  = ∑ p i [ log ⁡ 2 ( 1 / q i ) − log ⁡ 2 ( 1 / p i ) ] = ∑ p i log ⁡ 2 ( 1 / q i ) − ∑ p i log ⁡ 2 ( 1 / p i ) = H ( p , q ) − H ( p ) = ∑ p i l o g 2 ( p i / q i ) \begin{aligned} D_{K L}(p \| q) & =\sum p_{i}\left[I_{q}-I_{p}\right] \quad \# I_{q}-I_{p} \text { 为信息量之差 } \\ & =\sum p_{i}\left[\log _{2}\left(1 / q_{i}\right)-\log _{2}\left(1 / p_{i}\right)\right] \\ & =\sum p_{i} \log _{2}\left(1 / q_{i}\right)-\sum p_{i} \log _{2}\left(1 / p_{i}\right) \\ & =H(p, q)-H(p) \\ & =\sum p_{i} log _{2}\left(p_{i} / q_{i}\right) \end{aligned} DKL(pq)=pi[IqIp]#IqIp 为信息量之差 =pi[log2(1/qi)log2(1/pi)]=pilog2(1/qi)pilog2(1/pi)=H(p,q)H(p)=pilog2(pi/qi)

当p和q的分布完全相同时值为0

Cross Entropy loss

预测分布q与真实分布p之间的差距,所以我们可直接将损失函数定义为KL散度:

损失函数:  L o s s = D ( p ∥ q ) = H ( p , q ) − H ( p ) = ∑ p i log ⁡ 2 ( 1 / q i ) − ∑ p i log ⁡ 2 ( 1 / p i ) \text { 损失函数: } L o s s=D(p \| q)=H(p, q)-H(p)=\sum p_{i} \log _{2}\left(1 / q_{i}\right)-\sum p_{i} \log _{2}\left(1 / p_{i}\right)  损失函数Loss=D(pq)=H(p,q)H(p)=pilog2(1/qi)pilog2(1/pi)

对于分类问题,真实分布是一个单点分布,真实类别的概率为1,其他类别的概率都为0,类似如下:

类别class1class2class3class4
概率0010

p class  1 = p class  2 = p class  4 = 0 , log ⁡ 2 ( 1 / p class  3 ) = 0 所以 , H ( p ) = ∑ p i log ⁡ 2 ( 1 / p i ) = 0 p_{\text {class } 1}=p_{\text {class } 2}=p_{\text {class } 4}=0, \quad \log _{2}\left(1 / p_{\text {class } 3}\right)=0 所以, H(p)=\sum p_{i} \log _{2}\left(1 / p_{i}\right)=0 pclass 1=pclass 2=pclass 4=0,log2(1/pclass 3)=0所以,H(p)=pilog2(1/pi)=0

Loss  = D ( p ∥ q ) = H ( p , q ) − H ( p ) = H ( p , q ) \text { Loss }=D(p \| q)=H(p, q)-H(p)=H(p, q)  Loss =D(pq)=H(p,q)H(p)=H(p,q)

多分类 : E = − ∑ i = 1 n y i ∗ log ⁡ ( p i ) 多分类: E=-\sum_{i=1}^{n} y_{i} * \log \left(p_{i}\right) 多分类:E=i=1nyilog(pi)

二分类 : E = − [ y ∗ log ⁡ ( p ) + ( 1 − y ) ∗ log ⁡ ( 1 − p ) ] 二分类: E=-[y * \log (p)+(1-y) * \log (1-p)] 二分类:E=[ylog(p)+(1y)log(1p)]

Focal loss

Focal loss是何恺明提出的一种新的loss计算方案。其具有两个重要的特点。

  1. 控制正负样本的权重

  2. 控制容易分类和难分类样本的权重

正负样本的概念如下:

一张图像可能生成成千上万的候选框,但是其中只有很少一部分是包含目标的的,有目标的就是正样本,没有目标的就是负样本。(负样本的占比过多导致损失值大多数是负样本的损失值)

容易分类和难分类样本的概念如下:

假设存在一个二分类,样本1属于类别1的pt=0.9,样本2属于类别1的pt=0.6,显然前者更可能是类别1,其就是容易分类的样本;后者有可能是类别1,所以其为难分类样本。

首先我们对提到的二分类交叉熵损失进行简化

二分类 : E = − [ y ∗ log ⁡ ( p ) + ( 1 − y ) ∗ log ⁡ ( 1 − p ) ] 二分类: E=-[y * \log (p)+(1-y) * \log (1-p)] 二分类:E=[ylog(p)+(1y)log(1p)]

CE ⁡ ( p , y ) = { − log ⁡ ( p ) if  y = 1 − log ⁡ ( 1 − p ) otherwise  \operatorname{CE}(p, y)=\left\{\begin{array}{ll} -\log (p) & \text { if } y=1 \\ -\log (1-p) & \text { otherwise } \end{array}\right. CE(p,y)={log(p)log(1p) if y=1 otherwise 

p t = { p if  y = 1 1 − p otherwise  p_{\mathrm{t}}=\left\{\begin{array}{ll} p & \text { if } y=1 \\ 1-p & \text { otherwise } \end{array}\right. pt={p1p if y=1 otherwise 

CE ⁡ ( p , y ) = CE ⁡ ( p t ) = − log ⁡ ( p t ) \operatorname{CE}(p, y)=\operatorname{CE}\left(p_{\mathrm{t}}\right)=-\log \left(p_{\mathrm{t}}\right) CE(p,y)=CE(pt)=log(pt)

想要降低负样本的影响,可以在常规的损失函数前增加一个系数αt。与Pt类似,当label=1的时候,αt=α;当label=otherwise的时候,αt=1 - α,a的范围也是0到1。此时我们便可以通过设置α实现控制正负样本对loss的贡献

α t = { α if  y = 1 1 − α otherwise  \alpha_{t}=\left\{\begin{array}{cc} \alpha & \text { if } y=1 \\ 1-\alpha & \text { otherwise } \end{array}\right. αt={α1α if y=1 otherwise 

C E ( p , y , α ) = { − log ⁡ ( p ) ∗ α if  y = 1 − log ⁡ ( 1 − p ) ∗ ( 1 − α ) if  y = 0 C E(p, y, \alpha)=\left\{\begin{array}{cc} -\log (p) * \alpha & \text { if } y=1 \\ -\log (1-p) *(1-\alpha) & \text { if } y=0 \end{array}\right. CE(p,y,α)={log(p)αlog(1p)(1α) if y=1 if y=0

在控制容易分类和难分类样本的权重的时候引入了一个调制系数的概念。

( 1 − p t ) γ \left(1-\mathrm{p}_{\mathrm{t}}\right)^{\gamma} (1pt)γ

  1. 当pt趋于0的时候,调制系数趋于1,对于总的loss的贡献很大。当pt趋于1的时候,调制系数趋于0,也就是对于总的loss的贡献很小。

  2. 当γ=0的时候,focal loss就是传统的交叉熵损失,可以通过调整γ实现调制系数的改变。

FL ⁡ ( p t ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) \operatorname{FL}\left(p_{\mathrm{t}}\right)=-\alpha_{\mathrm{t}}\left(1-p_{\mathrm{t}}\right)^{\gamma} \log \left(p_{\mathrm{t}}\right) FL(pt)=αt(1pt)γlog(pt)

DFL loss

Loss 计算包括 2个分支:分类和回归分支,没有了以前的objectness 分支。

  • 分类分支依然采用BCE LOSS
  • 回归分支需要和 Distribution Focal Loss (DFL)中提出的积分形式表示法绑定, 因此使用了 DFL,同时还使用了CIoULoss

最终的loSS是对3个LoSS采用一定权重比例加权。

针对边界框模糊设计的损失函数

D F L ( S i , S i + 1 ) = − ( ( y i + 1 − y ) log ⁡ ( S i ) + ( y − y i ) log ⁡ ( S i + 1 ) ) \mathbf{D F L}\left(\mathcal{S}_{i}, \mathcal{S}_{i+1}\right)=-\left(\left(y_{i+1}-y\right) \log \left(\mathcal{S}_{i}\right)+\left(y-y_{i}\right) \log \left(\mathcal{S}_{i+1}\right)\right) DFL(Si,Si+1)=((yi+1y)log(Si)+(yyi)log(Si+1))

模型训练执行步骤

from ultralytics import YOLOdef train_model():# Load a model#model = YOLO('yolov8n.yaml')  # build a new model from YAMLmodel = YOLO('yolov8s.pt')  # load a pretrained model (recommended for training)#model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights# Train the modelresults = model.train(data='coco128.yaml', epochs=50, imgsz=640, batch=8, workers= 4, device=[0])return resultsif __name__ == '__main__':results = train_model()

在这里插入图片描述

正负样本匹配的执行步骤

Task-Aligned Assigner,又名对齐分配器,在YOLOv8中是一种动态的分配策略。

针对所有像素点预测的 Cls score 和 Reg Score(Box与每个GT box的IOU) 通过加权的方式得到最终的加权分数,通过对加权分数进行排序后选择Topk个正样本。

t = s α + u β t=s^{\alpha}+u^{\beta} t=sα+uβ

s 是标注类别对应的预测分值,u 是预测框和 gt 框的 iou,两者相乘就可以衡量对齐程度。

正样本匹配处理流程

  1. 解析预测框坐标(l,t,r,b)→→(cmin,ymin,max,ymax)

  2. 粗筛正样本:筛选出落在gt_box范围内的anchor,作为正样本

  3. 在上一步粗筛出来的正样本基础上精筛正样本:

    • 提取bboc_score、计算CIoU
    • 计算出的align_metric:
    • (TAL)align_matric = bbox_score0.5 * CIoU0.6
    • 根据align_metric的值,筛选出top-10作为正样本。
  4. 处理一个anchorpoint可能匹配到多个gt_box的情况,仅保留最大CloU的那个匹配。

在这里插入图片描述

断点调试的代码注释需要的可以联系。

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

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

相关文章

简单快速收集_安居客二手房小区数据

安居客二手房小区全国实时数据,含小区名称、价格、地区、地址、商圈、标签、经纬度、物业类型、交易权属、竣工时间、产权年限、开发商、总户数、总建面积、绿化率、容积率、统一供暖 供水供电、停车位、停车费、物业费、物业公司 车位管理费、在售房源、在租房源 …

B端:导航条就框架提供的默认样式吗?非也,看过来。

导航条不一定必须使用框架提供的默认样式,你可以根据项目需求和设计风格进行自定义。通过使用框架提供的自定义选项、CSS样式覆盖、自行设计或者使用其他UI库或组件,你可以实现独特且符合需求的导航条样式。 下面发一些参考给友友们,可以让设…

论文解读:DiAD之SG网络

目录 一、SG网络功能介绍二、SG网络代码实现 一、SG网络功能介绍 DiAD论文最主要的创新点就是使用SG网络解决多类别异常检测中的语义信息丢失问题,那么它是怎么实现的保留原始图像语义信息的同时重建异常区域? 与稳定扩散去噪网络的连接: S…

昇思25天学习打卡营第3天|基础知识-数据集Dataset

目录 环境 环境 导包 数据集加载 数据集迭代 数据集常用操作 shuffle map batch 自定义数据集 可随机访问数据集 可迭代数据集 生成器 MindSpore提供基于Pipeline的数据引擎,通过数据集(Dataset)和数据变换(Transfor…

skynet 入门篇

文章目录 概述1.实现了actor模型2.实现了服务器的基础组件 环境准备centosubuntumac编译安装 ActorActor模型定义组成 Actor调度工作线程流程工作线程权重工作线程执行规则 小结 概述 skynet 是一个轻量级服务器框架,而不仅仅用于游戏; 轻量级有以下几…

C语言百分号打印器

目录 开头程序程序的流程图程序输入与输出的效果例1输入输出 例2输入输出 例3输入输出 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语言编译的百分号打印器和与之相关的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <…

【RabbitMQ】MQ相关概念

一、MQ的基本概念 定义&#xff1a;MQ全称为Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信&#xff0c;而无需建立直接的连接。作用&#xff1a;主要用于分布式系统之间的通信&#x…

CANoe在使用时碰到的一些很少见的Bug

CANoe作为一款成熟且稳定的总线仿真与测试工具&#xff0c;深受汽车工程师们的喜爱。CANoe虽然稳定&#xff0c;但作为一个软件来说&#xff0c;在使用中总会出现一些或大或小的Bug。最近全球范围内的大规模蓝屏事件&#xff0c;是由某个安全软件引起的。而很多CANoe使用者最近…

【中项】系统集成项目管理工程师-第7章 软硬件系统集成-7.2基础设施集成

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

Kafka消息队列

目录 什么是消息队列 高可用性 高扩展性 高可用性 持久化和过期策略 consumer group 分组消费 ZooKeeper 什么是消息队列 普通版消息队列 说白了就是一个队列,生产者生产多少,放在消息队列中存储,而消费者想要多少拿多少,按序列号消费 缓存信息 生产者与消费者解耦…

VulnHub靶机入门篇--Kioptrix4

1.环境配置 下载地址&#xff1a; https://download.vulnhub.com/kioptrix/Kioptrix4_vmware.rar 下载完解压之后是一个vdmk文件&#xff0c;我们需要先创建一个新的虚拟机&#xff0c;将vdmk文件导入就行了 先移除原先硬盘&#xff0c;然后再进行添加&#xff0c;网络连接为…

EV代码签名证书具体申请流程

EV&#xff08;扩展验证&#xff09;代码签名证书是一种用于对代码进行数字签名的安全证书&#xff0c;它可以帮助用户验证软件发布者的身份&#xff0c;并确保软件未被篡改。对于Windows硬件开发者来说&#xff0c;这种证书尤其重要&#xff0c;因为它可以用来注册Windows硬件…

【Golang 面试 - 基础题】每日 5 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

六、2 写PWM代码(函数介绍、呼吸灯代码)

目录 一、1、步骤 2、函数介绍 3、外设引脚和GPIO引脚的复用关系&#xff08;引脚定义表&#xff09; 二、1、呼吸灯 步骤 &#xff08;1&#xff09;初始化通道 1&#xff09;输出比较模式 2&#xff09;输出比较极性 &#xff08;2&#xff09;配置GPIO &#xff08…

肆[4],VisionMaster全局触发测试说明

1&#xff0c;环境 VisionMaster4.3 2&#xff0c;实现功能 2.1&#xff0c;全局触发进行流程控制执行。 2.2&#xff0c;取像完成&#xff0c;立即运动到下一个位置&#xff0c;同步进行图片处理。 2.3&#xff0c;发送结果的同时&#xff0c;还需要显示图像处理的痕迹。 …

H616设计时候存在的问题

1.存在大量孤铜的问题&#xff1a; 这种情况是绝对不允许的&#xff0c;但是GBA焊盘打大量的过孔会出现很多这样的孤铜&#xff1a; 解决办法&#xff1a; 像这种出现大量重复焊盘的&#xff0c;用导线连接起来&#xff0c;之后铺铜形成铜皮&#xff0c;再在这个小铜皮上面打…

全网首创!基于GaitSet的一种多人步态识别方法公示

有源代码V细聊&#xff0c;可商用/私用/毕设等&#xff1a;NzqDssm16 &#x1f349;1 绪论 经过相关研究确认&#xff0c;步态识别是足以达到应用级别的生物识别技术&#xff0c;在现代社会中自始至终都存在着广泛的应用前景。之所以迟迟没有普及&#xff0c;主要是实…

【Oracle 进阶之路】Oracle 简介

一、简述 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统&#xff0c;系统可移植性好、使用方便、功能强&…

华为ensp中链路聚合两种(lacp-static)模式配置方法

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月26日11点54分 链路聚合&#xff08;Link Aggregation&#xff09;&#xff0c;又称为端口聚合&#xff08;Port Trunking&#xff09;&#xff0c;是一种将多条物理…