如何學習OpenCV
本文授權轉載自賈老師的微信公眾號"OpenCV學堂"。更多信息可掃描文末二維碼關注公眾號(知乎已將二維碼轉換成鏈接,可自動跳轉到微信)。
一:學習OpenCV三個階段
人工智慧帶火了計算機視覺的人才需求,作為計算機視覺應用開發框架OpenCV也越來越受到歡迎,市場需求大增,很多人聽說了之後就迫不及待的想加入這波大軍,這其中很多人他可能懂應用編程,但是計算機視覺零基礎,一般都是我要識別個什麼,而且還有時間限制,一般都是一個月左右時間,急功近利的心態可見一斑。
學了幾個API之後看到了點效果就覺得OpenCV也沒什麼嘛,感覺跟我搞應用開發一樣啊,很快上手啦,就在這個時候發現應用場景稍微有點改變,之前那一點點的效果也沒有了,什麼都識別不了,然後又發現還有這麼多東西要學,才發現這個演算法沒聽說過、那個演算法不知道,甚至連他自己調用的演算法API那些參數是什麼意思也沒搞懂怎麼調,於是他們就會抱怨OpenCV做的也太差了,壓根不行啊,才發現做計算機視覺好難,其實是他們學習OpenCV的打開方式不對。
正確的打開方式應該是這樣:首先學習基礎,如何知道自己的圖像處理與計算機視覺的基礎如何呢,很簡單,如果你能正確回答下面的十個問題,那說明你還是有點圖像處理基礎的。
1.圖像常見的格式有
- A.jpg
- B.tiff
- C.png
- D.webp
2.常見的圖像通道數可能是:
- A. 單通道
- B.雙通道
- C. 三通道
- D.四通道
3.數字圖像中最小數據單元是什麼
- A. 像素
- B.亞像素
- C.超像素
- D.顏色
4.常說的圖像濾波是什麼數學原理
- A. 傅立葉變換,
- B.離散餘弦變換
- C.卷積
- D.距離變換
5.常見的圖像插值演算法有
- A. 最近鄰
- B. 雙立方
- C. lanczos插值
- D.雙線性
6.常見的RGB圖像每個像素點顏色值範圍
- A. 0~1
- B. 0~256
- C.0~255
- D.0~180
7.關於RGB色彩的描述下面正確的是:
- A.RGB(255,255,255)表示黑色
- B.RGB(0,0,255)表示藍色
- C.RGB(255,0,0)表示綠色
- D.RGB(0,0,0)表示白色
8.常見的圖像色彩空間有:
- A. HSL
- B. HSV
- C. RGB
- D. YCrCb
9.常見的圖形繪製時候像素渲染方法有
- A.四鄰域渲染
- B.八鄰域渲染
- C.透明通道混合反鋸齒渲染
- D.遊戲渲染
10.下面關於RGB圖像亮度與對比度說法正確的是
- A.顏色值越高,亮度越高
- B.降低圖像亮度會影響圖像對比度
- C.亮度就是圖像對比度
- D.圖像對比度就是圖像直方圖
上面10道題是圖像處理基礎知識考察,其考察目的是檢驗是否擁有學習OpenCV一些必備的基礎知識,如果你一半都沒有做對(關注公眾號,發送 【答案】兩個字,即可查看答案),我覺得暫時你應該先放下你的那些識別、檢測的目標,而是老老實實的看視頻課程或者圖書、博客文章等,釐清這些基本概念,本人根據自己學習圖像處理、計算機視覺與OpenCV親身經歷,總結一個學習路線圖,僅供大家參考:
大致分為三個階段,第一個階段應該是基礎,第二個階段是提升、第三個階段是應用,而很多初學者一般都看重的是第三部分,素不知前面還有N多東西沒學,正所謂「千里之行,始於足下」。只有走好學習OpenCV的第一步我們才能走好剩下的999步。否則就會出現「欲速則不達」的尷尬局面,貌似懂,一做應用什麼都不行,調用哪個OpenCV演算法函數都無法解決問題的進退維谷之中。
二:做內外兼修的OpenCV開發者
OpenCV3.x中集成了超過1000個演算法模塊,這些演算法如何組合使用,他們的參數意義,演算法的原理與適用場景條件等各不相同,要成為一個真正的OpenCV開發高手,必須精通常見的演算法原理,各個參數意義,參數使用等。
就拿我們最常見的OpenCV中HAAR人臉檢測來說吧,整個代碼演示我可以做到20行以內實現,但是具體到應用場景,我就聽到有人跟我說HAAR級聯人臉檢測速度太慢了這樣的抱怨,原因是他連最基本的各個參數是什麼意思都沒搞清楚,更談不上調參數優化啦HAAR級聯檢測器API調用如下:
void cv::CascadeClassifier::detectMultiScale( InputArray image, std::vector<Rect> & objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() )
- 第一個參數image是輸入圖像 第二個參數objects檢測到的人臉BOX位置信息
- 第三個參數是放縮比率,這個參數是用來構建HAAR多尺度用的
- 第四個參數是計算人臉BOX的最小相鄰個數 第五個參數是標誌,在OpenCV3.0以後的版本中已經不再使用,沒有任意意義
- 第六個參數是檢測人臉時,可以檢出BOX的最小寬高
- 第七個參數是檢測人臉時,可以檢出BOX的最大寬高
上述的七個參數,對檢測速度與檢測結果影響比較大的分別是第三、第四、第六、第七個參數,第六與第七個參數是設置大小,這個很容易理解,比較難理解的是第四個,最小相鄰個數,假設最小相鄰數目取3、則有下圖:
表示在最終紅色BOX人臉檢測結果是基於HAAR級聯檢測磚紅色、青色、藍色框的求得平均值得到紅色BOX框,理論上3表示至少有三個候選,這個參數值越大,檢測結果輸出人臉的準確率越高,同樣耗時也會越長、還會導致漏檢率增加。
而很多初學者沒有仔細了解該參數的意義,更無從談起如何優化參數,另外三個參數,如果考慮速度的話,最好設置最大與最小可檢測人臉BOX範圍,這裡有利於減少計算時間,提升實時性能。這裡只是通過這個例子來說明OpenCV中的各個演算法API參數重要性,要成為OpenCV開發高手,個人認為要做到內外兼修,這裡內是指相關數學、演算法論文都認真讀、仔細的研究,不斷加深對相關演算法的理解與領悟;外是指要加強動手能力,編程能力,做為OpenCV開發者我們首要職責就是負責讓視覺相關應用落地,沒有很強悍的工程能力與解決問題能力很難做到這點。結合本人的親身實踐和學習路徑,建議在學習OpenCV 編程時搞清楚幾點對學習更加有幫助
- 學習API函數時查找相關論文,嘗試閱讀論文
- 搞清楚學到的每個演算法相關數學基礎,嘗試理解相關參數意義
- 學會看OpenCV官方的文檔與代碼示例
- 古語云「獨學而無有、孤陋則寡聞」,所以多認識一些OpenCV學習者與開發者
- 從最新版本開始學習,OpenCV已經發布了OpenCV3.4.1最新版本,建議學習從OpenCV3.4開始學習,避免學習一些過期的API給自己帶來不必要的煩惱與負擔。
- C++還是Python,當前OpenCV SDK支持C++與Python SDK,所以無論選擇哪一種語言都可以學習OpenCV。
三:關注業界動態、緊跟技術潮流
如果你成功了經歷了前面幾個階段,應該恭喜你是一個真正的OpenCV開發者啦,但是這個時候還有清醒的意識到你只是一個知道和熟悉常見OpenCV中演算法、使用它們解決實際問題的開發者而已,要學會關注業界動態,關注OpenCV框架的新發展與新動向、特別是新演算法在OpenCV框架中的實現與SDK發布。
舉例來說DNN模塊發布已經快一年了,本人一直跟蹤OpenCV的每個Release、深刻感受到它的功能越來越完善與強大,個人觀點以後OpenCV的大部分對象檢測與識別都可能基於DNN模塊實現,這樣的好處是對開發者顯而易見,即降低了學習門檻,有提高了檢測準確性與精度,對於DNN這樣的新模塊,作為OpenCV開發者的你是否一直在不斷跟蹤它,另外注意學術界的動態,OpenCV社區會很快把一些最新CVPR上面的論文變成想法演算法模塊的,所以對一些影響比較大的CVPR的論文有條件要及時跟進閱讀與理解。
很多人想學習人工智慧相關的熱門技術,我覺得OpenCV就是很接地氣,也很好的方向選擇,也不需要太過深奧的數學知識,即使零基礎也可以學會、學好。正如古人所說「假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假於物也」,藉助OpenCV這個神兵利器,開發者也會從檢測到識別無所不能。後記
也許不適合所有人,但是如果能對初學者有一點幫助,也算值得我寫下上面幾百字的肺腑之言了!千里之行、始於足下。
OpenCV學堂公眾號??
http://weixin.qq.com/r/-UwcBEzECBF3rQhn9xnv (二維碼自動識別)
另外宣傳一波公眾號博主賈老師的線上課程(部分課程需要自掏腰包)
賈志剛的網路課堂,賈志剛 深度學習,計算機視覺,自然語言 大講堂 - 51CTO學院特級講師最後的最後
如果喜歡小林的專欄,就收藏了吧!してください!
推薦閱讀:
※2017年歷史文章匯總|深度學習
※讀論文系列:Object Detection NIPS2015 Faster RCNN
※菜鳥學tensorflow
※【CVPR2018正式公布】行人重識別論文
※【小林的OpenCV基礎課 10】Canny邊緣檢測