视觉算法岗秋招总结

前言

  • 本人最开始对基于自动驾驶的计算机视觉十分感兴趣,因此希望在读研期间做自动驾驶感知算法研究相关的工作,但是无奈事与愿违去做了与之毫不相关的计算机仿真。今年秋招的时候,还是希望做一些计算机视觉相关的工作,因此找的工作大多是计算机视觉算法工程师
  • 在找实习和秋招的过程中,其实还面了很多其他的公司,但是有的印象不是特别深刻了,这里主要举了自己印象比较深的例子,仅代表个人体验和情况,仅供参考。

个人的准备与经验

  • 因为课题不是计算机视觉相关,因此我在3月份的时候就开始刷题和准备找实习了。

数据结构和算法

  • 我主要是用C++的,因此强推C++ primer,工具一般的书,主要是全,可以随意查找,当时从头到尾浏览一遍也是必不可少的;此外,Essential C++Effective C++More Effective C++都是很好的书籍,建议尽量都看一看。
  • 刷题的话,我主要是在LeetCode上刷题,最开始没有定语言,所以用C#、java和C++都刷过,但是后来基本确定了用C++(还是希望自己的想法能和硬件结合并落地),一开始基本上都是不会,就不断地看题解,去理解,后来就慢慢能习惯了(知道了题目的大概套路)。我建议在刷题的过程中,一开始毫无头绪的时候可以看题解,但是同一类型的看了一些之后,就需要自己去尝试解决,但是对于很难的问题,比如说可能半天或者一天都没解决,那可以看看题解(不然太耽误时间了…)。这方面的书籍的话,推荐剑指offer编程珠玑,都是非常经典的书籍。
  • 看书的话,建议还是算法导论,看起来内容和公式都很多,但是不管看不看懂,个人认为还是需要有个大概的了解的,之后再刷题的时候遇到对应的算法,再去具体翻对应的章节,一遍看不懂就找博客看,然后再去看书上的描述,多看几遍一般没问题(我动态规划那一块好像看了10来遍…自己太菜了)。

CV相关

  • 最开始我找的是机器学习算法工程师,所以西瓜书看了两遍(有些公式也是一直没搞懂),后来发现虽然转到了cv,但是像LR、SVM、RF这些很常用的机器学习算法在视觉中应用的也非常广泛,对于面试也很有帮助,包括李航老师的统计学习方法,因为比较精简,我在面试之前也基本都是翻一翻。
  • CV方面的话,特别是CNN相关的,首推还是花书,很全面系统,虽然公式也是很多。
  • CV从分类、检测、识别到分割、跟踪、场景理解任务,都有很多经典的论文,建议先看一下经典论文,对一些有源码的,建议跑一下源码,看一下具体的代码结构和实现细节,稍微有一些经验之后,可以尝试去复现一些比较经典的模型结构或者论文,一方面可以让自己增加对论文的理解,另一方面也可以更熟悉编程语言和工具。数据集一开始可能有的比较难下载,可以从mnist或者cifar入手,之后再去跑Pascal VOC或者cityscapes等数据集。当然,如果在自己的项目中可以找到一些结合的点,还是建议自己实践一下,给自己定个小目标,比如说发一篇论文或者专利等,这样一方面可以对整个流程更加熟悉,从问题分析与模型构建,再到数据采集和处理、模型编程实现、调试、优化,到最后的成文,感觉对问题分析能力、代码能力和论文撰写能力都会有很大的提升,同时给自己定个目标也可以不断push自己。
  • 关于工具和开发流程的话,建议还是选一套自己最熟悉和喜欢的,我个人对于开发的话,平时调试和快速实现时,用python和matlab比较多,到最后需要部署或者上线的话,一般还是会转成C++;对于编程工具的话,jupyter notebooksublime textVS这些还是用的比较多的;对于常用库的话,python一些常用的数值分析库、opencv、mxnet、tensorflow这些都是比较常用的;关于编程的平台,个人还是建议在linux下开展。
  • 关于机器学习和计算机视觉方面的书籍,其实感觉还是多翻翻,可能是自己不是科班的,总觉得缺点什么,秋招准备过程中翻了:机器学习实战python机器学习tensorflow实战视觉机器学习20讲python计算机视觉编程caffe深度学习等,最后发现其实大多都很类似。

项目

  • 如果课题与工作方向相关,建议定个小目标,比如说完成某个任务,然后发一篇论文或者专利之类的;如果无关的话,建议可以去kaggle或者天池上找一些比赛做一下,但是重点在学习,自己做之后,再和别人的思路和方法做一些对比,丰富自己的项目经验。

实习面经

大疆

  • 这是我最开始投的公司,投的是机器学习算法工程师,但是因为自己当时还没有怎么准备秋招,笔试就挂了,所以之后又补了大量关于深度学习和CV相关的基础知识,发现以前真的是看的太粗浅了,很多细节都忽略了。

阿里(一面挂)

  • 阿里是当时找实习的时候投的,后来面试跪了,在秋招的时候笔试就没过2333。下面主要是实习的时候的面经。
  • LR了解吗?说一下它的loss function,使用极大似然估计说明一下loss function。
  • 说一下自己的天池的项目,用到的随机森林,说一下工作原理,怎么选择分支的节点的,loss function是什么,RF有哪些超参数需要调节,怎么选择RF中的样本特征,超参数怎么调节的,怎么将LSTM/RNN与RF中得到的特征进行结合的
  • 还有没有其他改进预测效果的思路
  • 结构化道路提取的过程中,怎么结合多种机器学习方法的?怎么处理图像噪声干扰的?
  • 体验:感觉很在意细节,主要还是希望面试者对做过的东西非常熟悉吧,当时我也很清楚自己没有达到他们的要求。。。

腾讯(一面挂)

  • 做一下自我简介(项目等)
  • 说一下结构化道路提取的整个过程,怎么将各种机器学习算法结合在一起的
  • 结构化道路提取时,图像噪声怎么去除的,同时怎么去除去除噪声的?有没有考虑使用边缘信息?
  • 写一道编程题:把一个二叉树按照中序遍历的方式转化为双链表。
  • 总结:这也是找实习的时候面试的,感觉项目方面回答的还不错,但是编程题没写出来,直接就挂了,后来秋招笔试也挂了。。

京东

  • 这也是找实习的时候面试的,连续面了2个半小时,猝不及防,也是挂了。
  • 感觉京东当时在C/C++基础方面问的比较多,面试官说项目比较缺人,希望面试通过的话可以立即入职输出。

一面

  • 自我介绍
  • 说一下C/C++中static的用法
  • 定义一个函数指针的数组
  • 做几道编程题:链表的顺序变换,贪心算法

二面

  • 说一下对机器学习的理解(宏观的理解)
  • 其实还有半监督学习,DL、RL等,(翻了我的博客)说一下对RL和auto-encoder的理解(我只是记过笔记,没有深入研究。。。)
  • 说一下你理解的随机森林
  • 推导一下LR的loss function
  • bagging的全称是什么,除了SGD,还有哪些迭代优化的方法?(牛顿法之类的,我又没答上来。。。

三面

  • 介绍hashmap,在用户和开发人员之间怎么去定义接口。
  • 定义并实现链表的基本操作。

地平线

  • 这是当时找实习的时候面的,后来给了转正offer,也算是秋招第一个offer吧,感激。
  • 推导KCF。
  • 推导SVM与BP,写一下LR的loss function。
  • 说一下自己对目标检测与跟踪这方面的理解,自己使用过哪些算法等。
  • 算法题:排序,找到数组中的重复数字。

秋招面经

roadstar.ai

  • 体验:问的问题很有深度,在写代码时,也会非常注重细节。

一面

  • 说一下KCF项目里面主要用的平台,有哪些硬件设备,自己做的这个部分的输入输出是什么,检测用的模型是什么。
  • 针对跟踪丢失的问题,目前有什么比较好的解决方案
  • 项目中多目标跟踪过程中主要算法流程和使用的方法,运动估计说一下。
  • 怎么去解决远场景中的物体的跟踪不准确、噪声较大的问题。
  • 多目标跟踪使用的算法平台。

二面

  • 说一下语义分割的key factor:我自己说了data augmentation、转置卷积、孔洞卷积、encoder-decoder,面试官说他做过这个,主要有以下几个key factor:data augmentation、batch size要设置得大一些(resize或者crop减少一张图像的大小)、OHEM(我自己用的focal loss,但是他说focal loss效果不明显)。
  • 说一下KCF
  • 说一下SVM、KKT条件。
  • 有什么想要了解的

三面四面

  • 这是两轮coding,主要也是dfs+剪枝相关的思路,包括双向链表类的实现、不使用虚函数实现多态等,感觉网上都找不到类似的例子。

依图科技

  • 体验:依图科技的面试真的很难。。。但是面试官给人的印象还是很好的。

一面

  • 主要是说项目相关的,因为面试官在cv方向做得稍微少一些,所以写了一道编程题,就是生成一个有规律的矩阵,如下图,就不做解释了。

    1 2 6 7
    3 5 8 11
    4 9 10 12

  • 分析了一个关于数论的题目,题目太长,有点记不太清了,反正最后没写出来。。

  • 项目的话,因为面试官没做过,所以问了指标相关的问题,然而我的项目里面并没有groundtruth。。。。感觉之后这一轮很迷,我好多都没答上来,竟然还过了。。。

二面

  • 项目,主要是多目标跟踪的流程介绍。
  • 视频分割加速的原因和做法(单帧估计的跳变以及速度较慢)
    8 写了2道编程题,有一道是找到一个树中的没有直接父子节点关系的一个集合,求满足这样条件的集合的节点和(每个节点都有一个值)的最大值,还有一道忘了。。。

三面

  • 手推一下kcf(还好提前看了一下。。。)
  • 说一下基于检测的多目标跟踪和kcf的一些异同点
  • 介绍一下其他的项目
  • 代码题:先说思路,再开始写,具体的题目给忘了。。。
  • 介绍一下自己做项目的时候主要用到的框架和开发环境等。
  • C++容器和时间复杂度、继承和多态、虚函数。
  • 说一下自己感兴趣的方向。

百度

一面

  • 说一下目标检测的基本框架,为什么RPN是有用的,one stage与two stage的区别。
  • 编程:字符串解析,写了3道题,感觉主要是考察hashmap和C++的使用。
  • 语义分割常用模型,语义分割应该怎么做才能提升效果。

二面

  • 2道编程题,也是字符串解析,主要还是hashmap+细心即可。
  • hashmap在设计和使用的过程中需要注意些什么。
  • 推导一下?卡尔曼滤波(项目中用到的)和SVM,说一下SVM中对偶问题和KKT条件。

三面

  • 这一面主要是说一下宏观的东西,从自动驾驶的方案到自己做过的一些项目,自己负责的主要部分,都说的比较多,感觉面试官主要还是想知道自己有没有负责过完整的项目。

美团

一面

  • 说一下语义分割的基本模型,然后写了2道算法题,感觉面试官对语义分割不太了解,可能他更偏向于自动驾驶的定位方向吧,所以没有问太多时间。

二面

  • 推导KCF,说一下匈牙利算法是怎么匹配的,写了1道编程题,数组相关的。

三面

  • 手写连通区域分析算法,写完之后问有没有改进方法,我没有答上来(之前觉得两遍扫描法是最优解来着)。
  • 说一下多目标跟踪在误匹配、跟丢等异常情况下的处理。

海康

  • 海康总共就一轮技术面试,没想到比较幸运,第二天又加面了一轮。

一面

  • 语义分割模型,说一下fcn、segnet、unet、deeplab。
  • 矩形IOU计算,任意旋转的矩形的IOU计算(这个当时没有想出来)。

加面

  • 主要就是偏宏观的东西,自己做过的项目现在重新做,有什么可以改进的地方,自己之前做过的没在简历上写的东西等。

虹软

一面

  • 各种逻辑题和代码题,代码主要是堆栈之类的使用。

二面

  • 推导SVM。
  • 说一下RCNN流派物体检测,训练方法以及一些细节。
  • deeplab系列都介绍一下。
  • 多目标跟踪中针对异常情况的解决方案。
  • 项目中多线程的模块设计方案。

图森

总结

  • 做过的东西一定要非常清楚,从公式到优缺点,到改进方案等。
  • 简历很重要,一定要花心思去做,可以找靠谱的师兄师姐帮忙把关。
  • 千万不能浮躁,很多算法我第一遍没看懂,后来多看几遍好像也都差不多理解了(当然也都是一些比较常用的算法)。
  • 自己最心仪的公司一定不要贸然去面试,一定要做好充足的准备,可以先拿不太想去的公司练练手(虽然好像有些不厚道)。
  • 基础知识很重要,基本知识的公式推导和概念一定要知道,常用的模型及其优缺点要了解。
  • 建议在准备秋招的时候多看看一些新的比较好的论文,对一些前沿性的工作要有一些了解,有些面试官如果对你很感兴趣,会问的比较多,在简历上的东西已经十分熟悉的情况下(保证深度),自己的知识体系也要尽量广一些。