1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。
讲道理,其实这个博客我是怀着一个很严肃的心情准备写的,但是吧,一谈到【找工作】这个问题,我就很焦虑。。。。。。看到这个省略号了嘛?这就是我的心情 ,尤其是在就业一年比一年难的情况下。为什么这么说?
事实上19届秋招算法岗就有些【供过于求】了,头条甚至发了 算法劝退贴。而这很大程度上就是由于前几年算法就业形势太好了,导致一大批人转算法,这导致的大泡沫其实还没有消化掉,所以其实不是现在算法突然不好找工作了,而是之前太容易了。其实你说公司真的不缺算法工程师嘛?当然不是,公司也是有算法工程师的缺口的,那为什么出现这种情况?除了要劝退一部分盲目入行的同学;听到、遇到的好几个HR都说,收到几百份简历,但是没什么匹配的。所以说做算法的人多是真的,可是需要做算法的人也是真的,而主要的矛盾点在于 供需不匹配。
所以在经历过好多次心态崩裂,也问过很多前辈和大佬之后,参考了很多大佬的文章之后,我决定来总结一下如果想成为一个【深度学习 CV 算法工程师】需要什么学习能力和知识储备。这个文章应该会是一个【记录】性质的文章,期望看看自己这一路走来 学了什么,准备学什么,需要学什么,希望和各位共勉。
这真是个老生常谈的问题,为什么这么说呢,自然是因为这个【编程能力】我听过不下几百遍,听的脑瓜子都疼,可是没法子,这就是 必备技能,必备到什么程度?
这么说吧,假如你想写作文,如果你不会写字,组词,造句,我想你应该完全没法完成这个创作过程。很形象吧,但是也确实如此,仔细想一想,招你进去是要干活的,公司不会招聘一个只会 MATLAB 或者 python 都用不熟的人来做项目开发吧,做纯算法研究都不行。
那么 具体地说,编程能力需要哪些基本要求呢?
新手肯定都是用 Windows 起手的了,像我之前就是这样,但是在学习过程中发现在 Windows 上搞不定了,一般也会先忍几次,然后掉头就去学 linux 了,一定是这样的过程。哪些在 Windows 上真的搞不定呢?比如:最新论文中提出的视觉开源算法等等。
但是在条件上可能很多人都觉得不是太合适,比如实验室条件,电脑条件等等,不过对我们而言,linux 并不需要了解太深。装个 ubuntu 系统,常用的文件操作、程序编译等知道就OK了。剩下的完全是在使用的过程中现用现学,手边常备一本书 《鸟哥的linux私房菜》,神书,你可以百度或者Google一下自然就知道这个书的强大了。在或者现在的网络比较强大了,资源也是很多,实验楼 也是一个不错的选择,帮你搭配好的环境,直接使用就OK了。如果还是想自己搞一下,虚拟机也是一个不错的选择,不会影响你电脑本来的环境配置,但是还满足了要求。
个人计划:
网络如此发达的今天,如果你说你找不到资源我是不相信的,但是如果你说你眼花缭乱了,我是毫不质疑的。因为我当时就就是这样的,基础部分看廖雪峰的 python教程 就可以了,我个人有看一些,但是真正入门的是一本书——《Python编程:从入门到实践》,极其的基础,但是对小白来说非常友好。
有的同学会问是学 python2 还是 python3?这么说吧,python 核心团队计划2020年停止支持 python2,也就是说 python2 马上就要说再见了,肯定还是学 python3,遇到之前的 python2 的代码再查找区别即可。python 学起来其实很简单,看别人代码的过程就是学习的过程。对于不熟悉的用法多搜下官方文档,如 python,numpy,pandas,matplot,scikit-learn等等。
python 的开发环境值得说一下,因为有太多选择,这里比较建议使用 pycharm 和 jupyter notebook 吧,具体可以参考这个博客——Windows10 下 Anaconda和 PyCharm 的详细的安装教程(图文并茂)。
个人计划:
至于 C++,比较普遍的都是 《C++ primer》 或 《C++ primer plus》 这样的大块头书,如果是入门的话应该还可以,倒是不如 《王道程序员求职宝典》 这类书实用。大块头书优点在于全面,同时也往往导致了重点不突出。如果想看视频课程的话,推荐中国慕课上北大的《程序设计与算法》,第1门课程是 C 语言程序设计,第2门课程是算法基础,第3门课程是 C++ 程序设计。看视频课程一般比较慢,如果没什么基础或者特别想把基础学好的话,强烈推荐。
个人计划:
其实没做过检测或者分割或者其他的,是很正常的,快速跟进就是了,这是公司开发的常态。但是如果一些网络结构基础,图像的基础概念,卷积神经网络的基础——大话卷积神经网络CNN(干货满满),等等,这样很可能会犯很多低级错误,可能会出现很多问题。
这就要求开发能力必须过关,因为算法效率在实际生产中还是有要求的。工业界用的算法是滞后于学术界好几年的,不要对公司所做的算法有太多的幻想,现实数据比你想的质量差太多,现实用的算法也没有那么高端,大部分时间都不是用在建模。
个人计划:
python:
C++:
这里说的习惯有:多使用类,多利用函数封装,写好项目的目录结构,良好的变量或者函数命名,善用程序的注释功能,Python 编程语言需要遵循 PEP8 规范(杂谈——Python代码写得丑怎么办?autopep8来帮你)等等。这可以帮助你更好的和同事或者同行沟通,而且看着也舒服,就算好久不看程序了,依然可以做到很好的回溯记忆。
基于深度学习的计算机视觉是计算机视觉的两大方向之一,另一个是 SLAM,机器学习包括深度学习里的大部分算法本质上都是用来做 分类 的。具体到计算机视觉领域一般就是 物体分类(Object Classification)、目标检测(Object Detection)、语义分割(Image Semantic Segmentation) 等,当然也有一些很酷又好玩的东西比如 edges2cats、deepart 等等。
我主要做一些【图像重建】或者【超分辨率】相关的东西。其实一般是看一看论文,复现复现网络结构,或者直接跑一跑别人的代码,做一做网络结构修改,调一调超参数。前期的图像数据集制作,还有预处理才是主要的工作。深度学习为什么这么强?它比传统的图像处理方法好吗?它主要解决了什么样的问题呢?
个人比较认同是以下三点:学习特征的能力很强,通用性强,开发优化维护成本低。存在的问题可能就是数据量,对 label 的精准性要求比较大。之前看过的一个文章写得不错,参见 为什么深度学习几乎成了计算机视觉研究的标配?。
关于这一部分理论的学习,漫天飞的各种资源。这里推荐一些:
个人计划:
关于视觉部分的知识可以看一下这个博客—— 计算机视觉初级部分知识体系,这些基础知识的理解还是挺有必要的,有助于你理解更高层知识的本质,如果没有良好的图像基础,总有一天,遇到深度学习无法解决的问题,或者无法单独解决的问题,就不知所措了,须知很多的新技术都是从传统算法中获得灵感或者相互结合的。
如果说图像处理领域有什么库是绕不过去的,那一定是 OpenCV,这一个开源计算机视觉库堪称最优秀的计算机视觉库,不仅可以学术和商业免费使用,而且跨平台,高性能。需要掌握的基础内容包括:如何部署,基本数据结构的熟悉与使用,基本模块的了解。
这一部分学习资料的话还是挺推荐浅墨的 《OpenCV3编程入门》,也可以看他的博客 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置。当然他的书有一个问题就是涉及理论知识太少,所以推荐再另备一本偏理论一点的图像处理相关的书,比如 《数字图像处理:原理与实践》,只能说是差强人意吧。还有浅墨书的读书笔记 《OpenCV3编程入门》学习笔记一:邂逅OpenCV,里边包含一些理论知识,也是极力推荐的。
个人计划:
python 是脚本语言,而当前大量的 AI 算法都部署在移动端嵌入式平台,需要使用 c / c++ / java 语言,g++,CMake 和 Makefile 正是 Linux 下编译 C系代码 的工具,也是必备的基础。实际上一些python,matlab开源项目也需要预编译,更多的等到了工作岗位自然懂。
个人计划:
Linux 下一个熟练的工程师,会比 Windows 下工作效率高很多,提高写代码效率可以从终端多任务管理,熟练使用 shell 命令,熟练使用 vim 等开发环境,熟练使用 git 命令等地方入手。
个人计划:
深度学习项目开发中最重要的就是 数据!!!或许是一句戏言,但是有一句话是这么说的,深度学习在目前阶段可以认为是一个数据的游戏,你的数据更好,标记的更完美,你的运行结果就更棒。尤其是实际的项目经常没有足够多的数据,这个时候就需要自己去想办法获取了。除了公开的数据集之外,其他的数据怎么获得呢?互联网是一个什么资源都有的大宝库,学会使用好爬虫,你将可能成为时代里最有资源的人,我想叫你金矿工,而且这也很可能是项目成功的开始。
个人计划:
处理数据的一个常用的手段就是数据可视化!在深度学习项目中,常需要的数据可视化操作包括原始图片数据的可视化,损失和精度的可视化等。除了对数据可视化,还需要对模型进行可视化,方便调试和感知。
这个方面我的建议是多打一些比赛,多看一看别人的代码和博客,这样就会很容易学会的。
个人计划:
微积分:其实个人感觉CV所涉及的微积分知识相对简单,积分很少,微分也不是特别复杂,花一天时间学一学就行。
概率论与统计:这个比较高深,是应用在机器学习领域里最重要的数序分支。应用比如:条件概率、相关系数、最大似然、大数定律、马尔可夫链等等,还是得好好搞一下概率。
线性代数:数字图像本身就是以矩阵的形式呈现的,多个向量组成的样本也是矩阵这种形式非常常见,大多机器学习算法里每个样本都是以向量的形式存在的,多个矩阵叠加则是以张量(tensor)的形式存在 Google 深度学习库 TensorFlow 的字面意思之一。
凸优化:这个需要单独拎出来说一下。因为太多问题(尤其机器学习领域)都是优化问题(求最优),凸优化是里面最简单的形式,所以大家都在想办法怎么把一般的优化问题转化为凸优化问题。至于单纯的凸优化理论,好像已经比较成熟了。在机器学习里,经常会看到什么求对偶问题、KKT条件等,潜下心花两天学一学。
数学知识真的没必要系统学习,效率低又耗时,毕竟大家都有本科或者研究生的基础了,这就足够了。用的最多的就是矩阵论!!!或者用到的时候学,学完之后总结一下。再就是活学活用网上的搜索资源,比如 CSDN、知乎等等。
个人计划:
时代变了,一百年前的人类绝对想像不出自己有了困惑不是去翻书或请教他人而是告诉身旁的一台机器。如今,小学生做道算术题或小女生来个大姨妈都要问问电脑:这是怎么回事。但这些与学视觉又有什么关系呢?——答:没有。好像跑偏的有点多了,再扯远一点吧。跨越时间维度来思考一些新事物的发生及其与旧事物的联系,也许会给你一种想象的自由。比如电报、电话、视频聊天和全息通话用 HoloLens 通话,再比如马车、汽车、火车、飞机和火箭太空旅行,蒸汽机、电、互联网和AI。所以活用资源,多看肯定没错,不过要有所选择的看,不能啥都看,,,人的精力还是优先的。
先说明公众号不是打广告,推荐几个自己看的而已(排名没有先后顺序)。
看一下目录,你会发现它向一把小刀一样,是不是?希望你我能剑锋所指,所向披靡!!!
推荐一个自己写的博客——大话卷积神经网络CNN(干货满满),种树从现在开始。