当前位置: 首页 > 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官…...

机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)

KNN-手写数字数据集: 使用sklearn中的KNN算法工具包( KNeighborsClassifier)替换实现分类器的构建,注意使用的是汉明距离; 分段解释代码: import os import pandas as pd from Levenshtein import hamming导入所需的库,包括os用于文件操作,pandas用于数据处理,以及hamm…...

Java零基础入门-赋值运算符

前言 Java是一门广泛被应用的编程语言&#xff0c;它被用于开发各种类型的应用程序&#xff0c;从桌面应用程序到企业级后端系统。对于零基础的人来说&#xff0c;学习Java可能会感到有些困难。本文将帮助那些没有编程经验的人了解Java的赋值运算符。 摘要 本文将介绍Java中…...

xshell+xming显示jmeter的gui页面

1.下载和安装xming&#xff0c;下载地址&#xff1a;https://sourceforge.net/projects/xming/ 2.配置xming 记住这个端口&#xff0c;一会要用到 修改进入xming安装目录修改host文件 此处是远程服务器的ip 3.服务器执行vi /etc/ssh/sshd_config&#xff0c;修改成如图所示…...

el-tree业务

<el-form-item label"选择节点" prop"node_ids"><el-checkboxv-if"regionList.length"v-model"selectAll":disabled"selectDisabled":indeterminate"isIndeterminate":show-checkbox"!selectDisabl…...

警惕Mallox勒索病毒的最新变种malloxx,您需要知道的预防和恢复方法。

导言&#xff1a; 恶意软件的威胁不断进化&#xff0c;其中之一是.malloxx勒索病毒。这种病毒可以加密您的文件&#xff0c;并要求您支付赎金以解锁它们。本文91数据恢复将详细介绍.malloxx勒索病毒&#xff0c;包括如何恢复被加密的数据文件以及如何预防这种威胁。如果受感染…...

linux中断下文之tasklet(中断二)

在申请 GPIO 中断时使用 request_irq,但是request_irq绑定的中断服务程序指的是中断上文。在 Linux 内核中&#xff0c;tasklet 是一种特殊的软中断机制&#xff0c;被广泛用于处理中断下文相关的任务。它是一种常见且有效的方法&#xff0c;在多核处理系统上可以避免并发问题。…...

Mysql事务+redo日志+锁分类+隔离级别+mvcc

事务&#xff1a; 是数据库操作的最小工作单元&#xff0c;是作为单个逻辑工作单元执行的一系列操作&#xff1b;这些操作作为一个整体一起向系统提交&#xff0c;要么都执行、要么都不执行&#xff1b;事务是一组不可再分割的操作集合&#xff08;工作逻辑单元&#xff09;&a…...

Kafka-Java四:Spring配置Kafka消费者提交Offset的策略

一、Kafka消费者提交Offset的策略 Kafka消费者提交Offset的策略有 自动提交Offset&#xff1a; 消费者将消息拉取下来以后未被消费者消费前&#xff0c;直接自动提交offset。自动提交可能丢失数据&#xff0c;比如消息在被消费者消费前已经提交了offset&#xff0c;有可能消息…...

Python 训练集、测试集以及验证集切分方法:sklearn及手动切分

目录 方法一 方法二 需求目的&#xff1a;针对模型训练输入&#xff0c;按照6:2:2的比例进行训练集、测试集和验证集的划分。当前数据量约10万条。如果针对的是记录条数达上百万的数据集&#xff0c;可按照98:1:1的比例进行切分。 方法一&#xff1a;切分训练集和测试集&…...

数据结构,及分类(存储分类、逻辑分类)介绍

一、数据结构&#xff1a; 数据是软件开发的核心。在软件开发过程中基本上就是对数据的新增、删除、修改、查看的操作。 如何合理存储数据&#xff0c;如何有效提升数据操作开发效率&#xff0c;都是软件开发中的重中之重。使用合理的数据结构是非常重要的。 1.1简介&#xff…...