1. 程式人生 > >計算機視覺學習經驗總結

計算機視覺學習經驗總結

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入門環境搭建。下面,推薦一些入門和進階的書籍 

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