大話圖像處理之入門篇

最近有人問我圖像處理怎麼研究,怎麼入門,怎麼應用,我竟一時語塞。仔細想想,自己也搞了兩年圖像方面的研究,做個兩個創新項目,發過兩篇論文,也算是有點心得,於是總結總結和大家分享,希望能對大家有所幫助。

在寫這篇教程之前我本想多弄點插圖,讓文章看起來花哨一點,後來我覺得沒必要這樣做,大家花時間沉下心來讀讀文字沒什麼不好,況且學術和技術本身也不是多麼花哨的東西。

一、圖像處理的應用

這個其實沒什麼好說的,一種技術的應用價值不是靠嘴上說,而是要看有多少人去搞,很簡單的道理。其實我覺得判斷一項技術有沒有價值、有多大價值的最簡單最有效的方法就是看有多少人在研究它。如果大家都在研究,那必然說明它很火,至少目前很火,以後的幾年裏依然還會火。因此,如果你不確定圖像處理是不是有價值,那就查查全國圖像處理工程師的數量就行了。

當然這裏還是簡單提一下。如果你真的只想問“圖像處理有什麼用?”,相信百度會給出比我更專業的答案。不過作爲圖像處理的行內人,我還是從幾個基本的點來具體說一下。

1) 身份認證

21世紀是刷臉的時代,這一點無可厚非。首先是銀行,據說重慶的銀行已經使用了人臉識別的驗證系統來進行輔助的認證。

其次是門禁系統,以前是指紋,虹膜,現在就是人臉。指紋、虹膜的識別雖然準確,但是有侵犯性,採集的過程中有侵犯性,驗證的過程中也有侵犯性,反正讓誰天天錄指紋(採集指紋信息),用眼睛瞪攝像頭(採集虹膜信息),誰都會覺得不舒服的,況且手還會脫皮。

相比之下,人臉的識別就方便多了,拍張照片(採集人臉信息)誰都不會介意。最後是監控,一個攝像頭所拍的監控能從不同的角度記錄成百上千的人(比如車站等密集場所的監控),讓警察去辨認將是一個浩大的工程,要是系統能夠自動判別人員信息,無疑會給辦案帶來極大方便。

2) 監控安防

安防監控可以說是圖像處理領域最有潛力的應用領域。如今各個城市都在瘋狂的安裝監控攝像頭,全國時刻都有無數的攝像頭在錄監控,但是安防監控的後端處理卻沒跟上。

什麼是後端處理,簡單的說就是監控錄像的視頻處理。注意這裏的視頻處理可就不止包含人臉識別了,還有行人檢測、異常檢測、顯著性檢測、協同跟蹤等。人臉識別之前說了,這裏簡單說說行人異常檢測。

圖像處理中的行人異常檢測在外行人眼中是一個非常有魔力的東西。畢竟讓攝像頭通過監控視頻就能判斷出當前畫面中誰是好人誰是壞人(當然直接分爲好人和壞人還是太武斷了),在一般思維中貌似是不可能的。但是請不要忽略這樣一個事實,就是目前大部分監控視頻的分析處理都是由人工來完成的,警察破案時經常動不動就調出最近幾天的監控視頻,然後從頭看到尾,其工程量之大可想而知。也正是這樣才催生了人們對智能監控方面的研究,因爲有這方面的實際需求。當然我們的視頻分析程序不會直接給出諸如“好人or壞人”這樣的武斷而片面的判斷結果。

就當前的技術水平而言,能夠統計當下監控畫面中的人數(行人檢測)、定位他們的人臉(人臉檢測)、識別他們的身份(人臉識別)、判別他們的表情(表情識別)、檢測他們的動作(異常檢測),這就已經夠了。這樣以後人們就不會再面對長達幾十甚至上百個小時的監控視頻發呆,而是直接分析計算機給出的數據,當前畫面中有多少人、都是誰、誰的動作可疑等。總之,接下來智能監控發展會很迅速,因爲需求很迫切。

3) 深度學習(Deep Learning)

通俗的說一句,“圖像處理是深度學習應用的天堂”。深度學習這個概念可能有人不太熟悉,大家可以自行百度,我這裏給出一個相對通俗的解釋:“如果你不知道什麼叫深度學習,就想想《終結者》中的T-800”。當然這句話不是我說的,是出自業界的一位大牛之口。當然這可能有點小片面,不過深度學習確實是公認的新一代人工智能的基礎。

這裏舉兩個例子。一是谷歌的人工大腦項目。谷歌公司可以說是深度學習方面的牽頭企業了,其在2012年公佈的谷歌大腦項目,動用了1.6萬個計算節點,訓練數週,得到的人工智能模型能夠自主識別貓臉圖像,爲新一代人工智能開闢了道路,之後微軟深度學習研究院、百度深度學習研究院等機構都開始大量投入,各個高校也搞得風聲水起,原因很簡單,大家都知道它會火。

第二就是圖像識別方面的競賽。最有權威的就是ImageNet競賽。大家在一個擁有上千萬張,上千類別的圖像數據庫上訓練和測試自己的算法,比拼識別率。近幾年來,摘得桂冠的一直都是深度學習模型,確切的說是卷積神經網絡。更多有關ImageNet歷年的競賽信息大家可以自行百度。

說道深度學習在圖像處理的應用,不得不提中國的湯曉鷗教授,說他是國內深度學習的領頭羊也不爲過。他提出的DeepID人臉識別算法(一共分爲三代),在一些大規模人臉數據庫上的正確率(若LFW庫)已經達到了99.75%,單純從數字上講的話可以說已經超越了人類的識別率,爲此湯教授還開辦了公司,開發FaceSDK(雖然還沒有公佈)。不過拿計算機和人腦相比本身就是不合理的,各有所長嘛。不過可見DeepLearning在圖像識別領域的強大威力。至於深度學習與圖像處理的關係這裏就不用多說了,谷歌大腦識別的是圖像,深度學習競賽用的是圖像,DeepID識別的還是圖像人臉,雖然深度學習在其他方面諸如語音識別等也有應用,在圖像處理依然是其主要的應用領域。

二、圖像處理研究工具

圖像處理的研究分爲算法研究和應用兩個部分。用到的主要編程語言有Matlab、C/C++、Python等,原因很簡單,它們都有很多響應的第三方庫,不用我們從零開始編程。

1) Matlab

MathWork公司的Matlab軟件可以說是算法研究的利器,它的強大之處在於其方便快捷的矩陣運算能力和圖形仿真能力,單從簡潔性和封裝性來說,確實完爆其他語言。但高度封裝必然會相應的損失一部分靈活性,況且Matlab嚴格的講更像是一個工具,而非一門編程語言。順便提一句,它在2015年編程語言排行榜中位於第20名,僅次於IOS開發的Objective-C。

對於算法研究人員(尤其是高校的碩士博士),首選工具自然是matlab,因爲它簡便快捷,封裝性好,更重要的是全世界幾乎所有的算法大牛、精英教授都會首先公佈對應的Matlab源碼,然後在逐步改寫成其他語言進行實際應用。所以,如果你想做圖像處理方面的研究,Matlab是必須掌握的,而且是熟練掌握。

當你有一些想法需要驗證時,最好明智的先用matlab編寫出來測試。如果你上來就用看似高大上的C++來實驗,不僅錯誤BUG一大堆,到頭來可能效果還不佳,就算效果好,時間也會耽擱不少,畢竟算法開發還是要快的,這樣才能趕在別人之前發論文。總之,只要是接觸圖像算法,終究逃不過Matlab,就算你是軟件開發的,不研發算法,但總得能看懂別人的Matlab算法吧。

對於之前沒怎麼接觸過Matlab與圖像處理的人,在這裏推薦一本相關的書籍《MATLAB圖像處理實例詳解(附光盤)》。這本書對於Matlab圖像處理入門還是很有幫助的。記得我當時剛上研究生時就靠兩本書入門的,一是岡薩雷斯的《數字圖像處理》,二是這本《MATLAB圖像處理實例詳解》。

不過這裏友情提示,在看這類教程(不僅僅是Matlab)時千萬不要試圖去記憶所有的工具函數,這種做法是十分愚蠢的。正確的做法是根據自己的情況快速翻閱這類工具書,可以找出裏面的有實際意義的源碼來敲一敲練練手感,至於具體的工具函數,只需要知道Matlab提供了這方面的功能就行了,以後用到了再回來查,或者谷歌百度。我覺得在入門階段,最重要的不是看了多少書,聽了多少課,而是儘快自己敲出一段代碼,運行出結果,來建立自信和成就感,這纔是支持我們走下去的最實在的動力。記得我當時看了沒多久就自己敲了一個蹩腳的車牌檢測的Matlab程序,現在看來真是漏洞百出,不過當時我真的很興奮,很有成就感,覺得自己能幹這行,對於初學者來說,這種感受彌足珍貴。

2) OpenCv

Opencv是Intel公司開發的C++圖像處理工具包,形象的理解爲就是C++版的Matlab。當初Intel公司開發這個工具包的初衷也是方便大家共享,希望大家能夠在一個共同架構的基礎上共同建造摩天大樓,而不是各自在自己的地基上蓋平房。

與Matlab不同,Opencv是面向開發的,穩定性好,異常處理機制周全,但有一點需要注意,由於Opencv是開源的,那麼如果你在項目中直接調用了它的API,那就意味着你的項目也必須開源。因此在真正的產品開發過程中,往往需要從Opencv庫裏面挖代碼,而不是直接調用,幸好Intel公司允許我們看源碼,自己編譯一把就可以了。

說道C++和Opencv,有一個問題不得不提,那就是深度學習領域大名鼎鼎的Caffe框架。這是一個典型的基於C++和OpenCv的深度學習框架,由谷歌深度學習團隊、“谷歌大腦”負責人之一賈揚清學者編寫,並公佈了源碼。如今各個深度學習機構都在大量使用這個框架進行研究。

這裏同樣推薦兩本關於Opencv方面的教程。一本是CSDN博客大牛毛星雲寫的《OpenCV3編程入門》,這是它根據自己多年的博客整理成的書,很詳細,很典型的一本教程,介紹了OpenCv中相對前沿的知識。我翻看過這本教程,中規中矩,裏面的代碼通俗易懂,尤其適合初學者。當然大家同樣要注意不要犯了死讀書的毛病,只看它的功能,敲代碼練手感即可,不要試圖記憶API函數。重要的工具用多了自然會記住,不重要的工具記住了也沒用。

這裏推薦的第二本書是《圖像識別與項目實踐――VC++、MATLAB技術實現》,這本書是一本偏向於工程應用的書,我之所以推薦它是因爲它給出了很多有新意、能運行的代碼。其中裏面有一個項目讓我印象很深,是一個車牌檢測的實例。簡單描述一下:由於車牌中的字符數是固定的,因此它通過判斷橫向區域筆畫的跳變數以及筆畫寬度來定位車牌區域。這個想法讓人耳目一新,並且它還給出了詳細代碼,我也親身試驗過,效果還不錯。

這裏同樣再強調一下,就是一定要儘早入手寫程序,建立自信和成就感。我當時學OpenCv正好用它開發了一個人臉性別識別的系統,是一個本科大學生創新計劃的需求,效果還可以。

3) Python

Python在今年12月份的編程語言排行榜中名列第5,增長迅速。可以說Python已經逐漸成爲當下腳本語言的新標準。Python在圖像處理算法方面除了其自身簡潔的編程優勢外,還得益於兩個重要的Python類庫——Numpy和Theano。

Numpy是Python的線性代數庫,對於矩陣運算能提供很好的支持,並且能夠在此基礎上進行很多機器學習相關算法的開發仿真,這裏推薦一本受到大家廣泛認可的書《機器學習實戰》,我最近也正在看這本書,裏面對好多機器學習領域的經典算法,小到KNN,大到SVM,都給出了詳細的介紹以及代碼實現(Python版)。Theano是Python的機器學習庫,能夠方便的實現深度學習(例如卷積神經網絡CNN)算法,網上很多對於DeepID算法的復現都是用的這個庫。

個人覺得單從圖像處理的角度評價的話,Python並沒有前面兩個工具(Matlab和OpenCv)應用廣泛,不過作爲通用的腳本語言,我覺得每個程序員都應該去了解了解它,畢竟俗話說沒有爛的編程語言,只有爛程序員。我在學Python時第一個自己寫的程序就是微信打飛機的小程序,在我的博客中有詳細的教程,雖然是參照小甲魚的《零基礎入門學習Python》視頻教程寫的,但還是蠻有成就感的。

三、圖像處理研究方法

我覺得,圖像處理研究主要可以分爲三個部分:基礎概念、基本思想、算法研究。

1) 基礎概念

所謂基礎概念,就是圖像處理裏最基本的知識,比如什麼是圖像?什麼是像素?什麼是彩色圖像等等。沒有一個明確的界限來劃定什麼是基礎概念什麼是高級知識,因人而異。瞭解圖像處理的基礎知識,有一本書是必讀的,就是岡薩雷斯編寫的、阮秋琦翻譯的《數字圖像處理》。這本書已經作爲圖像處理領域的經典教材使用了三十多年,我自己也把這本書看了好幾遍,每一遍都會有新的體會。我覺得每一個搞圖像的都應該熟讀這本書。書中除了有幾章內容在講小波變換、模式識別等相對抽象的內容外,其他內容相對都是很基礎的,本科生水平就能看懂。而且我建議要儘早看這本書,如果是研究生儘量在進入課題之前就看一遍,因爲這樣一本經典的書在進入課題之後可能就沒時間看了,以後也頂多是查閱而已。我當初就是在大四的寒假看完了這本書,以後在圖像入門的過程中就顯得輕鬆很多。看完這本書,哪怕是隻看前幾章,明白了什麼是圖像(二維或者三維矩陣)、什麼是像素、彩色圖和灰度圖、顏色空間、圖像濾波、圖像噪聲、圖像頻域變換等概念,將來在進行更深一步的研究的話就會方便很多了。

2) 基本思想

剛開始想把這部分內容命名爲“基本算法”,意在介紹圖像處理中的一些基本算法,後來仔細想想決定不這麼寫,因爲圖像處理是一個非常大的概念,圖像處理不等於人臉識別,也不等於模式識別,直接介紹諸如圖像處理基本算法之類的內容很容易寫成空話,沒有什麼實際意義。讀者有興趣的話可以直接谷歌百度“圖像處理十大經典算法”,上面有我想說的內容。

萬變不離其宗,算法是死的,重在思想。舉個例子,我個人是主攻模式識別方向,在這個方向判斷一個學生是否入門有一個非常簡單的方法,就是“如果你能把圖像很自然的想象成高維空間中的一個點”,那就說明在模式識別方面入門了,可以對圖像進行分類了。當然標準不是唯一,在其他領域如目標檢測也會有其他的判斷標準,總之我們要對圖像進行處理,那麼圖像就不再只是圖像,它可能會演變成各種不同形式的概念,可能是點,可能是面,還可能是一個座標空間。在目標跟蹤的經典算法粒子濾波中,將一個個的小圖像塊看做一個個粒子;在子空間理論中,將一系列圖像放在一起構建一個成分主空間(例如主成分分析PCA算法等等。,我不會詳細介紹這些算法,說多了就顯得抽象老套,但我要說的是我們一定要把圖像本身理解好,它是一個圖像,是一個矩陣,是一個信息的容器,是一種數據的表現形式,圖像不一定都必須在視覺上有意義(比如頻域的圖像)。

總之圖像處理的基本思想還是要立足於圖像本身,要深度到圖像內部結構中,思維要靈活。我當時做本科畢設時,怎麼也不知道圖像和高維空間中的點之間有什麼對應關係,後來總算有一天,突然就明白了,這也就是所謂的量變產生質變。總之一定要多想,多總結,主動去鑽研,才能夠真正領悟一些東西。最基本的東西往往蘊藏着深奧的道理,無論你現在多牛多厲害,都不能放掉最本源的東西。多想想圖像是什麼,有什麼本質屬性,你可能無法得到準確的答案,但肯定能得到一些有用的感悟(有點像哲學問題了)。

3) 算法研究

算法研究應該是圖像處理的核心工作,尤其是各大高校的博士碩士。這裏我並不想談那些高大上的算法,我更想說的是一些算法研究的一些基礎的東西,比如說一些基礎課程,比如說矩陣運算。

研究圖像處理的算法,離不開數學。在這裏我建議圖像處理方面的碩士一定要上兩門課:《泛函分析》以及《最優化算法》,有的學校已經將這兩門課列爲了研究生階段的必修課程。這兩門可可以說是圖像處理(至少是模式識別)的基礎。我當初沒上過最優化算法,但後來也自己補上了,不然真的是寸步難行。至於泛函我當時聽課的時候也不是很懂,但是在之後的研究過程中發現很多圖像處理的基本知識基本理論都和泛函分析中枯燥的定理如出一轍,沒辦法,有的東西本身就是枯燥的乾貨,學着費力,缺它不行。

其次我想說的是矩陣運算。圖像就是矩陣,圖像處理就是矩陣運算。大家爲什麼都喜歡用Matlab,就是因爲它的矩陣運算能力實在是太強大,在Matlab的世界中任何變量都是矩陣。同樣OpenCv之所以能流行,不僅僅是因爲它良好的封裝性,也是因爲它的矩陣格式,它定義了Mat基礎類,允許你對矩陣進行各種操作。Python也不例外,它的Numpy就是一個專門的線性代數庫。

真正在圖像編程過程中,那些看着高大上的API函數歸根到底都是工具,查查手冊就能找到,真正核心還是在算法,算法是由公式編寫的,公式的單元是變量,而圖像屆的變量就是矩陣。所以,熟練去操作矩陣,求秩、求逆、最小二乘,求協方差,都是家常便飯。所以,如果你有幸能上《矩陣分析》這門課,一定要把它看懂,那裏面都是乾貨。

四、小結

總之,圖像處理就是一個典型的門檻低、廳堂深的領域。不需要太多基礎,學過線性代數,會一點編程就夠了;但是那些算法卻深不可測,是個消耗功夫的活兒。在寫這篇教程時我說的很直白,就像和大家對話一樣,想到什麼說什麼。在最後我想說兩句題外話,就是不僅僅針對圖像處理,對於其他新技術的入門學習也是一樣,儘快邁出第一步,儘快去建立自信和成就感,讓自己有勇氣走下去,然後缺什麼補什麼就行了。我覺得真正讓人望而卻步的往往不是技術本身,而是我們對自身的不自信。唯有果斷開工,才能戰勝心魔。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章