Hello 大家好,我是棒棒鸡,秋招已上岸某头部科技公司算法工程师。
24 届毕业的同学们马上也要开始投简历找实习了,不少同学觉得自己现在没有顶会不敢投算法岗,这里我就从去年自己找实习的经历来跟大家分享一下我的一些看法以及一些面经,希望能帮到大家少走弯路,早日拿到自己心仪的 offer。
那先简单介绍一下我的背景:
- 学历:某双非本(自动化,绩点中上),保研至某双非院校(计科)
- 本科两届 RoboMaster 竞赛国家一等奖以及另外一个国际性赛事的国家一等奖
- 研究生做的方向是 2d 目标检测以及弱监督学习,拥有过两段校企合作的项目经历(一个是目标检测项目、一个是人像抠图项目)
- 科研方面,投简历之前有一篇 A 类顶会 CVPR 的二作,一篇 C 类会议论文在投
- 我从三月中旬开始面试到四月下旬签约最终 offer,面了 13 家中大厂,挂了 6 家,拿了 6 家 offer(字节跳动、上海 AI Lab、地平线等),五五开
下面是正文:关于找实习,首先有几点是需要明确的。
第一个就是应聘的方向。在准备投简历之前,我曾有过一段时间的纠结以后是要走算法方向还是走 C++ 后端方向,因此在这过程中也考虑了后端的实习机会,有空的时候我还跟着网上的资料学习了一些 C++ 手写服务器的教程,后来觉得后端需要准备的东西太多太繁琐了,而且找到后端方向的实习导师可能也不会让我们去,索性就 all in 算法了。那时我做了两段 AI 相关的项目,并且对一些基础深度学习知识也还算了解,所以还是有些底气的。大伙们可以根据自身的情况来决定选择什么方向,从面试官问的问题来看,给我的感觉是他们对工程能力的需求大于对顶会论文的需求,除非是纯做 research 的岗位,因此没有顶会论文的同学也不用怕,还是很有机会的。
第二点就是刷题。笔试面试都会出算法题,所以 Leetcode 上的题目一定得做,我的经验是面试官一般出的比较多的是剑指 offer 里面的题目,刷题的时候可以优先刷这部分。我那会儿先刷了些剑指 offer 的题目然后就去看 labuladong 的专题了,边学边刷题,不过刷题的过程中我都会做笔记,包括思路、易错点之类的,因为同样的题目隔了一段时间再看的话可能就没有印象了,如果有做笔记的话就会很快记起来,并且这样也方便秋招再次复习。有些同学会认为一定要刷到多少题才去投简历,其实并不是的,刷题在于质量不在于数量,大体的算法框架搞的差不多懂了之后就可以直接冲了,边面试也可以边做题,不冲突的。
第三点就是制作简历。我是用超级简历APP 这个网站做的,比较方便,其他的工具比如 LaTex 或者 Word 也是可以的,原则就是最好一页,页面尽量简洁,不要搞太花里胡哨的色块,并且主要是对面试官突出自己的亮点。除了个人信息、教育经历这些必备的板块以外,最需要认真撰写的就是项目/竞赛经历这块(有实习经历的朋友也要强调一下实习经历),要按照负责什么模块、用到什么技术栈解决什么问题、最终取得了什么样的效果来展开。其中,比较关键的就是需要利用量化的指标来衡量最终取得的效果,不要用模糊的术语来描述。【在性能上有很大提升(x),精度上提升了3个点,速度提升40%(√)】
项目/竞赛经历按照时间由近到远排列,因为大部分面试官只感兴趣你在研究生期间做的事,我本科的竞赛基本上很少面试官问到过。如果自身有发表论文的话可以视篇幅来决定放在哪部分,如果项目/竞赛经历比较少或者没有的话可以将论文按照上述的点来展开说说,我写完项目/竞赛经历之后篇幅已经不太够了,所以就只放了个论文的题目放在论文&荣誉板块,面试官如果感兴趣的话会直接让你介绍一下论文。最重要的点,写上去的东西你一定得完全掌握,如果是那种一知半解的项目可能到时面试官问的深一点就答不出来了可能会减分,因此我建议写完简历之后好好把这些项目复盘一下,并且自己问问自己面试官可能会考察什么问题,提前预演一下。
另外,如果本身有写博客习惯或者 GitHub 有高 star 项目的,可以把博客或者 GitHub 链接放进简历,最好用超链接的形式,方便面试官直接点开。自我评价&掌握技能可以放在一个板块简介一下,吹嘘自己的话可以少说点,主要写掌握的技能,如果项目经历不够的话面试官可能会从这里考察一些基础知识。至于社团活动/学生工作我个人认为不用写进去,面试官一般不看,实在篇幅不够的话可以简单写一点。
第四点就是投递简历。这个有多种途径,最直接的就是去企业官网投递,此外还有各种招聘软件(我主要用 Boss 直聘和牛客网)。牛客网和 Boss 直聘投递比较方便,可以直接把 pdf 简历发给对接人,官网投递的话每次都需要填很多信息比较繁琐(chrome 有个插件叫牛客简历助手可以自动填充个人信息)。内推码可以直接上牛客网搜,一般都会有很多,不过其实没啥用,照样要走流程,如果有师兄师姐在公司的话建议找师兄师姐,查看进度啥的都比较方便。建议没事多刷刷牛客网看看面经,上面也会发布很多公司的招聘信息。
关于投递顺序,这个得根据个人情况具体分析,我的话是不想出深圳实习的,所以我主要考虑的是学校附近的实习机会以及远程实习的机会,这样如果导师有事找的话也能很快回来。因此我会选择先面一下其他城市的公司积累经验,再去冲符合自己意向的公司。因为很多公司都只有一次投递的机会,挂了的话如果没人捞起来就与这家公司无缘了,所以要做好面试的准备。并且也可以根据自身情况设一个预期,比如拿到某某 offer 就停止找实习了,或者某某公司就算给你发 offer 你也 100% 不会去的就不用面试了,给双方都省点时间。
第五点就是面试&复盘。面试的技巧也有很多,这里很难概括,不过建议大家可以准备一个 PPT 展示你的项目/竞赛/论文,这样比直接干讲会更加分,下面说一下面试完复盘的问题,最好就是列一个文档记录每一家公司笔试&面试的时间以及流程,然后每一面的问题都记录下来,有问到不会的问题就去网上搜索答案,很可能下一家公司的面试官也会问到同样的问题。所以有必要自己制作一份面经,不仅方便实习复盘,对秋招也很有帮助。下面是我实习时面试的一些公司的面经,希望能够帮助到大家:
平安科技 (拿到 offer)
3.23 一面
面试官是 nlp 方向的,所以确实对图像了解的并不多,整个过程几乎都是让我在介绍我的工作
- 详细介绍一下 CVPR 工作
- 介绍一下目标检测项目
- CLIP 是一个什么样的东西,Language 是怎么和 Image 产生关联的呢?
- 在 CVPR 这篇论文里做的贡献
- 代码能力怎样?简单讲讲 CVPR 这篇论文的代码框架,输入输出
整体来讲没问太多东西,总共聊了 40 分钟,然后就通过了
阿里云
3.18 一面
主要是根据简历上面写的东西进行询问,要对自己写进简历的细节都了解清楚
- 自我介绍
- 目标检测的项目是怎么验收的,部署工作是你做的吗?
- 目标检测项目有什么具体的性能指标要求吗?为什么选择用 TTFNet?
- CenterNet 为什么会对大目标检测效果不好呢?和最近的 DETR 相比他们分别有什么优缺点?
- 竞赛算法拿奖,你觉得和别人的代码相比有什么亮点?哪里是最创新的?
- 讲一讲 CVPR 论文,为什么利用CLIP可以做到消除背景?
面试官人很好,整个过程比较愉快,但是竞赛这一块感觉他没怎么太听懂,确实不太好描述,视频面试的话可以准备一些图片会好一点。
3.22 二面
到这里就挖论文以及项目了
- 自我介绍
- 讲一下你的论文,介绍一下 CLIP,并且问了一些细节
- 详细介绍论文中的三个 loss,以及各自的涨点情况,比 sota 高了多少?
- 介绍一下目标检测项目
- 如何解决目标检测的多尺度问题?回答:最直接的就是 FPN 了
- 那为啥项目中不尝试 FPN 呢?回答:做过,效果不好,TTFNet 大物体的高斯核会重叠
- 多尺度融合呢?尝试过没?回答:同上,然后引出了我们的 transformer attention 版本,把握主动权
- 项目中 10ms 的速度是在哪个平台测试的?最终端侧部署工作是谁做的?
做了两个题目,求最大子数组和,leetcode 原题,一个多星期之前我还做过这题,但是第一次在线答题,很紧张,没想出用动归的方法,做完之后又来了一道求最大子数组的乘积。
过了一天就跟我说二面过了,但是主管面想等我笔试做完再进行。
3.25 笔试
大概率无了,编程题第一题只拿了 83%,另外两道 0 分。(确实 G 了,问了面试官,只拿了 30 多分)
上海人工智能实验室 Open MMLab
3.23 一面
本来投的是 mmrazor 方向的算法研究员,后面给我分配到 mmdeploy 部门去面试了,问了一下说是算法没过筛,然后就面吧,虽然部署方向做的不多,但是还是有些兴趣的。
- 介绍目标检测项目,主要的 baseline 是什么,有什么提升?
- 做过哪些部署方面的活,有遇到过什么困难?转 onnx 有什么困难?
- 介绍下用 Libtorch 和 TorchMobile 部署的项目
- 主要用的是 C++ 还是 python?回答:训练网络用的是 python,本科用过一段时间 C++,然后把握主动权引出了比赛
- 介绍一下比赛主要用到的知识点,都是用 C++ 调用 OpenCV 模块的 API 是吗?
- TensorRT 有用过吗?回答:没有用过,但是了解一些
- 编程题:给你一个整数数组 nums,里面的数字互不相同,返回该数组所有可能的子集(幂集),可以以任意顺序返回,但是不能包含重复的子集。(用回溯,leetcode 78 题)
3.28 二面
这次是OpenMMLab 社区 MMDeploy 方向的负责人来面我,主要是考察我在目标检测以及抠图项目中的一些模型部署情况。
- 目标检测项目具体有哪些改进的点,有哪些是 work 的
- 部署的时候有遇到什么困难?(OP 不支持)
- 介绍一下 ONNX,你知道神经网络框架训出来的模型转 ONNX 格式底层是怎么实现的吗?(通过有向无环图)
- 除了提供 ONNX 格式的 model 给企业,自己有实际在端侧部署过网络吗?回答:在投论文比较速度的时候,将我们的模型和 yolo ssd 之类的全部都部署到了安卓端,用的是 Torch Mobile,然后介绍了一些是怎么部署的(面试官没有太了解 Torch Mobile,这个是能够比较快速部署的)
- 为什么要转成 TorchScript 格式呢?回答:部署在 IOS 应用上(后面面试官解释了 IOS 芯片上确实用 TorchScript)
- 转 TorchScript 有哪些方式呢?回答:torch.jit.trace 和 torch.jit.script,知道这两种有什么区别吗?(一个是直接走完一遍图,一个是需要进行编译)
- 知道模型部署的流程吗?有意愿加入哪一方面呢?我浅谈了一下,然后面试官给我介绍的很详细 mmdeploy 部门做的几个方向,模型转化(要能够支持各种芯片平台),C/C++ 推理框架接口开发,社区日常业务。然后我说我对 C/C++ 接口开发挺感兴趣,她就考了我一些基础知识。
- 深拷贝和浅拷贝的区别
- python 中有哪些内置的数据结构是 sequence (可以用索引取值)?回答:str,list,漏了 tuple 和 array
- 知道栈和队列的区别吗?用 C++ 实现一个 stack,包含 empty, push, pop 操作。然后我用了一个 vector 存数据,用一个 index 指针存放栈顶。然后面试官又让我实现索引取值 (stack[0]),然后我就说操作符重载,但是太久没写了忘了怎么写了,她表示能想到就可以了 hhh (参考 Leetcode 155 题)
- 反问阶段问了 mmlab 这种开源性质的工作每天都在干啥,然后就发现和公司做项目不一样,没有一个明确的 deadline,给个每月计划,然后按时交差就行了。
原本以为已经稳了,没想到反手进了人才库,想不通为啥,觉得回答的都还行。。
地平线 (拿到 offer)
3.25 一面
地平线的面试官是目前遇到的水平最高的,上来只问了我目标检测的项目,并且延伸得很广,对底层的考察也非常多。
- 在和企业合作的过程中,对轻量化有没有什么收获,一般会用什么进行模型轻量化?
- 如何加速 Faster RCNN?回答:通用的话,用轻量级的 backbone 以及将 FPN 和 Head 中的卷积换成通道可分离卷积,并且可以 cls 和 reg 两个分支共享一个卷积,然后提了一下 CenterNet v2 用了单阶段的检测器提取高质量的 Proposal,所以可以将 proposal 的数量降低,这样的话运行速度也会加快,因为少了很多低质量的 proposal 送去回归和分类
- 你的网络对 person 类的检测性能低,是由于什么因素呢?回答:感受野不够,并且人物高斯核重叠
- 数据集的大小是怎么样的?有看过里面三个类 (person,hand,face)的数量吗?以及数据集的场景有没有了解过?
- 如果还是单尺度做检测,如何提升 person 的检测效果?回答:提高感受野,然后说了 Dilated Encoder 以及我们尝试过的 Transformer Encoder 版本
- 物体中心重叠有什么解决办法吗?回答:暂时没什么好的解决方法,然后延伸出 CenterNet 也没有解决这个事,但是 FCOS 解决了这个事(重叠时就让网络回归比较小的物体),然后又说这样不够优雅,Auto Assign 让网络自己去学习回归哪一个物体
- 假设 FCOS 中,两个物体中心重叠在一起,按照策略,这部分区域只回归小的物体,那么大的物体就被放弃了吗?回答:如果尺度相差不大的话可能被分到同一层进行回归,那么大的物体可能被放弃了,如果相差比较大的话应该就是在不同层进行回归,所以不会有影响。
- 如果让你在三类检测中再加一类人头检测,你有哪些做法,会存在哪些问题?(开放性)回答:额外加一个分支检测人脸,问题就是可能会跟人脸撞了,互相影响训练得到人脸之后往外扩充一个范围,将 ROI 区域拿去训练好的人头检测网络检测人头的坐标,问题就是人头检测器不能一起联合训练。(我现在觉得这个就是扯淡,应该不能这样干)
- 交付模型给企业的时候,部署方面有哪些问题呢?回答:op 不支持,需要手动修改或者利用 onnx simplifier 转化 op
- CenterNet 的高斯核的 sigma 是怎么确定?回答:(我记得的话是跟 CornerNet 一样的生成套路),也就是重叠区域的 box 面积要和 gt box IoU 大于 0.7
- 你了解 mAP 指标的计算过程吗?这个凭借着记忆说了一遍,但是面试官说讲错了很多,回去再复习一下吧
- 编程题:用 python 手写卷积(带通道数的卷积)
3.28 二面
地平线公司主要都是在做业务,所以会很看重项目,这个面试官也基本在问我的项目情况
- 目标检测项目大多数问的和之前的一些面试官差不多,记录几个不同的问题
- 用到的两个数据集是怎么样的?回答:都是从公开数据集中取出来的,然后说了一下数据
- 没有用 FPN 自动选择哪一层进行回归吗?回答:试过,但是效果不好,然后说明了高斯核重叠的问题
- 说一下联合数据集是怎么训练的,然后我就说屏蔽不存在的类别的 loss,面试官说他们那边也有很多这种类似的数据集,只有某一些类别,然后会打上 ignore 标签,并且表示我这种做法也没啥问题
- 你们 KD 具体是怎么做的,teacher 和 student 的 AP 相差多少,KD 之后有多少提升呢?
- MODNet 你们对数据怎么进行清洗的?xxx,
- 讲一下 MODNet 的一个流程。(边缘预测,语义预测,alpha 预测,三个 loss)
- MODNet 最终的指标是在哪个数据集进行测试的?回答:业务上的数据集
- 你们的抠图项目如果图片中出现了多个人会一起抠出来吗?回答:会的,不需要进行特殊调优,本身训练集中就包含了多人的 case(不过这种 case 不是很多,但是我觉得网络有能力将所有人都抠出来,后来面试官问了一句有没有在一张背景上贴多个前景,我猜想他们是这么干的)
- 编程题:反转链表,直接 Ak
然后就是一些聊天,问业务,面试官就给我很系统地介绍了一下地平线做的智能驾驶相关业务,一个是车内感知,一个是车外感知,还有一个忘了。说我做的目标检测项目和车内感知很像,然后抠图项目他们也有在做,MODNet 他们也在用,而且改了很多结构,进行了很多减枝操作,总之 28 号面的两场都挺愉快的。
腾讯微保 (已放弃)
3.25 一面
本来是不想面的,好像是去做文档 OCR 的,跟 HR 说了放弃但是没回复我,又已经答应面试了,就上了。整体体验十分差,HR 电话打不通,微信是假的,发信息也不回,浪费我一个小时.
主要就是问项目,大多数时间是我自己在讲,检测项目和 matting 都问了,估计看不懂论文就没问,然后做了两题,先让我讲思路,然后问我多久能做出来,然后他就走了,到时间过来,全程没有让我开摄像头,感觉面试官十分敷衍。
过了一个星期 hr 发信息给我说一面过了,约二面。。。不想面了
群核科技 (酷家乐) (拿到 offer)
3.29 一面
这个公司主要是做产品的,类似 AutoCAD 这种设计工具,听了面试官的介绍之后觉得还挺不错的,面试官的水平也挺牛的,出乎了我的意料。
- 介绍一下检测项目,面试官说从下面一些角度来介绍,我觉得他的思路很清晰,赞动机,想解决什么问题数据集用的方法最终的效果
- 用 MobileNet 是为了轻量化吗,最终模型体积有多大?
- CenterNet 变体工作有没有了解,然后我说怎么变都还是那样,引出了 CenterNet v2 是个加强版的 RPN
- 列举一些 AnchorFree 检测器,FCOS,ATSS,AutoAssign,reppoint(fsaf,FoveaBox)
- KD 的概念,要解决什么问题,让大网络进行剪枝和蒸馏有什么异同之处?
- Swin transformer 看了没有,他和 VIT 那些有什么不同之处?面试官想要的回答:在 window 里面做 self-attention,而不是全图做
- 讲一下弱监督,半监督,全监督,无监督,元学习的概念
- 编程题:字符串中不含重复字符的最长子串的长度 "abcabcbb" -> 3 (直接滑动窗口做)
4.1 二面
这次是未来的 mentor 来面我,水平挺牛的,问的问题都很到点上。
- 介绍一下 matting 这篇论文的做法
- 介绍一下 matting 对数据清洗的流程
- matting 的 groundtruch 是 0 或 1 的二值图吗?(这里是我介绍的时候口误,gt 是 0-1 的连续值)
- 这篇 CVPR 论文是二作,你在里面充当什么角色
- 讲一讲这篇 CVPR 论文
- 接下去就是考一些知识点的概念
- 线代中特征值和特征向量是什么意思
- 讲讲无监督的概念,举例一种无监督算法并介绍。回答:k-means
- PCA 的目的是什么,是怎么做的
- Adam 和 SGD 的区别,SGD 怎么改进使它不陷入局部最小值
- 代码题:手写 NMS
4.2 三面
三面 leader 面,群核科技 AI 部门负责人来面我,气场很足,问的问题十分戳到点子,让我感觉这家公司的水平真的挺不错的,很有好感。
- 介绍一下检测这个项目,你觉得最大的创新点是什么(我说了联合数据集训练策略),他开始有点没听明白,后面我说最后是 num_class 个二分类,屏蔽一些二分类的 loss,他就懂了,提出了自己的一些见解,觉得我这个有点像 multitask learning,但是我感觉不太一样吧
- 觉得你有什么优点,有什么短板(这个问题问的我很慌,我就说容易被打扰,他就继续问下去。。。),下次就直接说:1. 涉猎太广泛,比较喜欢了解各种计算机知识导致有时候对自己专业不是特别精通。 2. 任务没有正反馈时,比较容易疲倦气馁。3. 英文写作水平还比较低
- 介绍一下 CVPR 文章,在里面扮演的角色
- 来我们这里的一个期望是什么,想获得什么?
- 想做偏工程一些还是偏科研一些?我说偏工程,然后他说觉得我的工程经验已经非常丰富了,跟我聊了他关于科研和工程的一些看法。做科研主要是要找对方向,并且要有人讨论帮忙,科研和工程本质上都是一样的,都得不断的思考,工程性的东西可以很快获得成就感,但是科研走对路了的话也是能获得成就感的
- 你未来的规划是什么?
- 主要就是以上这些,面试官关于科研和工程的关系跟我聊了很久,作为过来人给了我很多建议,挺感谢的。
腾讯 AI Lab
这边招人主要是做图像生成 research 的,虽然没有相关经验,但是可以去蹭一波面试经验,面试官挺牛的,对 research 有自己独到的见解。
3.30 一面
- 你的科研习惯怎样,拿 matting 这个项目来说,你是怎么去推进这个项目的
- 介绍一下检测的项目(每次我说完一个东西之后会说效果,以及不足,并且分析原因,面试官说我这点非常好,但是在说数据集联合训练的时候给出 hand 精度提高的原因是因为加入了更多 small scale 的样本进去训练,他觉得这个理由不太 convince,应该从 feature 的层面去分析原因,hand 和 face 得出来的 feature 应该是很不一样的,不能单从 scale 的角度去证明 hand 提升的原因)
- CNN 和 Transformer 有什么不同的地方呢?
- 有做过图像生成么,或者 GAN 有做过吗,是用于什么场景呢?(自己玩过 DCGAN)
- 然后面试官介绍他们的 research 主要做的东西,CG 转高清人脸视频,问我做这个的话有什么优势?我只能说我的学习能力很强了,毕竟没有做生成相关的经验。
- 问手里还还有没有项目在做,过去换方向做 GAN 的话导师会不会同意之类的
- 然后就说通过的话后续会安排二面考察工程能力
4.6 二面
这次有两个面试官一起考察,上来直接做了两题,应该凉了
- 给你一个 H*W 的灰度图,以 k 为窗口大小进行不重叠滑窗,可以产生 (H/k * W/k) 个 patch,对每一个 patch 提取特征:算出梯度的方向,然后将对应的角度 (0-360) 划分成 9 个区域,输出梯度方向在每一个区域的概率(也就是输出的 tensor shape 为 [H/k, W/k, 9])
- 给你一个 NCHW 的向量,求每一个像素对其他像素的自相似度,也就是 self-attention 在 softmax 前面进行的操作
- 然后就是另一个面试官了,随便问了我一下平时工程习惯,怎么组织训练代码,测试代码,以及模型保存什么信息,怎么命名之类的,想规范的话就是组织一个 train 脚本,然后通过 argparse 传入不同的参数,保存的时候多保存一些信息,如 epoch,optimizer 之类的。
腾讯音乐
4.2 一面
估计是招人去做移动端 APP 的,问了一堆移动端模型压缩的问题,几乎是没有研究过的领域。。。
- 首先问了一下导师以及我们组是不是有博后在带,巴拉巴拉
- 直接问检测项目了,问是在什么平台进行的测试
- 知不知道 npu 和 gpu 加速的区别
- 移动端模型压缩有哪些方法?我说了通过硬件优化特定算子,指令集加速,模型剪枝,蒸馏,算子融合,转格式用推理框架
- TensorCore 有知道吗?TensorRT 加速的原理是什么,为什么会加快推理速度支持 FP16,INT8,减少计算量又能保持精度算子融合,层融合
- 项目模型前向 10ms 是在什么平台进行的测试?理论计算量是多少?测试 FLOPs 的时候是不是多帧测量?
- 你有没有自己在移动端部署过这个模型?是什么型号的芯片?
- TorchScript 中的 script 和 trace 有什么区别?
- 用过移动端框架 NCNN 吗?TNN,NCNN 会比 TFLite 效率更高的原因是什么
- 你有用到蒸馏,说一下你蒸馏是怎么做的,你有用过剪枝吗
- 抠图的项目有和抖音这些软件进行过速度和效果对比吗?。。。
- 反问环节,面试官说我移动端的知识还需要再学的深入些(我压根没学过。。)
字节跳动 (拿到 offer)
4.2 一面
好家伙,面试官周六晚上八点开始面,直接给我面了两个小时,十点结束,我人都傻了,不过可以看出来这个面试官涉猎很多方向,并且能很好地指出我项目中存在的问题,非常有经验。
- 介绍检测项目,提出了哪些改进
- 你有用到蒸馏,是怎么用的,有关注最近的蒸馏文章吗,讲一些工作的大概做法。
- CVPR 这篇文章你是在里面负责什么?有没有涉及到代码的编写呢?然后聊了一会儿说大规模预训练结合到下游任务现在是个非常好的方向
- 讲讲 CVPR 这篇论文,你对弱监督了解多少,简单介绍一下(然后就从传统 CAM 到最近的工作大概讲了一下有什么变化)
- MODNet 主要流程大概是怎么样的呢?如果要对他进行改进的话,你觉得有哪些是可以改的?回答:可以做一些剪枝,去掉一些分支(Low resolution 用于检测简单场景,High resolution 和 Fusion branch 用于检测复杂场景),然后换深度可分离卷积
- MODNet 的 loss_c 是什么意思?(引用之前的文章的 composition loss,就是要让 gt RGB 合成图和 pred 的 RGB 图的每一个像素值都尽可能的一样,保证预测的完整度,这个面试官应该自己部门也做过 MODNet 相关业务,问的挺多的)
- 给个业务场景,比如 matting 这边的话,假设有大量的 noisy label(经过模型标注的伪标签),如何将这些伪标签利用上呢?回答:如果是分割任务的话可以用 CRF 或者 Random Walk 来 refine 一下标签;或者参考文献将 noisy label 和 精细的 label 一起训练提升效果;或者用 noisy label 先训一个模型,作为预训练权重,然后再用精细的 label 进行 finetune;然后问面试官给点提示,他说他也没做过,只是一个开放性问题,然后说如果是他的话,可能会用不确定性来将 noisy 的部分给干掉。
- 移动端部署加速的话你能想到用什么办法吗?回答:剪枝,蒸馏,特定算子优化,算子融合,量化,用推理框架,用指令集加速(NEON 在 ARM 平台可加速),根据场景选择 npu 以及 gpu (然后我就引出我和华为有过合作,用过他们的 npu,在效率上会比 NVIDIA gpu 快很多)
- 编程题:Leetcode 组合总和II,开始用滑动窗口做,发现有点困难,后来直接用回溯就行了。
4.7 二面
这个面试官水平挺高的,但是很多东西问的太细了,有些答不上来,并且最后的题目也挺变态的,太麻了。
- 详细介绍一下目标检测这个项目
- MobileNet 里面有 BN 层吧,在部署的时候有对 BN 层做什么处理吗?回答:应该将 Conv BN ReLU 三层融合为一个算子了,这样的话可以加快速度
- CenterNet 假设两个极值点靠的很近,就相差几个像素,怎么区分这两个物体呢?
- CenterNet 是怎么获取极值点的?:先对 heatmap 进行 pad,再用 3*3,stride=1 的卷积核进行 maxpooling,得到 hmax,hmax==heatmap 的部分即为保留下来的极值点
- 详细介绍一下抠图这个项目
- 为什么不使用一个大型的模型来对你们的业务数据集进行推理呢?(MODNet 的模型比较方便直接使用,其他的可能没有开源或者效果不怎么好,我们这样推理出来的七八百张图片也够用了)
- 抠图最终的数据集有多少张?前景图有多少张?
- 你们合成数据时就直接将前景贴到背景上去吗,有没有做什么操作?回答:直接贴,后来他说背景和前景的光照度对比度之类的,我就说我们找的背景都是很亮的,和前景没有太强的对比度
- 语义分割领域中,一般有什么方法来处理不太精细的边界问题吗?回答:CRF,RandomWalk,面试官问我知不知道原理是什么?直接跪
- 两个数据集,一个有 3 个类标注,一个有 1 个类标注,bs=16,如何每次都 sample 出一半 A 数据一半 B 数据?回答:重写 sampler,他问具体怎么实现?讲了我的一些思路,但是应该讲错了,再次跪
- 做分割时,假设我们用的是 512 分辨率训练,测试用一张 4k 或者 8k 的图片推理上采样回原图后,边界模糊怎么处理?回答:用类似 canny 的 nms,其实是错的,这种 nms 针对的是边缘区域,但是我们的分割图并不是边缘。好的做法有将图片切 patch 送入网络中进行推理,不过这样子的话推理时间会增加。另一种做法呢,面试官跟我说可以用引导滤波。又跪了
- 一般移动端模型轻量化有哪些方法?这个我刚好复习过,所以讲了很多方法。没想到他接着问,说一下剪枝的具体做法,说一下量化的具体做法,int8 缩放系数是怎么设定的。
- 讲讲 CVPR 论文,你们是怎么获取到与类别相对应的背景类的呢?回答:先验知识
- 编程题:用 SGDm 求 X**2 + 2*x -3 = 0 的解,破防了。
以为凉了,没想到竟然在 6 天之后收到了三面的消息!!!
4.19 三面
- 介绍检测项目,应用场景是怎样的
- 为什么不用 FCOS 等后面出来的 Anchor-free 检测器
- 对 FCOS ATSS 有了解吗,介绍一下
- 高通模型有自己部署在移动端吗?用的是什么框架?其它一些框架有没有了解过
- 介绍一下抠图项目
- 有对抠图做一些部署方面的处理吗
- 视频抠图中一般会出现什么问题?回答:画面光影抖动,导致抠图效果差。怎么解决这种问题?回答:收集几帧的数据,利用不确定性判断该区域历史像素的方差,方差大说明抖动厉害,结果不太可信,需要对历史像素进行加权。
- 开放题:假设会议软件中,背景抠图,但是只想抠主体的人,对非主体的人不想抠,如果还是用 MODNet,可以怎么改进呢?回答:1. 识别关键点进行解算 pnp 得到距离,只扣距离最近的人(但是思路是错的,万一两个人叠在一起就 gg)。2. 实例分割加抠图加距离解算。3. 面完后突然想到可以用 ROI,识别到人之后就把识别范围缩小到主体周围区域。
- 其他 CV 领域了解过吗,实例分割,GAN,看过那些文章或者做过什么项目
- 将 GAN 应用到检测分割当中提升性能你会怎么做?回答:用在蒸馏中,引入 GAN 的判别器,让学生的分布尽可能地与老师的分布相似,这样才能骗过判别器,同时也达到蒸馏的目的
- 讲讲论文,然后说我们的做法是比较 trick 的,已经有好几个面试官这么说了
- 开放题:抖音里面的机器人怎么识别?回答:根据动作,记录点赞关注的次数,然后利用聚类算法,对账号分为 k 类,如果点赞关注很多的话,特征的聚类中心会往机器人那一类靠近,然后再去进行下一步判别
- python:GIL 了解过吗?
- 如果数据集特别大,PyTorch 有什么策略可以加快 IO 的效率吗?回答:num_workers 多线程,preload,pin_memory
- C++:堆和栈的区别,vector 的内存管理模式
4.20 HR 面
HR 面了我 1.5 个小时,我看别人都是半个小时走个过场,怎么我面了这么久,一面我也面了两个小时,从来没见谁面过这么久。。这次是 hr 和另一个面试官一起面的,估计是 leader,但是全程都是 hr 在和我聊。问题实在太多了,这里就不写了,详情可以参考我这篇文章(这是链接),还有很多问题都记不得了,反正网上能找到的应该都问了 一遍,一个半小时底裤都被问没了,然后晚上看牛客很多同学都被 hr 挂了,然后我就很慌,还好后面过了
vivo (拿到 offer)
一面
不知道啥时一面的了,也没有记录,当时面试官迟到了很久都没有进来,我向 HR 打电话也打了四五个才接,跟我说面试官可能忘记了,然后要去提醒他,我当时想着 MMLab 应该稳了,就直接跟 HR 说要不就不面了吧。然后过了一会儿面试官打电话过来说面试,我想着面就面吧。。问的很多还是移动端的东西。
然后过了两天就收到了 MMLab 的感谢信。。。
4.12 二面
直接是 hr 面,hr 还迟到了,聊家常
- 本科成绩怎样,学校保研率怎样,你怎么保研的,团队有多少人,排名第几
- 在比赛中负责什么,强度怎样
- 比赛中跟别人有过分歧吗?怎么解决?
- 你觉得你是个怎样的人?
- 如果别人让你看代码 debug,但是你在做自己的事,怎么办?
- 家里是哪里的,父母做什么,家里生了几个,以后想在哪发展,父母意见怎样?
- 深圳最吸引你的地方是什么?回答:开放包容
- 目前有投递其他公司吗?在什么样的流程了?
- 什么时候到岗?
- 介绍薪资待遇
美的人工智能研究院 (拿到 offer)
进行了一次电话面试就直接拿到 offer 了,基本上就是对着我的简历进行提问,记录一些其他公司没有问过的问题
- 为啥用 CenterNet 不用更先进的 YoloV5 呢?回答:没有 nms,并且代码结构更简洁,改模型也更方便
- CVPR 这篇论文中,如果图里有多标签怎么办?回答:一个类一个类进行循环计算四个 loss
腾讯 ieg
4.18 一面
本来投的是 CV 岗,后来安排到 ieg 的游戏前沿部门去了,还是客户端开发,压根不熟的领域,然后面试官跟我说进去不是做开发的,看我有深度学习的背景就要了我的简历,进去为游戏业务做超分应用。面试官人很好,特别好说话,我回答不出来也一直说没关系没关系。主要是对 cpp 和 python 相关知识的考查。
- 简要问了一下项目,问帧率怎样
- 堆和栈的区别
- 链表和数组各有什么好坏之处
- #define 和 const 有什么区别(#define 没有类型,const 会对类型进行检查)
- 引用和指针有什么区别
- 多态是怎么实现的呢?虚表
- cpp 是类型安全的语言吗?不是,可以强制转化类型
- stdcall 有了解过吗,有没有了解过设计模式(这个真不太了解)
- python lambda 函数的应用场景(解耦)
- with open () as,这个是什么原理?上下文管理器
- os 和 sys 两个库有什么区别?一个针对操作系统,一个针对 python 解释器
基本全都答上来了,然后反手挂我,应该是 kpi 了
上海人工智能实验室 Open GVLab (拿到 offer)
4.20 一面
- 讲一下目标检测项目
- 为什么不用 Anchor-based 的方法,在工业界其实还是 Anchor-based 的用的多,因为召回率高
- 讲讲 CenterNet 这种用点来检测的方法和 Anchor-based 相比的优点在哪里
- 抠图和分割有什么区别,抠图的前景背景代表什么
- MODNet 语义的部分是怎么预测的,人的姿态千变万化,他为什么能够那么好的预测出来?因为 Backbone 使用了 Human Segmentation 的预训练权重,引入了先验知识
- 抠图你用了 MAD,MSE 指标,还了解其他指标吗?不了解,他表示还有结构上的指标,梯度那些
- 更多的就忘了,反正问了一个小时,没做题,他表示商汤更加注重学术,看我做了这么多项目工程能力应该也不错。总体来讲,面试体验中等偏下
4.21 二面
- 从三个方面讲一下目标检测项目:动机,方法,效果
- 你用到了 Transformer Encoder,你觉得他和 global attention 或者 self-attention 有什么区别呢?为什么选择他?
- CenterNet 能解决两个物体的中心点重叠在一起的问题吗?回答能或者不能,回答:不能,但是 COCO 里这种现象非常少,后续的 FCOS 也用多尺度的方案解决了这个问题
- 你用到了蒸馏,那么你觉得蒸馏和直接用 GT 相比,有什么好处?回答:蒸馏提供了一个更加 soft 的 label,可以使网络更好地去拟合。
- MODNet 是一个 Trimap Free 的还是 Trimap Based 的算法?介绍一下他的大概流程
- 抠图方面,怎么让一个小数据集训练出来的模型更具有泛化性呢?回答:1.贴多种多样的背景,2.在分割预训练模型的基础上进行 finetune,可以提供一些语义上的先验知识,3. 用在大数据集上训练过的大模型来蒸馏这个模型
- 有些问题忘了。。然后介绍部门,表示过去的话应该还是做抠图相关的研究,不仅仅做学术研究,可能还要落地
- 编程题:手撸 IOU 计算公式
以上就是我对找算法实习的一些看法和面经,通过面经可以看到,企业对于项目还是非常感兴趣的,大部分都会问的比较深入,这就需要我们在做项目的时候就认真对待每一个点。如果自身的项目含金量不是很高但是又想冲算法岗的话我建议可以去打一些高质量的比赛(kaggle、天池等),一方面可以让自己学的东西用在实践中,另一方面如果取得了好名次的话也是一个非常不错的加分项。
另外除了刷算法题,企业对于深度学习方面代码的能力也是有很多考察的,例如我在面试的时候就经常被要求自己实现 NMS、IOU、BatchNormalization、MaxPooling、卷积等等算子或接口,因此关于深度学习的基础知识考点我自己也总结了一份文档,涵盖了上述所有面试题的答案,有需要的小伙伴可以查看博客链接。再次祝愿大家都能找到自己心仪的工作!
#我的实习求职记录##字节跳动##腾讯##阿里巴巴##实习#