-NeoZng[neozng1@hnu.edu.cn]
笔者目前大三,因为参加比赛做计算机视觉相关的工作,一直想去旷视(之前没有任何实习经历),后来21年十月份机缘巧合下(同时也是头铁)投了腾讯,没想到还真过了两轮,结果最后被刷了,还是心有不甘.不过就单单三次的面试经历也让我学到了很多东西,在此按照时间顺序分享如下。
面试之前
投了两周之后才收到HR的电话,最开始投的是TEG的RoboticX,HR告诉我我的简历一直在简历池里,可能是那个部门的HR没怎么看,问我是否愿意参加大数据部门视频分析的面试。我简单问了一下大数据的工作,就答应了(还能拒绝吗)。随后就把面试时间约在下周。
说起来你可能不信,我是正式收到面试通知的时候才开始准备,去看面经之类的东西,顺便复习一下数据结构。还专门买了一本《拉布拉东算法小抄》,没事的时候就翻翻,结果一面的时候算法题直接翻车了(下面会再提到)
好家伙,在牛客,csdn,leetcode上找了几个面经一看可难死我了,面个计算机视觉算法工程师还要问操作系统和数据库(我就大概翻了一遍CSAPP,学了一丢丢的sql),给我紧张的花了好几个消失在那复习linux的基础知识。leetcode和洛谷上各找了几道常考的算法题做了做也就过去了。
cv方向的我之前主要学习目标检测几个基本框架都算比较清楚也简单写过改过一些框架,觉得没必要复习也没再看了。
一面
面试前特意借了个空教室,提早半小时就进去等着面试开始了。腾讯面试会提前两到三天给你简历里填的邮箱发一封邮件,问你是否确认面试的预约,然后会议号(一面用腾讯会议)也是随着邮件一起发过来的。
面试的环节大概分成四个部分:
1.自我介绍+项目介绍
自我介绍我也没有特别准备,就按照惯例说了自己的学校和家乡,目前大几,为啥要来投腾讯的实习,自己有什么特点。时间控制在一分钟就好,听学长说面试官基本上会在你自我介绍的时候把你的简历看一遍,所以简历上有的东西就没必要说了。简历的制作非常重要,在最后我还会特别提一下。介绍完以后,面试官就会问你的项目经历。我在简历里写了两个项目,一个是参加RoboMaster的比赛,另一个是学校的SIT计划,做的是slam+传感器处理。
因为投的cv相关的,肯定问的是第一个项目。在介绍项目的时候最好列点来,条理一定要清晰。我是先说为什么参加这个项目,然后是项目中做了什么,有什么收获。重点必然是第二部分,在做什么里我也分列了三点。每讲完一个部分就接着说“下一点“ 或者 ”第x点是…“,一方面可以作为一个缓冲,另一方面也给别人清楚的结构,不然会觉得你的整个逻辑非常混乱。
2. 基础知识问答
介绍项目的时候,面试官就会从你的项目技术点引申一些问题,很多都是引导性的,所以在面试的时候你有意无意可以说一些自己比较熟悉的领域的技术点,面试官很有可能会顺着你的话头往下问。特别注意,自己不会或者不熟悉的东西千万别在简历上写,简历上写的最好都是自己特别有把握的东西。
下面就凭着我自己的记忆大概罗列一下面试官问的问题,大家也可以看看自己答不答的上来,查缺补漏一下:
-
讲一下你项目里用的网络是怎么部署和训练的
收集数据集,根据数据特点设置数据增强,先跑通一次,随后根据val的结果尝试修改一些参数,再看看误检漏检目标有什么特点,增加数据或者用其他方法针对性解决一下。
-
你选择网络的时候考虑到什么问题
主要是部署的难度和网络速度,这个比赛的类别数量少不需要太高的mAP,对小目标的检测要求也没有那么高。针对我们使用的运算平台的特点最终该选择了nanodet作为推理模型,它是轻量模型中速度最快准确度最高的(说到这里,nanodet更新了plus版本!利用KD的标签分配策略用非常少的速度下降换来了average 7左右的涨点!)又修改了输入添加了slice层进一步提高速度以到达控制实时性。头部尝试了解耦头,效果没有更好,速度下降太多就没改。
-
部署平台是什么,用什么环境,怎么收集数据
部署框架使用的是ncnn(ncnn是腾讯优图的,这不得吹一下?),面向移动设备优化过的高性能推理框架,而且是c编写的,因为我们的程序是c++编写的,所有整合起来特别方便。部署环境是linux的ubuntu发行版,用的人多出现问题好解决。用工况相同的光线条件和工业相机拍摄图像然后手工标注。
-
linux用到什么程度,用什么ide?常用命令可以说一下吗
问到这个问题的时候其实有点慌,怕面试官问得更深,我就回答的也很保守:
主要是linux运行的时候系统占用小,release还可以直接把图形界面关掉,并且linux下配置环境会方便一些,也就是用一些基本的软件,没有深入学习内核的相关知识,大概懂一点文件系统和外设接口。ide用的是qt,跨平台比较方便,然后可以写一些图形界面方便调试。其他时候用的是vscode+cmake插件,不用手写makefile,cmake也就会基本的操作。常用的命令比如编译一些简单的文件命令行用gcc就行,创建文件touch,文件夹mkdir,删除rm…(到这里被面试官打断了)
来看看这里linux的基本命令和常用软件、ide吧:了解CV和RoboMaster视觉组(三)视觉组使用的软件NeoZng的博客-CSDN博客robomaster视觉组
-
接触过那些运算平台?用过云计算资源吗?
intel的nuc,还有淘宝上用nuc主板组装的工控主板,还有英伟达的jetson NX。stm官方提供了简单的cnn支持,也试了一下tflite的模型不过不太行。还用过k210,做点小项目。
云计算的话训练的时候会买机时,我们没有做太大的模型所以了解的并不是很多,不过有做过一个在线验证码识别的小程序。
-
知不知道当前的检测网络sota,为什么能达到sota
(当时真不知道检测的sota是啥。。只是一直听/看到ViT很猛,就猜是transformer)好像是基于transformer做的?用了多头自注意力机制,相当于是增强版的卷积操作,能够获得全局信息,但是同时计算量也大了很多,还有就是预训练的方法和数据量相比CNN的backbone也有很多修改,这个应该也有一定的关系。
-
讲下经典的Faster-RCNN的RPN网络结构,还有这个网络和之前的不同
(非常巧啊朋友们就在面试的前几天我刚好写了一篇RCNN家族的文章:(五)比赛中的CV算法(下1)目标检测算法:R-CNN家族当时我内心直呼稳了,直接看这篇文章吧我就不细说了)RPN替换了原本的selective search模块大大提升了整个算法的速度,第一次实现了真正的全网络模型,也算是某种程度的端到端了。还提出了anchor的概念,开了CNN中先验知识降低复杂度的先河。
-
faster rcnn是two-stage方法,介绍一些one-stage方法?
那就one-stage的开山之作yolo吧,还有早期常用的ssd,再比如现在的atss,fcos。
-
yolo的优缺点和大概结构
在当时最大的优点应该是第一个端到端的网络,并且它的速度比两阶段要快很多,因为没有region proposal这个阶段,但这同样也是他的缺点,这会导致定位框不够准确。yolo的作者也做了误差分析,发现rcnn经常会出现背景分类错误,而yolo几乎没有这样的错误,主要错误就是上面说的。因为yolo每一个模块都是卷积,就最后接到全连接层上,所以感受野比只接收proposal region内的特征的RCNN要广,所以不会分错背景。
笔者写的yolo介绍:(五)比赛中的CV算法(下2)YOLO算法和one-stage检测器_NeoZng的博客-CSDN博客
-
你知道nms原理吗,有没有针对性什么改进方法?
一阶段的基本都需要做nms,因为默认密集检测器的每一个格点都要输出c+1个类别,很有可能临近的几个点会输出好几个重叠程度很高的框,所以要通过nms消除这些重复识别。(当时想了一会没想到nms有啥改进方法,然而就在面试前一个星期还看了soft nms和softer nms…)nms的改进方法不太了解。
-
你主要用什么语言开发
c++和python,matlab偶尔做点仿真
-
用过c++11的新特性吗,比如智能指针?
用过智能指针,基本不用怕内存泄漏很方便,还有for的迭代器用法和auto自动类型推导。lambda表达式也知道,但是用的比较少。
-
指针和引用有什么区别
指针保存的是对应类型变量的地址,而引用是这个变量的别名,他们在底层是一样的,都是直接通过访问内存地址来获取里面存储的内容。不过指针使用的时候要用*取里面的内容,而传引用的话直接当作变量用就可以了。如果声明一个引用变量,必须是声明即定义,而且不能重新把引用绑定到其他变量上。
-
对视频分析有没有什么了解
自己没做过这方面的内容,但是知道一些方法和概念,比如视频内容理解,动作捕捉和分析,目标跟踪。(其实实时目标检测和目标跟踪,分割这些都算)
-
有没有自己用PyTorch或者caffe等搭建过网络?
刚开始学的时候有用pytorch搭过一个lenet5,跟着网上的教程一起写了yolov3,但是最后没跑起来。然后就是改别人写好的网络。
-
focal loss知道吗,主要是解决什么问题?说一下原理
知道,主要解决的是难易样本不均衡的问题。因为一般正样本都是难样本,负样本也就是背景大部分时候都是比较容易区分的,所以顺带解决了难易样本不均匀的问题。原理大概是为loss增加了一个调制系数,让负样本拥有更小的权重,而正样本会获得更大的权重,这样在梯度回传的时候模型的学习就会倾向正样本,防止模型的训练被大量的负样本被淹没。
笔者之前写的Focal Loss:(五)比赛中的CV算法(下4)损失函数的改进(1)NeoZng的博客-CSDN博客cv算法
-
L1正则化和L2正则化的形式和他们的区别
就是正则化的参数不同,L1直接把每个参数以加在一起求模,再乘上一个调制参数λ。L2的话是平方以后再加在一起。不同之处就是L2的正则效果应该要比L1好一些,不过L1正则化经常可以降低模型的复杂度,因为他的约束会让参数很容易和参数搜索空间的坐标轴产生交点。(其实叫造成参数稀疏性)
-
除了刚刚说的还有没有什么防止过拟合的方法
还有dropout,提前停止训练,batch-norm,输入归一化
-
pytorch有没有用过什么优化器
用过adam,一般都是用优化,很少单单用sgd了。还有用过cosine学习率,warmup,lr衰减。
-
讲一下adam的原理
adam结合了rmprop和动量梯度下降,所以也就综合了两者的好处,momentum的话会减小震荡方向上的震荡幅度,加大朝着收敛方向的学习速度,rmprop相当于对学习率做了一个归一化,防止小的太小大的太大。
(五)比赛中的CV算法(上2)目标检测初步:神经网络及优化方法NeoZng的博客-CSDN博客用于cv、ml、机器人的线性代数 还是笔者写得文章,非常详细哦!还可以看看吴恩达的神经网络课程,算是最生动的了。
-
Python在你们的开发中用的多吗,用来干嘛
主要就是改网络的时候用,还有会用python写脚本来处理或者转换数据集。其他时候用的比较少,有时候会找一些开源的库或者自己写简单的小工具。
3.算法题
本来我以为就考数据结构里面的题,结果好家伙面试官让我写个nms,当时心态有点小崩因为之前从来没写过都是直接用写好的代码的。不过也没办法只能硬着头皮上了。当时就卡在IOU的计算上,想分几种情况考虑,但是仔细一想这情况也太多了,两个框的左右顺序需要分情况,长宽不同又要分情况,当时就绷不住了。面试官看我卡在那边迟迟没有动手往下继续写,就问我需不需要一点提示,我就说再让我想想。我只好问他能不能用库?他说你随便用,然后我直接用opencv构造了两个rect对象,然后IOU=rect1&rect2/rect1|rect2 …然后面试官说你不能这样啊,我说我一时间没想到(从开始想到用库已经过了大概10分钟,属实有点菜了),然后他就说我提示你一下用minmax函数。我好像恍然大悟,“哦~” 了一下,然而要开始敲的时候又卡住了,没想好怎么写,又过了5分钟面试官让我别写了。场面一度有些尴尬,不过也还好,我为了掩饰尴尬就说了句确实没写过,之前都复习数据结构和算法去了。面试官说考什么其实对于不同的面试官都不一样,看个人。接着就是下一个环节了
4.你提问的环节
其实我一开始没想到这个环节。。一时间有点不知道问什么,想到刚刚nms都没写出来不能再失误了,赶紧先问了个问题:请问您的部门主要工作是什么?在他回答的时候我就想哎呀有没有什么其他可以问的。面试官大概介绍了一下TEG事业群的大数据部门的情况,还有他们的日常工作,我又问了一下实习薪资,腾讯确实有钱啊,实习生日新300起还有餐补,交通补,异地有住宿补贴。最后问了一下腾讯那边实习的本科生多不多什么的。面试官应该也挺年轻的听声音和预期还有惯用词,估计研究生毕业就直接取腾讯了?(猜的,后面师兄说有时候一面是已经在腾讯实习的实习生orz)
还好最后问题不大,虽然那个蛋疼的nms没写出来但是面试官直接和我约下次面试时间了,说下周吧,过几天HR会再联系我,也会给我发邮件。还好前面的问题自我感觉回答得还不错,不然那个nms直接要鲨了我。后面又和面试官唠了几句其他的,一面就结束了。面试体验还是非常棒的,那个面试官属于倾听类型,不会质疑你,总觉得你啥都不懂,然后过程中也是说”ok“ ”挺好的“ ”学的不错“这样的词句,比较鼓励人,当时nms写不出来真的有点慌,面试官和我说没事,让我静下来慢慢想不着急时间充足。
面试时长也是超乎想象,本来以为最多15分钟30min顶天,没想最后退出腾讯会议的时候看了一眼直接1个小时13分钟,真的是说的口干舌燥。
二面下次再发,有点长需要重新整理一下。还有写简历的方式方法格式,也会在下次一起发。
版权声明:本文为博主作者:HNU跃鹿战队原创文章,版权归属原作者,如果侵权,请联系我们删除!