双非自学!我上岸了,分享下踩过的坑(感知与融合岗)
点击下方卡片,关注“自动驾驶之心”公众号
点击进入→自动驾驶之心【求职】交流群
个人背景
本硕双非院校(考研失利),无名校背景。本科电子信息工程(武汉),硕士计算机技术(上海)。曾经拿过学校的智能汽车竞赛一等奖,参赛过程中受益良多,我想对智能汽车的兴趣就是从那时候开始的。
秋招情况
最终拿到了几个offer,有机器人公司,激光雷达,自动驾驶的公司。
方向选择和自学历程
选择自动驾驶感知的方向也是机缘巧合。一方面参加过学校智能汽车的竞赛,另一方面也参加了两轮平衡车的大创项目。计算机专业的基础知识都已掌握,C/C++编程,数据结构,计算机网络,操作系统,计算机组成原理等。
基础知识储备
C/C++:又将C/C++的知识过了一遍,敲完《C++ Primer Plus》,同时B站上看一些C++的课程巩固,最后从github上跟着做几个小项目。 Python:看网课,然后把《Python编程从入门到实践》敲了一遍,有了C++的基础,Python学习起来还是非常快的。然后就是学习一些Linux的知识,可以在Linux下进行C/C++和Python的编程。 机器学习相关:周志华的《机器学习》,当时抱着啃了大概两个月,手推公式,不懂得问下数学专业的同学,像支持向量机就是看了不少视频,做笔记推导才整明白。随后敲完了《机器学习实战》,对使用机器学习进行数据分析有了一定的理解与实践。又参加了阿里的天池竞赛。 深度学习相关:主要学习的Pytorch,对Tensorflow框架的定位是读懂相关代码即可,敲完了《动手学深度学习》和《Pytorch实战》收获还是非常多的,书中有很多小的Demo,不仅有CV的也有NLP的。即可以学习到相应的知识又可以后看到Inference后的结果,还是非常有成就感的。
专业知识学习与梳理
计算机视觉:做CV相关的同学还是特别多的,我就简单分享下个人的学习过程。
1)传统方式:学习图像的基本知识,灰度化,阈值化,形态学处理,边缘检测等等,使用OpenCV进行编程实现。做了几个Demo(银行卡识别,车位检测,车牌检测等等)。 2)深度学习方式:从最经典的卷积神经网络AlexNet,VGG等开始学习,逐层分析推导特征图,编程实现。然后学习目标检测的几个系列,one-stage和two-stage,anchor-base和anchor-free的检测方式,看了大量的论文。然后又看了不少语义分割的工作。比较经典的网络都读过源码并复现过,B站上也有很多大神讲解源码。
3D点云相关:首先学习的是点云相关的基础知识(点云滤波,八叉树,点云分割、拟合、聚类等),然后读3D目标检测的论文,从经典的PointNet网络到目前比较新的工作。其中PointPillars和CenterPoint网络好像是目前自动驾驶中应用的比较多的。基于Point,Pillar,Voxel等都有很多非常棒的论文,网上也有很多公开的数据集,最著名的就是KITTI了。
SLAM:分激光SLAM和视觉SLAM。我学习的是视觉SLAM。高翔博士的《视觉SLAM十四讲》是很棒的一本书,可以比较系统的入门学习。从视觉里程计到后端,还有配套的代码。像VINS-Fusion,ORB-SLAM系列的代码都要读一读,跑一遍。后面多传感器融合也用到很多SLAM中的知识。
ROS系统:古月居的课程很棒,熟悉节点间的通信方式,话题通信(发布者/订阅者),服务通信(C/S),掌握ROS命令行工具,还有就是rviz的使用,这块我学习的也不是很深入,只学了目前经常用到的东西。
多传感器融合:这一块涉及的东西比较多,网上资料也比较少,就多说一下。首先要了解的就是Lidar,Radar,Camera,IMU等传感器的特性。例如相机虽然对车道线,红绿灯等交通标识识别效果好,但视觉测距,测速性能不如激光雷达。然后学习各个传感器之间的时空同步和数据融合。同步又分时间同步和空间同步,时间同步又分软同步和硬同步,不同传感器之间的的空间同步也比较复杂,可以用运动补偿,帧间点云匹配ICP估计,里程计辅助等方式。个人感觉前融合阶段最重要的就是时空同步(激光雷达和相机的数据是要在同一时间戳下的同一物体)。对于传感器的数据融合有传统方式(卡尔曼滤波),也有基于深度学习的方式。除此之外,又简单学习了传感器之间的标定。每个知识点里细节都很多,这部分还有太多东西需要去学习了。最重要的还是要结合代码。
实习经历
在一家自动驾驶公司做自动泊车方面的算法实习生。参与泊车算法的研发,例如车位检测,FreeSpace检测,BEV下的工作等。这段实习经历让我得到了快速的提升,不在局限于一些理论知识,真正了解了针对自动驾驶场景下一些问题,使用什么方法能够得到较好的结果,然后再从一些论文中找到idea加以改进。真的非常感谢leader对我的指导。
秋招历程分享
个人秋招准备的是自动驾驶或机器人等行业的算法工程师(偏感知)。投递的公司类型:1、车企,2、机器人(包括工业上的),3、激光雷达公司,4、自动驾驶方案供应商(做ADAS,域控制器等),5、车联网(车路协同等),6、做视觉图像的公司。
8月17日开始第一份简历的投递,一共做了20多场笔试,面试也有20多场。首先刷Leecode,起码最高频的前100道题刷完,主要针对笔试,面试的时候也有让现场手撕的。
然后就是背C++/Python,Pytorch,深度学习,SLAM等方面的知识点。网上有大量的资料可以借鉴,就不多说了。
项目很重要,一定要非常熟悉,熟悉到一说到某一模块的功能可以想到相关代码的大概样子,很多问题会围绕项目展开,比如面试官会说这个问题能用凸包等更简单的方式解决吗?为什么要用深度学习?内参怎么计算的?单目怎么获取深度信息?精度怎样?SLAM后端边缘化?
也有一些开放性的问题需要平时的积累和灵活运用了,例如一个圆圈上的一些点知道各点和圆心坐标怎么较好的从12点钟位置进行顺时针排序(叉乘)。
当然也有一些问题没有答上来,像ICP的数据结构怎么实现的,ICP的原理看过很多遍,公式也推导过,但是没有具体的进行代码实现,还有一些神经网络结构,看过好多遍,但是问到激活函数的公式却想不起来,也认识到了自己的不足之处。
还有很多其他面试问题因为篇幅原因就不过多介绍了。
比较深刻的是有一场技术面试(深度学习+激光雷达),两位面试官,时间大概40多分钟,那是刚开始面试,没有经验也没准备好,回答的并不理想,比较受挫(后续接到技术二面通知了)。打了几把游戏后思考自己确实是有些地方没有掌握好,所做的不应该是为上一场面试表现不好而沮丧,要好好的查漏补缺,会的东西一定好好展现给面试官。之后的面试慢慢多了起来,有时一天三场技术面。不管通过与否,心态上的起伏很小了,自己已经把所学展现了。
总之,秋招过后感觉个人成长很多,回顾自己所学,展现给面试官,最后也找到了理想工作。
秋招感悟和写给转行人和待入行人的一些话
秋招历程感悟
秋招应该尽早投简历,不少同学因为投递较晚,虽然自身也很优秀但已经没有hc了。基本上没有所有东西都准备好了再投简历面试的情况,都是以战养战的策略,不断的面试,总结自己的不足,在下一场面试更好的展现自我。
面试过程中有肯定,当然也会有否定。不要因为一时的夸赞而骄傲,更不要因为一时的批评而否定自我。调整好心态迎接每一场面试。此外,在整个过程中,我感觉最重要的是自学能力。很多东西都是要靠自学的,学理论,抠代码,慢慢积累。
给同一专业、即将选择这行或者打算转行的同学的建议
我是一开始的目标职位就是算法工程师,比较明确,虽然很卷,但也是义无反顾,想做自己感兴趣的东西。
我学习的东西都是自己找的路线学习的,因为没有专业的指导,都是自己慢慢摸索和实践的,知识范围会比较广,但侧重的是视觉感知,像激光雷达,SLAM等都是发散学习的,并与视觉结合,虽然不确定按这个路线学习对不对,但是自己也是真真切切的学到东西了,在感知外,对建图定位也有了一些了解,整个自动驾驶的链路和基础学习框架已经在脑海中形成。
自动驾驶方向很多,感知,决策,规划,控制等。最后还是希望大家找准方向,沉下心来,接下来会有一段无人问津,艰苦奋斗的时光,夜色难免黑凉,前行必有曙光。
这篇面经分享出来也是希望大家能少走些弯路,祝大家都能找到理想的工作。
自动驾驶之心求职交流群
往期回顾
卷完了!分享下我的秋招面经(投递近50家自动驾驶与机器人公司)
【知识星球】内推公司汇总
【自动驾驶之心】全栈技术交流群