Abstract

基于LiDAR或基于RGB-D的目标检测被用于从自动驾驶到机器人视觉的众多应用中。一段时间以来,基于体素的3D卷积网络在处理点云LiDAR数据时被用于增强信息的保留。然而,问题仍然存在,包括推理速度慢和方向估计性能低。因此,我们研究了一种用于此类网络的改进稀疏卷积方法,该方法显着提高了训练和推理的速度。我们还引入了一种新形式的角度损失回归来提高方向估计性能和一种新的数据增强方法,可以提高收敛速度和性能。所提出的网络在KITTI 3D目标检测基准上产生了最先进的结果,同时保持了快速的推理速度。

关键词: 3D目标检测;卷积神经网络;激光雷达;自动驾驶

1.Introduction

近年来,在基于卷积神经网络(CNN)的目标检测[1,2]、实例分割[3]和关键点检测[4]方面取得了巨大进展。这种检测形式可用于基于单目[5]或立体图像[6]的自动驾驶。然而,用于处理图像的方法不能直接应用于LiDAR数据。这对于自动驾驶和机器人视觉等应用来说是一个重大限制。最先进的方法可以实现90%的2D汽车检测的平均精度(AP),但对于基于3D图像的汽车检测,AP仅为15%[7]。为了克服仅由图像提供的空间信息的缺乏,点云数据在3D应用中变得越来越重要。点云数据包含准确的深度信息,可以由LiDAR或RGB-D相机生成。

许多当前的3D检测器使用一种融合方法,该方法同时利用图像和点云数据。点云数据被转换为二维鸟瞰图[8]或投影到图像上[9,10]。然后使用卷积网络提取特征,并应用融合过程来映射图像和其他视图之间的特征。在[11]中,点云数据最初使用2D检测器生成的边界框进行过滤,然后使用卷积网络直接处理这些点。在其他方法中,例如[12-15]的方法,点云数据通过量化分配给体积网格单元,然后应用3D CNN。

最近,已经开发了一种称为VoxelNet[14]的新方法。这种方法在单级端到端网络中结合了原始点云特征提取和基于体素的特征提取。它首先将点云数据分组为体素,然后逐个体素应用线性网络,然后将体素转换为密集的3D张量以用于区域提议网络(RPN)[16]。目前,这是一种最先进的方法。然而,它的计算成本使其难以用于实时应用程序。在本文中,我们提出了一种称为SECOND(稀疏嵌入式卷积检测)的新方法,该方法通过最大限度地利用点云数据中丰富的3D信息来解决基于3D卷积的检测中的这些挑战。该方法结合了对现有卷积网络架构的多项改进。为基于LiDAR的检测引入了空间稀疏卷积网络,用于在将3D数据下采样为类似于2D图像数据的东西之前从z轴提取信息。我们还使用基于GPU(图形处理单元)的稀疏卷积规则生成算法来提高速度。与密集卷积网络相比,我们基于稀疏卷积的检测器在KITTI数据集的训练过程中实现了4倍的速度提升,推理速度提升了3倍。作为进一步的测试,我们设计了一个用于实时检测的小型模型,它在GTX 1080 Ti GPU上的运行时间约为0.025秒,性能只有轻微损失。

使用点云数据的另一个优点是,通过对目标上的指定点应用直接变换,可以很容易地缩放、旋转和移动目标。 SECOND结合了一种基于这种能力的新形式的数据增强。生成包含目标属性和相关点云数据的ground-truth数据库。然后在训练期间将从该数据库中采样的目标引入到点云中。这种方法可以大大提高我们网络的收敛速度和最终性能。

除了上述之外,我们还引入了一种新的角度损失回归方法来解决当地面实况和预测之间的方向差异等于π\piπ时产生的大损失问题,这会产生与真实情况相同的边界框。这种角度回归方法的性能超过了我们所知道的任何当前方法,包括AVOD[9]中可用的方向向量回归函数。我们还引入了一个辅助方向分类器来识别物体的方向。

在提交时,我们的方法在基于KITTI的3D检测[7]的所有类别中产生了最先进的结果,同时对于较大的模型以20 fps的速度运行,对于较小的模型以40 fps的速度运行。

我们工作的主要贡献如下:

  • 我们在基于LiDAR的目标检测中应用稀疏卷积,从而大大提高了训练和推理的速度。

  • 我们提出了一种改进的稀疏卷积方法,使其运行得更快。

  • 我们提出了一种新颖的角度损失回归方法,该方法展示了比其他方法更好的方向回归性能。

  • 我们为仅LiDAR的学习问题引入了一种新颖的数据增强方法,大大提高了收敛速度和性能。

2.Related Work

下面,我们简要回顾一下现有的基于点云数据和图像的3D目标检测工作。

2.1.Front-View-and Image-Based Methods

使用RGB-D数据的2D表示的方法可以分为两类:基于鸟瞰图(BEV)的方法和基于前视图的方法。在典型的基于图像的方法[5]中,首先生成2D边界框、类语义和实例语义,然后使用手工方法生成特征图。另一种方法[17]使用CNN从图像中估计3D边界框,并使用专门设计的离散连续CNN来估计目标的方向。使用LiDAR[18]的方法包括将点云转换为前视图2D 地图以及应用2D检测器来定位前视图图像中的目标。与其他方法相比,这些方法在BEV检测和3D检测方面表现不佳。

2.2.Bird’s-Eye-View-Based Methods

MV3D[8]是第一种将点云数据转换为BEV表示的方法。在该方法中,将点云数据转换为若干个切片以获得高度图,然后将这些高度图与强度图和密度图连接以获得多通道特征。ComplexYOLO[19]使用YOLO(You Only Look Once)[20]网络和复杂的角度编码方法来提高速度和方向性能,但它在预测的3D边界框中使用固定高度和z位置。在[21]中,设计了一种快速的单级proposal-free检测器,该检测器利用特定的高度编码BEV输入。然而,所有这些方法的一个关键问题是,在生成BEV地图时会丢弃许多数据点,从而导致垂直轴上的信息大量丢失。这种信息丢失严重影响了这些方法在3D边界框回归中的性能。

2.3.3D-Based Methods

大多数基于3D的方法要么直接使用点云数据,要么需要将这些数据转换为3D网格或体素,而不是生成BEV表示。在[12]中,点云数据被转换为包含特征向量的体素,然后使用一种新颖的类似卷积的基于投票的算法进行检测。参考[13]通过利用以特征为中心的投票方案来实现新颖的卷积,从而利用点云数据的稀疏性,从而提高了计算速度。这些方法使用手工制作的特征,虽然它们在特定数据集上产生了令人满意的结果,但它们无法适应自动驾驶中常见的复杂环境。[22,23]的作者以一种独特的方式开发了一个系统,该系统可以通过一种新颖的基于CNN的架构直接从点云中学习逐点特征。[24]使用k邻域方法和卷积从点云中学习局部空间信息。这些方法直接处理点云数据,对k-neighborhood点进行1D卷积,但不能应用于大量点;因此,需要图像检测结果来过滤原始数据点。一些基于CNN的检测器将点云数据转换为体素。在[15]中提出的方法中,点云数据被离散化为二值体素,然后应用3D卷积。[14]的方法将点云数据分组为体素,提取体素特征,然后将这些特征转换为密集张量,以使用3D和2D卷积网络进行处理。这些方法的主要问题是3D CNN的高计算成本。不幸的是,3D CNN的计算复杂度随着体素分辨率呈立方增长。在[25,26]中,设计了一个空间稀疏卷积来提高3D卷积速度,而Ref.[27]提出了一种新的3D卷积方法,其中输出的空间结构保持不变,从而大大提高了处理速度。在[28]中,子流形(submanifold)卷积应用于3D语义分割任务;然而,没有已知的方法使用稀疏卷积进行检测任务。

与所有这些方法类似,我们的方法使用3D卷积架构,但它包含了一些新颖的改进。

2.4.Fusion-Based Methods

一些方法将相机图像与点云相结合。例如,[29]的作者使用具有不同感受野的两个尺度的3D RPN来生成3D proposals,然后将每个3Dproposal的深度数据中的3D体积输入到3D CNN中,并将相应的2D色块输入到2D CNN 预测最终结果。在[8]中提出的方法中,点云数据被转换为前视图和BEV,然后从两个点云图中提取的特征图与图像特征图融合。带有图像的MV3D网络在很大程度上比BEV-only网络表现得更好,但是这种架构对于小目标效果不佳并且运行缓慢,因为它包含三个CNN。[9]的作者将图像与BEV相结合,然后使用一种新颖的架构来生成高分辨率特征图和3D目标proposals。在[11]中,2D检测结果用于过滤点云,以便PointNet[22]然后可以应用于预测3D边界框。然而,基于融合的方法通常运行缓慢,因为它们需要处理大量的图像输入。对具有LiDAR功能的时间同步和校准相机的额外要求限制了可以使用此类方法的环境并降低了它们的鲁棒性。相比之下,我们的方法可以仅使用LiDAR数据实现最先进的性能。

3.SECOND Detector

在本节中,我们描述了所提出的SECOND检测器的架构,并介绍了有关训练和推理的相关细节。

3.1.Network Architecture

所提出的SECOND检测器,如图1所示,由三个组件组成:(1)体素特征提取器;(2)稀疏卷积中间层;(3)RPN。


图1.我们提出的SECOND检测器的结构。检测器将原始点云作为输入,将其转换为体素特征和坐标,并应用两个VFE(体素特征编码)层和一个线性层。然后,应用稀疏CNN。最后,RPN生成检测。

3.1.1.Point Cloud Grouping

在这里,我们按照[14]中描述的简单程序来获得点云数据的体素表示。我们首先根据指定的体素数量限制预先分配缓冲区;然后,我们遍历点云并将这些点分配给它们相关的体素,并保存体素坐标和每个体素的点数。我们在迭代过程中根据哈希表检查体素的存在。如果与某个点相关的体素还不存在,我们在哈希表中设置相应的值;否则,我们将体素的数量加一。一旦体素的数量达到指定的限制,迭代过程将停止。最后,我们获得所有体素、它们的坐标以及每个体素的点数,以获得实际体素数。为了检测相关类别中的汽车和其他物体,我们基于沿z×y×xz \times y \times xz×y×x轴在[-3,1]×[-40,40] × [0,70.4]m处的ground-truth分布裁剪点云。对于行人和骑车人检测,我们使用 [−3, 1] × [−20, 20] × [0, 48]m处的裁剪点。对于我们较小的模型,我们仅使用[−3, 1] × [−32, 32] × [0, 52.8]m范围内的点来提高推理速度。裁剪后的区域需要根据体素大小进行微调,以确保生成的特征图的大小可以在后续网络中正确下采样。对于所有任务,我们使用vD=0.4×vH=0.2×vW=0.2v_{D}=0.4 \times v_{H}=0.2 \times v_{W}=0.2vD​=0.4×vH​=0.2×vW​=0.2m的体素大小。汽车检测的每个空体素的最大点数设置为T=35T = 35T=35,根据KITTI数据集中每个体素的点数分布选择;行人和骑自行车的人检测的相应最大值设置为T=45T = 45T=45,因为行人和骑自行车的人相对较小,因此,体素特征提取需要更多的点。

3.1.2.Voxelwise Feature Extractor

如[14]中所述,我们使用体素特征编码(VFE)层来提取体素特征。VFE层将同一体素中的所有点作为输入,并使用由线性层、批量归一化(BatchNorm)层和校正线性单元(ReLU)层组成的全连接网络(FCN)来提取逐点特征。然后,它使用元素最大池化来获取每个体素的局部聚合特征。最后,它平铺获得的特征并将这些平铺特征和逐点特征连接在一起。我们使用VFE⁡(cout )\operatorname{VFE}\left(c_{\text {out }}\right)VFE(cout ​)表示将输入特征转换为coutc_{out}cout​维输出特征的VFE层。类似地,VFE⁡(cout )\operatorname{VFE}\left(c_{\text {out }}\right)VFE(cout ​)表示一个Linear-BatchNorm-ReLU层,它将输入特征转换为coutc_{out}cout​维输出特征。作为一个整体,体素特征提取器由几个VFE层和一个FCN层组成。

3.1.3.Sparse Convolutional Middle Extractor

Review of Sparse Convolutional Networks

ref.[25]是第一篇介绍空间稀疏卷积的论文。在这种方法中,如果没有相关的输入点,则不计算输出点。这种方法在基于LiDAR的检测中提供了计算优势,因为KITTI中点云的分组步骤将生成5k-8k体素,稀疏度接近0.005。作为正常稀疏卷积的替代方案,子流形卷积[27]当且仅当相应的输入位置处于活动状态时才限制输出位置处于活动状态。这避免了生成过多的活动位置,这可能导致由于活动点数量过多而导致后续卷积层的速度下降。

Sparse Convolution Algorithm

让我们首先考虑二维密集卷积算法。我们使用Wu,v,l,mW_{u, v, l, m}Wu,v,l,m​表示过滤后的元素,使用Du,v,lD_{u, v, l}Du,v,l​表示图像元素,其中uuu和vvv是空间位置索引,lll表示输入通道,mmm表示输出通道。函数P(x,y)P(x, y)P(x,y)生成需要在给定输出位置的情况下计算的输入位置。因此,Yx,y,mY_{x, y, m}Yx,y,m​的卷积输出由以下公式给出:

Yx,y,m=∑u,v∈P(x,y)∑lWu−u0,v−v0,l,mDu,v,l,(1)Y_{x, y, m}=\sum_{u, v \in P(x, y)} \sum_{l} W_{u-u_{0}, v-v_{0}, l, m} D_{u, v, l}, \tag{1} Yx,y,m​=u,v∈P(x,y)∑​l∑​Wu−u0​,v−v0​,l,m​Du,v,l​,(1)

其中xxx和yyy是输出空间索引,u−u0u - u0u−u0和v−v0v - v0v−v0表示内核偏移uuu和vvv坐标。基于通用矩阵乘法(GEMM)的算法(也称为基于im2col的算法[30])可用于收集构造矩阵D~P(x,y),l\tilde{D}_{P(x, y), l}D~P(x,y),l​所需的所有数据,然后执行GEMM本身:

Yx,y,m=∑lW∗,l,mD~P(x,y),l,(2)Y_{x, y, m}=\sum_{l} W_{*, l, m} \tilde{D}_{P(x, y), l}, \tag{2} Yx,y,m​=l∑​W∗,l,m​D~P(x,y),l​,(2)

其中W∗,l,mW_{*, l, m}W∗,l,m​对应于Wu−u0,v−v0,l,mW_{u-u_{0}, v-v_{0}, l, m}Wu−u0​,v−v0​,l,m​,但采用GEMM形式。对于稀疏数据Di,l′D_{i, l}^{\prime}Di,l′​和相关的输出Yj,m′Y_{j, m}^{\prime}Yj,m′​,直接计算算法可以写成如下:

Yj,m′=∑i∈P′(j)∑lWk,l,mDi,l′(3)Y_{j, m}^{\prime}=\sum_{i \in P^{\prime}(j)} \sum_{l} W_{k, l, m} D_{i, l}^{\prime} \tag{3} Yj,m′​=i∈P′(j)∑​l∑​Wk,l,m​Di,l′​(3)

其中P′(j)P^{\prime}(j)P′(j)是用于获得输入索引iii和滤波器偏移量的函数。下标kkk是1D核偏移量,对应方程(1)中的u−u0u-u_{0}u−u0​和v−v0v-v_{0}v−v0​,下标iii对应方程(1)中的uuu和vvv。等式(3)的基于GEMM的版本由以下公式给出:

Yj,m′=∑lW∗,l,mD~P′(j),l′(4)Y_{j, m}^{\prime}=\sum_{l} W_{*, l, m} \tilde{D}_{P^{\prime}(j), l}^{\prime} \tag{4} Yj,m′​=l∑​W∗,l,m​D~P′(j),l′​(4)

稀疏数据的收集矩阵D~P′(j),l′\tilde{D}_{P^{\prime}(j), l}^{\prime}D~P′(j),l′​仍然包含许多不需要计算的零。为了解决这个问题,我们不直接将式(3)转化为式(4),而是将式(3)改写如下:

Yj,m′=∑k∑lWk,l,mD~Rk,j,k,l′(5)Y_{j, m}^{\prime}=\sum_{k} \sum_{l} W_{k, l, m} \tilde{D}_{R_{k, j}, k, l}^{\prime} \tag{5} Yj,m′​=k∑​l∑​Wk,l,m​D~Rk,j​,k,l′​(5)

其中Rk,jR_{k, j}Rk,j​也称为Rule,是一个矩阵,它指定输入索引iii,给定内核偏移量kkk和输出索引jjj。等式(5)中的内和无法通过GEMM计算,因此我们需要收集必要的输入来构造矩阵,执行GEMM,然后将数据分散回去。在实践中,我们可以通过使用预先构建的输入-输出索引规则矩阵直接从原始稀疏数据中收集数据。这增加了速度。具体来说,我们构造了一个规则矩阵表Rk,i,t=R[k,i,t]R_{k, i, t}=R[k, i, t]Rk,i,t​=R[k,i,t],维度为K×Nin×2K \times N_{i n} \times 2K×Nin​×2,其中KKK是内核大小(表示为一个体积),NinN_{in}Nin​是输入特征和ttt是输入/输出索引。元素R[:,:,0]R[:,:, 0]R[:,:,0]存储用于收集的输入索引,元素R[∴,:,1]R[\therefore,:, 1]R[∴,:,1]存储用于散射的输出索引。图2的顶部显示了我们提出的算法。


图2.稀疏卷积算法如上图,GPU规则生成算法如下图。NinN_{in}Nin​表示输入特征的数量,NoutN_{out}Nout​表示输出特征的数量。NNN是收集的特征的数量。Rule是规则矩阵,其中Rule[i,:,:][i,:,:][i,:,:]是卷积核中第i个核矩阵对应的第i个规则。除白色外的颜色框表示数据稀疏的点,白色框表示空点。

Rule Generation Algorithm

当前实现[31]面临的主要性能挑战与规则生成算法有关。通常使用使用哈希表的基于CPU的规则生成算法,但这种算法速度较慢,并且需要在CPU和GPU之间传输数据。更直接的规则生成方法是遍历输入点以找到与每个输入点相关的输出并将相应的索引存储到规则中。在迭代过程中,需要一个表来检查每个输出位置的存在,以决定是否使用全局输出索引计数器来累积数据。这是阻碍算法使用并行计算的最大挑战。

在我们的案例中,我们设计了一种基于GPU的规则生成算法(算法1),它在GPU上运行得更快。图1的底部显示了我们提出的算法。首先,我们收集输入索引和相关的空间索引而不是输出索引(算法1中的第一个循环)。在此阶段获得重复的输出位置。然后,我们对空间索引数据执行独特的并行算法,以获得输出索引及其关联的空间索引。从先前的结果生成与稀疏数据具有相同空间维度的缓冲区,用于下一步中的查表(算法1中的第二个循环)。最后,我们迭代规则并使用存储的空间索引来获得每个输入索引的输出索引(算法1中的第三个循环)。表1显示了我们的实现与现有方法之间的性能比较。

表1.各种卷积实现的执行速度比较。SparseConvNet是子流形卷积的官方实现[27]。所有基准测试均使用来自KITTI数据集的数据在GTX 1080 Ti GPU上运行。

Sparse Convolutional Middle Extractor

我们的中间提取器用于学习有关zzz轴的信息并将稀疏的3D数据转换为2D BEV图像。图3显示了中间提取器的结构。它由稀疏卷积的两个阶段组成。每个阶段包含几个子流形卷积层和一个正常稀疏卷积,以在zzz轴上执行下采样。在zzz 维被下采样到一维或二维后,稀疏数据被转换为密集特征图。然后,将数据简单地重新整形为类似图像的2D数据。


图3. 我们提出的稀疏中间特征提取器的结构。黄色框代表稀疏卷积,白色框代表子流形卷积,红色框代表稀疏到密集层。图的上半部分显示了稀疏数据的空间维度。

3.1.4.Region Proposal Network

RPNs[1]最近开始在许多检测框架中使用。在这项工作中,我们使用类似于单次多框检测器(SSD)的[32]架构来构建RPN架构。RPN的输入包括来自稀疏卷积中间提取器的特征图。RPN架构由三个阶段组成。每个阶段都从一个下采样的卷积层开始,然后是几个卷积层。在每个卷积层之后,应用BatchNorm和ReLU层。然后,我们将每个阶段的输出上采样为相同大小的特征图,并将这些特征图连接成一个特征图。最后,应用三个1×1卷积来预测类别、回归偏移和方向。

3.1.5.Anchors and Targets

因为要检测的目标的大小大致固定,我们使用固定大小的anchors,该anchor是根据旋转0度和90度的KITTI训练集中所有ground truths的大小和中心位置的平均值确定的。对于汽车,我们使用尺寸为w=1.6×l=3.9×h=1.56w=1.6 \times l=3.9 \times h=1.56w=1.6×l=3.9×h=1.56m的anchor,以z=−1.0z = -1.0z=−1.0m为中心。对于行人,我们使用尺寸为w=0.6×l=0.8×h=1.73w = 0.6 × l = 0.8 × h = 1.73w=0.6×l=0.8×h=1.73m的anchor,对于骑自行车的人,anchor的尺寸为w=0.6×l=1.76×h=1.73w = 0.6 × l = 1.76 × h = 1.73w=0.6×l=1.76×h=1.73m;两者都以z=−0.6z = -0.6z=−0.6m为中心。

每个anchor都被分配了一个分类目标的one-hot向量、一个7-vector的框回归目标和一个方向分类目标的one-hot向量。不同的类别有不同的匹配和不匹配阈值。对于汽车,anchors使用0.6的交并联合(IoU)阈值分配给ground-truth目标,如果它们的IoU小于0.45,则将anchors分配给背景(负值)。IoU介于0.45和0.6之间的anchors在训练期间会被忽略。对于行人和骑自行车的人,我们使用0.35作为非匹配阈值,0.5作为匹配阈值。

对于回归目标,我们使用以下框编码函数:

xt=xg−xada,yt=yg−yada,zt=zg−zahawt=log⁡(wgwa),lt=log⁡(lgla),ht=log⁡(hgha)θt=θg−θa(6)\begin{aligned} &x_{t}=\frac{x_{g}-x_{a}}{d_{a}}, y_{t}=\frac{y_{g}-y_{a}}{d_{a}}, z_{t}=\frac{z_{g}-z_{a}}{h_{a}} \\ &w_{t}=\log \left(\frac{w_{g}}{w_{a}}\right), l_{t}=\log \left(\frac{l_{g}}{l_{a}}\right), h_{t}=\log \left(\frac{h_{g}}{h_{a}}\right) \\ &\theta_{t}=\theta_{g}-\theta_{a} \end{aligned} \tag{6} ​xt​=da​xg​−xa​​,yt​=da​yg​−ya​​,zt​=ha​zg​−za​​wt​=log(wa​wg​​),lt​=log(la​lg​​),ht​=log(ha​hg​​)θt​=θg​−θa​​(6)

其中xxx、yyy和zzz是中心坐标;www、lll和hhh分别是宽度、长度和高度;θ\thetaθ是绕zzz轴的偏航旋转;下标ttt、aaa和ggg分别表示编码值、anchor和ground truth;da=(la)2+(wwa)2d^{a}=\sqrt{\left(l^{a}\right)^{2}+\left(w w^{a}\right)^{2}}da=(la)2+(wwa)2​是anchor box底部的对角线。

3.2.Training and Inference

3.2.1.Loss

Sine-Error Loss for Angle Regression

以前的角度回归方法,包括角编码、直接编码和矢量编码,通常表现不佳。角点预测方法[8]无法确定目标的方向,也不能用于行人检测,因为BEV框几乎是正方形的。矢量编码方法[9,19]保留了冗余信息,导致难以基于LiDAR检测远处的物体。VoxelNet[14]直接预测弧度偏移,但在0和π\piπ弧度的情况下会遇到对抗性示例问题,因为这两个角度对应于同一个框,但当一个被错误识别为另一个时会产生很大的损失。我们的架构通过引入新的角度损失回归解决了这个问题:
Lθ=SmoothL1⁡(sin⁡(θp−θt)),(7)L_{\theta}=\operatorname{SmoothL1}\left(\sin \left(\theta_{p}-\theta_{t}\right)\right), \tag{7} Lθ​=SmoothL1(sin(θp​−θt​)),(7)
其中下标ppp表示预测值。这种角度损失的方法有两个优点:(1)它解决了0和π\piπ方向之间的对抗性示例问题,以及(2)它自然地根据角度偏移函数对IoU进行建模。为了解决这种损失将具有相反方向的框视为相同的问题,我们在RPN的输出中添加了一个简单的方向分类器。该方向分类器使用softmax损失函数。我们使用以下方法来生成方向分类器目标:如果围绕ground truth的z轴的偏航旋转高于零,则结果为正;否则为负数。

我们的网络通常在KITTI点云中生成∼70k的anchors。不幸的是,通常只有几个ground truths,每个ground truth只产生4-6个positives。这导致前景和背景类之间的极端不平衡。RetinaNet[33]的作者介绍了一种有效的单阶段损失,称为焦点损失,可以解决这个问题;因此,我们在架构中使用了这种损失。分类损失具有以下形式:

FL(pt)=−αt(1−pt)γlog⁡(pt),(8)FL\left(p_{t}\right)=-\alpha_{t}\left(1-p_{t}\right)^{\gamma} \log \left(p_{t}\right), \tag{8} FL(pt​)=−αt​(1−pt​)γlog(pt​),(8)
其中ptp_{t}pt​是模型的估计概率,α\alphaα和γ\gammaγ是焦点损失的参数。我们在训练过程中使用α\alphaα = 0.25和γ\gammaγ = 2。

Total Training Loss

通过结合上面讨论的损失,我们可以得到多任务损失的最终形式如下:

Ltotal =β1Lcls+β2(Lreg−θ+Lreg−other)+β3Ldir (9)L_{\text {total }}=\beta_{1} L_{c l s}+\beta_{2}\left(L_{r e g-\theta}+L_{r e g-o t h e r}\right)+\beta_{3} L_{\text {dir }} \tag{9} Ltotal ​=β1​Lcls​+β2​(Lreg−θ​+Lreg−other​)+β3​Ldir ​(9)

其中LclsL_{cls}Lcls​是分类损失,Lreg−otherL_{r e g-o t h e r}Lreg−other​是位置和维度的回归损失,Lreg−θL_{r e g-\theta}Lreg−θ​是我们的新角度损失,LdirL_{dir}Ldir​是方向分类损失。β1=1.0,β2=2.0\beta_{1}=1.0, \beta_{2}=2.0β1​=1.0,β2​=2.0, 和 β3=0.2\beta_{3}=0.2β3​=0.2是我们损失公式的常数系数。我们使用相对较小的β3\beta_{3}β3​值来避免我们的网络难以识别目标方向的情况。

3.2.2.Data Augmentation

Sample Ground Truths from the Database

我们在训练过程中遇到的主要问题是存在的ground truths太少,这极大地限制了网络的收敛速度和最终性能。为了解决这个问题,我们引入了一种数据增强方法。首先,我们从训练数据集中生成了一个数据库,其中包含所有ground truths的标签及其相关的点云数据(ground truths的3D边界框内的点)。然后,在训练过程中,我们从这个数据库中随机选择了几个ground truths,并通过连接将它们引入到当前的训练点云中。使用这种方法,我们可以大大增加每个点云的ground truths数量并模拟不同环境中存在的目标。为了避免物理上不可能的结果,我们在对ground truths进行采样后进行了碰撞测试,并移除了与其他目标碰撞的任何采样目标。

Object Noise

为了考虑噪声,我们采用了与VoxelNet[14]中使用的相同方法,其中每个ground truth及其点云都是独立且随机变换的,而不是使用相同参数变换所有点云。具体来说,我们使用从均匀分布Δθ∈[−π/2,π/2]\Delta \theta \in[-\pi / 2, \pi / 2]Δθ∈[−π/2,π/2]中采样的随机旋转和从均值为0且标准差为1.0的高斯分布中采样的随机线性变换。

Global Rotation and Scaling

我们将全局缩放和旋转应用于整个点云和所有ground-truth框。缩放噪声取自均匀分布[0.95,1.05][0.95,1.05][0.95,1.05],[−π/4,π/4][-\pi / 4, \pi / 4][−π/4,π/4]用于全局旋转噪声。

3.2.3.Optimization

所提出的SECOND检测器使用随机梯度下降(SGD)进行训练。我们使用了在GTX 1080 Ti GPU上运行的Adam优化器,每个minibatch总共有三个点云。所有模型都训练了160个epoch(200k次迭代)。初始学习率为0.0002,指数衰减因子为0.8,每15个epoch衰减一次。使用0.0001的衰减权重、0.9的beta1值和0.999的beta2值。使用单个GTX 1080 Ti GPU训练大型汽车检测网络需要19小时,而训练较小的模型只需要9小时。

3.2.4.Network Details

我们建议使用两个网络:一个大的和一个小的。位于相机视锥体之外的点需要被移除。

对于汽车检测,在SECOND中使用了两个VFE层,即用于大型网络的VFE(32)和VFE(128)以及用于较小网络的VFE(32) 和VFE(64),然后是Linear(128)(128)(128)层。因此,输出稀疏张量的维度对于大型网络为128 × 10 × 400 × 352,对于小型网络为128 × 10 × 320 × 264。然后,我们使用两级稀疏CNN进行特征提取和降维,如图3所示。每个卷积层都遵循BatchNorm层和ReLU层。所有稀疏卷积层都有一个64个输出的特征图,内核大小为(3, 1, 1)内核大小和步幅 (2, 1, 1)。对于大型网络,中间块的输出尺寸为64 × 2 × 400 × 352。一旦输出重新整形为128 × 400 × 352,就可以应用RPN网络。图4显示了RPN的架构。我们使用Conv⁡2D(cout ,k,s)\operatorname{Conv} 2 D\left(c_{\text {out }}, \mathbf{k}, \mathbf{s}\right)Conv2D(cout ​,k,s)表示一个Conv2D-BatchNorm-ReLU层,使用DeConv⁡2D(cout ,k,s)\operatorname{DeConv} 2 D\left(c_{\text {out }}, \mathbf{k}, \mathbf{s}\right)DeConv2D(cout ​,k,s)表示一个DeConv2D-BatchNorm-ReLU层,其中coutc_{out}cout​是输出通道数,k\mathbf{k}k是内核大小和s\mathbf{s}s是步幅。因为所有层在所有维度上都具有相同的大小,所以我们对k\mathbf{k}k和s\mathbf{s}s使用标量值。所有Conv2D层都有相同的填充,所有DeConv2D层都有零填充。在我们的RPN的第一阶段,应用了三个Conv2D(128, 3, 1(2))层。然后,在第二和第三阶段分别应用五个Conv2D(128, 3, 1(2))层和五个Conv2D(256, 3, 1(2))层。在每个阶段,s\mathbf{s}s = 2仅对第一个卷积层;否则,s\mathbf{s}s = 1。我们对每个阶段的最后一个卷积应用单个DeConv2D(128, 3, s)层,三个阶段依次为s\mathbf{s}s = 1、2和4。对于行人和骑自行车的人检测,与汽车检测的唯一区别是RPN中第一个卷积层的步幅是1而不是2。


图4.RPN的详细结构。蓝色方框代表卷积层,紫色方框代表级联层,天蓝色方框代表stride-2下采样卷积层,棕色方框代表转置卷积层。

4.Experiments

我们在KITTI数据集[34]上训练我们的网络,并在KITTI基准[7]上评估我们的3D目标检测器,用于3D目标检测和BEV目标检测,包括汽车、行人和自行车基准。对于每一个等级,探测器被评估为三个难度等级:简单、中等和困难。难度评估基于2D结果中的物体高度、遮挡和截断。我们遵循[8]中提出的方法,将提供的7481个训练样本分成3712个样本的训练集和3769个样本的评估集。由于对测试服务器的访问有限,我们只使用测试集来评估我们的较大模型,因此只能为我们的较小模型提供验证集上的性能评估。根据AP评估BEV和3D检测结果。我们将我们提出的方法与几种最先进的方法进行了比较。这里,我们关注汽车检测结果,因为行人和骑自行车的人检测可能需要图像来获得更好的结果,如4.3节所述。我们用于推理的计算环境包括Core-i5 6500 CPU(4核)、16GB DDR4内存和GTX 1080 Ti GPU。

4.1.Evaluation Using the KITTI Test Set

表2显示了我们的3D检测器在KITTI测试集上的性能。我们的方法仅使用激光雷达数据获得了最先进的结果,并明显优于原始的VoxelNet[14],而AVOD-FPN[9]使用图像和激光雷达数据,并使用自定义的85/15训练/验证分割(与我们的50/50分割相反)和地平面估计来改善结果。F-PointNet[11]使用2D探测器,该探测器已经使用ImageNet权重进行了微调,而我们的网络是从零开始训练的,并且仅使用激光雷达数据。对于行人和骑自行车的人的检测,我们的结果可以与最先进的结果相媲美。表3显示了我们的3D BEV对象定位方法的性能。我们的方法比最先进的方法表现稍差,但仍然达到了相当的结果,并且它比仅使用激光雷达的VoxelNet[14]网络表现得更好。

我们在图5中展示了几个3D检测结果。3D边界框已被投影到相机坐标系中。总的来说,这个评估表明,我们的网络可以产生高精度的结果与快速的推理速度。

表2.3D检测性能:KITTI测试集中3D框的平均精度(AP)(单位为%)。在AVOD和AVOD-FPN[9]中,采用定制的85/15训练/验证分割和地平面估计来改善结果。对于F-PointNet[11],一个GTX 1080 GPU,其峰值性能是GTX 1080 Ti(用于我们的方法)或Titan Xp(用于AVOD)的67%,用于推断。粗体数字表示表格中的最佳结果。


图5.KITTI测试集上的3D检测结果。为了更好地可视化,使用激光雷达检测的3D框被投影到来自左侧相机的图像上。

表3.鸟瞰图检测性能:KITTI测试集中BEV框的平均精度(AP)(单位为%)。

4.2.Evaluation Using the KITTI Validation Set

由于除了VoxelNet[14]之外,目前没有公开的方法给出行人和骑自行车者检测的验证结果,因此我们只给出汽车检测的验证结果,以便与其他方法进行比较。

我们在表4和表5中报告了在KITTI验证集上实现的性能。我们的大型和小型网络在所有难度级别上都优于所有竞争方法,而我们的小型网络保持着特别快的推理速度。

表4.3D检测性能:KITTI验证集中3D框的平均精度(AP)(单位为%)。

表5.鸟瞰图检测性能:KITTI验证集中BEV框的平均精度(AP)(单位为%)。

4.3.Analysis of the Detection Results

图6显示了点云和相关图像的一些检测结果。


图6.KITTI验证集的检测结果。在每幅图像中,绿色框表示检测成功,红色框表示检测准确度低,灰色框表示假negative,蓝色框表示假positive。每个框旁边的数字和字母分别表示实例ID和类,其中“V”表示汽车,“P”表示行人,“C”表示骑自行车的人。在点云中,绿框表示ground truths,蓝框表示探测结果。

4.3.1.Car Detection

图6中的前四幅图像和相关点云作为典型汽车检测的示例。我们的网络可以为中等距离和近距离的汽车提供出色的结果。对于距离较远的汽车,尽管可用的点很少,但我们的网络仍然产生了良好的结果,这使得在图像中检测这样的目标非常具有挑战性。此外,我们的网络可以令人惊讶地检测到强烈重叠的汽车,对于这些汽车,点云仅包含原始汽车点云的一小部分。总的来说,这些结果证明了我们网络的3D方面的有效性。

另一方面,对于点云中只有几个点的情况,可以观察到汽车检测中的一些主要故障,包括不准确的旋转和大小估计。我们的网络错过了许多距离激光雷达较远的汽车,通常包含不到10个点。还有一个明显的标签缺失:一些距离较远或严重遮挡的汽车根本没有标签,尽管网络确实成功检测到了这些车辆。

4.3.2.Pedestrian and Cyclist Detection

图6中的最后四幅图像和相关点云显示了行人和骑自行车者的检测结果。这里的假positives和假negatives比汽车多。一些假positives出现在图像中不合理的位置。这种困难可归因于与汽车相比,行人和骑自行车者的实例密度通常更高,每个实例的点更少,这导致行人和骑自行车者更容易与其他点聚类和噪声混淆。此外,行人和骑自行车的人相对较少,导致他们的体素较少,这限制了CNN的能力。然而,这一发现有希望的方面是,如果有可能使用来自这种图像的信息,可以简单地过滤不相关的点,并且可以根据2D检测结果容易地确定物体的位置,这应该使这个问题容易消除。

4.4.Ablation Studies

4.4.1.Sparse Convolution Performance

表1显示了我们改进的稀疏卷积方法的性能,并将其与SparseConvNet[31]中的原始实现进行了比较。可以看出,我们的稀疏卷积方法比原始实现更快,因为它的规则生成更快。

4.4.2.Different Angle Encodings

表6显示了不同角度编码方法在KITTI验证集上的性能。可以看出,我们处理角度的方法比AVOD[9]和ComplexYOLO[19]中使用的角度矢量编码执行得更好。在我们的方法中,可以控制方向分类权重,以使网络更专注于重叠最大化,而不是在困难的情况下挣扎于方向识别。

表6.不同角度编码方法在Car类的KITTI验证集上的性能比较。

4.4.3.Sampling Ground Truths for Faster Convergence

为了纠正训练期间positive例和negative例之间的极端数据不平衡,我们引入了一种技术,用于对ground truths及其相关点云数据进行采样,以动态构建更好的训练数据。图7显示了在Car类的KITTI验证集上使用和不使用ground-truth采样进行训练的性能曲线。该图表明我们的采样方法大大提高了收敛速度并增强了最终结果。


图7.在KITTI验证集上进行3D地图评估的采样与非采样方法(汽车类,中等难度)。

5.Conclusions

大多数现有的3D目标检测方法将点云数据转换为2D表示,例如BEV和前视图表示,因此丢失了原始点云中包含的大部分空间信息。在本文中,我们介绍了一种新的角度损失回归方法,成功地将稀疏卷积应用于基于激光雷达的网络中,并提出了一种充分利用点云优势的数据增强新方法。在KITTI数据集上的实验表明,所提出的网络优于其他最先进的方法。此外,所提出的架构已被证明可以实时运行。然而,我们的网络在行人和骑车人检测以及BEV检测方面表现出较低的性能。未来的工作将包括研究基于相机和LiDAR的联合检测方法,例如图像特征与LiDAR体素特征的融合,以提高检测性能,以及使用弱监督训练来利用大的未标记部分KITTI数据集。

References

  1. Girshick, R. Fast R-CNN. In Proceedings of the IEEE International Conference on Computer Vision, Washington, DC, USA, 7–13 December 2015; pp. 1440–1448.

  2. Dai, J.; Li, Y .; He, K.; Sun, J. R-FCN: Object detection via region-based fully convolutional networks. In Proceedings of the Advances in Neural Information Processing Systems, Barcelona, Spain, 5–10 December 2016; pp. 379–387.

  3. He, K.; Gkioxari, G.; Dollar, P .; Girshick, R. Mask R-CNN. arXiv 2017, arXiv:1703.06870.

  4. Chen, Y .; Wang, Z.; Peng, Y .; Zhang, Z.; Yu, G.; Sun, J. Cascaded pyramid network for multi-person pose estimation. arXiv 2017, arXiv:1711.07319.

  5. Chen, X.; Kundu, K.; Zhang, Z.; Ma, H.; Fidler, S.; Urtasun, R. Monocular 3D object detection for autonomous driving. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, Las V egas, NV , USA, 27–30 June 2016; pp. 2147–2156.

  6. Chen, X.; Kundu, K.; Zhu, Y .; Ma, H.; Fidler, S.; Urtasun, R. 3D object proposals using stereo imagery for accurate object class detection. IEEE T rans. Pattern Anal. Mach. Intell. 2018, 40, 1259–1272. [CrossRef] [PubMed]

  7. Kitti 3D Object Detection Benchmark Leader Board. Available online: http://www.cvlibs.net/datasets/ kitti/eval_object.php?obj_benchmark=3d (accessed on 28 April 2018).

  8. Chen, X.; Ma, H.; Wan, J.; Li, B.; Xia, T. Multi-view 3D object detection network for autonomous driving. In Proceedings of the IEEE Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 21–26 July 2017; V olume 1, p. 3.

  9. Ku, J.; Mozifian, M.; Lee, J.; Harakeh, A.; Waslander, S. Joint 3D Proposal Generation and Object Detection from View Aggregation. arXiv 2017, arXiv:1712.02294.

  10. Du, X.; Ang Jr, M.H.; Karaman, S.; Rus, D. A general pipeline for 3D detection of vehicles. arXiv 2018, arXiv:1803.00387.

  11. Qi, C.R.; Liu, W.; Wu, C.; Su, H.; Guibas, L.J. Frustum PointNets for 3D Object Detection from RGB-D Data. arXiv 2017, arXiv:1711.08488.

  12. Wang, D.Z.; Posner, I. V oting for V oting in Online Point Cloud Object Detection. In Proceedings of the Robotics: Science and Systems, Rome, Italy , 13–17 July 2015; V olume 1.

  13. Engelcke, M.; Rao, D.; Wang, D.Z.; Tong, C.H.; Posner, I. V ote3deep: Fast object detection in 3D point clouds using efficient convolutional neural networks. In Proceedings of the 2017 IEEE International Conference on Robotics and Automation (ICRA), Singapore, 29 May–3 June 2017; pp. 1355–1361.

  14. Zhou, Y .; Tuzel, O. V oxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection. arXiv 2017, arXiv:1711.06396.

  15. Li, B. 3D fully convolutional network for vehicle detection in point cloud. In Proceedings of the IEEE 2017 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), Vancouver, BC, Canada, 24–28 September 2017; pp. 1513–1518.

  16. Girshick, R.; Donahue, J.; Darrell, T.; Malik, J. Rich feature hierarchies for accurate object detection and semantic segmentation. In Proceedings of the 2014 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Columbus, OH, USA, 23–28 June 2004; pp. 580–587.

  17. Mousavian, A.; Anguelov , D.; Flynn, J.; Košecká, J. 3D bounding box estimation using deep learning and geometry . In Proceedings of the 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 21–26 July 2017; pp. 5632–5640.

  18. Li, B.; Zhang, T.; Xia, T. V ehicle detection from 3D lidar using fully convolutional network. arXiv 2016, arXiv:1608.07916.

  19. Simon, M.; Milz, S.; Amende, K.; Gross, H.M. Complex-YOLO: Real-time 3D Object Detection on Point Clouds. arXiv 2018, arXiv:1803.06199.

  20. Redmon, J.; Divvala, S.; Girshick, R.; Farhadi, A. You only look once: Unified, real-time object detection. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, Las V egas, NV , USA, 27–30 June 2016; pp. 779–788.

  21. Yang, B.; Luo, W.; Urtasun, R. PIXOR: Real-Time 3D Object Detection From Point Clouds. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, Salt Lake City , UT, USA, 18–22 June 2018; pp. 7652–7660.

  22. Qi, C.R.; Su, H.; Mo, K.; Guibas, L.J. Pointnet: Deep learning on point sets for 3D classification and segmentation. In Proceedings of the IEEE Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 21–26 July 2017; V olume 1, p. 4.

  23. Qi, C.R.; Yi, L.; Su, H.; Guibas, L.J. Pointnet++: Deep hierarchical feature learning on point sets in a metric space. In Proceedings of the Advances in Neural Information Processing Systems, Long Beach, CA, USA, 4–9 December 2017; pp. 5105–5114.

  24. Li, Y .; Bu, R.; Sun, M.; Chen, B. PointCNN. arXiv 2018, arXiv:1801.07791.

  25. Graham, B. Spatially-sparse convolutional neural networks. arXiv 2014, arXiv:1409.6070.

  26. Graham, B. Sparse 3D convolutional neural networks. arXiv 2015, arXiv:1505.02890.

  27. Graham, B.; van der Maaten, L. Submanifold Sparse Convolutional Networks. arXiv 2017, arXiv:1706.01307.

  28. Graham, B.; Engelcke, M.; van der Maaten, L. 3D Semantic Segmentation with Submanifold Sparse Convolutional Networks. In Proceedings of the IEEE Computer Vision and Pattern Recognition CVPR, Salt Lake City , UT, USA, 18–22 June 2018.

  29. Song, S.; Xiao, J. Deep sliding shapes for amodal 3D object detection in rgb-d images. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, Las V egas, NV , USA, 27–30 June 2016; pp. 808–816.

  30. Vasudevan, A.; Anderson, A.; Gregg, D. Parallel multi channel convolution using general matrix multiplication. In Proceedings of the 2017 IEEE 28th International Conference on Application-specific Systems, Architectures and Processors (ASAP), Seattle, WA, USA, 10–12 July 2017; pp. 19–24.

  31. SparseConvNet Project. Available online: https://github.com/facebookresearch/SparseConvNet (accessed on 28 April 2018).

  32. Liu, W.; Anguelov , D.; Erhan, D.; Szegedy , C.; Reed, S.; Fu, C.Y .; Berg, A.C. Ssd: Single shot multibox detector. In Proceedings of the European Conference on Computer Vision, Amsterdam, The Netherlands, 8–16 October 2016; Springer: Amsterdam, The Netherlands, 2016; pp. 21–37.

  33. Lin, T.Y .; Goyal, P .; Girshick, R.; He, K.; Dollár, P . Focal loss for dense object detection. arXiv 2017, arXiv:1708.02002.

  34. Geiger, A.; Lenz, P .; Urtasun, R. Are we ready for autonomous driving? The kitti vision benchmark suite. In Proceedings of the 2012 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Providence, RI, USA, 16–21 June 2012; pp. 3354–3361.

SECOND: Sparsely Embedded Convolutional Detection相关推荐

  1. 论文阅读 SECOND:Sparsely Embedded Convolutional Detection

    标题:SECOND:Sparsely Embedded Convolutional Detection 作者:Yan Yan,Yuxing Mao,and Bo Li 来源:sensors 2018 ...

  2. SECOND: Sparsely Embedded Convolutional Detection 论文笔记

    SECOND: Sparsely Embedded Convolutional Detection 论文链接: https://www.researchgate.net/publication/328 ...

  3. 论文笔记 : SECOND: Sparsely Embedded Convolutional Detection

    SECOND: Sparsely Embedded Convolutional Detection 重庆大学,输变电设备与系统安全国家重点实验室,2018,KITTI 总结 基于体素划分的3D卷积网络 ...

  4. (2018, sensors) SECOND: Sparsely Embedded Convolutional Detection

    paper: https://www.mdpi.com/1424-8220/18/10/3337 code: https://github.com/traveller59/second.pytorch ...

  5. 【论文阅读】SECOND: Sparsely Embedded Convolutional Detection

    论文链接: https://www.researchgate.net/publication/328158485_SECOND_Sparsely_Embedded_Convolutional_Dete ...

  6. 【3D目标检测】SECOND: Sparsely Embedded Convolutional Detection

    目录 概述 细节 网络结构 稀疏卷积 方向分类 损失函数 概述 首先,本文是基于点云,并且将点云处理成体素的3D目标检测网络,提出的SECOND可以看做是VoxelNet的升级版. 提出动机与贡献 V ...

  7. 【3D目标检测】SECOND: Sparsely Embedded Convolutional Detection论文解读(2018)

    1. 为什么要做这个研究(理论走向和目前缺陷) ? VoxelNet这种直接对点云进行特征提取而非手工设计特征的3D检测算法效果还行但是很慢.以前的方案朝向预测不准. 2. 他们怎么做这个研究 (方法 ...

  8. 嵌入式目标检测--Fast YOLO: A Fast You Only Look Once System for Real-time Embedded Object Detection

    Fast YOLO: A Fast You Only Look Once System for Real-time Embedded Object Detection in Video https:/ ...

  9. (CVPR 2019)PointPillars: Fast Encoders for Object Detection From Point Clouds

    Abstract 点云中的目标检测是许多机器人应用(例如自动驾驶)的重要方面.在本文中,我们考虑将点云编码为适合下游检测管道的格式的问题.最近的文献提出了两种类型的编码器:固定编码器往往速度很快,但牺 ...

最新文章

  1. 神经网络基础知识总结
  2. 十分钟掌握多项式回归:非线性预测
  3. 融合 MF 和 RNN 的电影推荐系统
  4. 读书笔记之Unix命令
  5. [Swift通天遁地]二、表格表单-(14)实时调整表单元素的激活和失效
  6. java check word lock_Java多线程-新特征-锁(下)
  7. 引领盲返消费新潮流,共创社交电商新时代
  8. 上线群聊功能 阿里搞不赢的社交美团能行吗?
  9. 新版ideal2021配置Tomcat
  10. pmp-关键路径法之顺推和逆推
  11. 思博伦TestCenter进行某大型保险集团广域网测试——路由器测试_双极未来
  12. mybatis-plus雪花算法生成Id使用详解
  13. [Unity]实现按住WASD角色移动
  14. 史上最全面的python学生管理系统教程(二)
  15. js 鼠标移动和离开
  16. Vivado如何生成BIN或MCS文件并烧写到FLASH中
  17. NB模组选型及整体方案注意事项
  18. 视频化表达“吞噬”互联网,文本信息逐渐被替代?
  19. nasm 宏参数macro
  20. python检测屏幕亮点_使用Python和OpenCV检测图像中的多个亮点

热门文章

  1. 信息学奥赛一本通-1055:判断闰年
  2. kali安装flash插件
  3. IP地址和MAC 地址
  4. 谈谈privoxy:关于广告过滤和自动代理切换
  5. 图片怎么转换成PDF,这三个方法轻松搞定!
  6. Vue 源码之 mixin 原理
  7. linux awk判断字符串开头,Linux文件比较三剑客(awk/grep/sed)之awk
  8. Redis面试完整版
  9. android指南针程序,如何在Android上制作精确的指南针
  10. win10计算机属性管理打不开,win10系统此电脑属性打不开怎么办