作者 | 深蓝学院  编辑 | 自动驾驶与AI

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心技术交流群

本文只做学术分享,如有侵权,联系删文

招聘在即,为帮助大家在面试中有更好地表现,拿到自己心仪的offer,深蓝学院特邀请了500+来自各个互联网科技大厂的求职者们,为大家分享自己在面试过程中遇到的的题目以及经验,耗时一个半月整理出1000+覆盖自动驾驶、CV、推荐系统等等热门领域的真题题库,阿里、百度、腾讯、华为等30+大厂题目皆有涉及,同时为了方便大家交流业内信息,深蓝学院也建立了“招聘交流群”,群内会提供一线大厂学长学姐们的面试经验以及和大咖交流的机会。

自动驾驶目前是比较热门的一个方向,各个车企和公司都对该技术进行了研究,比如特斯拉,理想汽车,蔚来汽车等,深蓝学院整理了该方向的面试题如下:

  1. ROS的通信机制有哪些?

  2. BFS和DFS的区别是什么?

  3. 进程的通信方式是什么?

  4. 简述BN归一化的过程。

  5. 自动驾驶汽车闯红灯的原因是什么?

  6. 车道线检测的方法有哪些?

  7. 自动驾驶中构建的地图都有哪些形式?

  8. 自动驾驶中MPC控制的过程?

  9. 目前的目标检测方法有哪些?

  10. 描述车牌定位的具体过程。

  11. 解释SSD算法目标检测的原理。

  12. 描述ResNet的基本结构,其设计思想和优点是什么?

  13. 介绍Adaboost的原理。

  14. 多传感器之间是怎么对时的?

  15. 说明IMU预积分理论。

  16. 说明RANSAC算法的原理。

  17. 简述A* 路径规划方法的特点和基本原理。

  18. YOLO-v5算法的改进之处体现在哪里?

  19. 目标检测中IOU的计算过程使用代码编程实现。

  20. 简述PnP算法的基本步骤和原理。

建议大家先自己答题,再对照参考答案噢~~

参考答案

1. ROS的通信机制有哪些?

ROS基本的通信方式有三种:话题通信(发布订阅模式)、服务通信(请求响应模式)和参数服务器(参数共享模式)。

话题通信指的是一个节点发布消息,另一个节点订阅消息,适用于不断更新的、少逻辑处理的数据传输场景。话题通信涉及到Talker(发布者)、Listener(订阅者)和ROS Master(管理者)三个角色,发布者负责给订阅者发布数据,订阅者负责接收发布者的数据,管理者负责保管发布者和订阅者注册的消息,并匹配话题相同的发布者与订阅者,帮助发布者与订阅者建立连接。

服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。一般用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。服务通信涉及到Client(客户端)、Server(服务端)和ROS Master(管理者)三个角色,客户端负责向服务端发送请求,并接收服务端发送的数据,服务端负责接收处理请求,并对客户端做出相应,管理者负责保管客户端和服务端注册的信息,并匹配话题相同的客户端与服务端,帮助客户端与服务端建立连接。

参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。参数服务器一般用于存储一些多节点共享的数据,类似于全局变量。参数服务器涉及ROS Master(管理者)、Talker(参数设置者)和Listener(参数调用者),管理者作为一个公共的容器保存数据,参数设置者往容器中储存数据,参数调用者读取容器中所需的数据。

2. BFS和DFS的区别是什么?

BFS是广度优先搜索,其特点是:

(1)BFS从根节点开始搜索,并根据树级别模式探索所有邻居根。

(2)它使用队列数据结构来记住下一个节点访问。

(3)BFS比DFS需要更多的内存。

(4)它是使用FIFO列表应用的。

(5)寻找最短路径的理想选择。

(6)该算法用于查找两个节点之间的最短路径,发现图中的所有连接组件,分析图是否为二部图等。

DFS是深度优先搜索,其特点是:

(1)DFS从根节点开始搜索,并从根节点尽可能远地探索这些节点。

(2)使用堆栈数据结构来记住下一个节点访问。

(3)DFS所需的内存少于BFS所需的内存。

(4)它是通过LIFO列表应用的。

(5)寻找最短距离的理想选择。

(6)该算法用于解决问题,拓扑排序,需要对图进行回溯,识别图中的循环以及发现两个节点之间的路径等。

3. 进程的通信方式是什么?

进程之间的通信方式一般有管道、FIFO、消息队列、信号量和共享内存五种。

管道指的是无名管道,是UNIX 系统IPC最古老的形式。其特点如下:

(1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

(3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

FIFO是命名管道,是一种文件类型。其特点如下:

(1)FIFO可以在无关的进程之间交换数据,与无名管道不同。

(2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

消息队列是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。其特点如下:

(1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

(2)消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。

(3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

信号量是一个计数器,用于实现进程间的互斥和同步,其特点如下:

(1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

(2)信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。

(3)每次对信号量的 PV 操作不仅限于对信号量值加1或减1,而且可以加减任意正整数。

(4)支持信号量组。

共享内存指的是两个或多个进程共享一个给定的存储区,其特点如下:

(1)共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

(2)因为多个进程可以同时操作,所以需要进行同步。

(3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

4. 简述BN归一化的过程。

BN是Batch Normalization的缩写,该方法的代表性论文是“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”,论文中关于BN的解释是训练深度神经网络非常复杂,因为在训练过程中,随着先前各层的参数发生变化,各层输入的分布也会发生变化,图层输入分布的变化带来了一个问题,因为图层需要不断适应新的分布,因此训练变得复杂,随着网络变得更深,网络参数的细微变化也会放大。

由于要求较低的学习率和仔细的参数初始化,这减慢了训练速度,并且众所周知,训练具有饱和非线性的模型非常困难。我们将此现象称为内部协变量偏移,并通过归一化层输入来解决该问题。

如上图中的左图所示,由于两个数据不在同一范围,但它们是使用相同的学习率,导致梯度下降轨迹沿一维来回振荡,从而需要更多的步骤才能达到最小值。且此时学习率不容易设置,学习率过大则对于范围小的数据来说来回震荡,学习率过小则对范围大的数据来说基本没什么变化。如上图中的右图所示,当进行归一化后,特征都在同一个大小范围,则loss landscape像一个碗,学习率更容易设置,且梯度下降比较平稳。

算法的核心代码如下:

在一个batch中,在每一BN层中,对每个样本的同一通道,计算它们的均值和方差,再对数据进行归一化,归一化的值具有零均值和单位方差的特点,最后使用两个可学习参数gamma和beta对归一化的数据进行缩放和移位。

此外,在训练过程中还保存了每个mini-batch每一BN层的均值和方差,最后求所有mini-batch均值和方差的期望值,以此来作为推理过程中该BN层的均值和方差。

5. 自动驾驶汽车闯红灯的原因是什么?

闯红灯的原因在于:

摄像机里的无线收发装置产生了电磁干扰,以致交通信号灯上的转发器所发出的信号受到破坏。

这个事故显然让以往被人忽视的电磁干扰问题更加突显出来。而且,对于很多汽车制造商来说,干扰来自很多目前应用的技术,从车内的手机充电器,到电子控制的转向和刹车系统等等。

仅仅是确定干扰出自何处,就是一个极具挑战性的任务。随着汽车上的电子设备日益增加,计算机化和网联化程度加深,工程师越来越难以辨认干扰的来源。而各种无线技术彼此交叉重叠,无疑让挑战更加复杂。

美国联邦通信委员会在十多年前就作出了规定,事先预留了5.9 GHz频段,可通过专用的短程通信,应用于车辆安全的相关领域。但最近几年,蜂窝式汽车互联技术的鼓吹者,以及一些机器人公司,都希望能够共享这个频段。这就为工程师排除干扰的工作增加了不确定性。

电磁干扰的问题显然在大城市、市中心是尤为突出的。而开发自动驾驶的公司恰恰就是期望在这些地方投放它们最初的一批高阶自动驾驶汽车。

然而目前的情况是,许多测试中心都建在远离市区的地方,因此也是无线电干扰可以控制的地方。

从实验到实用,还需要跨越不少鸿沟。

6. 车道线检测的方法有哪些?

车道线检测方法分为两种:一种是传统算法,主要基于边缘特征或者是图像分割,通过图像预处理,特征提取等方式与卡尔曼滤波器等算法结合,在识别出车道线后采用后处理的方式形成最终的车道。然而这种传统方法易受到光照变化,行驶车辆,道路破损等干扰,导致效果欠佳。近年来,深度学习方法利用网络模型自动学习目标特征,具有较强的泛化能力,可以有效提高目标检测的准确率。得益于卷积神经网络的强大特征提取能力,性能也在不断提升。

7. 自动驾驶中构建的地图都有哪些形式?

二维地图:栅格地图、拓扑地图、导航网格图。

栅格地图主要对平面进行网格化,格子一般为正方形,长度的调整代表地图的分辨率。

拓扑地图与图论紧密结合,通过抽象的点与边,边的方向与路径长度代表一个地图的信息。

导航网格图弥补了栅格地图的缺陷,网格由不同的多边形构成,多边形一般根据障碍物顶点的连线构成,将地图划分为不规则的一个个区域,网格数量较少。

三维地图:栅格地图、八叉树地图、点云地图、体素地图、TSDF地图、ESDF地图。

栅格地图类似于二维栅格地图,三维地图相对比较占内存。

八叉树地图如果某个位置上没有障碍物,那么可以用该位置上的大正方体表示,如果某个位置上是小障碍物,那就把大正方体切分到刚好可以包含这个障碍物的小正方形。这样就可以减少计算量,节约内存。而这刚好是八叉树这种数据结构,寻找障碍物先从最大的正方体开始找,然后再向由这个正方体平均分的八个正方体里去找。

点云地图通过激光雷达等传感器得到数据在进行三维重建得到点云地图。

体素地图类似于八叉树地图,由最小的正方体为单位构成,每个体素存储一个SDF、颜色和权重。

TSDF地图是截断符号距离函数场,这里的体素储存的是投影距离(projective distance),就是沿着传感器射线到已测量的表面的距离。

ESDF地图是欧几里得符号距离场,在这个场里面的每一个体素都包含了距离它最近的障碍物的欧几里得距离。

8. 自动驾驶中MPC控制的过程。

模型预测控制(Model Predictive Control)指一类算法,周期性基于当帧测量信息在线求解一个有限时间开环优化问题,并将结果的前部分控制序列作用于被控对象。根据所用模型不同,分为动态矩阵控制(DMC),模型算法控制(MAC)、广义预测控制(GPC)。在智能驾驶方向,重点在于基于状态空间模型的模型预测控制。

预测控制最大的吸引力在于它具有显式处理约束的能力, 这种能力来自其基于模型对系统未来动态行为的预测, 通过把约束加到未来的输入、输出或状态变量上, 可以把约束显式表示在一个在线求解的二次规划或非线性规划问题中。

在线求解开环优化问题获得开环优化序列是MPC和传统控制方法的主要区别,因为后者通常是离线求解一个反馈控制律,而该反馈控制律一旦确定,在系统中就不再变动。

其中,x(t)为t时刻车辆的测量状态量,x*(t)为t时刻车辆的估计状态,u’(t)为t时刻的最优控制解,y(t)为t时刻的系统输出。

MPC算法包括三个步骤:

预测模型:根据历史信息、当前输入预测未来输出。我们需要一个模型能够基于历史信息和当前状态,来预测未来输出,这就涉及状态量的描述,非线性模型的线性化,从而确保预测输出最大限度接近期望值。

滚动优化:某一性能指标最优,反复在线优化。由于外部干扰,模型系统误差等原因,预测输出与实际存在偏差,滚动优化要做的就是找到每个时刻下的局部最优解,一般会设计一个损失函数,转化为二次规划问题,找到最优解。

反馈校正:基于测量对模型预测进行修正。模型基于当前与过去信息预测未来输出,那么未来时刻的输出就是反馈信息,这一部分与模型有较大关系,有些模型把这一部分内容体现在前两步骤中。

9. 目前的目标检测方法有哪些?

目标检测的方法包括传统方法和深度学习方法。

传统目标检测方法有VJ检测器、HOG检测和DPM等。

(1)VJ检测器

采用最直接的检测方法,即,滑动窗口:查看图像中所有可能的位置和比例,看看是否有窗口包含人脸。虽然这似乎是一个非常简单的过程,但它背后的计算远远超出了计算机当时的能力。VJ检测器结合了 “ 积分图像 ”、“ 特征选择 ” 和 “ 检测级联 ” 三种重要技术,大大提高了检测速度。

(2)HOG检测

HOG可以被认为是对当时的尺度不变特征变换(scale-invariant feature transform)和形状上下文(shape contexts)的重要改进。为了平衡特征不变性 ( 包括平移、尺度、光照等 ) 和非线性 ( 区分不同对象类别 ),将HOG描述符设计为在密集的均匀间隔单元网格上计算,并使用重叠局部对比度归一化 ( 在“块”上 ) 来提高精度。虽然HOG可以用来检测各种对象类,但它的主要动机是行人检测问题。若要检测不同大小的对象,则HOG检测器在保持检测窗口大小不变的情况下,多次对输入图像进行重新标度。多年来,HOG检测器一直是许多目标检测器和各种计算机视觉应用的重要基础。

(3)DPM

DPM算法采用了改进后的HOG特征,SVM分类器和滑动窗口(Sliding Windows)检测思想,针对目标的多视角问题,采用了多组件(Component)的策略,针对目标本身的形变问题,采用了基于图结构(Pictorial Structure)的部件模型策略。此外,将样本的所属的模型类别,部件模型的位置等作为潜变量(Latent Variable),采用多示例学习(Multiple-instance Learning)来自动确定。

深度学习目标检测方法有基于分类的检测算法和基于回归的检测算法,基于分类的检测算法有OverFeat算法、R-CNN、SPP-Net、Fast-RCNN、Faster-RCNN、R-FCN、Mask R-CNN,基于回归的检测算法有YOLO、SSD、YOLOv2以及YOLO9000、YOLOv3、YOLOv4、YOLOv5和YOLOvx。

(1)OverFeat算法

OverFeat并没有使用region proposal,但其思路被后面的R-CNN系列沿用并改进。该算法通过多尺度的滑动窗口结合 AlexNet提取图像特征,完成检测。在 ILSVRC 2013 数据集上的平均准确率(mean Average Precision,mAP)为 24.3%,检测效果较传统算法有显著改进,但依旧存在较高错误率。

(2)R-CNN

R-CNN利用Selective Search获得候选区域(约2000个)。随即对候选区域大小进行归一化,用作CNN网络的标准输入。再使用AlexNet获得候选区域中的特征,最后利用多个 SVM 进行分类以及线性回归微调定位框(Bounding-box)。

但是,R-CNN对近2 000个候选区域分别做特征提取,而候选区域之间存在许多重复区域,导致大量且重复的运算,运行缓慢,平均每幅图片的处理时间为 34 s。同时,对每一步的数据进行存储,极为损耗存储空间。另外,对候选区域进行归一化操作,会对最终结果产生影响。

(3)SPP-Net

针对R-CNN对所有候选区域分别提取特征的缺点,SPP-Net一次性对整张图片作卷积操作提取特征。使得特征提取从 R-CNN 的近 2 000 次变为提取1次整张图片特征,大大减少了工作量。

另外,SPP-Net在最后一个卷积层后、全连接层前添加空间金字塔池化层(SPP层),提取固定尺寸的特征向量,避免对候选区域大小进行归一化的复杂操作。

(4)Fast-RCNN

Fast R-CNN算法在SPP-Net的基础上,将SPP层简化为ROI Pooling层,并将全连接层的输出作SVD分解,得到两个输出向量:softmax的分类得分以及 Bounding box外接矩形框的窗口回归。这种改进将分类问题和边框回归问题进行了合并;用 softmax 代替 SVM,将所有的特征都存储在显存中,减少了磁盘空间的占用;SVD分解则在几乎不影响精度的情况了,极大加快检测速度。

Fast R-CNN 使用 VGG16 代替 AlexNet,平均准确率达到 70.0%,且训练速度较 R-CNN 提升 9 倍,检测速度达到每幅图片 0.3 s(除去 region proposal 阶段)。Fast R-CNN 依然使用 Selective Search 方法选取候选区域,这一步骤包含大量计算。

Fast RCNN成功地融合了 R-CNN 和 SPPNet 的优点,但其检测速度仍然受到建议检测候选区域的限制 。由此可见,改进Selective Search是Fast R-CNN速度提升的关键。

(5)Faster-RCNN

Faster R-CNN使用RPN网络(Region Proposal Networks)替代 Selective Search 算法,使目标识别实现真正端到端的计算。

RPN 使得 Faster R-CNN 在 region proposal 阶段只需10 ms,检测速度达到5 f/s(包括所有步骤),并且检测精度也得到提升,达到 73.2%。但是,Faster R-CNN 仍然使用 ROI Pooling,导致之后的网络特征失去平移不变性,影响最终定位准确性;ROI Pooling后每个区域经过多个全连接层,存在较多重复计算;Faster R-CNN 在特征图上使用锚点框对应原图,而锚点框经过多次下采样操作,对应原图一块较大的区域,导致 Faster R-CNN检测小目标的效果并不是很好。

(6)R-FCN

R-FCN使用全卷积网络ResNet代替VGG,提升特征提取与分类的效果;针对全卷积网络不适应平移敏感性的缺陷,该算法使用特定的卷积层生成包含目标空间位置信息的位置敏感分布图(Position Sensitive Score Map);ROI Pooling 层后不再连接全连接层,避免重复计算。

R-FCN的准确率达到 83.6%,测试每张图片平均花费170 ms,比Faster-RCNN快了2.5~20倍。但是R-FCN在得到 Score map 需要生成一个随类别数线性增长的channel数,这一过程虽然提升了目标检测精度,但减慢了检测速度,导致其难以满足实时性要求。

(7)Mask R-CNN

Mask R-CNN是一种在 Faster R-CNN 基础上加以改进的算法,增加了对实例分割的关注。该算法在分类和定位回归以外,加入了关于实例分割的并行分支,并将三者的损失联合训练。实例分割要求实例定位的精准度达到像素级,而Faster R-CNN 因为 ROI Pooling 层的等比例缩放过程中引入了误差,导致空间量化较为粗糙,无法准确定位。

Mask R-CNN 提出双线性差值 RoIAlign 获得更准确的像素信息,使得掩码(mask)准确率提升 10%到50%;Mask R-CNN 还使用 ResNeXt基础网络,在COCO 数据集上的检测速度为 5 f/s,检测准确性从 Fast-RCNN的19.7%提升至39.8%。

Mask R-CNN在检测精度、实例分割方面都达到目前最高的层次。其后一些算法在性能上有所提升,但基本维持在同一水平。但是该算法的检测速度依旧难以满足实时要求,并且实例分割目前也还面临着标注代价过于昂贵的问题。

(8)YOLO

YOLO v1(2016)将图片划分为 S × S 的网格(cell),各网格只负责检测中心落在该网格的目标,每个网格需要预测两个尺度的bounding box和类别信息,一次性预测所有区域所含目标的bounding box、目标置信度以及类别概率完成检测。

YOLO 采用以 cell为中心的多尺度区域取代 region proposal,舍弃了一些精确度以换取检测速度的大幅提升,检测速度可以达到 45 f/s,足以满足实时要求;检测精度为63.4%,较Faster R-CNN的73.2%,差距较大。

YOLO在极大提高检测速度的情况下,也存在以下问题:(1)因为每个网格值预测两个bounding box,且类别相同,因此对于中心同时落在一个网格总的物体以及小物体的检测效果差,多物体环境下漏检较多;(2)由于YOLO关于定位框的确定略显粗糙,因此其目标位置定位准确度不如 Fast-RCNN;(3)对于外型非常规的物体检测效果不佳。

(9)SSD

Faster-RCNN 检 测 检 测 精 度 高 但 检 测 速 度 慢 ,YOLO 检测精度不高但检测速度快,SSD则结合两者的优点,在 YOLO的基础上借鉴了 RPN的思路,在保证高精度检测的同时,兼顾检测速度。

为不同层的特征图具有对应大小的感受野,特定层的特征图只需要训练对应尺度的对象检测。因此,SSD 结合高层和底层的特征图,使用多尺度区域特征进行回归。

结果:SSD300的mAP能达到73.2%,基本与Faster R-CNN(VGG16)持平,而检测速度达到59 f/s,比Faster R-CNN快6.6倍。但是SSD具有以下问题:(1)小目标对应到特征图中很小的区域,无法得到充分训练,因此 SSD 对于小目标的检测效果依然不理想;(2)无候选区域时,区域回归难度较大,容易出现难以收敛等问题;(3)SSD不同层的特征图都作为分类网络的独立输入,导致同一个物体被不同大小的框同时检测,重复运算。

(10)YOLOv2和YOLO9000

YOLOv虽然检测速度快,但是它在物体定位方面不够准确,并且召回率低,因此它的检测精度比较低。YOLOv2(2017)通过在每一个卷积层后添加 batch normalization、多尺度训练,加入 K-mean 维度聚类等方式,使得检测速度和精度的再次提升。该算法能够在76.8%正确率的同时达到 67 f/s的检测速度,78.6%的正确率时达到40 f/s。

同时,YOLOv2还专门训练了一个由19个卷积层和5个池化层组成的Darknet-19网络作为模型的主干网络,用于提取特征并减少模型的计算量。同文还提出了YOLO9000,该算法采用wordTree层次分类,混合检测数据、识别数据集,在分类和检测数据集上同时训练,实现9 418类的检测。

无论是 YOLO 系列还是 SSD 算法,都沿用 R-CNN系列算法先在大数据集上进行分类预训练,再在小数据集上 fine-tune 的方法。但 fine-tune 预训练模型有以下问题:(1)预训练模型,往往无法迁移到如医疗图像等特定数据上;(2)预训练模型结构基本固定,难以修改;(3)预训练样本和最终检测目标有所区别,得到的模型未必是检测目标的最佳模型。

(11)YOLOv3

YOLOv3(2018) 在 YOLOv2的基础上,使用全新设计的 Darknet-53 残差网络并结合特征金字塔网络 ( feature pyramid networks,FPN)( Seferbekov 等,2018) 进行多尺度融合预测,其基本思想是先利用特征提取网络得到一定尺寸的特征图(如 13 × 13),然后将输入图像分成对应个数(13 × 13)的网格单元,如果真实目标的中心坐标落在某一网格单元,则由该网格单元来预测该目标,因为每个网格单元都会预测固定数量的边界框(采用 YOLOv2 中的 K 均值聚类算法(K-means) 获 得 3 个初始尺寸不同的边界框),最终选择与真实值的 IOU 最大的边界框来预测该目标。

YOLOv3 的Darknet-53 相对于 YOLOv2 的 Darknet-19 改进了两个方面:1) YOLOv3 中做特征图尺寸变化的池化(pooling)层基本由卷积层来实现,减少了模型的运算量;2)针对 YOLOv2 中直筒型网络结构层数太多所产生的梯度问题引入了 ResNet 网络中的残差结构(residual blocks),ResNet 的残差结构训练深层网络的难度较小,因此可以将网络做到 53 层来提升检测精度,这些改变使得 YOLOv3 用 1 /3 的时间达到与 SSD 相当的精度。另外 YOLOv3 采用了FPN架构,在三个不同尺度的特征图上进行检测,提高了网络对小目标的检测效果。

(12)YOLOv4

2020年Bochkovskiy等提出了YOLOv4,该模型选择了CSPDarknet53作为主干网络,同时模型中加入了很多普遍适用的算法。例如加权残差连接、跨阶段部分连接、自对抗训练、跨小批量标准化和DropBlock正则化等。这些调优的手段使得该模型实现了当时最优的实验结果。

(13)YOLOv5和YOLOvx

优点:已经证实可以在多个数据集上快速收敛;模型可定制性强

特点:yolov5有点类似EfficientNet网络的设计规则,(输入、宽度、深度)

10. 描述车牌定位的具体过程。

车牌定位,就是在车牌图像中找出最符合车牌特征的区域。其主要目的是在经图像预处理后原始灰度图像中寻出车牌的位置,并将包含车牌字符的一块子图像从整个图像中分割出来,供字符识别子系统之用,分割的准确与否直接关系到整个车牌字符识别系统的识别率。

车牌识别系统现阶段比较成熟的车牌定位方法有:基于图像的彩色信息法、基于纹理分析的方法、基于边缘检测的方法、基于数学形态学的方法、基于遗传算法的定位、基于神经网络定位等。

汽车牌照定位:在车牌识别系统中对车牌定位的算法包括三个过程,即颜色识别、形状识别、纹理识别。先通过颜色识别来初步确定车牌的所在区域,再结合车牌的形状特征以及纹理特征精确定位。

车牌识别系统都是基于牌照区域的特征来进行定位的,车辆牌照的主要特征如下:

(1)颜色特征

车牌底色与字符颜色有着相应的组合,颜色对比强烈。如果对彩色图像进行定位,有蓝底白字白框线,黄底黑字黑框线,黑底白字白框线,白底黑f红1字黑框线等几种颜色搭配的车牌。如果对灰度图像进行定位,则有深色底浅色字和浅色底深色字两种组合。

(2)几何特征

在车辆图像中,车牌通常是一个近似矩形或者平行四边形的区域。宽、高比例在一定范围内,标准长宽比值为3 .14,定位出来的车牌区域一般在此比值上下,相差不大。

(3)纹理特征

在车辆牌照内,有7个字符规则排列,形成了特殊的纹理特征。通过车辆牌照的扫描线,灰度值有着较规则跳变。

11. 解释SSD算法目标检测的原理。

早期的目标检测系统包含了两个不同阶段:目标定位和目标检测,这类系统计算量非常耗时,不适用实际应用。Single Shot Detection模型在网络的前向运算中封装了定位和检测,从而显著提高了运算速度。

多尺度特征映射图(Multiscale Feature Maps):小编认为这是SSD算法的核心之一,原始图像经过卷积层转换后的数据称为特征映射图(Feature Map),特征映射图包含了原始图像的信息。SSD网络包含了多个卷积层,用多个卷积层后的特征映射图来定位和检测原始图像的物体。

先验框(Priors):在特征映射图的每个位置预先定义不同大小的矩形框,这些矩形框包含了不同的宽高比,它们用来匹配真实物体的矩形框。

预测矩形框:每个特征映射图的位置包含了不同大小的先验框,然后用预测卷积层对特征映射进行转换,输出每个位置的预测矩形框,预测矩形框包含了框的位置和物体的检测分数。比较预测矩形框和真实物体的矩形框,输出最佳的预测矩形框。

损失函数:我们知道了预测的矩形框和真实物体的矩形框,如何计算两者的损失函数?

损失函数包含了位置损失函数和分类损失函数,由于大部分矩形框只包含了背景,背景的位置不需要定位,因此计算两者的位置损失函数用L1函数即可。我们把背景称为负类,包含了物体的矩形框称为正类,不难理解图像中大部分的矩形框只包含了负类,若用全部的负类和正类来计算损失函数,那么训练出来的模型偏向于给出负类的结果。解决办法是在计算分类损失函数时,我们只选择最难检测的几个负类和全部正类来计算。

非极大值抑制(Non-maximum Suppression):若两个矩形框都包含了相同的物体,且两个矩形框的重叠度较高,则选择分数较高的矩形框,删除分数较低的矩形框。

SSD网络包含了基础网络,辅助卷积层和预测卷积层:

(1)基础网络:提取低尺度的特征映射图;

(2)辅助卷积层:提取高尺度的特征映射图;

(3)预测卷积层:输出特征映射图的位置信息和分类信息。

12. 描述ResNet的基本结构,其设计思想和特点是什么?

Residual net(残差网络):靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分。

残差神经单元:假定某段神经网络的输入是x,期望输出是H(x),如果我们直接将输入x传到输出作为初始结果,那么我们需要学习的目标就是F(x)=H(x)-x,这就是一个残差神经单元,相当于将学习目标改变了,不再是学习一个完整的输出H(x),只是输出和输入的差别H(x)-x,即残差。

残差网络的作用:

(1)普通的直连的卷积网络和ResNet的最大区别在于,ResNet有很多旁路的支线将输入直接连接到后面的层,使得后面的层可以直接学习残差,这种结构也被称为shortcut或者skip connections。

(2)传统的卷积层或全连接层在传递信息时,或多或少会存在信息的丢失,损耗等问题。ResNet在某种程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入,输出差别的那一部分,简化了学习目标和难度。

BatchNormalization(BN)设计思想:

(1)所有输出保证在0到1之间。

(2)所有输出数据均值接近0,标准差接近1的正态分布。使其落入激活函数的敏感区,避免梯度消失,加快收敛。

(3)加快模型收敛速度,并且具有一定的泛化能力。

(4)可以减少Dropout的使用。(减少过拟合)

残差网络ResNets的特点:

(1)残差网络在模型表征方面并不存在直接的优势,ResNets并不能更好的表征某一方面的特征,但是ResNets允许逐层深入地表征更多的模型。

(2)残差网络使得前馈式/反向传播算法非常顺利进行,在极大程度上,残差网络使得优化较深层模型更为简单

(3)“shortcut”快捷连接添加既不产生额外的参数,也不会增加计算的复杂度。快捷连接简单的执行身份映射,并将它们的输出添加到叠加层的输出。通过反向传播的SGD,整个网络仍然可以被训练成终端到端的形式。

13. 介绍Adaboost的原理。

Adaboost算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树)进行合理的结合,使其成为一个强分类器。

Adaboost采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第N次迭代中,一共就有N个弱分类器,其中N-1个是以前训练好的,其各种参数都不再改变,本次训练第N个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前N-1个弱分类器没分对的数据,最终分类输出要看这N个分类器的综合效果。

14. 多传感器之间是怎么对时的?

激光雷达:大多数雷达如VLP-16等都提供基于pps脉冲和GPRMC信号的输入接口,PPS和GPRMC信号可以由GNSS或IMU提供,或者由外部时钟源提供。少数激光雷达还支持NTP/PTP同步,PTP的精度一般比NTP高,这两个信号都需要由外部时钟源设备提供。。

相机:需要支持外部触发曝光的型号,因为相机帧周期包括曝光时间和readout时间,一般来说readout时间是固定的,可以补偿这个时间,相机的时间戳选择为曝光的中间时间。

GNSS:可以从卫星获得高精度的时钟信号,而且通常的GNSS都支持PPS脉冲以及GPRMC信号。

(1)使用GNSS作为时钟源,将GNSS的PPS信号提供给雷达和一个开发板,开发板将给相机一个曝光的脉冲信号。

(2)使用外部时钟源,这种时钟源通常支持PPS信号输入,将GNSS的PPS传给外部时钟源,同时外部时钟源可以使用PTP/NTP/PPS给雷达做时间同步,同时触发相机开始曝光。外部时钟源同时也可以使用PTP/NTP对主机进行时间同步。

15. 说明IMU预积分理论。

IMU的使用一般是对其测得的加速度,角速度进行积分,从而推算出机器人的位姿。但是,由于积分关系,IMU的积分所得的位姿飘移会随着积分时间的增大而增大。另一方面,当优化方法优化了历史时刻的位姿之后,之后时刻的IMU积分值需要重新进行积分,计算量大。因此,IMU预积分就被提出,以解决以上问题。IMU预积分简单来说就是描述了lidar帧(或者相机帧)之间(时间间隔比较短,比如lidar帧间间隔通常为100ms),IMU数据的观测量。其只跟上一帧时刻的IMU状态量相关,因此,在进行优化过程中,计算量较小。作为观测量,IMU预积分自然是作为一个约束用于slam位姿优化。

16. 说明RANSAC算法的原理。

RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的是数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大。RANSAC主要解决样本中的外点问题,最多可处理50%的外点情况。

RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:

一个模型适用于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。

用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。

如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。

然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。

最后,通过估计局内点与模型的错误率来评估模型。

这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为它比现有的模型更好而被选用。

17. 简述A 路径规划方法的特点和基本原理。*

结合了Dijkstra和启发式算法的优点,以从起点到该点的距离加上该点到终点的估计距离之和作为该点在Queue中的优先级。在下文会详细介绍此算法。优点:比dijkstra快,因评价函数存在,算法会放弃掉图的边缘节点。缺点:h函数的选择决定了算法速度。

A* 算法是启发式搜索,是一种尽可能基于现有信息的搜索策略,也就是说搜索过程中尽量利用目前已知的诸如迭代步数,以及从初始状态和当前状态到目标状态估计所需的费用等信息。

A* 算法可以选择下一个被检查的节点时引入了已知的全局信息,对当前结点距离终点的距离作出估计,作为评价该节点处于最优路线上的可能性的量度,这样可以首先搜索可能性大的节点,从而提高了搜索过程的效率。

A* 算法的基本思想如下:引入当前节点j的估计函数f*,当前节点j的估计函数定义为:

f*(j)= g(j)+h*(j)

其中g(j)是从起点到当前节点j的实际费用的量度,h*(j)是从节点j到终点的最小费用的估计,可以依据实际情况,选择h*(j)的具体形式,h*(j)要满足一个要求:不能高于节点j到终点的实际最小费用。从起始节点点向目的节点搜索时,每次都搜索f*(j)最小的节点,直到发现目的节点。

18. YOLO-v5算法的改进之处体现在哪里?

改进之处:

(1)Data Augmentation

YOLOV5通过数据加载器传递每一批训练数据,并同时增强训练数据。数据加载器进行三种数据增强:缩放,色彩空间调整和马赛克增强。据悉YOLO V5的作者Glen Jocher正是Mosaic Augmentation的创造者,故认为YOLO V4性能巨大提升很大程度是马赛克数据增强的功劳,也许你不服,但他在YOLO V4出来后的仅仅两个月便推出YOLO V5,不可否认的是马赛克数据增强确实能有效解决模型训练中最头疼的“小对象问题”,即小对象不如大对象那样准确地被检测到。

(2)Auto Learning Bounding Box Anchors

YOLO-v5锚定框是基于训练数据自动学习的。个人认为算不上是创新点,只是手动改代码改为自动运行。

对于自定义数据集来说,由于目标识别框架往往需要缩放原始图片尺寸,并且数据集中目标对象的大小可能也与COCO数据集不同,因此YOLO V5会重新自动学习锚定框的尺寸。

(3)Backbone

YOLO V5和V4都使用CSPDarknet作为Backbone从输入图像中提取丰富的信息特征。CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,具体做法是:将梯度的变化从头到尾地集成到特征图中,减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸。

(4)Neck

YOLO V5和V4都使用PANET作为Neck来聚合特征。Neck主要用于生成特征金字塔,增强模型对于不同缩放尺度对象的检测,从而能够识别不同大小和尺度的同一个物体。

在PANET之前,一直使用FPN(特征金字塔)作为对象检测框架的特征聚合层,PANET在借鉴 Mask R-CNN 和 FPN 框架的基础上,加强了信息传播。

PANET基于 Mask R-CNN 和 FPN 框架,同时加强了信息传播。该网络的特征提取器采用了一种新的增强自下向上路径的 FPN 结构,改善了低层特征的传播。第三条通路的每个阶段都将前一阶段的特征映射作为输入,并用3x3卷积层处理它们。输出通过横向连接被添加到自上而下通路的同一阶段特征图中,这些特征图为下一阶段提供信息。同时使用自适应特征池化(Adaptive feature pooling)恢复每个候选区域和所有特征层次之间被破坏的信息路径,聚合每个特征层次上的每个候选区域,避免被任意分配。

(5)Head

模型Head主要用于最终检测部分,它在特征图上应用锚定框,并生成带有类概率、对象得分和包围框的最终输出向量。yolo5在通用检测层,与yolo3、yolo4相同。

最后三个特征图是不同缩放尺度的Head被用来检测不同大小的物体,每个Head一共(80个类 + 1个概率 + 4坐标) * 3锚定框,一共255个channels。

(6)Network Architecture

YOLO-v4和YOLO-v5基本相同的网络架构,都使用CSPDarknet53(跨阶段局部网络)作为Backbone,并且使用了PANET(路径聚合网络)和SPP(空间金字塔池化)作为Neck,而且都使用YOLO V3的Head。YOLO V5 s,m,l,x四种模型的网络结构是一样的。原因是作者通过depth_multiple,width_multiple两个参数分别控制模型的深度以及卷积核的个数。

(7)Activation Function

yolo5的作者使用了 Leaky ReLU 和 Sigmoid 激活函数。yolo5中中间/隐藏层使用了 Leaky ReLU 激活函数,最后的检测层使用了 Sigmoid 形激活函数。而YOLO V4使用Mish激活函数。

(8)Optimization Function

YOLO V5的作者提供了两个优化函数Adam和SGD(默认),并都预设了与之匹配的训练超参数。YOLO V4使用SGD。

YOLO V5的作者建议是,如果需要训练较小的自定义数据集,Adam是更合适的选择,尽管Adam的学习率通常比SGD低。但是如果训练大型数据集,对于YOLOV5来说SGD效果比Adam好。

实际上学术界上对于SGD和Adam哪个更好,一直没有统一的定论,取决于实际项目情况。

(9)Benchmarks

YOLO 系列的损失计算是基于 objectness score, class probability score,和 bounding box regression score.

YOLO V5使用 GIOU Loss作为bounding box的损失。

YOLO V5使用二进制交叉熵和 Logits 损失函数计算类概率和目标得分的损失。同时我们也可以使用fl _ gamma参数来激活Focal loss计算损失函数。

YOLO V4使用 CIOU Loss作为bounding box的损失,与其他提到的方法相比,CIOU带来了更快的收敛和更好的性能。

19. 目标检测中IOU的计算过程使用代码编程实现。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include<string>
#include<sstream>
#include<map>
#include<set>
#include<iomanip>
#include <functional> // std::greater
using namespace std;
double calcS(vector<int> num)
{return (num[2] - num[0])*(num[3] - num[1]);
}
vector<vector<double>> calcIOU(vector<vector<int>> &nums)
{vector<vector<double>> res(nums.size(), vector<double>(nums.size(),0.0));for (int i = 0; i < nums.size(); ++i){for (int j = i + 1; j < nums.size(); ++j){int x1 = max(nums[i][0], nums[j][0]);int x2 = min(nums[i][2], nums[j][2]);int y1 = max(nums[i][1], nums[j][1]);int y2 = min(nums[i][3], nums[j][3]);double inter_square = (x2 - x1)*(y2 - y1);double union_square = calcS(nums[i]) + calcS(nums[j]) - inter_square;res[i][j] = inter_square / union_square;}}return res;
}
int main()
{vector<vector<int>> nums;vector<vector<double>> res;// 表示坐标位置,(x1,y1,x2,y2),分别是左上角和右下角的坐标int a[3][4] = { { 3,6,9,11 },{ 6,3,8,7 },{ 3,7,10,12 } };for (int i = 0; i < 3; ++i){vector<int> temp;for (int j = 0; j < 4; ++j){temp.push_back(a[i][j]);}nums.push_back(temp);}res = calcIOU(nums);for (int i = 0; i < nums.size(); ++i){for (int j = i + 1; j < nums.size(); ++j)cout << fixed << setprecision(3) <<res[i][j] << " ";}cout << endl;system("pause");return 0;
}

20. 简述PnP算法的基本步骤和原理。

PnP(Perspective-n-Point)是求解3D到2D点的对应方法。它描述了当知道n个3D空间点及其位置,如何估计相机的位姿。如果两张图像中的一张特征点3D位置已知,那么至少需要3个点对(以及至少一个额外验证点验证结果)就可以计算相机的运动。PnP的应用范围很广比如两阶段法的6D姿态估计以及视觉SLAM等等。

特征点的3D位置可以由三角化或者RGB-D相机的深度图确定,当然还有其他方法。

PnP求解方法:

(1)DLT直接线性变换

(2)P3P三对点估计位姿

(3)EPnP(Efficient Pnp)

(4)BA(Bundle Adjustment)光速法平差

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合、多传感器标定、多传感器融合、3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、协同感知、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码免费学习)

视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、Occupancy、多传感器融合、大模型、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

2023最新自动驾驶面试题汇总(持续更新中)相关推荐

  1. 面试1:Java、微服务、架构常见面试题(持续更新中)

    Java.微服务.架构常见面试题(持续更新中) 文章目录 Java.微服务.架构常见面试题(持续更新中) ==**Java**== 1.Java概述 (1)JVM.JRE和JDK (2)Java特点 ...

  2. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(4)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  3. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(8)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  4. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(3)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  5. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(1)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  6. 阿里笔试题(2015)持续更新中

    第一次做阿里笔试题,除了ACM题之外从来没有做过校招网络题呀,完全是裸考,总体感觉吧,对于我来说,感觉时间不够用,不是题不会,感觉时间紧,大脑很混乱,总结这一次的笔试题 废话不多说,直接上题和答案 平 ...

  7. YOLO 3/4/5/6/7/x、Efficient、MaskRcnn、FasterRcnn、FCOS、SSD、M2Det、Retina、CenterNet、PicoDet等系列数据模型汇总持续更新中

    做了很长时间的CV领域的任务了,见到了很多不错的项目,很多时候也是会选择直接拿来开源的项目去使用,自己也做过了很多项目,后面就萌生了一个想法,将看到的不错的文章或者是数据集或者是项目汇总记录一下,以便 ...

  8. 技术问题收集整理汇总——持续更新中...

    此文章的目的是收集自己在网上看到的不错的文章或帖子,并将这些文章的索引统一收集在这里,并持续更新中....大家有好的东西也可以分享过来哦! 1.关于java为什么要使用继承(或java使用继承有什么用 ...

  9. 自动驾驶面试题汇总(2022秋招题库)——持续更新

    这份面试题整理自12家大厂的2022年秋招面试题.题目基本涵盖了自动驾驶和机器人定位方向的主要知识点,包括惯性导航.点云.状态估计.CV/VIO.C++等部分. 建议大家先自己答题,再对照参考答案~( ...

最新文章

  1. 清华首超新加坡国立大学,成亚洲第一;苏州大学成211学科黑马丨US News 2021
  2. Linux 中文件管理常用的工具
  3. 给喜欢写博、乐于交流的你们!
  4. 除了收割票房,内战中的中国喜剧电影到底在拼什么?
  5. 查找数组连成环形的和最大的连续子数组
  6. mysql引擎与操作系统的关系_mysql五大引擎之间的区别和优劣之分
  7. pandas将所0值修改为NaN
  8. HNOI2019 退役记
  9. 【Cadence 17.2】02 添加封装库/焊盘库
  10. 一键部署office的工具——OTool
  11. 仿美洽客服系统-gin框架内核独立自主源码开发在线客服系统
  12. 大学计算机基础第五版习题和课后题答案
  13. 【老生谈算法】matlabBOOST电路的设计与仿真——BOOST电路
  14. 第四章 结构化程序设计
  15. 很多次游戏的最后取胜实际上都有很强的偶然性
  16. MedianFlow跟踪算法
  17. 【开关电源】降压变换器(BUCK)的断续模式建模
  18. 如何做好项目沟通管理
  19. 使用tensorboard时http://localhost:6006打不开或desktop-2a1fhsu 已拒绝连接
  20. HTML5调用摄像头+视频特效+录制视频+录音+截图+变声+滤波+音频可视化

热门文章

  1. c语言实现上下左右移动,C语言实现矩阵翻转(上下翻转、左右翻转)分享
  2. Excel一键生成工资条的另类操作
  3. 微信 updateAppMessageShareData ios分享不出来标题内容
  4. BUFF80双模蓝牙5.2热插拔PCB
  5. Talend使用总结
  6. 犀牛书第七版学习笔记:数据类型与结构-布尔值
  7. mac iphone 备份_如何在Mac上删除iPhone和iPad备份
  8. 怎样使用Finder从MacOS Catalina删除iPhone和iPad备份?
  9. linux 卸载docker 离线_Linux 离线安装docker的过程(一键式安装)
  10. qdebug打印数组所有内容_qDebug 的使用