商汤科技CV岗凉经
前言
楼主因为之前实习拿到商汤的offer,加了面试官微信。前几日面试官问我是否需要内推,就把我简历要了过去,然后商汤就给我打电话了,然后然后....就有了昨日被血虐的过程。
一面
- 针对项目提问,简历上所有的项目都问了个遍。其中我有用到ssd-mobilenetv1-coco的预训练模型,我自己finetune之后的map是0.956@IOU0.5,面试官问我map的误报率是多少...我一脸懵逼= =哎,菜是原罪。
-
问曰:熟悉目标检测吗?
答曰:看过经典论文,但实际的项目做得不多。
继续问:知道nms吧?把nms的代码写一下,并且分析一下时间复杂度。
答曰:好的。
于是我吭哧吭哧的写了一段,给面试官看,面试官提出了一些优化的点:不用每一次都排序,可以用 一个bool的vector记录哪个bbox会被留下来,我恍然大悟,于是又吭哧吭哧写了一段,如下:class Boundingbox { int x; int y; int w; int h; float score; }; bool cmp(const Boudingbox &a, const Boundingbox &b) { return a.score > b.score; } float calIOU(Boundingbox a, Boudingbox b);//假设已经定义好这个 void NMS(vector<Boundingbox> &bboxes, const int num, const int threshold) { if(bboxes.size() <= 0) return; sort(bboxes.begin(), bboxes.end()); int i = 0, count = 0; vector<bool> flags(bboxes.size(), false); while(i < bboxes.size() && count !=num) { maxbbox = bboxes[i]; for(int j = i 1;j<bboxes.size();j ) { if(calIOU(bboxes[j], maxbbox) > threshold) continue; flags[j] = true; } } vector<Boundingbox>::iterator it = bboxes.begin(); for(int i = 0; i<flags.size(); i ) { if(!flags[i]) it = bboxes.erase(it) } }
分析上述代码的时间复杂度为o(N2),N为待选bboxes的个数。(ps:上述代码估计运行还是不行的,只是比伪代码稍微强一点,表明思路)
好了,到这里我觉得我表现的还不错嘛,最起码这个nms的之前我只看过大概流程,但是也“差不
多”写出来了,但是下面.... - 面试官:做个题吧,数组的最大子区间和。
我心想:这个也太简单了吧,我得写慢点,于是我控制在五分钟之后才说我写好了。谁料该来的还是
要来...
面试官:如果数组是二维的咋办?就是一个矩阵,求里面最大的一个子矩阵的和。
我: 思考了一下,写了个上面的二维版,面试官说不对。于是又问:那咱们换个问题吧,如果数组首尾相连咋办?
我: 思考了很长时间....说可以把数组复制成两段来做,面试官说这样虽然可以,但是可能最大和区间会超过数组本来的长度...好吧确实是这样,面试官此间还多番提醒,仍未果。
这题的答案,网上应该有,都是数组的最大子数组和的变种,我这般菜鸡,不会举一反三,不会触类旁通,真是丢脸呀。
二面
二面面试官竟然是实习时面我的,他认出我来了,我一开始并没有认出来,后面想起来脱口而出:诶呀你变帅了我都木有认出来!感觉这句话把面试官给雷到了,但这确实是心里话,他确实变帅了。
- 为什么没来实习?我blablabla
- 再讲一下你的毕设吧,我好像忘了。因为我的毕设是做视觉显著性检测,他问我和深度学习中常见的attention有什么关系,其实我觉得就是那个,但是我还是很怂的说不了解attention,怕给自己挖坑...
- 问了一点c STL里面的知识;vector删除(erase()函数),i 和 i更有效率?(我知道是 i但我不知道为啥啊!!!???)
- 下面的重点来了:定义一颗多叉树,并从{ 0 1;0 2;0 3; 0 4; 3 4; 3 5; 3 6}build这棵树
好吧,我真的不会,装模做样的在草稿纸上瞎写了一波,面试官亲切的问怎么了哪里不会?我好想说哪里都不会....
看我一副便秘般憋不出代码的表情,面试官问我是不是计算机专业的,我说不是,他说好吧那确实为难你了,那我们换个题吧? - 给我讲下你简历里面你写的熟悉的这些东西吧?讲讲PCA?
好吧,PCA我已经不太熟了,我大概说了下:是给数据降维的方法,计算数据矩阵的特征值,并保留特征值累加起来超过全部特征值和的90%以上的特征值对应的特征向量(这是我凭印象瞎说的,正确答案请自行百度= =),然后面试官问我矩阵的特征值和特征向量是什么意义?好吧我真的说不出个所以然,放弃了。 - 看我很受挫,面试官让我手推下svm,我按照自己的理解推了一遍,重拾了一波信心。
三面
可能是实习时肯定过我吧,不好打脸,还是给了三面。三面应该是个大佬,在***,于是微信语音面了一波。
- 问我什么时候毕业,毕业要求达到没?
- 问我对计算机视觉任务中比较熟悉哪一类,是检测,分割,分类还是什么?
我突然我发现我好菜,我竟然一个都不敢说熟悉,检测知道些理论但实际项目没咋做过,分类倒是做过实际项目,但是感觉论文没有看太多,分割就是论文和项目都没咋做过。于是我硬着头皮说了分类。 - 分类网络有哪些?我从LeNet到resNet和mobilenet都说了一遍,然后着重问了我两个问题:
(1)resnet为什么好?(我用csdn博客上看到的一个理解解释了一波,被反驳了,后面我问应该怎么理解,面试官说是因为shortlink接口可以减轻梯度消失,这个我不知道咋理解啊?我说这个我知道,面试官又问我梯度消失的原因是什么,我说了一波激活函数导数那个解释,但是面试官说后面都用relu函数了,导数是1或0,为什么还会有梯度消失?不知道不知道真的不知道吗,求各位大佬解答= =)
(2)mobilenet为什么快?(分析了一波深度可分离卷积)怎么证明mobilenet的快是因为用了深度可分离卷积?(不知道咋回答...)mobilenet有多少层?(不记得)mobilenet有多少参数(不记得)
总之三面就是各种不知道,不清楚,全程很尴尬= =
总结
凉经。
#面经##商汤科技##算法工程师#