计算机视觉学习经验总结

1.编程能力

1.1 编程语言(C++, python)

  刚接触CV(computer vision)(注:本文偏向于图像学而非图形学)时,大家一般都会不假思索地选择使用C++:装个VS(Visual Studio),配置下opencv,撸起袖子就上了。这样做非常合理,几乎所有人都是这么入门的。 不过,当你知识面扩展开后,你会感觉到很多时候C++都显得有些力不从心。比如:当你要画一些图表或做一些分析,就还得把数据导入MATLAB里做进一步处理;当你要非常快捷方便地学习或测试一个算法,C++会是你最糟糕的选择;或者当你要学习深度学习时,你绝对不会再选择使用C++….总之,有太多理由会促使你再学习一门编程语言,最好的选择没有之一:python。

1.1.1 简单介绍一下C++和python的各自特点:

  • C++:偏底层,执行效率高,适合嵌入式等平台上使用;在视觉领域,C++生态好,用的人多,网上找资源很方便。 缺点是开发效率实在太低了,关于这一点如果你只是专注于图像处理的话可能感受不是那么真切,因为opencv库做得足够好。但是当你做到机器学习后,opencv就显得有些力不从心了,虽然它也包含一些SVM、神经网络等的简单实现,但毕竟不擅长。

  • python:全能语言,干啥都行,并且都相对擅长。图像处理,opencv支持有python接口;科学计算,其功能类似于matlab了:机器学习及深度学习,python是最好用的,没有之一;爬虫等网络应用,豆瓣就是用python写的;简而言之,方便,实在太方便了。 
    当然python也有自己的另一面。执行效率不高,这一点做嵌入式开发的可能比较忌讳。但如今手机的内存都升到6G了,tensorflow都可以在移动端跑了,Python也都可以用来控制STM32了,未来很难说。

  顺便说一句也有人使用MATLAB等做图像方面的研究,如果你只是偶尔用图像处理辅助一下你的研究,可以这么做,一般情况下不建议使用。

1.1.2 C++和python学习资源推荐

  • C++: 
    • 初级入门 
      如果你是一个无编程经验的C++初学者,或者有其它语言经验的C++初学者,那强烈推荐下面的书籍。 
      • C++ Primer作者:Stanley Lippman, Josée Lajoie, and Barbara E. Moo (更新到C++11) (不要和 C++ Primer Plus–Stephen Prata搞混了)近1千页,本书透彻的介绍了C++,以浅显和详细的方式讲到C++语言差不多所有内容。2012年8月发行的第五版包含C++11的内容 
        电子书:第三版(中文)、第四版(中文)、第五版(英文版)
      • Accelerated C++ 作者:Andrew Koenig and Barbara Moo 这本书覆盖了和C++ Primer一样的内容,但厚度只有C++ Primer的四分之一。这主要是因为本书面向的不是编程的初学者,而是有其它语言经验的C++初学者。对于初学者,本书学习曲线稍显陡峭,但对于能克服这一点的学习者而言,它确实非常紧凑的介绍了C++这门语言。 
        电子书:中文版,英文版
      • C++编程思想(Thinking in C++) 作者:Bruce Eckel 共两卷,第二卷主要将标准库,但还是不错的。 
        电子书:第二版V2(英文版)、第二版V2(中文版)
    • 最实用 
      • Effective C++ 作者:Scott Meyers 本书以瞄准成为C++程序员必读的第二本书籍而写,Scott Meyers成功了。早期的版本面向从C语言转过来的程序员。第三版修改为面向从类似Jave等语言转来的程序员。内容覆盖了50多个很容易记住的条款,每个条款深入浅出(并且有趣)讲到了你可能没有考虑过的C++规则。 
        电子书:第三版(英文)、第三版(中文)
      • C++程序设计原理与实践 (Programming: Principles and Practice Using C++ )作者:Bjarne Stroustrup C++之父写的C++入门书籍。本书面向没有编程经验的初学者,但相信有编程经验的人也能从本书中学到不少东西。 
        电子书:中文版
  • python: 
      基础部分看廖雪峰的python教程就可以了,然后就是用哪一块学哪一块了。python学起来很简单,看别人代码的过程就是学习的过程。对于不熟悉的用法多搜下官方文档,如python, numpy,pandas, matplot, scikit-learn。这里有几张python各种库的小抄表其实直接在网上搜这几张表也都比较方便。课程的话,我之前上过一些七月算法的课程,讲得不好,多少会给你一些知识体系和各种学习资料,总体不推荐或跳着看。python的开发环境值得说一下,因为有太多选择,这里比较建议使用pycharm和jupyter notebook吧,具体参考python入门环境搭建。下面,推荐一些入门和进阶的书籍 
    • 初级入门 
      《简明Python教程》 
      《父与子的编程之旅》 
      《笨办法学Python》 
      《深入浅出Python》 
      《像计算机科学家一样思考python》 
      《Python编程:入门到实践》 
      《廖雪峰Python教程》 
      《Python 入门指南》
    • 进阶 
      《Python学习手册》 
      《Python核心编程第3版》 
      《Python进阶》 
      《编写高质量Python代码的59个有效方法》 
      《Python CookBook》 
      《流畅的Python》 
      《Python源码剖析》

1.2 编程平台(windows, linux)

  新手肯定都用windows了,学习过程中发现在windows上搞不定了,先忍几次,然后掉头就去学linux了。一定是这样。 哪些在windows上真的搞不定呢?比如:deeplearning,或最新论文中提出的视觉开源算法。 不过对我们而言,linux并不需要了解太深。装个ubuntu系统,常用的文件操作、程序编译等知道就OK了。我完全是在使用的过程中现用现学,手边常备一本书《鸟哥的linux私房菜》。

2.视觉知识

  计算机视觉实在很广了,目前比较热门的方向总体上分为两大块:一块是深度学习,一块做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技术:这一部分了解不多,不做太多评价,有兴趣的可以自己谷歌一下

3.机器学习

  计算机视觉中使用的机器学习方法个人感觉不算多,早期的时候会用SVM做分类,现在基本都用深度学习选特征+分类。原因在于统计机器学习这一块虽然方法不少,但是基本都无法应对图像这么大的数据量。 不过大家在学习过程中很容易接触到各种机器学习方法的名字因为现在大数据分析、机器学习、语音识别、计算机视觉等这些其实分得不是很开,然后不自觉地就会去了解和学习。这样我感觉总体来说是好的。不过在学习一些暂时用不着的算法时,个人感觉没必要做的太深:重在理解其思想,抓住问题本质,了解其应用方向。 
下面分开介绍一下传统机器学习算法和深度神经网络

  传统机器学习一般也就决策树、神经网络、支持向量机、boosting、贝叶斯网等等吧。方法挺多的,同一类方法不同的变形更多。除了这些监督式学习,还有非监督学习、半监督学习、强化学习。当然还有一些降维算法(如PCA)等。对这些个人整体把握的也不是特别好,太多了。 
学习资料,吴恩达的coursera课程《Machine Learning》,他正在出一本新书《MACHINE LEARNING YEARNING》,说好陆续更新的,刚更新一点就没了,本来想翻译学习一下。个人比较喜欢他的课程风格话说今天中午传出新闻,吴恩达从百度离职了。——执笔于2017.03.22,简单易懂。还有李航的《统计学习方法》和周志华的《机器学习》,两本在国内机器学习界成为经典的书。 
  深度学习主要的发展就是CNN、RNN;从去年起GAN火起来了,现在如日中天;增强学习现在发展也非常快,有些名校如CMU都开这方面课程了。 
资料上面说过就不说了喜欢高雅的人也可以看看这个深度学习论文阅读路线图 ,说说在使用deeplearning时用哪个库吧。目前为止还没有大一统的趋势,连各个大公司都是自己用自己开发的,一块大肥肉大家都不舍得放弃。感觉在这方面没必要太计较,用相对简单的和大家都用的(生态好) 。

4.数学

  一切工程问题归根结底都是数学问题,这里说说计算机视觉和机器学习所涉及的数学问题。

  微积分:比如图像找边缘即求微分在数字图像里是做差分(离散化)啦,光流算法里用到泰勒级数啦,空间域转频域的傅立叶变换啦,还有牛顿法、梯度下降、最小二乘等等这些都用的特别普遍了。 
  概率论与统计:这个比较高深,是应用在机器学习领域里最重要的数序分支。应用比如:条件概率、相关系数、最大似然、大数定律、马尔可夫链等等。 浙大的《概率论与数理统计》感觉还行,够用。 
  线性代数与矩阵:数字图像本身就是以矩阵的形式呈现的,多个向量组成的样本也是矩阵这种形式非常常见,大多机器学习算法里每个样本都是以向量的形式存在的,多个矩阵叠加则是以张量(tensor)的形式存在google深度学习库tensorflow的字面意思之一。具体应用,比如:世界坐标系->相机坐标系->图像坐标系之间的转换,特征值、特征向量,范数等。 推荐国外的上课教材《线性代数》。因为浙大的那本教材感觉实在不太行,买过之后还是又买了这本。 
  凸优化:这个需要单独拎出来说一下。因为太多问题(尤其机器学习领域)都是优化问题(求最优),凸优化是里面最简单的形式,所以大家都在想办法怎么把一般的优化问题转化为凸优化问题。至于单纯的凸优化理论,好像已经比较成熟了。在机器学习里,经常会看到什么求对偶问题、KKT条件等,潜下心花两天学一学。 建议备一份高校关于凸优化的教学课件,大家对这一块毕竟比较生,缺乏系统感。比如北大的《凸优化》课程。这些数学知识没必要系统学习,效率低又耗时。毕竟大家都有本科的基础,够了。一般用到的时候学,学完之后总结一下。

原文:https://blog.csdn.net/ksws0292756/article/details/78876125

你可能感兴趣的:(计算机视觉,AI,computer,vision)