實(shí)踐的意義——寫給圖像處理算法愛好者的建議
陸放翁詩云:“紙上得來終覺淺,絕知此事要躬行”,此乃亙古不變之真理也。
本文引用地址:http://butianyuan.cn/article/201702/344240.htm圖像處理研究的一個很大特點(diǎn)就在于,它是一種和實(shí)際應(yīng)用緊密聯(lián)系的實(shí)用型學(xué)科。所有的算法都是針對實(shí)際中遇到的問題而存在的。無論是我們新提出了一個算法,還是我們新學(xué)習(xí)了一個算法,都可以直接寫一個程序來檢驗它的處理效果。而且這種“效果”往往還是一目了然的。因為圖像處理的輸入和輸出都是圖像,圖像就是用來給人看的。這種直觀性是其它研究領(lǐng)域所很難具備的。例如,當(dāng)年何愷明博士向CVPR提交其關(guān)于圖像去霧算法的論文時,審稿人就很驚訝于這么簡單的方法居然有這么意外的效果。于是其中就有好奇的審稿人直接動手編程實(shí)現(xiàn)了他的算法。正所謂,是騾子是馬,拉出來溜溜。他算法的效果最終征服了審稿人,也征服了大會的評委會,最終那屆的最佳論文獎就首次頒給了來自亞洲的研究者。
而之于正在學(xué)習(xí)或研究圖像算法的同學(xué)而言,動手實(shí)踐的意義就更大了。不要以為你聽老師或別人講了一些算法,或者自己看看岡薩雷斯書上的描述,就覺得自己好像已經(jīng)get了什么。除非你真的自己能把程序?qū)懗隽?,否則其實(shí)你什么都沒懂,最多也就是似懂非懂。這一點(diǎn)我最有發(fā)言權(quán)。很多算法我感覺我也學(xué)得不錯,但其實(shí)我在寫Magic House的時候仍然花了很多時間去調(diào)試,因為在寫的過程中,其實(shí)問題是層出不窮的。例如,我在寫圖像傅立葉逆變換的時候,我感覺這個算法我已經(jīng)理解的很到位了,但是做逆變換的時候就是得不到原圖,而是一片黑。問題到底出在哪里我其實(shí)斷斷續(xù)續(xù)想了挺長時間。有一天突然開竅了,因為傅立葉變換的結(jié)果存在文件里,其實(shí)只是保存了實(shí)數(shù)的部分,虛數(shù)部分根本就沒存。因為你在屏幕上看傅立葉變換結(jié)果圖的時候,看到的也只是實(shí)數(shù)部分。盡管你可能遇到的問題跟我不一樣,但遇到這樣或那樣的問題總是肯定的。我總結(jié)了自己鍛煉編寫圖像處理代碼的幾個原因:
1)一方面你會發(fā)現(xiàn)過去你的理解可能是有偏差的,因為按照你那個想法去實(shí)現(xiàn)的代碼效果可能并不理想,那問題出在哪里就很值得你思索;
2)另一方面,你自己在實(shí)現(xiàn)的過程中很可能發(fā)現(xiàn)原作者算法的不足(比如我在實(shí)現(xiàn)暗通道算法時就發(fā)現(xiàn)這個算法處理大面積的天空時會有問題),然后你進(jìn)一步研究的方向就來了!這在我看來似乎是發(fā)paper最容易的方法。
3)我不得不告訴你,很多paper是會騙人的!中國有學(xué)術(shù)腐敗,國外也有學(xué)術(shù)造假。洛必達(dá)把他老師伯努利教給他的方法寫進(jìn)了自己的書里,于是便有了今天你所學(xué)到的洛必達(dá)法則。從這個角度來看,18世紀(jì)的歐洲就已經(jīng)有學(xué)術(shù)腐敗了。有些作者paper里的效果很可能是PS過的,所以你按照他的方法,無論怎么做也不可能得到他的效果,這一點(diǎn)如果你不試試,就很可能被騙。
4)寫代碼本身就是一項本領(lǐng)或者基本功。你將來還很有可能要靠他生存。曲不離口、拳不離手。你現(xiàn)在不好好練,將來很可能作繭自縛。
說到這里我就不禁要提一句。懶惰既是推動人類創(chuàng)新的兩大動力之一,但也可能是害得你“啥都不會,只會坐等靠要”、最終一事無成的毒草。就像中國過去搞扶貧只會一味的輸血,本來還有二畝薄田可以耕種,現(xiàn)在政府有救濟(jì)款,索性連田也懶得種了,結(jié)果導(dǎo)致某些地方越扶越貧。現(xiàn)在很多人在網(wǎng)上一張嘴就是“有沒有源代碼下載”?或者買書看書也是挑那種“帶光盤的”或者滿篇滿篇就只有代碼的。抄來的過程當(dāng)然輕松,但是知識、技術(shù)學(xué)會了是自己的,抄來的東西始終是別人的。不是說網(wǎng)上的代碼、資源不可以參考,但是你絕對不應(yīng)該對此產(chǎn)生依賴心理,人還是應(yīng)該靠自己。如果你寫不出來,只能說明你還沒真正學(xué)會,學(xué)懂。何況真正有技術(shù)含量的東西,你永遠(yuǎn)也抄不來。兩彈一星我們也曾想讓蘇聯(lián)幫忙,但人家憑啥給你?結(jié)果怎么樣,還不得靠中國人自己嗎?要知道,這個技術(shù)積累的過程本身也很重要。
說道實(shí)踐編程,你要么用C/C++,要么用Matlab,可能還有其他小眾的(比如我有時也用R做圖像處理),但大體上總逃不過這兩大陣營。有人說他用Java或者Python, Anyway這其實(shí)并不重要。我的討論還是以C/C++和Matlab為主體來講。Matlab當(dāng)然比較好用,什么卷積、直方圖、高斯濾波,一個函數(shù)搞定!C/C++如果結(jié)合OpenCV基本可以達(dá)到同樣的效果。當(dāng)這絕對是后話。如果你是初學(xué),最好能踏踏實(shí)實(shí)一點(diǎn)一滴把最基本的圖像處理算法實(shí)現(xiàn)一下。千里之行,始于足下。九層之臺,起于累土。因為建立一個完整的體系思維和擁有一個扎實(shí)的基礎(chǔ)特別重要。一些看似高大上的算法都是在這些不起眼的算法的堆砌組合下實(shí)現(xiàn)的。比如SIFT特征構(gòu)建時,你會遇到直方圖、高斯濾波和圖像金字塔這些非常基礎(chǔ)的原件。當(dāng)你看到這些東西的時候,你就應(yīng)該有馬上覺悟到它們的各種特性和作用的能力。這對于你理解SIFT很有幫助。如果你具備了這種素質(zhì),詳細(xì)我,你再在matlab里調(diào)那些函數(shù)來寫SIFT就非常容易。如果說你學(xué)了一遍SIFT,但是還是寫不出來,結(jié)論就是因為最基本的高斯、金字塔、直方圖你也沒自己寫過。跳過了鍛煉基礎(chǔ)的階段,直接來高大上的東西,比如會無福消受。就像《天龍八部》里的番僧鳩摩智為了速成,不惜用道教的小無相功來催動少林72絕技,結(jié)果走后入魔,前功盡廢。前兩天有網(wǎng)友給我博客留言:“如果只是把現(xiàn)成的算法實(shí)現(xiàn)一遍那也沒什么意思,原創(chuàng)算法的話就有技術(shù)含量了?!蔽耶?dāng)時覺得可能這位網(wǎng)友水平比較高,看我這些雕蟲小技自然不能入法眼。但我這兩天又在想拋開大家水平高低不談,這句話到底對不對?我發(fā)現(xiàn),這個說法還是有漏洞。你小學(xué)時候每天語文課上學(xué)了十個新漢字,老師就讓你在方格本上每個抄10遍,這種事當(dāng)然沒意思了,但是大家不都是這么沒意思過來的嗎?如果不這樣,你怎么能在高考的時候40分鐘寫一篇800字命題作文呢?可見沒意思的事情未必沒意義!
最后,用荀老夫子的一句話同大家共勉:無冥冥之志者,無昭昭之明,無昏昏之事者,無赫赫之功。
評論