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

MS COCO数据集的评价标准以及不同指标的选择推荐(AP、mAP、MS COCO、AR、@、0.5、0.75、1、目标检测、评价指标)

目标检测模型性能衡量指标、MS COCO 数据集的评价标准以及不同指标的选择推荐

0. 引言

0.1 COCO 数据集评价指标

目标检测模型通过 pycocotools 在验证集上会得到 COCO 的评价列表,具体参数的含义是什么呢?

0.2 目标检测领域常用的公开数据集

  1. PASCAL VOC
  2. Microsoft COCO(MS COCO)

在 MS COCO 数据集出来之前,目标检测基本上用的是 PASCAL VOC 数据集,现在 MS COCO 非常流行。这两个数据集均有自己的评判标准。

0.3 COCO(Common Objects in Context,上下文中的常见对象)数据集简介

0.3.1 介绍

COCO 数据集是一个可用于图像检测(Image Detection),语义分割(Semantic Segmentation)和图像标题生成(Image Captioning)的大规模数据集。它有超过 330K 张图像(其中 220K 张是有标注的图像),包含

  • 150 万个目标
  • 80 个目标类别(object categories:行人、汽车、大象等)
  • 91 种材料类别(stuff categoris:草、墙、天空等)
  • 每张图像包含五句图像的语句描述
  • 且有 250, 000 个带关键点标注的行人

MS COCO官网:https://cocodataset.org/#home

0.3.2 MS COCO 可以应用的任务

  1. 目标检测(object detection):使用 bounding box 或者 object segmentation (也称为instance segmentation)将不同的目标进行标定。

  2. Densepose(密集姿势估计):DensePose 任务涉及同时检测人、分割他们的身体并将属于人体的所有图像像素映射到身体的3D表面。用于不可控条件下的密集人体姿态 估计。

  3. Key-points detection(关键点检测):在任意姿态下对人物的关键点进行定位,该任务包含检测行人及定位到行人的关键点。

  4. Stuff Segmentation(材料细分):语义分割中针对 stuff class 类的分割(草,墙壁,天空等)

  5. Panoptic Segmentation(全景分割):其目的是生成丰富且完整的连贯场景分割,这是实现自主驾驶或增强现实等真实世界视觉系统的重要一步。

  6. image captioning(图像标题生成):根据图像生成一段文字。

0.3.3 COCO 的 80 个类别

编号英文名称中文名称编号英文名称中文名称编号英文名称中文名称
1person28boat55cup杯子
2bicycle自行车29traffic light交通灯56fork叉子
3car汽车30fire hydrant消防栓57knife
4motorcycle摩托车31stop sign停车标志58spoon勺子
5airplane飞机32parking meter停车计时器59bowl
6bus公共汽车33bench长凳60banana香蕉
7train火车34bird61apple苹果
8truck卡车35cat62sandwich三明治
9boat36dog63orange橙子
10traffic light交通灯37horse64broccoli西兰花
11fire hydrant消防栓38sheep65carrot胡萝卜
12stop sign停车标志39cow66hot dog热狗
13parking meter停车计时器40elephant大象67pizza披萨
14bench长凳41bear68donut甜甜圈
15bird42zebra斑马69cake蛋糕
16cat43giraffe长颈鹿70chair椅子
17dog44backpack背包71couch沙发
18horse45umbrella雨伞72potted plant盆栽
19sheep46handbag手提包73bed
20cow47tie领带74dining table餐桌
21elephant大象48suitcase行李箱75toilet厕所
22bear49frisbee飞盘76tv monitor电视监视器
23zebra斑马50skis滑雪板77laptop笔记本电脑
24giraffe长颈鹿51snowboard单板滑雪78mouse鼠标
25backpack背包52sports ball运动球79remote遥控器
26umbrella雨伞53kite风筝80keyboard键盘
27tie领带54baseball bat棒球棍

1. 目标检测中常见的指标

对于这样一张图片,怎样才能算检测正确呢?其中,绿色为 GT,红色为预测框。

  • IoU 大于指定阈值?
  • 类别是否正确?
  • confidence 大于指定阈值?

以上三点都是我们需要考虑的。

1.1 TP、FP、FN

1.1.1 定义

  • TP(True Positive):预测正确的预测框数量 [IoU > 阈值](同一个 GT 只计算一次)
  • FP(False Positive):检测到是同一个 GT 的多余预测框的数量 [IoU < 阈值](或者是检测到同一个 GT 的多余预测框的数量)
  • FN(False Negative):没有检测到 GT 的预测框数量 [漏检的数量]
  • 阈值根据任务进行调整,一般选择 0.5
  • FP 就是“假阳性”,就是模型误认为是 TP

1.1.2 例子说明 TP、FP、FN

举个例子理解 TP、FP、FN:

对于张图片来说,绿色 为 GT,红色 为模型预测框,IoU 阈值设置为 0.5。

  • 对于中间这只猫来说,在 绿色框(GT) 中的 预测框(红色)绿色框 的 IoU 肯定是 >0.5 的,所以它应该是一个 TP(预测对了目标且 IoU > 阈值);而对于 偏左的预测框 来说,它和 GT 的 IoU 肯定是不足 0.5 的,加之因为有 TP 的存在,所以它是 FP。
  • 对于右下角的那只猫,GT 是有的,但模型并没有给出对应的预测框,因此模型对于这只猫来说,漏检了,故 FN 的数量为 1。

1.2 AP(Average Precision,平均精度)

1.2.1 Precision

P r e c i s i o n = T P T P + F P \mathrm{Precision = \frac{TP}{TP + FP}} Precision=TP+FPTP

解释:模型预测的所有目标(Object)中,预测正确的比例 -> 查准率

模型认为正确的目标 中 确实预测对了多少


那么仅仅通过 Precision 这个指标能不能全面衡量模型的检测能力呢?举个例子进行说明:

同样的,绿色的为 Ground Truth,红色的为 预测框。

上面这张图片有 5 个目标,但是网络只针对猫 ① 给出了预测框(红色的),剩下的猫都没有检测出来。这里的 TP=1,FP=0。所以此时的 Precision 为:

P r e c i s i o n = T P T P + F P = 1 1 + 0 = 1 = 100 % \begin{aligned} \mathrm{Precision} & = \mathrm{\frac{TP}{TP+FP}} \\ & = \frac{1}{1 + 0} \\ & = 1\\ & = 100\% \end{aligned} Precision=TP+FPTP=1+01=1=100%

很明显对于这张图片网络漏检了 4 个目标,但 Precision 又显示结果是非常好的。因此我们就可以知道了,仅仅通过 Precision 无法评判检测网络的性能。为了解决这个问题,我们引入了另外一个指标 —— Recall。

1.2.2 Recall

R e c a l l = T P T P + F N \mathrm{Recall = \frac{TP}{TP + FN}} Recall=TP+FNTP

解释:所有真实目标中,模型预测正确的比例 -> 查全率

本应该检测对的,模型检测对了多少

那么我们只使用 Recall 这个指标来判定模型的好坏吗?举个例子说明:

这张图片和上一张图片类似,网络总共预测出了 50 个预测框(即 50 个目标)。这 50 个预测框中包括了所有要检测的目标,那么该网络针对这张图片的 Recall 为:

R e c a l l = T P T P + F N = 1 1 + 0 = 1 = 100 % \begin{aligned} \mathrm{Recall} & = \mathrm{\frac{TP}{TP+FN}} \\ & = \frac{1}{1 + 0} \\ & = 1\\ & = 100\% \end{aligned} Recall=TP+FNTP=1+01=1=100%

很明显,单单使用 Recall 无法评判模型的好坏。所以我们需要同时使用 Precision 和 Recall 这两个指标来进行网络性能的评判,即引入 —— AP。

1.2.3 AP —— P-R 曲线下面积

AP 就是P-R曲线下方的面积,而 P-R 分别为 Precision 和 Recall。

假设模型已经训练完毕,验证集为下面 3 张图片:

1.2.3.1 第一张图片

首先判断该图片中有几个目标(GT)?很明显绿色的框有两个,所以有两个 GT,即

n u m o b j = 0 + 2 = 2 。 \mathrm{num_{obj}} = 0 + 2 = 2。 numobj=0+2=2

接下来同一个列表统计网络所检测到的目标信息:

GT idConfidenceOB (IoU=0.5)
10.98True
10.61False

Note:

  • GT id 为 预测框匹配的 GT 的 id;Confidence 为预测框的置信度(是此类别的概率);OB 为判断该预测框是否是 TP。
  • 该表从上到下的顺序是根据 Confidence 降序排列的
  • 对于 GT id = 2,网络并没有给出预测框,所以表中没有相关信息
1.2.3.2 第二张图片

这张图片中目标的个数(绿色的框)有 1 个,所以累积目标个数:

n u m o b j = 2 + 1 = 3 。 \mathrm{num_{obj}} = 2 + 1 = 3。 numobj=2+1=3

表也需更新:

GT idConfidenceOB (IoU=0.5)
10.98True
30.89True
30.66False
10.61False
1.2.3.3 第三张图片

累积目标个数:

n u m o b j = 3 + 4 = 7 。 \mathrm{num_{obj}} = 3 + 4 = 7。 numobj=3+4=7

更新表:

GT idConfidenceOB(IoU=0.5)
10.98True
30.89True
60.88True
70.78True
30.66False
10.61False
40.52True
1.2.3.4 计算 AP

得到表以后,我们计算针对不同 Confidence(即取不同 Confidence 阈值)得到的 Precision 和 Recall 的信息)。

GT idConfidenceOB (IoU=0.5)
10.98True
30.89True
60.88True
70.78True
30.66False
10.61False
40.52True
  1. 首先将 Confidence 的阈值设置为 0.98(Confidence ≥ 0.98 的目标才算匹配正确),只有一个预测框符合条件(表中的第一行)。

    • TP = 1; FP = 0; FN = 6

    在 Confidence≥0.98 的条件下,TP=1 没什么问题;FP=0 是因为阈值的存在;FN=6 是因为累积目标个数 num_ob=7,所以 F N = n u m _ o b − T P = 7 − 1 = 6 \mathrm{FN=num\_ob - TP} = 7 - 1 = 6 FN=num_obTP=71=6。因此我们可以得到 P r e c i s i o n = T P T P + F P = 1 1 + 0 = 1 \mathrm{Precision = \frac{TP}{TP + FP} = \frac{1}{1+0}=1} Precision=TP+FPTP=1+01=1 R e c a l l = T P T P + F N = 1 1 + 6 = 0.14 \mathrm{Recall = \frac{TP}{TP + FN} = \frac{1}{1+6}=0.14} Recall=TP+FNTP=1+61=0.14
    Note:这个TP; FP; FN是看那个表,就不区分什么第几张图片了,看表就可以。

  2. 将 Confidence 阈值设置为 0.89

    • 此条件下,TP = 2; FP = 0; FN = num_ob - TP = 7 - 2 = 5,我们可以得到 Precision 和 Recall
  3. 将 Confidence 阈值设置为 0.66

    • 此条件下,TP=4; FP=1; FN=num_ob-TP=7-4=3,我们可以得到 P r e c i s i o n = T P T P + F P = 4 4 + 1 = 0.80 \mathrm{Precision = \frac{TP}{TP + FP} = \frac{4}{4+1}=0.80} Precision=TP+FPTP=4+14=0.80 R e c a l l = T P T P + F N = 4 4 + 3 = 0.57 \mathrm{Recall = \frac{TP}{TP + FN} = \frac{4}{4+3}=0.57} Recall=TP+FNTP=4+34=0.57

全部计算完毕后,结果如下表所示。

RankPrecisionRecall
11.00.14
21.00.28
31.00.42
41.00.57
50.800.57
60.660.57
70.710.71

我们可以根据求得的一系列的 Precision 和 Recall 绘制 P-R 曲线。以 Recall 为横坐标,Precision 为纵坐标得到 P-R 曲线,如下图所示。

在绘制 P-R 曲线时需注意:对于 Recall(横坐标)需要滤除一些重复数据(图中用框框住的即为参与计算的点,有两个点没有被框,它俩不参与 AP 的计算)。根据表中的数据可知,Recall=0.57 有 3 个值,此时需保留 Precision 最大的值,即:

RankPrecisionRecall
11.00.14
21.00.28
31.00.42
41.00.57
50.800.57
60.660.57
70.710.71

图中阴影部分的面积就是 AP,计算如下(重复的 Recall 已经滤除):

RankPrecisionRecall
11.00.14
21.00.28
31.00.42
41.00.57
60.710.71

R e c a l l = ∑ i = 1 R a n k ( R e c a l l i − R e c a l l i − 1 ) × max ⁡ ( P r e c i s i o n i , . . . , R a n k ) R e c a l l = ∑ i = 本行 R a n k ( R e c a l l 本行 − R e c a l l 上一行 ) × 本行及以下最大的 P r e c i s i o n \begin{aligned} \mathrm{Recall} & = \sum_{i=1}^{\mathrm{Rank}} (\mathrm{Recall}_i -\mathrm{Recall}_{i-1}) \times \max(\mathrm{Precision}_{ i, ..., \mathrm{Rank}}) \\ \mathrm{Recall} & = \sum_{i=本行}^{\mathrm{Rank}} (\mathrm{Recall}_{本行} -\mathrm{Recall}_{上一行}) \times 本行及以下最大的\mathrm{Precision} \end{aligned} RecallRecall=i=1Rank(RecalliRecalli1)×max(Precisioni,...,Rank)=i=本行Rank(Recall本行Recall上一行)×本行及以下最大的Precision

根据公式可以求得阴影的面积,即 AP 为:

R e c a l l = ( 0.14 − 0 ) × 1.0 + ( 0.28 − 0.14 ) × 1.0 + ( 0.42 − 0.28 ) × 1.0 + ( 0.57 − 0.42 ) × 1.0 + ( 0.71 − 0.57 ) × 0.71 = 0.6694 \begin{aligned} \mathrm{Recall} & = (0.14 - 0) \times 1.0 + (0.28 - 0.14) \times 1.0 + (0.42 - 0.28) \times 1.0 + (0.57 - 0.42) \times 1.0 + (0.71 - 0.57) \times 0.71 \\ & = 0.6694 \end{aligned} Recall=(0.140)×1.0+(0.280.14)×1.0+(0.420.28)×1.0+(0.570.42)×1.0+(0.710.57)×0.71=0.6694

了解完 AP 后我们就可以进一步得到一个新的指标 —— mAP。

1.3 mAP(mean Average Precision,即各类别 AP 的平均值)

mAP 就是各类别 AP 的平均值,计算公式如下:

m A P = 1 n c ∑ i = 1 n c A P i \mathrm{mAP = \frac{1}{nc}\sum^{nc}_{i=1}AP_i} mAP=nc1i=1ncAPi

其中 nc 为类别数。

1.4 注意事项

以上的 TP、FP、FN 都是经过 NMS 处理后得到的预测框。

2. MS COCO 评价指标中每条数据的含义

MS COCO 官网说明:https://cocodataset.org/#detection-eval

Note:图片中虽然写的是 AP,但实际上表示的是 mAP。

2.1 Average Precision (AP)

  1. A P \mathrm{AP} AP:MS COCO 的主要评价指标,设置的 IoU 阈值为 IoU = range(0.5, 1.00, 0.05) 共 10 个 IoU 的 mAP 的均值,计算公式如下:
    A P = 1 10 ( m A P I o U = 0.5 + m A P I o U = 0.55 + m A P I o U = 0.60 + m A P I o U = 0.65 + m A P I o U = 0.70 + m A P I o U = 0.75 + m A P I o U = 0.80 + m A P I o U = 0.85 + m A P I o U = 0.9 + m A P I o U = 0.95 ) \mathrm{AP = \frac{1}{10}(mAP^{IoU=0.5} + mAP^{IoU=0.55} + mAP^{IoU=0.60} + mAP^{IoU=0.65} + mAP^{IoU=0.70} + mAP^{IoU=0.75} + mAP^{IoU=0.80} + mAP^{IoU=0.85} + mAP^{IoU=0.9} + mAP^{IoU=0.95})} AP=101(mAPIoU=0.5+mAPIoU=0.55+mAPIoU=0.60+mAPIoU=0.65+mAPIoU=0.70+mAPIoU=0.75+mAPIoU=0.80+mAPIoU=0.85+mAPIoU=0.9+mAPIoU=0.95)
  2. A P I o U = 0.50 \mathrm{AP^{IoU}=0.50} APIoU=0.50:将 IoU 阈值设置为 0.5 得到的 mAP 值(就是上面我们举的例子),这个取值也是 PASCAL VOC 的评价指标。
  3. A P I o U = 0.75 \mathrm{AP^{IoU}=0.75} APIoU=0.75:是更加严格的标准(因为 IoU 的阈值越大,说明网络预测框与 GT 重合度越来越高 -> 目标的定位越来越准,这对网络来说是很难的)。

2.2 Across Scales

  1. APsmallmAP 针对小目标 若检测目标(GT)的像素面积小于 3 2 2 32^2 322,则将其归为小目标 ——衡量网络对于小目标的平均查准率
  2. APmediummAP 针对中目标 若检测目标(GT)的像素面积在 [ 3 2 2 , 9 6 2 ] [32^2, 96^2] [322,962] 之间,则将其归为中目标 ——衡量网络对于中等目标的平均查准率
  3. APlargemAP 针对大目标 若检测目标(GT)的像素面积大于 9 6 2 96^2 962,则将其归为大目标 ——衡量网络对于大目标的平均查准率

通过这三个指标可以看出该目标检测网络对于不同尺度目标的检测效果。如果我们的任务需要检测的目标都是较小的,我们应该更加关注与 A P s m a l l \mathrm{AP^{small}} APsmall 参数而不是 A P l a r g e \mathrm{AP^{large}} APlarge

2.3 Average Recall (AR)

对于目标检测网络,在代码部分会限制每张图片最终预测框的数量,这里的 max 就是这个数量。如 max=100,即每张图片最终预测 100 个预测框。而这里的 A R m a x = 100 \mathrm{AR^{max}=100} ARmax=100 就表示在每张图片预测框阈值为 100 的情况下,平均的查全率(Recall)是多少。

  1. A R m a x = 1 \mathrm{AR^{max}=1} ARmax=1:在每张图片预测框数量阈值为 1 的情况下,平均的查全率(Recall)是多少
  2. A R m a x = 10 \mathrm{AR^{max}=10} ARmax=10:在每张图片预测框数量阈值为 10 的情况下,平均的查全率(Recall)是多少
  3. A R m a x = 100 \mathrm{AR^{max}=100} ARmax=100:在每张图片预测框数量阈值为 100 的情况下,平均的查全率(Recall)是多少

从上图可以看到, A R m a x = 100 = 64 % \mathrm{AR^{max}=100}=64\% ARmax=100=64% A R m a x = 10 = 63.3 % \mathrm{AR^{max}=10}=63.3\% ARmax=10=63.3% A R m a x = 1 = 45.2 % \mathrm{AR^{max}=1}=45.2\% ARmax=1=45.2%。这说明 max 取 100 和取 10 相差不大,进一步说明了,模型训练时使用的数据集每张图片中目标(GT)的数目并不是很多,基本上在 10 左右;而当预测框数量限制在 1 时,它的 AR 仅为 45.2%,说明每张图片的目标个数一般是 >1 的。

2.4 AR Across Scales

与 AP、AP across scales 类似,AR across scales 表示对应不同目标尺度的 AR

  1. A R s m a l l \mathrm{AR^{small}} ARsmallAR 针对小目标 若检测目标(GT)的像素面积小于 3 2 2 32^2 322,则将其归为小目标 ——衡量网络对于小目标的平均查全率(Recall)
  2. A R m e d i u m \mathrm{AR^{medium}} ARmediumAR 针对中目标 若检测目标(GT)的像素面积在 [ 3 2 2 , 9 6 2 ] [32^2, 96^2] [322,962] 之间,则将其归为中目标 ——衡量网络对于中等目标的平均查全率(Recall)
  3. A R l a r g e \mathrm{AR^{large}} ARlargeAR 针对大目标 若检测目标(GT)的像素面积大于 9 6 2 96^2 962,则将其归为大目标 ——衡量网络对于大目标的平均查全率(Recall)

3. 各种指标的选择 —— 基于不同的任务

不同的任务需要使用不同的指标。

3.1 mAP

  • 于 PASCAL VOC 的 mAP 来说, A P I o U = 0.50 \mathrm{AP^{IoU}=0.50} APIoU=0.50 是要看的,因为它是 PASCAL VOC 的主要评价指标。
  • 对于 MS COCO 数据集来说, A P \mathrm{AP} AP(第一行,10 个 mAP 的平均)是要看的,因为它是 MS COCO 的主要评价指标。
  • 如果我们对 目标框定位精度要求较高 的话,我们可以关注 A P I o U = 0.75 \mathrm{AP^{IoU}=0.75} APIoU=0.75
  • 如果我们对 小目标检测要求比较高 的话,我们可以关注 A P s m a l l \mathrm{AP^{small}} APsmall,通过这个值可以了解网络对于小目标检测的平均查准率(整体情况)
  • 如果我们对 中目标检测要求比较高 的话,我们可以关注 A P m e d i u m \mathrm{AP^{medium}} APmedium
  • 如果我们对 大目标检测要求比较高 的话,我们可以关注 A P l a r g e \mathrm{AP^{large}} APlarge

3.2 AR

主要关注下面两个指标:

  1. A R m a x = 10 \mathrm{AR^{max}=10} ARmax=10
  2. A R m a x = 100 \mathrm{AR^{max}=100} ARmax=100

如果它俩 AR(平均查全率)相差很小的话, 可以减少网络预测框的个数,从而提高目标检测的效率。

参考

  1. 目标检测mAP计算以及coco评价标准
  2. COCO数据集介绍

相关文章:

MS COCO数据集的评价标准以及不同指标的选择推荐(AP、mAP、MS COCO、AR、@、0.5、0.75、1、目标检测、评价指标)

目标检测模型性能衡量指标、MS COCO 数据集的评价标准以及不同指标的选择推荐 0. 引言 0.1 COCO 数据集评价指标 目标检测模型通过 pycocotools 在验证集上会得到 COCO 的评价列表&#xff0c;具体参数的含义是什么呢&#xff1f; 0.2 目标检测领域常用的公开数据集 PASCAL …...

css实现鼠标多样化

cursor pointer&#xff1a; 手型default&#xff1a; 箭头text&#xff1a; 文本输入光标move&#xff1a; …...

21.2 Python 使用Scapy实现端口探测

Scapy 是一款使用纯Python编写的跨平台网络数据包操控工具&#xff0c;它能够处理和嗅探各种网络数据包。能够很容易的创建&#xff0c;发送&#xff0c;捕获&#xff0c;分析和操作网络数据包&#xff0c;包括TCP&#xff0c;UDP&#xff0c;ICMP等协议&#xff0c;此外它还提…...

Qt设计一个自定义的登录框窗口

今天写了一个Qt登录、注册的小demo&#xff0c;后续完善会连接MySQL使用&#xff0c;过几天写完我会放在github上。 主要页面&#xff1a; 动态演示&#xff1a; 写完这个界面后&#xff0c;我终于知道了Qt为什么几乎没什么好看的窗口设计了&#xff0c;随便写一个简单大方的登…...

05 MIT线性代数-转置,置换,向量空间Transposes, permutations, spaces

1. Permutations P: execute row exchanges becomes PA LU for any invertible A Permutations P identity matrix with reordered rows mn (n-1) ... (3) (2) (1) counts recordings, counts all nxn permuations 对于nxn矩阵存在着n!个置换矩阵 , 2. Transpose: 2.…...

[数据结构】二叉树

1.概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成 从上图我们可以发现&#xff1a; 1.二叉树不存在大于2 的度 2.二叉树的子树有左右之分&#xff0c;次序不能颠倒。是有…...

idea 中配置 maven

前文叙述&#xff1a; 配置 maven 一共要设置两个地方&#xff1a;1、为当前项目设置2、为新项目设置maven 的下载和安装可参考我之前写过的文章&#xff0c;具体的配置文章中也都有讲解。1、为当前项目进行 maven 配置 配置 VM Options: -DarchetypeCataloginternal2、为新项…...

Python---for循环嵌套

for循环嵌套&#xff0c;就是一个for循环里面嵌套另外一个for循环的写法。 当循环结构相互嵌套时&#xff0c;位于外层的循环结构常简称为外层循环或外循环&#xff0c;位于内层的循环结构常简称为内层循环或内循环。 基本语法&#xff1a; # 外层循环 for i in 序列1:# 内层…...

189. 轮转数组 --力扣 --JAVA

题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 解题思路 通过位移后位置对数组长度的取余来判断元素变换后的位置 代码展示 class Solution {public void rotate(int[] nums, int k) {int size nums.length;int[]…...

C# 使用waveIn实现声音采集

文章目录 前言一、需要的对象及方法二、整体流程三、关键实现1、使用Thread开启线程2、TaskCompletionSource实现异步3、将指针封装为Stream 四、完整代码1.接口2.具体实现 五、使用示例方式一方式二 总结 前言 之前实现了《C 使用waveIn实现声音采集》&#xff0c;后来C#项目…...

长连接的原理

Apollo的长连接实现是 Spring的DeferredResult来实现的,先看怎么用 import ...RestController RequestMapping("deferredResult") public class DeferredResultController {private Map<String, Consumer<DeferredResultResponse>> taskMap new HashMa…...

软考系列(系统架构师)- 2015年系统架构师软考案例分析考点

试题一 软件架构&#xff08;质量属性效用树、架构风险、依够点、权衡点&#xff09; 【问题1】&#xff08;12分&#xff09; 在架构评估过程中&#xff0c;质量属性效用树&#xff08;utility tree&#xff09;是对系统质量属性进行识别和优先级排序的重要工具。请给出合适的…...

小程序开发——小程序的视图与渲染

1.视图与渲染过程 基本概念&#xff1a; 视图层由WXML页面文件和样式文件WXSS共同组成。事件是视图层和逻辑层沟通的纽带&#xff0c;用户操作触发事件后可通过同名的事件处理函数执行相应的逻辑&#xff0c;处理完成后&#xff0c;更新的数据又将再次渲染到页面上。 WXML页面…...

用python实现操作mongodb的插入和查找操作

用python实现操作mongodb的插入和查找操作 import pymongoclient pymongo.MongoClient("mongo://localhost:27017") db client["app"] col db["C1"]# 插入一条数据 #user { # "name": "Sam", # "age":…...

代码审计及示例

简介&#xff1a; 代码安全测试是从安全的角度对代码进行的安全测试评估。 结合丰富的安全知识、编程经验、测试技术&#xff0c;利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷&#xff0c;在代码形成软件产品前将业务软件的安全风险降到最低。 方法&#x…...

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…...

基于FPGA的电风扇控制器verilog,视频/代码

名称&#xff1a;基于FPGA的电风扇控制器verilog 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 基于FPGA的电风扇控制器 运用 EDA SOPO实验开发系统设计一个基于FPGA的电风扇定时开关控制器,能实现手动和自动模式之间的切换。要求: (1)KI为电…...

【MySQL】区分:等值连接/自连接/自然连接/外连接 以及ON和Where使用

区分&#xff1a;等值连接/自连接/自然连接/外连接 以及ON和Where使用 一、等值连接二、自连接三、自然连接四、外连接1.左外连接2.右外连接3.全外连接 五、using 和 on六、JOIN 关联表中 ON、WHERE 后面跟条件的区别 一、等值连接 等值连接&#xff1a;它是基于两个表之间的相…...

Windows环境下Apache安装部署说明及常见问题解决

一、软件准备 1.1 Python的下载与安装 见博客 链接: Python下载安装 1.2 Pycharm的下载与安装 见博客 链接: pycharm安装 1.3 Mysql的下载与安装 见博客 链接: MySQL安装 1.4 Navicat的下载与安装 可参考软件安装管家。 解释说明:Pycharm是Python的集成编译环境&#xff0c;Nav…...

Linux-安装docker-compose

前言&#xff1a;本文建立在服务器中已经存在docker环境的基础上&#xff0c;总结了安装docker-compose过程&#xff0c;以及安装过程中遇到的问题和解决方案。 一、下载docker-compose 在网上找了两种&#xff0c;一种是github官方的&#xff0c;一种是国内的镜像 gitbub官…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...