Chris  

BitTiger AI工程师直通车学员

EE本科,EE研究生,图像背景,SLAM和医疗图像实习;刚入职一家马里兰医疗图像公司,职位是Computer Vision Engineer。

“我整个准备时间超过五个月,不知道有多少天的突击学习,看书,编程,配置环境,不禁觉着如果能一直坚持下去总会有收获。很多时候多坚持一会就能找到工作了。各位共勉。”

 

我们来看Chris为大家分享他找AI全职工作(视觉方向)的经历和经验。

在所有事情开始之前,要把相关的环境设置好。首先你要有OpenCV(对于视觉工程师方向),至少一个深度学习框架(TensorFlow, Kaffe, Keras等,新手推荐用Keras),Ubuntu。还要掌握C++, Python, 和基本的机器学习知识。

 

C++在AI类工作中有怎样的重要性?

C++对于你找AI视觉方向的工作是比较重要的。以下几个工作Title是要求你必须会C++的:

  • AI Engineer / Computer Vision Engineer / Self-driving Car Engineer / Image Processing Engineer / SLAM Engineer
  • GPGPU Engineer

而这四类工作Title并不要求你一定会C++:

  • Data Scientist(Python, R etc.)
  • Deep Learning Scientist
  • NLP engineer (Python)
  • Machine Learning Engineer (Pyhton, Java)

 

如何准备C++?

C++11中最重要的是Smart pointer,很容易考到。其次还有STL(vector, map etc.) 添加,删除,排序。类也会考察,类里有很多前缀后缀,如const, static, override, virtual,pure virtual等,这些需要清楚地记得。

然后说到刷题,LeetCode上Easy和Medium的题,起码要刷三百道。最好是能一边上现成的算法课,一边用C++刷题练习。

关于用到的资料,向大家推荐一本C++的书:Effective C++。这本书比较薄,三天内就能看完,可以不用看得太细,它对编程风格的讲解是比较值得一看的。比如你可以了解到面对过程的编程风格和面向对象的编程风格。

最后给大家推荐一个YouTube播主: Cppnuts。他把C++的每个知识点总结成三到五分钟的视频,讲得很不错,大家可以关注。

 

找AI视觉方向的工作,你需要哪些必要的图像知识?

  • 特征点Harris角点检测,SIFT,SURF,ORB。例如,面试官可能会问你:在SLAM系统中,我们为什么要用ORB,而不用SIFT和SURF?答案是因为ORB比SIFT和SURF快,并且精度也不错。
  • 描述子和匹配,FLANN算法
  • 相机模型:相机内参,外参数,相机标定。这部分其实是3D的概念,是视觉中的一大块,但不需要了解得太深,现在这个领域绝大部分还是基于深度学习,只需这些基本的概念了解清楚。
  • 基本的大块概念:图像配准,运动检测,光流算法等。
  • OpenCV:很重要,任何一个关于图像的工程师职位都对OpenCV有要求。Mat基本操作遍历必须会,其他的东西可以根据算法推演。
  • CUDA:这是找工作过程中非常容易赢得优势的一门技术。任何一个项目如果你说你用了CUDA,并解释得清除完整,会让面试官刮目相看。虽然CUDA有优势但学起来并不容易,内容比较多。

 

 

你需要哪些深度学习的知识积累?

  • 至少熟悉一种框架:如Caffe,Tensorflow,Pytorch,MXNet等。推荐TensorFlow和Keras。Keras适合新手,比较简单,并且和TensorFlow是一样的。对于TensorFlow,推荐《TensoFlow实战》这本书。
  • 至少一次Kaggle项目的经历:Kaggle项目的名次最好在15%以内,这样只需写一个。如果没有名次,就可以多写几个项目。写在简历上的项目要突出两点:第一,你把模型重新训练了一遍。第二,你Ensemble了Multiple models。 Dogs and Cats的获奖感言中讲了一些他做Kaggle的经历,推荐大家去看,可以借鉴他的话用在面试中。历届冠军说的一些感言有很多是十分有用的。
  • 对于这些模型,能够迅速说出其优点:GoogleNet V12345, VGG, ResNet, MobileNet, AlexNet。
  • 模型选择方面:了解Fine tune,参数训练的技巧(如何设定初值,如何调参等)
  • 各种面试的小问题:如你平时喜欢用什么Optimizer?为什么神经网络越深越好?为什么网络要Thin呢?Gradient Vanish造成的原因?为什么会造成Overfitting?怎样克服Overfitting?你怎么看Overfitting?Batch Normalization是什么?还有Range of each hyper parameter,SVM和分类算法的对比,数据集大小和切割等。

 

关于面试准备过程中的Tips

 

不要想着准备好了再面试。其实”准备好“是一个难以界定的概念,也许你永远都达不到所谓的“准备好”的状态,等你准备好时很多职位都没有了,会错失很多机会。

 

多面试,才知道职位究竟需要什么技能。AI的职位不像软件工程师职位那样有相对固定的需要准备的知识点,医疗方向有医疗方向需要准备的东西,无人机有无人机需要准备的东西。多面试才能知道这个职位到底需要什么技能。但是不要一开始就面大公司,可以从一些小公司练手,积攒经验后再面大公司,并且大公司尽量找内推。

 

过面试失败总结经验,建立一个自己的Cheatsheet。当你准备去面试一个陌生的领域,通过把每次面试的经验写在Cheatsheet上,你就会逐渐知道面试官需要什么样的项目,你要如何润色自己的项目。

 

如果拿不到面试可以尝试投国内公司练手。投国内的公司可能拿到面试的机会更大一些,通过这些面试一样可以积攒经验。国内公司可能对算法方面没那么严苛,但其他方面可以对你有很大的指导性,并且问的问题很实际,很接地气。

 

 

面试中可能会面对哪些失败?

 

回复很少:有时候你可能没有把简历写到Recruiter能看懂的程度。如果你简历写得不够直白,Recruiter没看懂,他可能就pass了你的简历。我们要把项目中最重要的关键词突出出来,并且可能需要写一个general的cover letter,让Recruiter了解你。我们自己也可以去LinkedIn加Recruiter,越多越好,可以直接把简历发给他,增加Recruiter回复的概率。

 

公司其实并不招人:有时候公司把招聘信息发布在网上,但其实他并不想招人,他就是要招不到人,才能给自己公司里的人办H1b。这个时候面试官可能会出特别难的题,这种情况大家需要理性识别,不要一次遇到太难的面试就怀疑自己,从而丧失信心。

 

代码没时间准备:这其实是最不应该出现的问题。代码在AI工程师求职中是很重要的。每个公司至少有两轮代码的面试,Online或者白板面试。大家一定要勤刷题。

 

项目不够吸引人:打造一些实习经历,实习是最重要的,有了实习对找全职是非常有帮助的。

 

心态已崩:找工作的难度大,但很多时候多坚持一会就能找到工作了。你要知道,如果你是MS最终做了AI,你已经为自己省了两到三年转行的时间。

 

现在AI有这些比较热门的方向:

自动驾驶、医疗诊断、推荐nlp、聊天机器人、视觉导航、金融、视觉机器人、VR / AR、监控等。