【论文阅读--实时语义分割】STDC:Rethinking BiSeNet For Real-time Semantic Segmentation

Abstract

【BiSeNet的存在问题】
BiSeNet[28,27]已被证明是一种流行的用于实时分割的双流网络。其添加额外路径来编码空间信息的原理非常耗时,并且由于任务特定设计的不足,从预训练任务(例如图像分类)借用的主干对于图像分割可能效率低下
【STDC网络的提出】
设计了一个短期密集连接模块(STDC模块),通过消除结构冗余而高效,用于提取具有可扩展感受野和多尺度信息的深层特征。该模块以可承受的计算成本 提升了STDC网络的性能。
具体地说,我们逐步降低特征映射的维数,并使用它们的聚合来表示图像,这形成了STDC网络的基本模块。在解码器中,我们提出了一个细节聚合模块,该模块以单流方式将空间信息的学习集成到低层。从而在低层中更精确地保存空间细节,而不会在推理时间中产生额外的计算成本。最后,融合低层特征和深层特征,预测最终分割结果。
【效果与速度】
在城市景观和CamVid数据集上的大量实验证明了该方法的有效性,在分割精度和推理速度之间取得了令人满意的平衡。具体而言,我们的STDC1-Seg50在一张NVIDIA GTX 1080Ti卡上以250.4 FPS的速度在Cityscapes测试集上实现71.9%的mIoU。在相同的实验设置下,我们的STDC2-Seg75以97.0 FPS的速度实现76.8%的mIoU。
代码可在https://github.com/MichaelFan01/STDC Seg。

1 Introduction

2 相关工作

  • 高效网络设计
    以下工作是专门为图像分类任务设计的,它们对语义分割应用程序的扩展应该仔细调整。
    • SqueezeNet使用fire模块和某些策略来减少模型参数。
      MobileNet V1利用深度可分离卷积来减少推断阶段的失败。
      ResNet采用了残差模块,以实现卓越的性能。
      MobileNet V2[25]和ShuffleNet[29]使用组卷积来降低计算成本,同时保持可比的精度。
  • 通用语义分割
    分割算法的方法:传统的分割算法,如阈值选择、超级像素,利用手工制作的特征在图像中指定像素级标签。随着卷积神经网络的发展,基于FCN[23]的方法[3,1,32,14]在各种基准上取得了令人印象深刻的性能。
    神经网络的操作:扩展主干(具有空洞卷积)编解码结构 都可以同时学习底层细节和高层语义。然而,由于高分辨率的特点和复杂的网络连接,大多数方法需要大量的计算量。在本文中,我们提出了一种高效的体系结构,在速度和精度之间实现了良好的平衡。
    • Deeplabv3[3]采用了一个Atrus空间金字塔池模块来捕获多尺度上下文。
      SegNet[1]利用编码器-解码器结构恢复高分辨率特征映射。
      PSPNet[32]设计了一个金字塔池,以捕获扩展主干(空洞卷积)上的本地和全局上下文信息。
  • 实时语义分割
    近年来,实时语义分割的实际应用迅速增长。在这种情况下,设计有效的分割方法有两个主流。
    • i) 轻量级主干。
      DFANet[18]采用轻量级主干网来降低计算成本,并设计了一个跨级别的特征聚合模块来提高性能。DFNet[21]利用“偏序剪枝”算法获得轻量级主干和高效解码器。
    • ii)多分支架构。
      ICNet[31]设计了多尺度图像级联,以实现良好的速度精度权衡。
      BiSeNetV1[28]和BiSeNetV2[27]分别为低级细节和高级上下文信息提出了两种流路径。
    • 在本文中,我们提出了一种高效的轻量级主干网来提供可伸缩的接收场 (因此模型可以输入任意尺寸的图片)。此外,我们还设置了一个使用细节信息引导的单路径解码器来学习底层细节。

3 拟议方法

BiSeNetV1[28]利用轻量级主干网,例如ResNet18和空间路径作为编码网络,形成两个steam分段架构。然而,由于结构冗余,分类主干和双边体系结构可能效率低下。在本节中,我们首先介绍我们提议的STDC网络的细节。然后,我们给出了单流方法的整个体系结构,并提供了详细的指导。


3.1 编码网络的设计

3.1.1 短期密集级联模块

在这里插入图片描述
图3. (a) 通用STDC网络架构。ConvX操作指的是Conv BN ReLU。(b) 我们网络中使用的短期密集级联模块(STDC模块)。M表示输入通道的尺寸,N表示输出通道的尺寸。每个块都是具有不同内核大小的ConvX操作。(c)步幅为2的STDC模块。

【STDC模块结构】
我们提出的网络的关键组件是短期密集级联模块(STDC模块)。图3(b)和(c)显示了STDC模块的布局。具体来说,每个模块被分成几个块,我们使用 C o n v X i ConvX_i ConvXi 表示第 i i i 块的操作。因此,第 i i i 块的输出计算如下: x i = C o n v X i ( x i − 1 ,   k i )           ( 1 ) x_i = ConvX_i(x_{i-1,\,k_i})\,\,\,\,\,\,\,\,\,(1) xi=ConvXi(xi1,ki)(1) 这里 x i − 1 x_{i-1} xi1 x i x_i xi 分别是第 i i i 个block的输入和输出。ConvX包括一个卷积层、一个批处理规范化层和ReLU激活层, k i k_i ki 是卷积核的大小。
在STDC模块中,第一个块的内核大小为1,其余块的内核大小仅设置为3。给定STDC模块输出N的通道数,第i块中卷积层的滤波器数为 N / 2 i N/2^i N/2i,但最后一个卷积层的滤波器数与前一个卷积层的滤波器数相同。

【STDC模块感受野】
在图像分类任务中,通常在较高的层中使用更多通道。但在语义分割任务中,我们主要关注可伸缩的感受野和多尺度信息。低层需要足够的通道来编码具有较小感受野的更细粒度信息,而具有较大感受野的高层则更关注高层信息的表达,将同一通道设置为低层可能会导致信息冗余。Down-sample仅发生在Block2中。为了丰富特征信息,我们通过跳过路径将 x 1 x_1 x1 x n x_n xn 特征拼接起来,作为STDC模块的输出。在级联之前,通过3×3池大小的平均池操作,将STDC模块中不同块的响应映射下采样到相同的空间大小,如图3(c) 所示。在我们的设置中,STDC模块的最终输出为: x o u t p u t = F ( x 1 , x 2 , . . . , x n ) x_{output} = F(x_1,x_2,...,x_n) xoutput=F(x1,x2,...,xn)其中 x o u t p u t x_{output} xoutput 表示STDC模块输出,F表示我们方法中的融合操作,而 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn 是所有n个块的特征图。考虑到效率,我们采用级联作为融合操作。在我们的方法中,我们在4个块中使用STDC模块。
在这里插入图片描述
表1. STDC模块中模块的感受野。RF表示感受野,S表示步幅.注意,如果步幅=2,则Block1的1×1 RF通过平均池操作变成3×3 RF

表1显示了STDC模块中块的感受野, x o u t p u t x_{output} xoutput 因此从所有块收集多尺度信息,我们声称我们的STDC模块有两个优点:
1)我们通过以几何级数方式逐渐减小来精心调整块的滤波器大小,从而显著降低计算复杂度。
2) STDC模块的最终输出由所有块连接而成,保留了可伸缩的各个字段和多尺度信息。
【STDC模块参数量】
给定输入通道尺寸M和输出通道尺寸N,STDC模块的参数数量为:
S p a r a m = M ∗ 1 ∗ 1 ∗ N 2 1 + ∑ i = 2 n − 1 N 2 i − 1 ∗ 3 ∗ 3 ∗ N 2 i + N 2 n − 1 ∗ 3 ∗ 3 ∗ N 2 n − 1 S_{param}=M*1*1*\frac{N}{2_1}+\sum_{i=2}^{n-1}\frac{N}{2^{i-1}}*3*3*\frac{N}{2^i}+\frac{N}{2^{n-1}}*3*3*\frac{N}{2^{n-1}} Sparam=M1121N+i=2n12i1N332iN+2n1N332n1N = N M 2 + 9 N 2 2 3 ∗ ∑ i = 0 n − 3 1 2 2 i + 9 N 2 2 2 n − 2 =\frac{NM}{2}+\frac{9N^2}{2^3}*\sum_{i=0}^{n-3}\frac{1}{2^{2i}}+\frac{9N^2}{2^{2n-2}} =2NM+239N2i=0n322i1+22n29N2 N M 2 + 3 N 2 2 ∗ ( 1 + 1 2 2 n − 3 ) \frac{NM}{2}+\frac{3N^2}{2}*(1+\frac{1}{2^{2n-3}}) 2NM+23N2(1+22n31)
如等式3所示,STDC模块的参数数量由预定义的输入和输出通道尺寸决定,而块的数量对参数大小影响不大。特别是,当n达到最大值时,STDC模块的参数个数几乎保持不变,仅由M和N定义。


3.1.2网络架构

我们在图3(a) 中展示了我们的网络架构。除输入层和预测层外,它由6个阶段组成。

  • 第1∼5阶段分别以2的步长对输入的空间分辨率进行下采样,阶段6通过一个ConvX、一个全局平均池层和两个完全连接层输出预测逻辑。
  • 阶段1和阶段2通常被视为外观特征提取的低层。为了追求效率,我们在第一阶段和第二阶段的每个阶段只使用一个卷积块,根据我们的经验证明这是足够的。
  • 第3、4、5阶段的STDC模块数量在我们的网络中进行了仔细调整。在这些阶段中,每个阶段中的第一个STDC模块以2的步长向下采样空间分辨率。每个阶段中的以下STDC模块保持空间分辨率不变。

我们将阶段的输出通道数表示为 N l N_l Nl,其中 l 是级的索引。在实践中,我们根据经验将 N 6 N_6 N6 设置为1024,并仔细调整rest阶段的通道数,直到在精度和效率之间达到良好的平衡。由于我们的网络主要由短期密集级联模块组成,我们称我们的网络为STDC网络。表2显示了我们的STDC网络的详细结构。在这里插入图片描述
表2. STDC网络的详细架构。请注意,表中所示的ConvX指的是Conv BN ReLU。第3、4和5阶段的基本模块是STDC模块。KSize表示内核大小。S、 R,C分别表示步幅、重复次数和输出通道



3.2. 解码器的设计

3.2.1.分割结构

主干: 我们认为,这两个阶段的特征在不同的特征表示级别: 来自编码主干的特征保留了丰富的细节信息,而来自解码器的特征包含来自全局池层的输入的上下文信息。
头部: [Seg head] 包括一个3×3 Conv BN ReLU运算符,然后是一个1×1卷积,以获得输出维度N,该维度被设置为类数。
损失: 我们采用交叉熵损失和 Online Hard Example Mining 来优化语义分段学习任务。
在这里插入图片描述
图4.STDC细分网络概述。ARM表示注意细化模块,FFM表示特征融合模块。红色虚线框中的操作是我们的STDC网络。蓝色虚线框中的操作是细节信息(边界信息)聚合模块。
我们使用预训练的STDC网络作为编码器的主干,并采用BiSeNet[28]的上下文路径对上下文信息进行编码。

  • 如图4(a) 所示,我们使用阶段3、4、5分别以下采样率1/8、1/16、1/32生成特征映射。然后,我们使用全局平均池来提供具有大接受域的全局上下文信息 。
  • 采用U形结构对来自全局特征的特征进行上采样,并将每个特征与编码阶段最后两个阶段(第4阶段和第5阶段)的对应特征相结合。
  • 遵循BiSeNet[28],我们使用[ARM 注意细化模块]细化每两个阶段的组合特征。对于最终的语义分割预测,我们采用BiSeNet[28]中的 [特征融合模块] 来融合编码器第3阶段的1/8下采样特征和解码器的对应特征。

3.2.2低层的细节指导在这里插入图片描述

图5. 在没有或有详细指导的情况下,对空间路径和第3阶段中的特征有无细节指导 的视觉解释。带有下标D的列表示带有细节指导的结果。可视化显示,与主干的底层相比,空间路径可以编码更多的空间细节,例如边界、角点,而我们的细节引导模块可以在不增加额外计算成本的情况下完成同样的工作。

【细节引导模块】
我们在图5(b)中可视化了BiSeNet的空间路径特征。与相同下采样率的主干低层(第3阶段)相比,空间路径可以编码更多的空间细节,例如边界、角点。
基于这一观察,我们提出了一个细节引导模块,引导低层作为二元分割任务来学习空间信息:

  • 如图4(c)所示,我们首先通过拉普拉斯算子从 [Seg GT] 中生成 [Detail GT]。
  • 如图4(a)所示,我们在阶段3中插入 [Detail Head] 生成细节特征图。然后以 [Detail GT] 作为细节特征图的引导,引导底层学习空间细节特征。如图5(d)所示,与图5(c)所示的结果相比,具有细节指导的特征地图可以编码更多的空间细节。
  • 最后,将学习到的细节特征与解码器深层块的上下文特征进行融合,进行分割预测。

【细节标签生成】:
我们通过我们的细节聚合模块从语义分割标签生成二进制细节标签,如图4(c)的蓝色虚线框所示。该运算可由二维卷积核(称为拉普拉斯核)和可训练的1×1卷积来实现。我们使用图4(e) 中所示的拉普拉斯算子生成具有不同步幅的粗细程度的细节特征图,以获得多尺度细节信息。然后,我们将细节特征映射向上采样到原始大小,并将其与可训练的1×1卷积进行融合,以进行动态重新绘制。最后,我们采用阈值0.1将预测细节转换为具有边界和角点信息的二元细节标签。

【细节头[Detail Head]生成】:
如图4(b) 所示,我们使用一个细节头来生成细节图,它引导浅层对空间信息进行编码。细节头包括一个3×3 Conv BN ReLU操作符,然后是一个1×1卷积,以获得输出细节图。在实验中,细节头被证明能够有效地增强特征表示。请注意,此分支在推断阶段被丢弃。因此,该边信息可以很容易地提高分割任务的准确性,而不需要任何推理代价。

【Detail Loss】
由于细节像素的数量远少于非细节像素,因此细节预测是一个经典平衡问题。由于加权交叉熵总是导致结果粗糙,在[7]之后,我们采用二元交叉熵和dice loss 联合优化细节学习。dice loss 测量预测图和真实标签之间的重叠。此外,它对前景/背景像素数不敏感,这意味着它可以缓解类不平衡问题。因此,对于高度为H、宽度为W的预测细节图,细节损失 L d e t a i l L_{detail} Ldetail公式如下: L d e t a i l ( p d , g d ) = L d i c t ( p d , g d ) + L b c e ( p d , g d )              ( 4 ) L_{detail}(p_d,g_d)=L_{dict}(p_d,g_d)+L{bce}(p_d,g_d)\,\,\,\,\,\,\,\,\,\,\,\,(4) Ldetail(pd,gd)=Ldict(pd,gd)+Lbce(pd,gd)(4)其中 p d ∈ R H ∗ W p_d \in \mathbb{R}^{H*W} pdRHW指的是预测的内容; g d ∈ R H ∗ W g_d \in \mathbb{R}^{H*W} gdRHW指的是细节标签。 L b c e L_bce Lbce指的是二元交叉熵损失; L d i c t L_{dict} Ldict值得是dict loss,其公式为 L d i c t ( p d , g d ) = 1 − 2 ∑ i H ∗ W p d i g d i + ϵ ∑ i H ∗ W ( p d i ) 2 + ∑ i H ∗ W ( g d i ) 2 + ϵ L_{dict}(p_d,g_d) = 1 - \frac{2 \sum_i^{H*W}p_d^ig_d^i + \epsilon }{\sum_i^{H*W}(p_d^i)^2+\sum_i^{H*W}(g_d^i)^2 + \epsilon} Ldict(pd,gd)=1iHW(pdi)2+iHW(gdi)2+ϵ2iHWpdigdi+ϵ
其中 i i i 表示第 i i i 个像素, ϵ \epsilon ϵ是拉普拉斯平滑项,以避免零分割。本文将 ϵ \epsilon ϵ 设为1。

4 实验结果

我们在三个数据集上实现了我们的方法:ImageNet[6]、Cityscapes[5]和CamVid[2],分别评估我们提出的主干网和分段网络的有效性。我们首先介绍数据集和实现细节。然后,我们报告了与其他算法相比,我们在不同基准上的精度和速度结果。最后,我们讨论了我们提出的方法中组件的影响。


4.1 基准和评价指标

  • ImageNet。ILSVRC[6]2012是最流行的图像分类数据集。它包含120万张用于训练的图像,50000张用于1000个类别的验证。它还广泛用于为下游任务(如目标检测或语义分割)训练预训练模型。
  • Cityscapes。Cityscapes[5]是一个语义场景解析数据集,它是从汽车的角度获取的。它包含5000幅精细注释图像,并分为训练集、验证集和测试集,分别有2975幅、500幅和1525幅图像。注释包括30个类,其中19个用于语义切分任务。图像的分辨率高达2048×1024,对实时语义分割提出了挑战。为了公平比较,我们在实验中只使用精细的注释图像。
  • CamVid。Cambridge driving Labeled Video Database(Camvid)[2]是一个道路场景数据集,从驾驶汽车的角度获取。该数据集包含从视频序列中提取的701个带注释的图像,其中367个用于训练,101个用于验证,233个用于测试。图像分辨率为960×720,语义类别为32个,其中11个类别的子集用于分割实验。
  • 评价指标。对于分类评估,我们使用评估top-1准确性作为评估指标,如下[9]。对于分割评估,我们采用基于并集的类相交平均值(mIoU)和每秒帧数(FPS)作为评估指标。

4.2.实施细节

  • 图像分类。
    我们使用小批量随机梯度下降法(SGD),批量大小64,动量0.9,重量衰减1e−4.训练模型。采用了[11]中的三种训练方法,包括学习率预热、余弦学习率策略和标签平滑。在前5个阶段,采用预热策略的总阶段数为300,其中学习率从0.001开始到0.1。分类块之前的辍学设置为0.2。我们不使用其他特殊的数据扩充,它们都与[9]相同。
  • 语义分割
    我们使用动量为0.9,重量衰减为5e的小批量随机梯度下降(SGD)−4.Cityscapes和CamVid数据集的批量大小分别设置为48和24。作为常见配置,我们使用初始速率乘以 ( 1 − i t e r i t e r m a x p o w e r ) (1-\frac{iter}{iter_{max}}^{power}) (1itermaxiterpower) 的"poly"学习速率策略。功率设置为0.9,初始学习率设置为0.01。此外,我们分别为Cityscapes和CamVid数据集对模型进行60000和10000次迭代训练,其中我们在前1000200次迭代中采用预热策略。
  • 数据增强
    包括颜色抖动、随机水平翻转、随机裁剪和随机调整大小。比例范围为[0.125,1.5],裁剪分辨率为1024×512,用于城市景观的训练。对于训练CamVid,刻度范围为[0.5,2.5],裁剪分辨率为960×720。

在所有实验中,我们在docker上基于pytorch-1.1进行实验。我们在CUDA 10.0和CUDNN 7.6、TensorRT 5.0.1.5下执行所有实验,在批量为1的NVIDIA GTX 1080Ti GPU上测试我们方法的计算能力。


4.3 消融研究

本节介绍消融实验,以验证我们方法中每个组件的有效性。

  • STDC模块的有效性
    我们在STDC2中调整了STDC模块的块号,结果如图7所示。根据我们的方程3,随着组数的增加,FLOPs明显减少。最好的表现是在4个模块。更多块的好处变得非常小,更深的网络不利于并行计算和FPS。因此,在本文中,我们将STDC1和STDC2中的块号设置为4。
  • 骨干网络的有效性
    为了验证我们为实时分割设计的主干网的有效性,我们采用了最新的轻量级主干网,其分类性能与STDC2相当,并用我们的解码器构建了语义分割网络。如表3所示,我们的STDC2与其他轻量级主干相比,在速度精度方面取得了最佳的平衡。
    在这里插入图片描述
    表3. 城市景观验证集上的轻量级主干比较。所有体验者使用相同的解码器和相同的实验设置。
  • 细节指导的有效性
    我们首先可视化第3阶段特征图的热图,如图6所示。与没有详细指导的阶段3相比,具有详细指导的阶段3的特征编码了更多的空间信息。因此,小对象和边界的最终预测更精确。我们在表4中显示了一些定量结果。为了验证详细指导的有效性,我们在Cityscapes val数据集上比较了STDC2 Seg的不同详细指导策略。
    为了进一步证明细节引导的能力,我们首先使用BISENTV1[28]中的空间路径对空间信息进行编码,然后使用空间路径生成的特征替换Stage 3D中的特征。空间路径实验的设置与其他实验完全相同。如表4所示,STDC2 Seg中的详细指导可以在不影响推理速度的情况下提高mIoU。添加空间路径编码空间信息也可以提高精度,但同时增加了计算成本。此外,我们发现我们的细节聚合模块对丰富的细节信息进行编码,并通过1x、2x、4x细节特征的聚合产生最高的mIoU。

    在这里插入图片描述
    图6. 视觉对比我们对城市景观验证集的详细指导。带有下标D的列表示带有详细指导的结果。第一行(a)显示输入图像。(b)/(c)[没有]/[有] 详细指导的情况下第3阶段的热量图。(d)/(e) 在[没有]/[有]详细指导的情况下演示预测。(f) 是输入图像的真实标签。
    在这里插入图片描述
    表4. 城市景观验证集的详细信息比较。SP表示具有空间路径的方法,DG表示细节引导,其中1x、2x、4x表示细节聚合模块中具有不同下采样步长的细节特征。

4.4 与最新技术相比

在这一部分中,我们将在ImageNet、Cityscapes和CamVid三个基准上,将我们的方法与其他现有的最先进的方法进行比较。

  • ImageNet上的结果
    在这里插入图片描述
  • 城市景观的结果。
    按照前面的方法[27,22],我们使用训练集和验证集来训练我们的模型,然后再提交给Cityscapes online server。
    在测试阶段,我们首先将图像大小调整为固定大小512×1024或768×1536以进行推断,然后将结果采样到1024×2048。我们在方法名称后使用50和75分别表示输入大小512×1024和768×1536。例如,对于STDC1主干和512×1024输入大小,我们将方法命名为STDC1-Seg50。
    在这里插入图片描述
  • 在CamVid上的结果。
    我们也在CamVid数据集上评估了我们的方法。表7显示了与其他方法的比较结果。输入尺寸为720×960时,STDC1 Seg以197.6 FPS的速度实现73.0%的mIoU,这是性能和速度之间最先进的折衷。这进一步证明了我们方法的优越性能。
    在这里插入图片描述
  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:这个错误是由于OpenCV库的某个函数没有实现导致的。解决这个问题的方法是重新构建库并添加Windows、GTK+ 2.x或Cocoa支持。如果你使用的是Ubuntu或Debian系统,可以尝试安装libgtk2.0-dev和pkg-config,然后重新运行cmake或configure脚本。\[1\] 引用\[2\]:解决这个问题的方法是通过运行以下命令安装所需的软件包: sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools gcc-4.8-multilib-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libssl-dev gcc-aarch64-linux-gnu g+conf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz python-matplotlib libc6:i386 libssl-dev texinfo liblz4-tool genext2fs lib32stdc++6。\[2\] 引用\[3\]:这个错误的原因是由于网络问题导致无法下载特定的文件。可能是由于网络连接不稳定或目标文件不存在。\[3\] 根据提供的信息,你遇到了一个名为package/pkg-generic.mk的错误。这个错误发生在构建mpv-0.27.2时,导致构建失败。要解决这个问题,你可以尝试重新构建或检查构建过程中的网络连接。如果网络连接不稳定,可以尝试使用稳定的网络环境重新构建。如果问题仍然存在,你可以尝试手动下载所需的文件并将其放置在正确的位置。 #### 引用[.reference_title] - *1* [解决问题:cv2.error: OpenCV(4.5.1) /tmp/pip-req-build-jhawztrk/opencv/modules/highgui/src/window.cpp...](https://blog.csdn.net/weixin_46474546/article/details/114914967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [LINUX 系统编译报“recipe for target 'doc/libtool.info' failed” 处理办法](https://blog.csdn.net/qq_25402181/article/details/87872367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Get ...](https://blog.csdn.net/hknaruto/article/details/119108533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值