一面
项目相关
1、简历中的项目相关问题,项目是三维重建相关的,深度学习的深度估计
2、具体细节上,网络结构、loss设计、数据、训练泛化效果
3、非公共区域如何处理、精度如何保证
基础:
1、非线性优化
概念:规划问题的目标函数及约束函数中至少有一个是非线性函数,则称这种规划为非线性规划。
迭代法:LM/高斯牛顿法/最速下降法/D_G法
优缺点对比:高斯牛顿法适用于迭代的开始阶段,牛顿法适用于最优值附近,LM相当于对高斯牛顿法进行改进,引入了阻尼因子;高斯牛顿法的H矩阵容易是病态的矩阵,如果步长太准确性也会降低,常用的是G-N和L-M(病态也好)法求解,
2、视觉slam基础
1、只有相机的情况下,采用深度学习的方案,如何实现高精度、强泛化的模型效果
当模型泛化性差的时候,我们需要找到其原因
原因1:网络足够大,仅仅记住了所有样本
解决1:1.找当前任务的公开数据集在自己的模型上训练,对比一些性能优越算法的性能,这样能让我们验证自己算法的可行性,以测试所有基础架构是否正确到位。
2.保证数据集和标签正确无误,这个很好理解,当数据集有错误的时候,网络无论如何无法学到真正的规律;
3.正则化
4.超参探索、尝试原因2:过拟合
解决2:增大数据集、增加正则化,dropout一些神经元,减小网络模型、提前停止训练
2、cnn,不做三维了,做其他方向,怎么准备
1、双目立体匹配,哪些方案
BM和SGBM。SGBM是BM立体匹配算法的优化版,属于半全局匹配,相对于BM花的时间要更多,但效果优于BM。这里以SGBM举例
步骤:1.打开相机,获取到左目和右目的图像;
2.矫正畸变;
3.图像灰度化;
4.立体匹配,输出结果。
使重建更加稠密的方法:WLS视差滤波(opencv-contrib)
或者是使用open3d点云重建
SGBM全称为半全局匹配方式,相比BM多了代价空间和代价聚合。
其中的惩罚系数P1与相邻像素点视差之间的差异有关,当差异为1时惩罚为P1。在理论上来说,深度图上的视差应当是连续的,惩罚系数P2与视差不连续有关,当差异值大于1时惩罚值为P2。P2大于P1,因此不连续的惩罚很高。
opencv中实现的SGBM算法计算匹配代价没有按照原始论文的互信息作为代价,而是按照块匹配的代价。
算法实现过程:预处理 -> 代价计算 -> 动态规划 -> 后处理
1.预处理包括Sobel算子处理,并将处理后的图像上每个像素点映射成一个新的图像
2.代价计算包括基于采样的方法利用图像的梯度信息得到梯度代价,以及原图像采样得到SAD代价
3.动态规划包括参数P1和P2
4.后处理包括三个步骤:唯一性检测、亚像素插值、左右一致性检测
kinectfusion等等开源三维重建框架,有没有玩过,看过
KinectFusion是第一个使用RGBD相机进行实时稠密三维重建的系统,TSDF(截断符号距离函数)地图
对于输入的RGB-D图像,首先计算点云及其归一化后的法向量,然后通过ICP算法迭代计算当前帧的相机位姿(输入为三维场景投影得到上一帧的深度图像,以及当前帧的点云),之后将当前点云融合到TSDF地图中,最后通过TSDF地图以及当前帧的位姿,预测(投影)出当前帧的深度图,该深度图用来和下一帧的点云计算下一阵的位姿。
深度学习相关:
1、cnn 基础架构哪些,cnn总体可以分为哪两类任务
卷积层(conv)+激活函数(如:relu)+池化层(pooling)+全连接(fc)
CNN特性:局部连接、权值共享、下采样,都是为了减少参数,提高训练速度。
2、l1 l2 loss 优缺点、原因、l1 l2正则化,优点,原因,如何在pytorch代码里面实现
L1损失:即平均绝对误差(MAE),L2损失:即均方误差(MSE)
L1正则化:即对权重矩阵的每个元素绝对值求和,L2正则化:即对权重矩阵的每个元素求平方和 优缺点:
L1损失函数:最小化绝对误差,因此L1损失对异常点有较好的适应更鲁棒,不可导,有多解,解的稳定性不好。
L2损失函数:最小化平方误差,因此L2损失对异常点敏感,L2损失函数会赋予异常点更大的损失值和梯度,调整网络参数向减小异常点误差的方向更新,因此容易造成训练的不稳定和发散。
3、交叉熵loss,代码,二分类问题
逻辑logistic回归问题,引入激活函数sigmoid将线性方程转化为非线性方程,然后利用极大似然估计(Maximize
Likelihood Estimation)方法求解二分类问题。
4/ 多loss加和,如何实现自适应权重调节
权重调节在训练过程中能根据不同任务学习的阶段,学习的难易程度,甚至是学习效果动态来调整的。
也可以使用Gradnorm也就是梯度标准化的方式自适应平衡多个任务之间的loss\
transformer
transformer是指图神经网络,基于编解码和注意力的模型,解决了传统RNN的训练慢的特点
。
6、目前的模型是在什么上面跑的,tensorRT搞没搞过,有没有用c++载入过模型,模型太大怎么办,网络结构怎么调
7、轻量级网络架构哪些,mobilenet知不知道
MobileNet利用深度可分离卷积的使用,减少了参数数量和计算量, 引入两个超参数——Width
Multiplier和Resolution Multiplier
slam相关:
1、E矩阵 F矩阵,全称,至少需要几对点来计算,自由度、矩阵的秩
E矩阵:Essential Matrix 本质矩阵 秩为3 有5个自由度,至少需要5对点求解 F矩阵:Fundemental Matrix
基本矩阵 秩为2 至少需要4对点求解
2、什么情况下无法正确计算E矩阵,为什么
3、ransac,ransac特殊形式
RANSAC是“RANdom SAmple Consensus(随机抽样一致)”
RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
RANSAC通过反复选择数据中的一组随机子集来达成目标
4、pnp问题,至少需要几对点,为什么很少的点就可以计算了,还需要那么多匹配对
PnP(Perspective-n-Point)是求解3D到2D点的对应方法。它描述了当知道n个3D空间点及其位置,如何估计相机的位姿。
如果两张图像中的一张特征点3D位置已知,那么至少需要3个点对(以及至少一个额外验证点验证结果)就可以计算相机的运动。
PnP求解方法:DLT直接线性变换、P3P三对点估计位姿、EPnP(Efficient Pnp)、BA(Bundle Adjustment)光速法平差
其他匹配对用于验证得到一个合理的解
5、orbslam相关,orbslam流程,fast关键点、brief描述子、旋转不变性、怎么实现三角化
ORB SLAM流程:输入:摄像头(图像 + 时间码),输出:轨迹(每帧图像对应相机位姿) + 地图(关键帧 + Map point)
FAST关键点:属于计算特别快的一种特征点检测方法,之所以快是因为这种方法只是只是找到了关键点,并没有相应的描述子。
ORB特征:该方法改进了FAST检测不具有方向性的问题,并且采用速度极快的二进制描述子BRIEF,使整个图像特征的提取速度大大加快。
旋转不变性:在数学里,给予一个定义于内积空间的函数,假若对于任意旋转,函数的参数值可能会改变,但是函数的数值仍旧保持不变,则称此性质为旋转不变性
三角化:参考三角量测,已知相机参数和匹配点恢复三维点的坐标
三角化实现过程(德劳内三角化):从两张图像中提取匹配点对,根据两张图像的匹配点对,计算两帧图像的相对位姿,然后根据2D匹配点对和两帧的相对位姿R和t,求这些匹配点对对应的空间3D点坐标。
6、5的1/3次方怎么算,只有加减乘除
7、非线性优化、牛顿法、高斯牛顿法、区别,各是几阶的,本质区别
本质都是基于梯度下降法。 高斯牛顿和牛顿法的区别在于牛顿法依赖于Hessen矩阵非奇异,收敛较快;高斯牛顿是依赖二阶项的jacobian
解决了Hessen非奇异的问题,收敛相对慢。
LM针对高斯牛顿法的奇异性,增加了拉格朗日因子,保证了等式左边即HX始终正定,表现是使用一个因子拟合牛顿和高斯牛顿法。
Case 2
一面
1、简历中的项目相关问题,项目思想,展开讨论
2、选一个最熟悉的开源框架讲讲
3、当你写BA的时候, 如果发现问题,你一般怎么debug
BA(光束平差法)优化就是使用三维点进行投影找出最合适的相机位姿(旋转矩阵和平移矩阵)或:迭代调整光束,使其满足约束平面。
BA优化:把一路上的所有坐标点与位姿整体放在一起作为自变量进行非线性优化(最小二乘优化方法)
4、ORBSLAM还有什么改进的空间除了回环检测之外,orbslam怎么消除累计误差
可以从回环检测,地图重用和重定位三个方面改进。 使用BA优化,比ICP或者光度和深度误差最小方法的更加精确。
针对无法建图的情况,提出了一个轻量级的定位模式 ,能够更加有效的重用地图。
二面
1、项目中的code
2、讲一下lambda函数
lambda函数也叫匿名函数,lambda语句构建的其实是一个函数对象
3、虚函数表
4、两道代码题,一道是用类来实现一个计时器。另一道是动态规划题。
5、根据编程中的知识点问一些问题,类的生存周期,类的内存储存在哪?
类的对象存储在堆栈上面。除了全局常量区和静态存储区。
类的生命周期分为静态生存周期和动态生存周期,静态生存周期是指从对象定义的那一刻到程序结束才销毁,动态生存周期是指从对象定义的那一刻到函数或语句块结束时销毁。
Case 3
1、自我介绍
2、写一个梯度下降法求解a^2=b的算法题
3、简历中的项目相关问题,尤其探讨了深度学习相关的知识在检测和分割领域的应用
4、ORB-SLAM2单目的初始化,VINS-MONO的初始化。主要涉及到一些基础知识的问答
VINS初始化包括计算视觉和IMU之间的几何约束并对齐、利用旋转约束估计外参数旋转和陀螺仪的偏置、初始化速度、重力和尺度因子、优化重力向量、将相机坐标系对齐世界坐标系5、光流原理,LK光流特征
Case 4
1、详细讲一下cartographer的流程
先输入传感器的数据,包括里程计数据、IMU数据、激光点云数据和位姿数据等,跟踪IMU的变化,将激光点云数据进行自适应voxel滤波,然后根据上一步预测的位姿构建本地局部SLAM地图(方法是利用点云匹配并构建submap)最后利用第一步的位姿数据在新的后台线程上构建全局SLAM地图,并利用光束平差法进行优化。
2、在无人机上跑的时候计算平台是什么样的,carto在上面跑的时候的资源占用
3、你的3DSLAM主要用在什么上面
4、在无人机上做和在车上做有什么区别
5、简历上说熟悉loam,lego-loam,说说loam和lego-loam的区别
lego-loam与loam相比,更改了特征点的提取形式,添加了后端优化,且更为轻量。
lego-loam核心部分:分割模块、特征提取、雷达里程计模块、雷达建图模块
1.分割模块通过对一帧的点云重投影到图像中,进行地面分割,非地面点被分割出来;
2.特征提取模块基于分割后的点使用和LOAM一样的方法提取边缘点和平面点;
3.雷达里程计模块基于提取的特征点构建scan-to-scan约束关系,使用两次LM优化,得到姿态变换矩阵;
4.雷达建图模块将得到的特征点进一步处理,构建scan-to-map的约束关系,构建全局地图。
6、两步L-M和loam的一步有什么区别
7、你说lego-loam回环比较简单,你有了解过什么更好的吗
8、IMU和激光融合做的算法有没有了解
融合算法主要有两种,基于滤波器的融合方法和基于图优化的融合方法
基于滤波器的方法主要使用EKF扩展卡尔曼滤波器,在IMU和激光数据融合中,可以先用IMU的加速度和角速度数据来推算当前时刻的位移、速度和旋转监督,然后通过激光的位姿数据来对这些值进行校正。
基于图优化的融合方法参考LIOSAM的因子图优化方法,该方法分两步完成,先通过点云特征计算出相对位姿,然后利用相对位姿、IMU与积分和GPS做融合。相对于直接一步做紧耦合提高了效率。
9、IMU和激光雷达紧耦合的开源项目有没有了解
10、IMU预积分有没有了解
IMU预积分主要解决IMU和图像频率不一致的问题,相邻两个图像帧之间的IMU信息需要积分从而与视觉信息对齐。
IMU预积分的思路就是先把每次优化迭代时不变的项提出来,减小每次重新积分的工作量。
11、激光雷达怎么判断适合你的使用的,即选型,你会看那些参数
12、假如让你用EKF做IMU和激光雷达的融合怎么做
使用激光点云数据构建三维地图,
雷达坐标和陀螺仪坐标通过静态TF关系连接到base_link,利用robot_pose_ekf功能包实现激光数据和IMU的融合,得到一个新的里程计坐标odom_combined,然后通过例如gmapping的算法连接到map坐标系下
13、简历上说熟悉非线性优化G-N/L-M,平时主要用那种
14、调的库还是自己写的
15、L-M跟G-N有什么区别
对于以及一阶梯度下降公式,(H+λI)△x=b
当λ= 0时,L-M等于G-N;
当λ= ∞时,L-M等于一阶梯度下降
L-M算法可以通过调整λ来调整下降的速率,如果下降的太快,使用较小的λ,如果下降的太慢,使用较大的λ
16、看你也有用ceres库,huber是怎么设置的
Ceres核函数Huber
17、说说项目,EKF怎么调参的,调完有什么感想、心得
EKF调参面向预测函数和更新函数,A、B、H根据模型来确定,主要是调Q和R两个参数,来决定数据是更倾向于预测值还是观测值。
测量噪声大,R(测量值的不确定度)需要设置的就较大;模型不准确,Q(其他外接的干扰)需要增大。P(系统状态的不确定度)变大也会导致卡尔曼增益变大,从而使得估计值倾向于测量值。
Q/R决定了滤波器的稳态频率响应。
心得:与互补滤波相比,卡尔曼的权重值是动态调整的,所以有更好的收敛性,更好的噪声抑制性。
Case 5
一面
1、简历中的项目相关问题
2、光流原理
LK光流法原理:
光流,简单说也就是画面移动过程中,图像上每个像素的x,y位移量,比如第t帧的时候A点的位置是(x1, y1),那么我们在第t+1帧的时候再找到A点,假如它的位置是(x2,y2),那么我们就可以确定A点的运动了。
三个假设:亮度恒定(灰度不变)、小运动、空间一致
灰度不变性:像素的灰度值不会随着帧的跟踪改变。
时间持续性:时间的变化不会引起像素位置的剧烈变化。
空间一致性:场景中相同表面的相邻点具有相似的运动,并且其投影到图像平面上的距离也比较近。
高斯牛顿法——光流更加精确
LK光流基本假设:光流在像素点的邻域是一个常数,然后使用最小二乘法对邻域中的所有像素点求解基本的光流方程。
光流第二种方法:建立图像金字塔、根据金字塔逐层计算光流
3、矩阵求逆的复杂度?矩阵分解有哪些方法,复杂度是多少?工程上哪种方法最通用,为什么?
矩阵分解得常见方法:Cholesky、QR、LU
Cholesky分解主要是将一个正定的矩阵分解为对称的上下矩阵的乘积
QR分解主要是将任何一个实数方阵分解为Q正交矩阵和R上三角矩阵
LU分解主要是将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积
4、H和F矩阵的自由度。
5、IMU预积分了解吗?
6、MLE和MAP的关系。
MLE是最大似然估计,在估计模型的参数θ时,我们的依据是百分之百来自于观测数据的,也就是通过观测数据去预测参数θ,仅仅依赖于观测数据(样本)。
MAP是最大后验估计,在估计模型的参数θ时,我们的依据不只是手中的观测数据,还要来自于一个先验。。
数据量非常非常多时,MAP的解趋于MLE的解
二面
1、三道代码题,hashmap,动态规划相关。
Hash表也叫散列表,哈希表的主干是Entry数组,每一个Entry包含一个key-value键值对
数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的
HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值时,将链表转换为红黑树,这样大大减少了查找时间。
2、C++11如何有效防止内存泄露使用智能指针解决内存泄漏问题,确保在离开指针所作用域时,自动正确的销毁动态分配的对象,防止内存泄漏。
3、智能指针,weak_ptr讲一下
weak_ptr相对于shared_ptr来说,避免了两个对象相互使用一个shared_ptr成员变量指向对方,造成循环引用,使引用计数失效,从而导致内存泄漏。
特点:1.weak_ptr 通常情况下需要跟 shared_ptr 一起使用
2.构造和析构时引用计数不增加也不会减少
3.专门用来解决两个类中shared_ptr相互引用而导致的内存泄露问题
4、array和数组有什么区别?
5、C++如何高管理动态内存(关于这个问题我真的很迷)
C语言中采用从堆上申请空间,并在生命周期结束后释放C++申请和释放单个元素的空间时,使用new和delete来进行内存管理,底层是使用malloc和free来实现的
三面
1、简历中的项目相关问题。
2、opencv、eigen、PCL库了解吗?PCL库里bug挺多,你说说有哪些bug。
3、ORBSLAM的代码有哪些需要改进的地方?
4、BA中,海塞矩阵的求逆有哪些可以加速的方法,除了边缘化和GPU,有哪些数值计算的方式能够加速?
Hessian矩阵的逆计算复杂,可以采用拟牛顿法,该方法不需要二阶导数的信息,,所以有时比牛顿法更为有效。
5、ceres库的自动求解雅克比的原理?
eres 自动求导的核心是运算符的重载与Ceres自有的Jet变量(可微函数f的泰勒展开式中的前k项)。
6、ROS中,node属于多进程,如何把两个node放在一个进程中?
ROS1中写成一个小节点(nodelet),编译的时候会自动编译为动态链接库,程序运行时会被动态加载到容器进程中。
Case 6
一面
1、长廊问题怎么办?
SLAM算法在长廊环境下或动态变化大的环境中容易发生定位丢失,可以将视觉SLAM和激光SLAM融合。
2、为什要选用yolo这个模型?
YOLO算法的最大优点就是速度极快,每秒可处理45帧,也能够理解一般的对象表示。
3、动态SLAM的思路?与基础矩阵分割相比有什么区别?什么是三角剖分?与深度学习方法相比的优势?
解决方法大致可以分为两大类:
1、是使用多视图几何或者其他传统方法检测外点或者残差较大的动态区域,
2、是使用深度学习的方法,包括目标检测和实例分割的一些网络,将一些先验的运动的物体分割出来进行剔除。
4、霍夫变换的原理?单应矩阵为什么只有8个自由度?
根据数学对偶性原理提出了检测图像直线的方法,主要应用于模式识别领域中对二值图像进行直线检测。
单应矩阵3*3 9个变量,最大自由度为9,但是这九个变量为纯在一个尺度问题,所以是八个自由度
5、RANSAC
6、ORBSLAM的初始化步骤
创建了ORB词袋的对象、关键帧的数据库、地图对象、以及两个显示窗口
初始化Tracking对象、Local Mapping对象、Loop Closing对象、以及初始化显示窗口,开启线程显示图像和地图点
7、怎么用H的稀疏性加速?
采用舒尔消元的方法,也叫Marginalization边缘化
8、滑动窗口中的边缘化?
边缘化作用:根据新测量信息和旧测量信息构建新的系统。合理移除旧的变量,边缘化先验残差。
9、R的性质,李群
群是指一种集合+运算的代数结构。李群是指具有连续光滑性质的群。
R表示相机的旋转,旋转矩阵是正交阵。
二面
1、纯代码面,手撕两道编程题。记得其中一道与flood fill类似。
2、git的基本原理以及相关操作
3、还有一些C++基本知识
1、PnP求解最少需要几个点?(4个,3个求解,1个验证)只有一个点的自由度是多少?两个点呢?
2、二维码恢复相对位置,六个自由度,哪个自由度上对噪声比较敏感?
采用QR码定位的方案,识别QRLocation后面的小数,作为二维码的边长,然后识别二维码左右两条边沿,并根据二维码的四个顶点坐标计算alpha、beta和z0。
3、怎么用EKF融合多传感器信息?
面向无人机的EKF多传感器信息融合应用主要是磁力计数据融合、航向融合、空速融合以及位置和速度的融合
主要步骤是根据第一个测量值对当前状态进行初始化(加上时间的更新),
然后根据当下的数据预测未来,并对于下一个时间周期内的数据进行修正
4、单目视觉如何测量深度?
采用三角量测的方法,依据的是同一个空间点在不同时刻的投影到相机成像平面上的位置来确定这两个时刻时这个点的深度。
5、相机内参K的单位。
dx,dy的单位是“mm/pixel”。
f的单位是mm。
fx = f/dx, fy = f/dy,所以他们的单位是pixel。
图像坐标系(归一化平面)和相机坐标系的单位是mm。
像素坐标系的单位是pixel。
6、相机内外参数求解以及标定方法
相机内参数六个:1/dx、1/dy、r、u0、v0、f
相机外参数三个:三个轴的旋转参数分别为(ω、δ、 θ)
相机的畸变类型:径向畸变、切向畸变
求解方法:求解相机单应矩阵
相机标定是指将世界坐标系转换到相机EKF
标定方法:
1、打印一张棋盘格,把它贴在一个平面上,作为标定物。
2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
3、从照片中提取棋盘格角点。
4、估算理想无畸变的情况下,五个内参和六个外参。
5、应用最小二乘法估算实际存在径向畸变下的畸变系数。
6、极大似然法,优化估计,提升估计精度。
7、如何通过光流一致性剔除动态物体?
以LK光流法举例:根据光流三个假设中的运动一致性假设,通过光流法获取匹配的特征点对,并跟据匹配的特征点对计算基础矩阵。
然后通过基础矩阵和特征点计算特征点对应的极线,当特征点到极线的距离大于一定值,即判断为动态特征点。
Case 7
一面
1、简历中的项目相关问题,多传感器融合了解吗?
2、跑过哪些开源算法,是否做过对比,各有什么优劣?
3、对于光照明暗变化、动态场景,视觉SLAM如何去解决?
针对高动态物体:在线实时过滤
针对低动态物体:一次SLAM过程结束后,后处理方式过滤
针对半静态物体:全生命周期建图
4、视觉SLAM的行业应用有哪些,阐述一下语义SLAM的未来应用优势与劣势?
二面
1、做了哪些项目,问得非常细,会抠项目的细节问。
2、你做的项目未来还有什么改进点?
3、一道编程题,位运算相关。
Case 8
一面
1、简历中的项目相关问题
2、ORBSLAM的哪个部分最耗时?后端H矩阵求解的算法复杂度是多少?如何去加速后端求解?
描述符计算的过程最耗时,需要选择图像作为关键帧。
可以采用pthread多线程加速v-slam场景
3、如何求解线性方程Ax=b?SVD和QR分解哪个更快?
求解上述方程可以采用非线性优化的方法,采用Cholesky或者是SVD或者是QR分解求最小二乘解
SVD是最可靠的分解法,但是计算复杂度比QR高
二面
1、ORBSLAM怎么克服尺度漂移问题?回环原理讲一下,要估计哪些量?
在pose-graph之后进行full BA优化,回环检测采用基于词典的特征描述子集合方案,通过检测关键帧组来检测闭环的候选关键帧。该方案是指找到与当前帧4相似的关键帧1,从1直接估计4的位姿,而不是1234这个过程,减少了误差传递。回环校正的同时也要校正路标点坐标
2、做了一道题,嵌入式编程相关,设计位运算。
3、嵌入式方面,DRAM和SRAM的区别,速度差多少?
4、因为项目用了TX2,问到TX2有哪些模块?