天天看點

非計算機,如何學習計算機視覺

這兩年,計算機視覺似乎火了起來計算機視覺的黃金時代真的到來了嗎?。生物醫學、機械自動化、土木建築等好多專業的學生都開始研究其在各自領域的應用,一個視覺交流群裡三分之一以上都不是計算機相關專業的。當然,我也是其中一員。

對于非計算機相關專業的學生而言,學習過程中往往缺少交流機會,不容易把握知識的全貌。這裡僅根據個人經驗談一談對于一名非計算機專業的學生而言,該如何學習計算機視覺。

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++ primer》或《C++ primer plus》這樣的大塊頭書,我自己感覺倒不如《王道程式員求職寶典》這類書實用。大塊頭書優點在于全面,同時也往往導緻了重點不突出。碼代碼時不熟悉的用法一般直接在cppreference上搜就可以了,超級友善;但有些不容易了解的地方确實需要系統的找資料學習一下。課程的話推薦coursera上北大的《程式設計與算法》,第3門課程是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時用哪個庫吧。目前為止還沒有大一統的趨勢,連各個大公司都是自己用自己開發的,一塊大肥肉大家都不舍得放棄。我隻用過keras和tensorflow,感覺在這方面沒必要太計較,用相對簡單的和大家都用的(生态好) 。

4.數學

一切工程問題歸根結底都是數學問題,這裡說說計算機視覺和機器學習所涉及的數學問題。

  • 微積分:比如圖像找邊緣即求微分在數字圖像裡是做差分(離散化)啦,光流算法裡用到泰勒級數啦,空間域轉頻域的傅立葉變換啦,還有牛頓法、梯度下降、最小二乘等等這些都用的特别普遍了。其實個人感覺CV所涉及的微積分知識相對簡單,積分很少,微分也不是特别複雜。也可能是大學那會兒力學學怕了吧。

    我好像沒備微積分的資料,如果需要的話,同濟大學出的大學教材應該也夠用了吧。

  • 機率論與統計:這個比較高深,是應用在機器學習領域裡最重要的數序分支。應用比如:條件機率、相關系數、最大似然、大數定律、馬爾可夫鍊等等。

    浙大的《機率論與數理統計》我感覺還行,夠用。

  • 線性代數與矩陣:數字圖像本身就是以矩陣的形式呈現的,多個向量組成的樣本也是矩陣這種形式非常常見,大多機器學習算法裡每個樣本都是以向量的形式存在的,多個矩陣疊加則是以張量(tensor)的形式存在google深度學習庫tensorflow的字面意思之一。具體應用,比如:世界坐标系->相機坐标系->圖像坐标系之間的轉換,特征值、特征向量,範數等。

    推薦本書,國外的上課教材《線性代數》。因為浙大的那本教材感覺實在不太行,買過之後還是又買了這本。

  • 凸優化:這個需要單獨拎出來說一下。因為太多問題(尤其機器學習領域)都是優化問題(求最優),凸優化是裡面最簡單的形式,是以大家都在想辦法怎麼把一般的優化問題轉化為凸優化問題。至于單純的凸優化理論,好像已經比較成熟了。在機器學習裡,經常會看到什麼求對偶問題、KKT條件等,潛下心花兩天學一學。

    建議備一份高校關于凸優化的教學課件,大家對這一塊畢竟比較生,缺乏系統感。比如北大的《凸優化》課程。

這些數學知識沒必要系統學習,效率低又耗時。畢竟大家都有大學的基礎,夠了。一般用到的時候學,學完之後總結一下。如果真想學習的話,七月線上有個課程《機器學習中的數學》,講的一般,倒不妨看一看。

介紹個小trick,之前學習好多數學知識或算法時,看不懂教材上晦澀死闆的講解,一般都會搜尋“

XXX 形象解釋

”,往往都會搜到些相對通俗易懂的解釋也往往都是在知乎上搜到的這些解答,比如拉格朗日乘子法如何了解?, 如何通俗并盡可能詳細解釋卡爾曼濾波? 。

5.授之以魚不如授之以漁

程式設計能力->計算機視覺->機器學習->數學知識,前文已經把所要學習的知識基本都介紹完了。不知道你有沒有冒出疑問:你怎麼知道的這些?你平時怎麼學習的?

先說第一條:時間,時間的積累。講個故事,去年暑期在華東師大參加一個關于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紙總結整理一下放檔案夾裡,備日後翻閱。這樣有助于提升你的數學能力,加深對算法的了解。
  • 學習新技能,講究效率。在大家智力、體力水準都相當的情況下,怎麼比别人學得更快更好?這裡介紹一個自己快速學習一項新技能的方法:花兩周時間把兩本書看兩遍。具體解釋是:機關時間内,把兩本書看一遍不如把一本書看兩遍,在不确定哪本書具有絕對優勢時最好兩本書都看(不要把雞蛋放進一個籃子裡)。當然,一定要快!!!對于寫代碼而言,看書的同時實踐也是非常重要。

6.工作

這一點好像跟學習本身關系不大,但跟大多數學習者本身(比如我)關系很大。

花開兩朵,各表一枝。

  • 不少人可能跟我一樣都是沖着現在計算機視覺很火、有前景又比較感興趣,是以選擇學計算機視覺,并且以後想要從事計算機視覺這方面的工作。。一定要擺正心态,找工作時可能就要跟那些計算機專業的學生們競争了;最好從現在起,就把自己當一名程式員看待。當然你也有自己的優勢,你擁有自己專業的領域知識這對某些公司來說很重要,你找工作時基本上也都應該重點考慮這些公司。,你對視覺的具體應用本身也比較了解;劣勢是你缺乏計算機專業的基本素養,具體到筆試或面試中就是你基礎程式設計能力不行。

    說到這裡,大家應該都聽說過“刷題”這回事。程式員應聘的特點之一就是首先面試者會考查一些基礎的算法題,借此評估一下你的基本程式設計能力。其實計算機專業的學生在工作季前也要在leetcode等平台上刷刷題練練手,不然他們也過不了第一關。不過,對于我們非計算機專業學生而言,刷題前最好系統學習下資料結構和算法這兩門課。程式=資料結構+算法,前面提到的北大《程式設計與算法》專項課程裡就有這兩門課。然後就是苦練刷題技能了,刷題過程中注意多總結吧。(目前我也剛走到這一階段,是以不好多說。)

  • 當然我相信也有一部分人畢業之後就再也不會接觸這些破玩意兒,挺好的。三十而立之年,如果我還在整天苦逼地碼代碼,,,呃,不敢想象,那一定不是我想要的生活。對于這些人而言,計算機視覺可能會成為你人生中的一項常識——五年後的某一天,當你坐上無人車時,一點都不會感到驚訝。當然,也祝願它會給你的人生帶來更多改變,你所學的專業對你思維上最大的影響是什麼?

說完了,有用或沒用的、該說或不該說的、跟視覺相關或不相關的都說了好多,收個尾:管理好自己,。

還有,,,如果你誠心正意把計算機視覺作為個人事業并嚴肅認真對待的話,可以看下這篇文章《初探計算機視覺的三個源頭、兼談人工智能|正本清源》,知道計算機視覺不是隻有現在的深度學習。

轉自:http://blog.csdn.net/NNNNNNNNNNNNY/article/details/64240575?locationNum=13&fps=1。

繼續閱讀