1. 程式人生 > >一些關於計算機視覺的思考和學習方法

一些關於計算機視覺的思考和學習方法

轉自:https://me.csdn.net/ali_start (該博主也是轉載的,很遺憾我沒能找到這篇博文真正的作者,如果原文博主看到這篇文章,請您私信我,很想向您請教一些問題)

這兩年,計算機視覺似乎火了起來計算機視覺的黃金時代真的到來了嗎?。生物醫學、機械自動化、土木建築等好多專業的學生都開始研究其在各自領域的應用,一個視覺交流群裡三分之一以上都不是計算機相關專業的。當然,我也是其中一員。 
對於非計算機相關專業的學生而言,學習過程中往往缺少交流機會,不容易把握知識的全貌。這裡僅根據個人經驗談一談對於一名非計算機專業的學生而言,該如何學習計算機視覺。

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學起來很簡單,看別人程式碼的過程就是學習的過程。對於不熟悉的用法多搜下官方文件,如pythonnumpy,pandasmatplotscikit-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)等,當然也有一些很酷又好玩的東西比如edges2catsdeepart。本人主要做一些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等平臺上刷刷題練練手,不然他們也過不了第一關。不過,對於我們非計算機專業學生而言,刷題前最好系統學習下資料結構和演算法這兩門課。程式=資料結構+演算法,前面提到的北大《程式設計與演算法》專項課程裡就有這兩門課。然後就是苦練刷題技能了,刷題過程中注意多總結吧。(目前我也剛走到這一階段,所以不好多說。)
  • 當然我相信也有一部分人畢業之後就再也不會接觸這些破玩意兒,挺好的。三十而立之年,如果我還在整天苦逼地碼程式碼,,,呃,不敢想象,那一定不是我想要的生活。對於這些人而言,計算機視覺可能會成為你人生中的一項常識——五年後的某一天,當你坐上無人車時,一點都不會感到驚訝。當然,也祝願它會給你的人生帶來更多改變,你所學的專業對你思維上最大的影響是什麼?

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

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