一、引言
计算机视觉的黄金时代真的到来了吗?
近年来,随着深度学习技术的革新、计算存储的扩大、可视化数据集的激增,计算机视觉领域的研究开始蓬勃发展,如火如荼。
在自动驾驶、智能安防、智慧城市、医疗保健、商业零售、航空能源、虚拟现实等诸多人工智能热门领域,计算机视觉技术落地开花,熠熠生辉。
计算机视觉研究工作在学术界和工业界取得的巨大成功,每年吸引着数以万计的研究人员蜂拥而至,加入炼丹师的序列。
甚至连生物医学、机械自动化等诸多专业的学生都开始研究其在各自领域的应用,一个视觉交流群里三分之一的同学都不是计算机相关专业的。当然,我也是其中一员。
对于非计算机相关专业的同学而言,学习过程中往往缺少交流机会,不容易把握视觉知识的全貌。这里仅根据个人经验和网络知识,谈一谈对于一名非计算机专业的学生而言,该不该入门计算机视觉?以及该如何学习计算机视觉?
可以关注微信公众号及B站系列知识总结
ID:AI研习图书馆
其实,对于一门计算机学科的学习,入门同学无非要做好两门功课:理论知识+编程能力。
二、学习路线
机器学习 -> 数学知识 -> 编程能力 -> 计算机视觉
1. 理论知识
(1)视觉知识
由于计算机视觉研究领域十分宽泛,涉及学科门类知识点众多,因此这里仅针对个人研究及知识体系来谈一谈,欢迎不吝赐教~~
目前,计算机视觉比较热门的研究方向总体上可以分为两个方面:一是深度学习,二是SLAM。
那么,它们的研究点区别在哪里呢?
深度学习,侧重于解决识别感知问题,SLAM侧重于解决几何测量问题。以机器人举例,如果你想要它走到你的冰箱面前而不撞到墙壁,那就需要 SLAM;如果你想要它能识别并拿起冰箱中的物品,那就需要深度学习。
不过在学习这些之前,作为入门的新同学:
首先掌握了解一下计算机视觉基础知识,即图像处理基础。计算机视觉初级部分知识体系的构建,对于计算机视觉基础知识的理解还是非常有必要的,有助于你理解更高层知识的本质。
初级部分知识学习资料:理论方面:《数字图像处理》(冈萨雷斯)、《数字图像处理:原理与实践》、《计算机视觉算法与应用》,编程方面:《OpenCV3编程入门》。
研究方向:基于深度学习的计算机视觉和SLAM技术。基于深度学习的机器视觉:包括图像分类、目标检测、语义分割三大基础任务,以及目标跟踪、行人再识别等延伸任务等。
关于深度学习的学习:可以参考李宏毅老师的一天搞懂深度学习;李飞飞的CS231n课程;Yoshua Bengio的《DEEP LEARNING》。
(2)机器学习
计算机视觉研究中使用的机器学习方法不是很多,早期会用SVM做分类,现在基本都用深度学习方法。原因在于机器学习虽然方法不少,但是基本都无法应对大的数据量。在学习一些暂时用不到的算法时,个人感觉没必要做的太深:重在理解其基本思想,抓住问题本质,了解其应用方向即可。
下面分别介绍一下机器学习算法和深度神经网络。
传统机器学习
传统机器学习算法:决策树、支持向量机、boosting、贝叶斯网、神经网络等。除了有监督学习,还有无监督学习、半监督学习、强化学习,一些降维算法等。
学习资料:吴恩达老师的《Machine Learning》,以及《MACHINE LEARNING YEARNING》。课程风格诙谐,简单易懂。李航老师的《统计学习方法》和周志华老师的《机器学习》,业内称西瓜书,两本在国内机器学习界成为经典的书~
深度神经网络
深度学习,风风雨雨数十年,不可解释性科学,但是应用起来效果很棒。发论文都感觉有点心虚,有时候都说服不了自己~~资料上面视觉知识部分已经说过了,听听课程、看看那些知名的模型和框架,基本上也就了解了。
主要的发展有CNN、RNN,不久前的GAN,现在如日中天;强化学习发展也非常快,有许多名校,如CMU都开设了这方面课程。深度学习框架百花齐放,百家争鸣,国内和国际都有,目前主流的是TensorFlow和PyTorch~
(3)数学
一切工程问题归根结底都是数学问题
这里谈一谈计算机视觉和深度学习中所涉及的数学问题。
微积分:例如图像边缘检测,即求微分在数字图像里是做差分,还有牛顿法、梯度下降、最小二乘等。CV所涉及的微积分知识相对简单,积分很少,微分也不是特别复杂。
概率论与数理统计:机器学习领域里最重要的数学分支。例如:条件概率、相关系数、最大似然、大数定律、马尔可夫链等
线性代数:数字图像是以像素矩阵的形式呈现的,多个向量组成的样本也是矩阵形式,大多机器学习算法里每个样本都是以向量的形式存在的,多个矩阵叠加则以张量的形式存在。
凸优化:很多实际问题,尤其机器学习领域,都是优化问题,凸优化是里面最简单的形式,把一般的优化问题转化为凸优化问题。在机器学习里,经常会看到对偶问题、KKT条件等。
其实,这些数学知识没必要系统性学习,效率低又耗时。一般用到的时候再学,学完之后总结一下。
2. 编程能力
(1)编程语言(C++, Python)
刚刚接触CV时,大家一般都会不假思索地选择使用C++:装个VS(Visual Studio),配置下opencv,撸起袖子就开始干了。这样做非常合理,几乎所有人都是这么入门的。
不过,当你的知识面扩展开后,你会感觉到很多时候C++都显得有些力不从心。
总之,有太多的理由会促使你再学习一门编程语言,最好的选择没有之一:Python。CVer开发必备:Python~
C++和Python学习资源推荐
C++:《C++ primer》或《C++ primer plus》,大书优点在于全面,同时也导致了重点不突出。课程推荐北大的《程序设计与算法》,C++程序设计。
Python:基础部分看一下Python教程即可,Python学起来很简单,Python的开发环境值得一提,选择很多,建议使用Pycharm+Anaconda,简单方便。
(2)编程平台(windows, linux)
新手windows,进阶linux。linux并不需要了解太深,常用的文件操作、程序编译等知道就OK了,现学现用。
三、学习心得
机器学习 -> 数学知识 -> 编程能力 -> 计算机视觉
前文已经把所要学习的知识基本都介绍完了。不知道你有没有冒出疑问:你怎么知道这些?你平时怎么学习的?
基础第一条:时间,时间的积累。
简单总结一下学习过程中的技巧:
Google搜索:论文检索,项目检索
学术交流:博客、公众号、微信群等业内人士交流学习
知识学习:论文和书籍阅读
理论研究:关注行业前沿,业内最新研究成果
项目实战:算法实现、代码开发,GitHub项目,竞赛平台
一句话:学会抓住问题本质。
算法太多,学过就忘。这可能是所有人遇到的共同问题。
试想一下,如果一位师弟指着你桌上的西瓜书问你:机器学习是什么?你会不会一脸懵?O(∩_∩)O
机器学习就是让机器学会自主学习,对已有信息进行归纳和识别,并自主获得新技能的能力。
这就是机器学习的魅力~~
四、工作
其实,学习的根本目的就是为了工作,更好的工作!
目前,大多数同学涉足计算机视觉领域,其根本原因无非有三:高薪、需求大、前景广阔。选择计算机视觉,并且以后想要从事计算机视觉这方面的工作。非科班同学,入门一定要慎重 慎重 慎重,一定要摆正心态,因为找工作时可能就要跟那些计算机专业的学生们竞争了,博主的血泪史~~
如果已经坚定决心,最好从现在起,就把自己当一名程序员看待。当然你也可以有自己的优势,你拥有自己专业的领域知识,这对某些公司来说很重要,你找工作时基本上也都应该重点考虑这些公司。你对视觉的具体应用本身也比较了解;劣势是你缺乏计算机专业的基本素养,具体到笔试或面试中就是编程能力不行。
不过,对于我们非计算机专业同学而言,刷题前最好系统学习下数据结构和算法这门课程,切忌管中窥豹。程序=数据结构+算法,前面提到的北大《程序设计与算法》专项课程里就有这门课。然后就是苦练刷题技能了,刷题过程中注意多总结吧~~
当然,也不否认有一部分同学误入歧途,深陷泥潭......我相信也有一部分人同学毕业之后就再也不会接触这些,挺好的,早放弃早快乐~~
三十而立之年,如果还在整天苦苦地码代码......
呃,不敢想象,那一定不是我想要的生活~~
对于这一类同学而言,计算机视觉可能会成为你人生中的一项常识
五年后的某一天,当你坐上无人汽车时,一点都不会感到惊讶。当然,也祝愿它会给你的人生带来更多改变~~
祝大家炼丹愉快,学习顺利,关注我,不迷路~~