这两年,计算机视觉似乎火了起来计算机视觉的黄金时代真的到来了吗?。生物医学、机械自动化、土木建筑等好多专业的学生都开始研究其在各自领域的应用,一个视觉交流群里三分之一以上都不是计算机相关专业的。当然,我也是其中一员。
对于非计算机相关专业的学生而言,学习过程中往往缺少交流机会,不容易把握知识的全貌。这里仅根据个人经验谈一谈对于一名非计算机专业的学生而言,该如何学习计算机视觉。
刚接触CV(computer vision)(注:本文偏向于图像学而非图形学)时,大家一般都会不假思索地选择使用C++:装个VS(Visual Studio),配置下opencv,撸起袖子就上了。这样做非常合理,几乎所有人都是这么入门的。
不过,当你知识面扩展开后,你会感觉到很多时候C++都显得有些力不从心。比如:当你要画一些图表或做一些分析,就还得把数据导入MATLAB里做进一步处理;当你要非常快捷方便地学习或测试一个算法,C++会是你最糟糕的选择;或者当你要学习深度学习时,你绝对不会再选择使用C++….总之,有太多理由会促使你再学习一门编程语言,最好的选择没有之一:python。
C++:偏底层,执行效率高,适合嵌入式等平台上使用;在视觉领域,C++生态好,用的人多,网上找资源很方便。
缺点是开发效率实在太低了,关于这一点如果你只是专注于图像处理的话可能感受不是那么真切,因为opencv库做得足够好。但是当你做到机器学习后,opencv就显得有些力不从心了,虽然它也包含一些SVM、神经网络等的简单实现,但毕竟不擅长。python:全能语言,干啥都行,并且都相对擅长。图像处理,opencv支持有python接口;科学计算,其功能类似于matlab了:机器学习及深度学习,python是最好用的,没有之一;爬虫等网络应用,豆瓣就是用python写的;简而言之,方便,实在太方便了。
当然python也有自己的另一面。执行效率不高,这一点做嵌入式开发的可能比较忌讳。但如今手机的内存都升到6G了,tensorflow都可以在移动端跑了,Python也都可以用来控制STM32了,未来很难说。
顺便说一句也有人使用MATLAB等做图像方面的研究,如果你只是偶尔用图像处理辅助一下你的研究,可以这么做,一般情况下不建议使用。
新手肯定都用windows了,学习过程中发现在windows上搞不定了,先忍几次,然后掉头就去学linux了。一定是这样。
哪些在windows上真的搞不定呢?比如:deeplearning,或最新论文中提出的视觉开源算法。
不过对我们而言,linux并不需要了解太深。装个ubuntu系统,常用的文件操作、程序编译等知道就OK了。我完全是在使用的过程中现用现学,手边常备一本书《鸟哥的linux私房菜》。
计算机视觉实在很广了,这里仅针对我个人知识体系来说一说。
现在比较热门的方向总体上分为两大块:一块是深度学习,一块做SLAM。它们的研究点区别在哪呢?深度学习这一群体侧重于解决识别感知(是什么)问题,SLAM侧重于解决几何测量(在哪里)问题ICCV研讨会:实时SLAM的未来以及深度学习与SLAM的比较。拿机器人来说,如果你想要它走到你的冰箱面前而不撞到墙壁,那就需要使用 SLAM;如果你想要它能识别并拿起冰箱中的物品,那就需要用到深度学习机器人抓取时怎么定位的?用什么传感器来检测?。当然这两方面在research上也有互相交叉融合的趋势。
不过在学习这些之前,一般都会先掌握下传统的计算机视觉知识,也就是图像处理这一部分了。我之前大致总结过一次:
计算机视觉初级部分知识体系。这些基础知识的理解还是挺有必要的,有助于你理解更高层知识的本质,比如为什么会出现deeplearning等这些新的理论知识(感觉有点像读史了,给你智慧和自由)。这一部分学习资料的话还是挺推荐浅墨的《OpenCV3编程入门》 也可以看他的博客。当然他的书有一个问题就是涉及理论知识太少,所以推荐自己再另备一本偏理论一点的图像处理相关的书,我手边放的是《数字图像处理:原理与实践》,差强人意吧。个人之前看浅墨书的时候做了一份《OpenCV3编程入门》学习笔记,里边包含一些理论知识和个人见解。
下面说一下两个大的方向:基于深度学习的视觉和SLAM技术。
- 基于深度学习的视觉:机器学习包括深度学习里的大部分算法本质上都是用来做“分类”的。具体到计算机视觉领域一般就是物体分类(Object Classification)、目标检测(Object Detection)、语义分割(Image Semantic Segmentation)等,当然也有一些很酷又好玩的东西比如edges2cats、deepart。本人主要做一些Object Detection相关的东西。其实一般是直接跑别人的代码了,稍微做一些修改和参数调整,前期的预处理才是主要工作。这些程序基本都是在linux下跑的。好,深度学习为什么这么强?它主要解决了什么问题呢?我比较认同以下三点:学习特征的能力很强,通用性强,开发优化维护成本低 参见为什么深度学习几乎成了计算机视觉研究的标配?。
关于这一部分的学习,主要就是deeplearning了。关于deeplearning,漫天飞的各种资源。可以看一看李宏毅的一天搞懂深度学习课件 youtube上有一个一天搞懂深度學習–學習心得;李飞飞的CS231n课程,网易云课堂有大数据文摘翻译的中文字幕版课程,知乎专栏智能单元有CS231N课程翻译(非常好);三巨头之一Yoshua Bengio的新作《DEEP LEARNING》,目前已有中译版本 。- SLAM技术:这一部分我了解不多,只是听过一些讲座。可以关注下泡泡机器人 公众号吧,他们公开课出得挺多的;听说高博的新书快出了,我也想赶紧入手偷偷学一下。
计算机视觉中使用的机器学习方法个人感觉不算多,早期的时候会用SVM做分类,现在基本都用深度学习选特征+分类。原因在于统计机器学习这一块虽然方法不少,但是基本都无法应对图像这么大的数据量。
不过大家在学习过程中很容易接触到各种机器学习方法的名字因为现在大数据分析、机器学习、语音识别、计算机视觉等这些其实分得不是很开,然后不自觉地就会去了解和学习。这样我感觉总体来说是好的。不过在学习一些暂时用不着的算法时,个人感觉没必要做的太深:重在理解其思想,抓住问题本质,了解其应用方向。
下面分开介绍一下传统机器学习算法和深度神经网络。
- 传统机器学习一般也就决策树、神经网络、支持向量机、boosting、贝叶斯网等等吧。方法挺多的,同一类方法不同的变形更多。除了这些监督式学习,还有非监督学习、半监督学习、强化学习。当然还有一些降维算法(如PCA)等。对这些个人整体把握的也不是特别好,太多了。
学习资料,吴恩达的coursera课程《Machine Learning》,他正在出一本新书《MACHINE LEARNING YEARNING》,说好陆续更新的,刚更新一点就没了,本来想翻译学习一下。个人比较喜欢他的课程风格话说今天中午传出新闻,吴恩达从百度离职了。——执笔于2017.03.22,简单易懂。还有李航的《统计学习方法》和周志华的《机器学习》,两本在国内机器学习界成为经典的书。- 深度学习说着感觉有点心虚,哈哈总共就这几年就那些东西,资料上面视觉知识部分已经说过了,听听课程、看看那些出名的模型框架,基本上也就了解了《一天搞懂深度学习》其实就已经把大部分都给说了,不过个人感觉还是挺难理解的。主要的发展也就CNN、RNN;从去年起GAN火起来了,现在如日中天;增强学习现在发展也非常快,有些名校如CMU都开这方面课程了。
资料上面说过就不说了喜欢高雅的人也可以看看这个深度学习论文阅读路线图 ,说说在使用deeplearning时用哪个库吧。目前为止还没有大一统的趋势,连各个大公司都是自己用自己开发的,一块大肥肉大家都不舍得放弃。我只用过keras和tensorflow,感觉在这方面没必要太计较,用相对简单的和大家都用的(生态好) 。
一切工程问题归根结底都是数学问题,这里说说计算机视觉和机器学习所涉及的数学问题。
- 微积分:比如图像找边缘即求微分在数字图像里是做差分(离散化)啦,光流算法里用到泰勒级数啦,空间域转频域的傅立叶变换啦,还有牛顿法、梯度下降、最小二乘等等这些都用的特别普遍了。其实个人感觉CV所涉及的微积分知识相对简单,积分很少,微分也不是特别复杂。也可能是本科那会儿力学学怕了吧。
我好像没备微积分的资料,如果需要的话,同济大学出的本科教材应该也够用了吧。- 概率论与统计:这个比较高深,是应用在机器学习领域里最重要的数序分支。应用比如:条件概率、相关系数、最大似然、大数定律、马尔可夫链等等。
浙大的《概率论与数理统计》我感觉还行,够用。- 线性代数与矩阵:数字图像本身就是以矩阵的形式呈现的,多个向量组成的样本也是矩阵这种形式非常常见,大多机器学习算法里每个样本都是以向量的形式存在的,多个矩阵叠加则是以张量(tensor)的形式存在google深度学习库tensorflow的字面意思之一。具体应用,比如:世界坐标系->相机坐标系->图像坐标系之间的转换,特征值、特征向量,范数等。
推荐本书,国外的上课教材《线性代数》。因为浙大的那本教材感觉实在不太行,买过之后还是又买了这本。- 凸优化:这个需要单独拎出来说一下。因为太多问题(尤其机器学习领域)都是优化问题(求最优),凸优化是里面最简单的形式,所以大家都在想办法怎么把一般的优化问题转化为凸优化问题。至于单纯的凸优化理论,好像已经比较成熟了。在机器学习里,经常会看到什么求对偶问题、KKT条件等,潜下心花两天学一学。
建议备一份高校关于凸优化的教学课件,大家对这一块毕竟比较生,缺乏系统感。比如北大的《凸优化》课程。
这些数学知识没必要系统学习,效率低又耗时。毕竟大家都有本科的基础,够了。一般用到的时候学,学完之后总结一下。如果真想学习的话,七月在线有个课程《机器学习中的数学》,讲的一般,倒不妨看一看。
介绍个小trick,之前学习好多数学知识或算法时,看不懂教材上晦涩死板的讲解,一般都会搜索“XXX 形象解释
”,往往都会搜到些相对通俗易懂的解释也往往都是在知乎上搜到的这些解答,比如拉格朗日乘子法如何理解?, 如何通俗并尽可能详细解释卡尔曼滤波? 。
编程能力->计算机视觉->机器学习->数学知识,前文已经把所要学习的知识基本都介绍完了。不知道你有没有冒出疑问:你怎么知道的这些?你平时怎么学习的?
先说第一条:时间,时间的积累。讲个故事,去年暑期在华东师大参加一个关于ROS(Robot Operate System, 机器人操作系统)的Summer School。顺便提一句,主办者张新宇老师人特别nice。第一天上午的speaker叫Dinesh Manocha,Canny的学生。对,就是Canny边缘检测算法的Canny。Dinesh教授有一个保持了几十年的习惯:(平均)每天只睡4个多小时。用张新宇老师的一句总结就是:智力超群、体力超群、习惯超群。他还提到,未来中国要跟国外竞争,一定程度上就是体力的竞争。因为相比老外目前中国人在这方面不太重视。呃,,,反正我是弱的不行。应该加强的。
当然,在具体学习方法也有一些trick,不然怎么解释有的人效率高呢。当然聪明和底子能够解释部分原因。现在我就说一说自己学习过程中的小trick。
- google搜索。时代变了,一百年前的人类绝对想像不出自己有了困惑不是去翻书或请教他人而是告诉身旁的一台机器。如今,小学生做道算术题或小女生来个大姨妈都要问问电脑:这是怎么回事。但这些与学视觉又有什么关系呢?——答:没有。好像跑偏的有点多了,再扯远一点吧。跨越时间维度来思考一些新事物的发生及其与旧事物的联系,也许会给你一种想象的自由。比如电报、电话、视频聊天和全息通话用 HoloLens 通话 ,只是举例,我可没说以后这种技术真会普遍应用。,马车、汽车、火车、飞机和火箭太空旅行,蒸汽机、电、互联网和AI。
百度搜索太烂了(当然,它本地化搜索做得不错。并且我也没说完全是技术原因),有多烂?我认为它跟google搜索的差距不是1:2,是1:10。这一点好像不应该说这么多,大家都公认的。问题根源在于“中国特色”不允许我们使用google搜索,这里介绍一个非常方便的科学上网工具lantern(链接是它的github地址,官网墙内好像登不了。)。下载完安装之后直接运行即可。
还有一点,多使用英文搜索,这样呈现在你眼前的才是完整的世界。英文世界里优秀、原创资源多,浏览网页时不经意间也会遇到些好网站。比如曾经surf到一个计算机视觉方面的博客Learn OpenCV,通俗易懂,不频繁更新,几乎每篇文章必看。- 交流。这里特制人与人之间的交流,最好是面对面聊天。这样的好处是随意性大,随便一句话就可能指出你长期存在某个误区。对于我们(非计算机专业学生)而言,最缺的就是这种交流环境。所以大家只能尽量弥补了,比如通过各种途径认识点计算机专业或视觉方向的同学(蹭学校计算机视觉的课程);多加点相关的公众号,QQ、微信群不好的再删,当然自己也要主动参与这些社区。
- 书。好书基本上都是公认的,并且适合大部分人。有些人买书可能会有选择恐惧症,这一点,,,摆正心态吧,很多时候买书本来就不是为了读完,只要能给你一两次惊喜或节约你几小时宝贵时间,它的使命就已经完成了,值!!!当然买书也讲究个度,这个就如人饮水、冷暖自知了。
- PPT。PPT的出现在一定程度上对传统教材产生了冲击,方便,重点突出,体验舒服。个人几乎会把学习的所有课件都保存在ipad里推荐使用非常出名的备注记录软件Notability来保存和编辑你的PPT,听课时可以在上边做笔记,课后如果需要随时温故而知新。
- “一句话”抓住问题本质。算法太多,学过就忘。这可能是所有人遇到的问题。尤其对于那些学的不是特别深入的算法,倘或跟人聊起都不知道如何解释。“一句话”解释,就是用简单的几句话把一件事说清楚。比如《统计学习方法》里李航就提出统计机器学习的三要素:模型、策略和算法,针对某种机器学习方法根据这三要素梳理一下,你就已经把握到整体了,即使其中有些细节不理解也无伤大雅。想象一下如果有同学指着你桌上的书问你“机器学习是什么?”,你会不会一脸懵逼?我会,O(∩_∩)O。说一下个人理解,至少听起来是句人话:机器学习就是让机器学会自学,对已有信息进行归纳和识别,并自主获得新技能的能力。相比于传统计算机编程里直接告诉计算机“什么时候做什么”,机器学习通过“不显式编程”赋予计算机能力,即提供一些案例(训练数据),让计算机通过案例自己学习什么时候应该做什么。
- A4纸学习法。平常的一个个人习惯吧,感觉对自己比较有用,分享一下。对于某些算法,有时候可以自己花半天、一天或者两天动手推导一下,然后A4纸总结整理一下放文件夹里,备日后翻阅。这样有助于提升你的数学能力,加深对算法的理解。
- 学习新技能,讲究效率。在大家智力、体力水平都相当的情况下,怎么比别人学得更快更好?这里介绍一个自己快速学习一项新技能的方法:花两周时间把两本书看两遍。具体解释是:单位时间内,把两本书看一遍不如把一本书看两遍,在不确定哪本书具有绝对优势时最好两本书都看(不要把鸡蛋放进一个篮子里)。当然,一定要快!!!对于写代码而言,看书的同时实践也是非常重要。
这一点好像跟学习本身关系不大,但跟大多数学习者本身(比如我)关系很大。
花开两朵,各表一枝。
- 不少人可能跟我一样都是冲着现在计算机视觉很火、有前景又比较感兴趣,所以选择学计算机视觉,并且以后想要从事计算机视觉这方面的工作。。一定要摆正心态,找工作时可能就要跟那些计算机专业的学生们竞争了;最好从现在起,就把自己当一名程序员看待。当然你也有自己的优势,你拥有自己专业的领域知识这对某些公司来说很重要,你找工作时基本上也都应该重点考虑这些公司。,你对视觉的具体应用本身也比较了解;劣势是你缺乏计算机专业的基本素养,具体到笔试或面试中就是你基础编程能力不行。
说到这里,大家应该都听说过“刷题”这回事。程序员应聘的特点之一就是首先面试者会考查一些基础的算法题,借此评估一下你的基本编程能力。其实计算机专业的学生在工作季前也要在leetcode等平台上刷刷题练练手,不然他们也过不了第一关。不过,对于我们非计算机专业学生而言,刷题前最好系统学习下数据结构和算法这两门课。程序=数据结构+算法,前面提到的北大《程序设计与算法》专项课程里就有这两门课。然后就是苦练刷题技能了,刷题过程中注意多总结吧。(目前我也刚走到这一阶段,所以不好多说。)- 当然我相信也有一部分人毕业之后就再也不会接触这些破玩意儿,挺好的。三十而立之年,如果我还在整天苦逼地码代码,,,呃,不敢想象,那一定不是我想要的生活。对于这些人而言,计算机视觉可能会成为你人生中的一项常识——五年后的某一天,当你坐上无人车时,一点都不会感到惊讶。当然,也祝愿它会给你的人生带来更多改变,你所学的专业对你思维上最大的影响是什么?
说完了,有用或没用的、该说或不该说的、跟视觉相关或不相关的都说了好多,收个尾:管理好自己,。
还有,,,如果你诚心正意把计算机视觉作为个人事业并严肃认真对待的话,可以看下这篇文章《初探计算机视觉的三个源头、兼谈人工智能|正本清源》,知道计算机视觉不是只有现在的深度学习。