基于 DETR 的开放世界目标检测

2023-11-04

本文首发于微信公众号 CVHub,不得以任何形式转载到其它平台,仅供学习交流,违者必究!

Title: Open World DETR: Transformer based Open World Object Detection

Paper: https://arxiv.org/pdf/2212.02969v1.pdf

Author: Na Dong et al. (NUS)

Introduction

开放世界目标检测其实是一个相对来说比较少人关注的领域,其旨在不限定特定目标类别的情况下,对图像中的所有目标进行检测。与传统的目标检测方法有所不同,传统方法通常需要提前限定目标类别,并且只能检测预先定义好的目标类别。因此,面向开放世界的目标检测具备以下优势,例如:

  • 可以检测新出现的未知目标,这对于应用在动态环境中的系统来说是非常重要的
  • 可以更快速地进行目标检测,因为无需预先定义目标类别,也无需训练多个分类器(多模型)

本文为大家介绍一种名为Open World DETR两阶段训练方法,该方法基于Deformable DETR,旨在在没有明确监督的情况下,检测训练数据中不存在的未知对象。此外,必须在持续增量地给出未知对象的相应注释时,识别出未知对象的确切类别,而不会导致先前已知类别的灾难性遗忘。

Open World DETR

第一阶段:使用当前带标注的数据来训练一个模型,以便从当前已知的类别中检测对象,同时训练一个额外的二分类器,用于将预测分类为前景背景类别。这有助于模型构建一个不受偏见的特征表示,可以促进在随后的过程中检测未知类别。

第二阶段:使用多视图自标签策略一致性约束来微调模型的特定组件。此外,通过使用知识蒸馏典型复现来缓解在未知类别的注释逐渐可用时的灾难性遗忘。

PASCAL VOCMS-COCO上的实验结果表明,本文所提出的方法在大幅度上优于其他最先进的开放世界目标检测方法。

exemplar replay,是增量学习领域中一种非常经典的方法,用于缓解遗忘已经学过的知识,以便保留原来的性能。它通过将先前学习的样本(称为“exemplar”)复制并插入新的训练数据中来实现这一目的。这样,模型就可以继续在新的数据上进行训练,同时保持对先前学习的样本的记忆。在本文中,作者使用该方法来缓解在未知类别的注释逐渐可用时的灾难性遗忘。

Motivation

现如今,大部分传统的基于深度学习的目标检测算法是基于封闭世界假设的,因此,即使是当前最先进目标检测方法也很难识别出未知类别的对象,因此学术界延伸出了另外一种新的检测任务—面向开放世界的目标检测。

一般而言,人类比机器更擅长识别未知类别的对象,在绝大多数情况下都能正确区分已知类别中的未知对象并快速识别未知对象。在推理时,即使是当前最先进的基于深度学习的物体检测方法也无法感知未知对象。(对于单纯的通用检测模型严格来说我认为应该不算,毕竟这种方法只能单纯的区分前景和背景,但不能感知到具体的类别)

开放世界物体检测旨在通过训练基于深度学习的物体检测器来检测未知物体,并且不需要明确的监督。此外,在逐步给出未知物体的注释时,必须能够识别这些未知物体,同时不会忘记之前已知的类别。具体来说,要实现开放世界物体检测,必须克服三大挑战:

  1. 除了准确识别已知类别外,模型还必须学会在无监督的情况下为未知类别生成高质量的proposal

  2. 在全监督的情况下,目标检测模型往往会将潜在的未注释的未知物体抑制为背景。在开放世界物体检测设置中,模型必须能够将未知物体与背景分离开来;

  3. 使用已知类别的注释训练的模型极大概率会偏向于将未知物体检测为已知类别之一。在开放世界物体检测设置中,模型必须能够将未知物体与已知类别区分开来。

下面,让我们看下先前的代表性工作是如何实现的:

先来看下经典的开放目标世界检测工作——ORE,该方法基于Faster R-CNN,其依赖于保留的验证集来估计未知类别的分布。

相比之下,本文方法不需要任何未知类别的监督,相对来说更符合开放世界物体检测的定义。

再来看下基于Transformer的开放世界物体检测方法——OW-DETR,该方法利用基于注意力的伪标签方案来选择注意力分数较高但与任何已知类别的GT边界框不匹配的物体查询框作为未知类别的伪提议框。尽管OW-DETRORE的性能有所提高,但该方法本质上对注意图的依赖导致只有少部分具有高注意分数的未知物体被定位,从而抑制了其余的部分未知物体。

Methods

Overview of the proposed model pre-training stage

第一阶段的方法如上图所示,结构挺简单的,就是基于Deformable DETR的框架训练处一个检测器出来,Backbone是基于TransformerHead部分在原有的框架上加多了一个分支:

  • Regressor:回归出物体所在的位置;
  • Classifier:学习当前物体的类别;
  • Binary_Classifier:仅学习如何区分前景和背景,为第二阶段的学习做准备。

第三个分支的具体训练步骤也很简单,只需将所有前景的标签设为0,背景设为1即可,损失函数后面会讲。

Transformer笔者在去年已经大致介绍过了感兴趣的小伙伴可以直接翻阅公众号『CVHub』历史文章,本文不再详述,下面简单讲解下本方法所涉及到的其他相关知识点。

DETR

DETR

同先前的目标检测器范式不同,DETR框架致力于推断出一个固定长度为N的预测集合(长度序列),即输出N个预测框和对应的类别置信度,其中N远大于实际的GT数(看图理解)。

其次,以往的目标检测器如YOLO系列等,大部分都是通过建立AnchorGT之间的联系(一般为IoU)来区分正、负样本,而DETR则是基于一种匹配策略来确定正、负样本的,公式如下所示:

σ ^ = arg ⁡ min ⁡ σ ∈ S N ∑ i N L match ⁡ ( y i , y ^ σ ( i ) ) \hat{\sigma}=\underset{\sigma \in \mathfrak{S}_N}{\arg \min } \sum_i^N \mathcal{L}_{\operatorname{match}}\left(y_i, \hat{y}_{\sigma(i)}\right) σ^=σSNargminiNLmatch(yi,y^σ(i))

其中, L match ⁡ ( y i , y ^ σ ( i ) ) \mathcal{L}_{\operatorname{match}}\left(y_i, \hat{y}_{\sigma(i)}\right) Lmatch(yi,y^σ(i))表示的是真值 y ^ \hat{y} y^ 与预测值 y ^ σ ( i ) \hat{y}_{\sigma(i)} y^σ(i) 之间的匹配代价函数。这里,$\mathcal{L}_{\operatorname{match}}$ 通常采用Hungarian loss作为损失函数

Hungarian loss

Hungarian loss最早由Russell StewartMykhaylo Andriluka两人于CVPR 2015所发表的文章中提出,文中首次将二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)引入深度学习目标检测任务中的成功案例。

Hungarian loss其实理解起来也不难,本质上就是先利用匈牙利算法进行配对,然后基于这个匹配结果计算相应的损失。

具体地,我们先基于匈牙利算法来求解出最优的匹配结果:

σ ^ = arg ⁡ min ⁡ σ ∈ G N ∑ i N L match  ( y i , y ^ σ ( i ) ) L match  ( y i , y ^ σ ( i ) ) = − 1 { c i ≠ ∅ } p ^ σ ( i ) ( c i ) + 1 { c ≠ ∅ } L box  ( b i , b ^ σ ( i ) ) \begin{gathered} \hat{\sigma}=\underset{\sigma \in \mathfrak{G}_N}{\arg \min } \sum_i^N \mathcal{L}_{\text {match }}\left(y_i, \hat{y}_{\sigma(i)}\right) \\ \mathcal{L}_{\text {match }}\left(y_i, \hat{y}_{\sigma(i)}\right)=-\mathbb{1}_{\left.\left\{c_i \neq \varnothing\right\} \hat{p}_{\sigma(i)}\left(c_i\right)+\mathbb{1}_{\{c} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_i, \hat{b}_{\sigma(i)}\right) \end{gathered} σ^=σGNargminiNLmatch (yi,y^σ(i))Lmatch (yi,y^σ(i))=1{ci=}p^σ(i)(ci)+1{c=}Lbox (bi,b^σ(i))

最后,通过获取匹配结果后,计算出损失函数,进行相应的梯度回传:

L Hungarian  ( y , y ^ ) = ∑ i = 1 N [ − log ⁡ p ^ σ ^ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box  ( b ˙ i , b ^ σ ^ ( i ) ) ] \mathcal{L}_{\text {Hungarian }}(y, \hat{y})=\sum_{i=1}^N\left[-\log \hat{p}_{\hat{\sigma}(i)}\left(c_i\right)+\mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(\dot{b}_i, \hat{b}_{\hat{\sigma}}(i)\right)\right] LHungarian (y,y^)=i=1N[logp^σ^(i)(ci)+1{ci=}Lbox (b˙i,b^σ^(i))]

需要注意的是,在原始的论文中,作者在进行二分图匹配时,参照物是直接采用GT,即为每个预测值均考虑其最佳的匹配结果,因此预测值的下标是直接采用GT的下标i作为索引,代表与当前GT所匹配的预测框,这便是原文所提及到的置换不变形(Permutation Invariant)。为了消除这种影响,我们可以引入Positional Encoding,使其变为置换同变性(Permutation Variant)。

更详细的解读可参考此篇文章,由于篇幅内容有限,本文不再做详细阐述。

了解完原始的损失函数如何定义后,我们再来看看本文是如何实现的。首先,对于两个分支定义如下:

σ ^ = arg ⁡ min ⁡ σ ∑ i = 1 N L match  ( y i , y ^ σ ( i ) ) σ ^ ∗ = arg ⁡ min ⁡ σ ∗ ∑ i = 1 N L match  ( y i ∗ , y ^ σ ∗ ( i ) ∗ ) \begin{aligned} \hat{\sigma} & =\underset{\sigma}{\arg \min } \sum_{i=1}^N \mathcal{L}_{\text {match }}\left(y_i, \hat{y}_{\sigma(i)}\right) \\ \hat{\sigma}^* & =\underset{\sigma^*}{\arg \min } \sum_{i=1}^N \mathcal{L}_{\text {match }}\left(y_i^*, \hat{y}_{\sigma^*(i)}^*\right) \end{aligned} σ^σ^=σargmini=1NLmatch (yi,y^σ(i))=σargmini=1NLmatch (yi,y^σ(i))

  • 定义常规的分类+回归分支:

L match  ( y i , y ^ σ ( i ) ) = 1 { c i ≠ ∅ } L c l s ( c i , c ^ σ ( i ) ) + 1 { c i ≠ ∅ } L box  ( b i , b ^ σ ( i ) ) \begin{aligned} \mathcal{L}_{\text {match }}\left(y_i, \hat{y}_{\sigma(i)}\right) & =\mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \mathcal{L}_{\mathrm{cls}}\left(c_i, \hat{c}_{\sigma(i)}\right) \\ & +\mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(\mathbf{b}_i, \hat{\mathbf{b}}_{\sigma(i)}\right) \end{aligned} Lmatch (yi,y^σ(i))=1{ci=}Lcls(ci,c^σ(i))+1{ci=}Lbox (bi,b^σ(i))

  • 定义前背景二分类+回归分支:

KaTeX parse error: Expected 'EOF', got '_' at position 168: …_{\text {binary_̲cls }}\left(c_i…

最后,基于上面的定义,我们便可以将最终的损失函数定义为如下形式:

L h g b i n ( y , y ∗ , y ^ ) = ∑ i = 1 N [ L c l s ( c i , c ^ σ ^ ( i ) ) + 1 { c i ≠ ∅ } L b o x ( b i , b ^ σ ^ ( i ) ) + λ b − c l s L b − c l s ( c i ∗ , c ^ σ ^ ∗ ( i ) ∗ ) ] \begin{aligned} & \mathcal{L}_{\mathrm{hg}}^{\mathrm{bin}}\left(y, y^*, \hat{y}\right)=\sum_{i=1}^N\left[\mathcal{L}_{\mathrm{cls}}\left(c_i, \hat{c}_{\hat{\sigma}(i)}\right)\right. \\ & \left.+\mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \mathcal{L}_{\mathrm{box}}\left(\mathbf{b}_i, \hat{\mathbf{b}}_{\hat{\sigma}(i)}\right)+\lambda_{\mathrm{b}_{-} \mathrm{cls}} \mathcal{L}_{\mathrm{b}_{-} \mathrm{cls}}\left(c_i^*, \hat{c}_{\hat{\sigma} *(i)}^*\right)\right] \end{aligned} Lhgbin(y,y,y^)=i=1N[Lcls(ci,c^σ^(i))+1{ci=}Lbox(bi,b^σ^(i))+λbclsLbcls(ci,c^σ^(i))]

这里,常规分类损失和二分类损失均采用Sigmoid Focal Loss,回归损失则结合L1损失和GIoU损失,权重均为0.5,具体参数同Deformable DETR保持一致。


Overview of the proposed open world learning stage

上图描述了一种基于多视图的自动标签策略,它包含两个网络。在训练过程中,灰色斜线模块的参数是fixed的。注意,以上两组损失项是在不同视图上应用同一目标的实例。这里的特征提取器是基于第一阶段训练出来的,由于在一阶段已经学到了如何区分前景和背景(通过Binary_Classifier分支实现),因此这里不需要再单独学习如何定位RoI了,因此直接将Regressor头和Backbone的参数freezed即可。

根据作者的实验结果不难发现,Deformable DETR 中的projection层和classification头是与类别相关的(class-specific),而 CNNs、Transformer 和regressor头是类别不相关的(class-agnostic)。因此,本文提出在从预训练模型初始化模型的参数后,调整类特定组件的参数,而保持类不可知组件的参数不变。在保持类不可知组件的参数不变的同时,调整类特定组件的参数,有助于模型在不遗忘之前检测到的新类别的物体的同时检测到新的类别的物体。

Class-specific 与 Class-agnostic

在目标检测中,我们依据检测器是否关心待检测类别可以简单的划分为class-specificclass-agnostic这两种,下面让我们来简单介绍下它们之间的区别。

首先,class-specific,亦称为class-aware,即与类别相关的或者说是对类别感知的检测算法。早期的经典检测算法如Faster-RCNN系列均属于class-specific,这是因为当我们输入一张图片给检测器时,检测算法会返回特定的类别和对应的边界框给我们,这便称为是与类别相关的。

其次,对于class-agnostic,即与类别无关的或者说是对类别无感的检测算法,大多数是用于诸如显著性检测这类任务上。class-agnostic检测算法中仅区分两类物体——前景背景。无论你最终检测的目标是阿猫阿狗还是一头猪,在该算法中统称为前景,除前景外的物体全部视为背景。由于检测模型事先并不清楚自己正在检测对象的具体类别,因为我们统称为与类别无关的检测算法。

同样地,延伸到具体架构上,例如CNNsTransformerMLP等,这些网络架构宏观上可用于计算机视觉、自然语言处理、语音识别等方向,更细一点就CV而言也可做阿猫阿狗的分类,亦可做行人车辆检测等,因此我们可以简单的理解为class-agnostic,而对于regressor head这个想必更不用说了把?

Multi-view self-labeling

Multi-view self-labeling

为了解决未知类别的缺失标注问题,如上图所示,作者提出了一种多视角自标签策略来生成未知类别的伪标签以用于训练模型能够学习检测出未知类别。具体做法如下:

  1. 对输入图像采用通用的数据增强,如随机裁剪和缩放;
  2. 利用 class-agnostic binary classifier 分支为未知类别从预测结果中挑选合适的伪提议框;这里,可以先采用 NMS 过滤重复的提议框后基于置信度过滤掉分数较低的propossals

此处需要注意的是,如果这些 pseudo proposals与当前已知类别的真实对象有很多重叠部分,那么这些类别的性能肯定会下降的。为了缓解这个问题,作者通过仅选择非重叠于当前已知类别真实对象的未知类别的最高得分建议,来缓解这个问题,说人话就是挑出最靠谱的。

  1. 根据两种视图,执行交换预测机制,以鼓励模型对同一图像的不同视图做出一致的预测。这一点其实类似于Mask的机制,就是强迫网络去学习出这种信息。

此外,为了为未知类别补充更多的 proposals,作者引入了 SSL 选择性搜索算法来生成额外的 proposals,这些提议框不与上述两种方式产生的 proposals 重叠。

选择性搜索算法用于为目标检测算法提供候选区域,优势是速度快,召回率高。首先采用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域,然后使用相似度计算方法合并一些小的区域。值得注意的是,RCNNFast RCNN中也用到了这一技术。

Consistency constraint

为了提高特征表示的质量,作者提出在原始图像和增强图像的对象查询特征之间应用一个一致性约束。注意,原始图像的二分类器生成的伪真实对象与增强图像的二类别器生成的伪真实对象不匹配。因此,只在与已知类别的真实对象和选择性搜索生成的伪真实对象匹配的对象查询特征上应用一致性约束。

首先采用 pair-wise matching loss 来找到原始图像和增强图像的最优分配。然后给出匹配的对象查询特征之间的一致性损失,如下所示:

L c o n ( q ^ , q ^ a u g ) = ∑ i = 1 M ℓ 1 ( q ^ σ ^ ( i ) , q ^ σ ^ a u g ( i ) ) \mathcal{L}_{\mathrm{con}}\left(\hat{q}, \hat{q}^{\mathrm{aug}}\right)=\sum_{i=1}^M \ell_1\left(\hat{q}_{\hat{\sigma}(i)}, \hat{q}_{\hat{\sigma}^{\mathrm{aug}}(i)}\right) Lcon(q^,q^aug)=i=1M1(q^σ^(i),q^σ^aug(i))

整体的损失函数为:

L total  = L hg  bin  ( y u , y u ∗ , y ^ ) + L hg  bin  ( y u aug  , y u ∗  aug  , y ^ aug  ) + λ con  L con  ( q ^ , q ^ aug  ) \begin{aligned} \mathcal{L}_{\text {total }} & =\mathcal{L}_{\text {hg }}^{\text {bin }}\left(y_u, y_u^*, \hat{y}\right)+\mathcal{L}_{\text {hg }}^{\text {bin }}\left(y_u^{\text {aug }}, y_u^{* \text { aug }}, \hat{y}^{\text {aug }}\right) \\ & +\lambda_{\text {con }} \mathcal{L}_{\text {con }}\left(\hat{q}, \hat{q}^{\text {aug }}\right) \end{aligned} Ltotal =Lhg bin (yu,yu,y^)+Lhg bin (yuaug ,yu aug ,y^aug )+λcon Lcon (q^,q^aug )

Alleviating catastrophic forgetting

DETR with exemplar replay and KD

除了能够检测未知对象作为对象外,这个模型还需要在仅训练当前已知类别的注释数据集时克服先前已知类别的遗忘。有许多方法被提出来解决这个问题,包括exemplar replayknowledge distillation 等。

通过结合上面提到的两种技术可用于减轻先前已知类别的遗忘。具体来说,在每个增量步骤中训练当前已知类别数据集时,应用知识蒸馏到特征和分类输出。此外,存储先前已知类别和当前已知类别的平衡样本集,并在增量步骤后对这些数据进行微调。

更多细节请查阅原始论文,由于篇幅有限,本文不做详细介绍。

Experiments

Benchmark

Benchmark

本文在以上四个基准数据集上进行理论验证,同《Open-world detection transformer》(In CVPR, 2022)和《Towards open world object detection》(CVPR2021 Oral)两篇文章的设置保持一致,有兴趣的同学也可以都督这两篇论文。

如上图所示,第一个任务的训练集来自PASCAL VOC,后面三个任务的训练集来自MS-COCO。 来自PASCAL VOC测试集的所有图像和来自MS-COCO的val集的选择图像构成验证集,其中标记了所有以前已知的类和当前已知的类,未知任务的所有类将标记为unknown.

Metrics

对于未知类别,常采用 Unknown Recall, 即U-Recall来衡量模型检索未知实例能力的主要评估指标。此外,除了常规的mAP评估指标,本实验还引入了Wilderness Impact(a.w.a WI)和Absolute Open-Set Error(a.w.a A-OSE)两个评价指标来进一步综合评估所提方法对未知类别和已知类别的效果。

  • Wilderness Impact

Wilderness Impact指标用于衡量模型在将未知实例预测为已知类别时的混淆程度,公式如下:

 Wilderness  Impact ⁡ ( W I ) = P K P K ∪ U − 1 \text { Wilderness } \operatorname{Impact}(W I)=\frac{P_{\mathcal{K}}}{P_{\mathcal{K} \cup \mathcal{U}}}-1  Wilderness Impact(WI)=PKUPK1

其中, P K P_{\mathcal{K}} PK P K ∪ U P_{\mathcal{K} \cup \mathcal{U}} PKU 分别为在已知类别上的precision以及在已知和未知类别并集上的precisionrecall取 0.8. 理想情况下,我们希望 WI 等于 0,即当逐渐加入未知类别,在保证召回的情况下,希望精确率越高越好。反言之,如果该指标越大,说明模型无法很好的区分出未知类别。

  • Absolute Open-Set Error

A-OSE则是用于衡量检测为已知类的未知实例的总数,即被误分类至已知类别的未知目标的绝对值数量。

  • mAP

此处mAP的阈值取 0.5,用于评估模型在引入新类别下的增量学习性能,衡量模型对于已知类别的识别能力。

Implementation details

实验细节是块大头,让我们一看究竟:

  • 网络模型:主干为 ResNet-50Deformable DETR 模型。
  • 硬件设备:8 * RTX 3090,每块 GPU 的批次设置为 2
  • 训练阶段:
    • 第一阶段基于 ImageNet 数据集上以自监督的方式训练初始权重,采用初始学习率为 0.0002 和 权重衰减率为 0.0001AdamW 优化器;在前 50 个 epochs 内,学习率在第 40 个 epoch 时衰减 1/10;
    • 第二阶段采用来自一阶段的权重进行参数初始化,对 binary classification headclass-specific projection layer以及ckassification head这三个部分进行 fine-tune的同时冻结其他层的参数;采用的初始学习率为 0.0002 共训练 5 个 epochs,同时在第 3 个 epoch 将学习率降低 1/10;
    • 损失函数中 λ b c l s \lambda_{b_cls} λbcls λ c o n \lambda_{con} λcon 均设置为 1;
    • 其他训练细节同 ORE 论文中的参数设置保持一致。
  • 推理阶段:取每张图像的前 50 个得分最高的预测用于模型性能的评估。

Comparison on MS-COCO

从上述结果可以看出,本文方法的综合性能更强,具有更高准确性和召回率。

Conclusion

本文是继 OREOW-DETR 后,针对开放世界对象检测场景所提出的一种更加简洁高效的 DETR 目标检测方法。该方法主要涉及到两个阶段,第一阶段训练一个标准的可变性DETR外加接入一个额外的用于前、背景识别的二分类器以构建无偏表示;第二阶段则基于数据增强和增量学习引入了一种多视图自标记策略,通过通过一阶段预训练所得到的二分类器和选择性搜索算法为未知类别生成高质量的伪提议框。同时,通过进一步对对象查询特征实施一致性约束,从而产生更高质量的特征表示。

长远来看,开放世界的目标检测是一个非常值得研究的领域,其在许多应用场景中都具有非常重要的应用价值,如自动驾驶、无人机监控、智能家居等。笔者认为,与其花大把精力在传统的COCO数据集上提高一个百分点,还不如另辟蹊径,解决更具挑战性和更有意义的课题。

写在最后

如果您也对人工智能和计算机视觉全栈领域感兴趣,强烈推荐您关注有料、有趣、有爱的公众号『CVHub』,每日为大家带来精品原创、多领域、有深度的前沿科技论文解读及工业成熟解决方案!欢迎添加小编微信号:cv_huber,一起探讨更多有趣的话题!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 DETR 的开放世界目标检测 的相关文章

  • 使用Rider断点调试lua代码

    记录一下 新建调试配置 在 Rider 工具栏的 Debug Config 中点击 Editor Configigurations 然后点击 号 新建一个 Emmy Debugger NEW 输入调试器名字为 Tcp Debugger co
  • Linux中cmake指定特定版本gcc

    最近因为服务器上有多个gcc 编译llvm的时候需要使用5 1以上的 但是由于默认目录 usr bin下的gcc是4 8 5 在另外的目录下有一个7 3 1的 cmake默认使用老版本的gcc 导致cmake失败 报错 输入which gc
  • websocked基础

    websocked基础 http与websocked区别 http websocked websocked特点 如何使用websocked 补充blob对象或Arraybuffer对象 http与websocked区别 http 只能由客户
  • cannot find reference ‘keras’ in ‘__init__.py‘

    文章目录 起因 原因 解决办法 参考来源链接 起因 在网上找了开源代码 之前看的都是jupyter notebook编写的 今天用pycharm调试一个开源程序 发现总是不能调试 检查了好几遍编译环境都没问题 运行正常 就是不能调试 报错是
  • 早期计算机语言称为,程序设计语言是软件的基础和组成部分,也称为计算机语言...

    原标题 程序设计语言是软件的基础和组成部分 也称为计算机语言 程序是对计算任务的处理对象和处理规则的描述 必须装入计算机内部才能工作 没有操作系统 系统无用 程序设计语言是软件的基础和组成部分 也称为计算机语言 定义计算机程序的语法规则 由
  • torch.nn.Linear()函数讲解

    函数讲解 in features指的是输入的二维张量的大小 即输入的 batch size size 中的size out features指的是输出的二维张量的大小 即输出的二维张量的形状为 batch size output size
  • 【Matlab】智能优化算法_灰狼优化算法GWO

    Matlab 智能优化算法 灰狼优化算法GWO 1 背景介绍 2 基本思想 2 1 等级制度 2 2 狩猎方式 3 公式推导 3 1 社会等级制度 3 2 包围猎物 3 3 包围猎物 3 4 攻击猎物 3 5 搜索猎物 4 算法流程图 5

随机推荐

  • 史上最详细springboot vue UEditor整合(包括遇到的各种坑)

    Vue中引入UEditor看这篇教程https blog csdn net kshon article details 102667318 接下来说说springboot中配置UEditor遇到的各种坑 1 将UEditor中目录下的con
  • IM即时通讯-推荐框架

    CIM https gitee com farsunset cim CIM是一套基于mina或netty框架下的推送系统 或许有一些企业有着自己一套即时通讯系统的需求那么CIM为您提供了一个解决方案 目前CIM支持websocket and
  • java map取第一个元素_java常用对象Map集合中关于取出元素的说明

    之前在上一篇 java常用对象API中集合框架之Map的用法 文章中简单的例举了一些Map集合中的一些简单方法和一些常用的子类 那么本章将对例举的方法和子类进行一一的详细说明和举例 这样也是为了让更多的朋友们学习java能够得到另一种启发而
  • 将手机、平板变成电脑第二屏

    将手机 平板变成电脑第二屏 过年回家了 带着大包小包 显示器总不能再带在身上吧 常年双屏使用者 当没有了双屏 感觉很难受 于是找到了开源项目deskreen Deskreen 是一款桌面应用程序 可以通过 WiFi 局域网下 将任何带有浏览
  • 华为OD机试 Python 【恢复数字序列】

    描述 给你一个由正整数拼接而成的字符串 但中间有些字符位置被打乱了 比如原来有 89101112 它可能被打乱为 90811211 这时整数10就变成了0和1两部分 请你找出原始字符串中的最小正整数是什么 输入 一行 包括被打乱的字符串和原
  • RabbitMQ 消息丢失的场景,如何保证消息不丢失?

    一 RabbitMQ消息丢失的三种情况 第一种 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候 可能数据就在半路给搞丢了 因为网络问题啥的 都有可能 第二种 RabbitMQ 弄丢了数据 MQ还没有持久化自己挂了 第三种 消
  • 【C#】.Net 腾讯云一句话识别 【实例】

    腾讯云一句话识别实例 using System using System Threading Tasks using TencentCloud Common using TencentCloud Common Profile using T
  • 编写高质量代码:改善Java程序的151个建议(第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151)...

    第10章 性能和效率 建议132 提升Java性能的基本方法 建议133 若非必要 不要克隆对象 建议134 推荐使用 望闻问切 的方式诊断性能 建议135 必须定义性能衡量标准 建议136 枪打出头鸟 解决首要系统性能问题 建议137 调
  • 素数筛【朴素,埃氏,欧拉】(持续优化ing)

    一 朴素筛法 定义部分说明 int prime 11000 存素数 int ans 0 计数 计prime数组中有多少个素数 代码实现部分 void getPrime int n prime ans 2 for int i 3 i lt n
  • Docker开发指南(自用)

    Docker开发指南 自用 本指南总结归纳菜鸟教程上的常用指令 并在文末给出了一个应用实例 序言 Docker是什么 Docker 是一个开源的应用容器引擎 基于 Go 语言 并遵从 Apache2 0 协议开源 Docker 可以让开发者
  • 【C语言练习题】计算1 * 2 * 3+3 * 4 * 5+5 * 6 * 7+...+99 * 100 * 101的值。

    计算1 2 3 3 4 5 5 6 7 99 100 101的值 错误版本 循环结束后仍执行i i 多余 include
  • 金融风控反欺诈之图算法

    先介绍下金融借贷业务流程 用户前来申请借贷 会先经过欺诈识别 把欺诈团伙和主观欺诈的个人拒绝掉 然后对通过的人做信用评估 最后根据额度模型 算出利润最大化时放款金额 刚才提到了团队欺诈 举个真实的例子 宜人贷在他们的财报中公布的 他们被一个
  • BFS和DFS代码实现

    BFS DFS实现图的遍历 以以下图数据为例 首先BFS是广度优先遍历算法 从图的某一个节点出发 然后遍历完这个节点相邻的节点 这个算法的核心就是 先把周围的找完 再去找更深的地方 通俗易懂的说法 DFS就是一条路走到底 发现没路了 返回来
  • uniapp uni-table表格组件 合并单元格

    注意 目前该方法只适用于H5 小程序和APP无法适配 就不用往下看了 解决方案 直接使用 rowspan 和 colspan 就可以 虽然文档上并没有写这些参数 但是我实际使用后以后 发现这些参数是可以直接用的 我猜测其他的一些参数都是可以
  • 软件测试V模型

    以 编码 为黄金分割线 将整个过程分为开发和测试 并且开发和测试之间是串行的关系 特点 明确标注了测试的类型 明确标注了测试阶段和开发阶段之间的对应关系 缺点 测试后置 V模型是基于瀑布模型的 将测试放在整个开发的最后阶段 没有让测试今早介
  • 时序预测

    时序预测 MATLAB实CNN LSTM 卷积长短期记忆神经网络 时间序列预测 目录 时序预测 MATLAB实CNN LSTM 卷积长短期记忆神经网络 时间序列预测 基本介绍 CNN LSTM模型 CNN网络架构 LSTM网络架构 CNN
  • JAVA 数据类型强制转换详解

    JAVA 数据类型转换 强制类型转换 强制类型转换 将 取值范围大的类型 强制转换成 取值范围小的类型 特点 代码需要进行特殊的格式处理 不能自动完成 转换格式 范围小的类型 范围小的变量名 范围小的类型 原本范围大的数据 int i in
  • 原码反码补码:计算机整数的运算为啥用补码?运算过程举例理解

    原码 反码 补码基本知识 正整数 原码 反码 补码均是原码本身 负整数 反码 原码按位取反 符号位除外 补码 反码 1 例如 byte 1 原码 0000 0001 反码 0000 0001 补码 0000 0001 byte 3 原码 1
  • 前端PS基础使用教程

    详细教程https t2tfktotho feishu cn docx doxcndr868igJ0ubjf7Z0dRqAEb from from copylink 目录 常用快捷键 切片导出工具 cutterman 安装 操作技巧 3 6
  • 基于 DETR 的开放世界目标检测

    本文首发于微信公众号 CVHub 不得以任何形式转载到其它平台 仅供学习交流 违者必究 Title Open World DETR Transformer based Open World Object Detection Paper ht