1. 程式人生 > >關於計算機視覺(隨談)(轉)

關於計算機視覺(隨談)(轉)

關於計算機視覺(隨談)

       之前看了這麼一本說自然影象統計學的書,本來是想著要好好看,然後每天翻譯幾頁的。但實習的時候太忙了,沒有什麼時間,所以只把目錄給翻譯了,哈哈。這本書叫:Natural Image Statistics: A Probabilistic Approach to Early Computational Vision大家可以瞧瞧。不過,看到裡面視覺概述的時候,自己也想扯扯點東西,按捺不住,就吐了不少文字。如果有什麼不對的地方,也還希望大家不吝指正,謝謝。

一、什麼叫視覺Vision?

       什麼叫視覺?可能這個問題的第一反應就是:不就是看東西麼。好吧,那麼高大上的問題就被這麼輕描淡寫了。看東西不是目的,目的是看到後知道是個什麼東西,然後基於這種物體與事件的聯絡服務於高層意識理解。哈哈,瞬間檔次又拉上去了。個人淺見,目前大體視覺可以分為生物視覺和機器視覺。生物視覺就是有眼睛的動物能什麼看東西的。例如喵星人、汪星人還有地球人啥的。每種動物的視覺感官不同,能感受的光波長也不同。我們如果可以知道它們是怎麼工作了,就可以借鑑著做出具有類似強大功能的裝置了。這其中涉及到的東西有很多,它們的視覺流是怎樣的?包含怎麼接受光訊號的輸入,到如何逐級的提取資訊,再到高層的推理,還有高層到底層的反饋等等。有的已經被解密了,有的還猶抱琵琶半遮面,也的神祕依舊。遺憾的是,後者的比重更大。

      目前來說,大家最感興趣的還是人的視覺系統。它實在是太強大了,但卻又太神祕,使得眾多探祕者傾注心血也只能窺知一二。不過也還是有令人欣慰的訊息可以傳出,然後對某些成果,也有種能用之一二,受用一生的感覺。哈哈。

       人腦中大約70%的資訊是來自於眼睛。大概20-30%的皮層區域是拿來做視覺處理的。生物視覺的最終目標還是想把人的視覺系統徹底告破於天下。嗯,理想是應該豐滿點。那機器視覺又是啥呢?就是機器看東西嘛。因為內在的平臺還是計算機,所以叫計算機視覺。Computer Vision!它屬於人工智慧裡面很核心的一部分。機器要像人一樣,會看,會聽,會說,會學習,會思考等等。其中,像人一樣,視覺的資訊的比重依舊是最大的。所以計算機視覺的重要性毋庸置疑。計算機視覺研究的終極目標也是如何讓機器具有人一樣的視覺!這聽起來就挺難的是嗎?嗯,之前人工智慧的發展實在太緩慢了,近幾年Deep Learning的出現、大資料和大機器的支撐才給人工智慧的發展稍微推進了一段距離,但還有很遠的路要走。很遠。

       好了,視覺是啥?視覺就是看東西,呃,不是很專業。視覺是為了獲取關於環境中物體和事件的資訊,從物體發射或者反射出來的光中提取資訊的過程。所以我們第一件需要考慮的事情是,這些資訊在什麼形式的時候才是有效的?

       物體發出或者反射的光會被收集和度量,當然了,這裡沒有特定任務的資訊提取的處理。生物視覺系統和人工視覺系統都通過同一種方式來完成這第一個步驟,也就是將這些光投影到一個二維的影象中。對於人眼和攝像頭,雖然存在不少差別,但影象資訊的處理基本是相同的。通過非常多的感光的細胞或者感光的原件接受光,然後將這些光的強度變成一個二維影象。然後影象的每個點的光強度就儲存了某種資訊。

       一般來說,投影影象還具有時間和彩色的維度。但我們大部分關注靜態和灰度的影象。這個影象可以表示為二維的標量函式I(x,y),也就是給定每個位置(x,y),會得到一個對應的灰度值I(x,y)。儘管位置和灰度值都應該是連續的,但典型的情況是離散取樣。也就是說x和y是整數,而灰度值在每個點取樣。在數字系統中,取樣一般也是矩形。但實際上,生物系統中的空間採集取樣並不是矩形的,甚至是無規律的。

       視覺就是從這種影象資料中提取資訊的。物理環境的資訊包含在這個影象中的,但很遺憾,是隱含著的。視覺系統必須將這種隱含的資訊變換成明確的形式,例如識別環境中的物體。但這不是一件容易的事情。

二、人類視覺系統的魔法

       視覺是個非常棘手的任務。儘管這對搞視覺的人來說沒什麼可以驚訝的,但對其他人來說,他們可能會覺得非常驚訝,他似乎沒有意識到自己與生俱來的雙眼是如此的強大和不可複製。因為他幾乎毫不費力的無時無刻的既有效又快速執行這個任務。但實際上在你看我的文字的時候,你大腦的整個計算過程是非常複雜的,但可惜呀,我們一般只在乎這個結果,大腦直接給我們它的計算結果,而沒有告訴我們它完成這個是多麼的辛苦。默默無聞,以使得被忽略和遺忘。

       為了說明視覺的難度,我們看下圖。其實一個度量後的影象就是這樣子的,每個空間位置有個光的強度值。那請你告訴我,下面這幅影象是個啥?你可以破解嗎?

       OK,我知道這個對大家很難,那我們看看他究竟是啥,我們把每個方塊的數字換成同等幅度的灰度。瞬間清晰了,有木有,這是一張男人的臉!雖然眼睛接收到的就是上面的那些類似數字之類的東西,但我們的視覺系統把這些數字都變得有意義了,然後發現了真實世界的物體。

       到目前為止,我們做了大量慘絕人寰的簡化。實際上人的視網膜的光接收器是可以接收不同波長的光的,同時我們一般是雙眼看世界,而不是隻用一個。還有一個最大的差別是,我們是看動態的影象,而不是靜態的。相機是一次成像,而人眼則是眼睛和大腦的組合,眼睛持續不斷把影象資訊傳遞給大腦,並且眼睛在不挺的轉動,讓高解析度的感應區域掃過物件的各個細節。大腦把所獲得的資訊進行動態累加,就得到了我們所感覺到的影象了。你驚呼,差點被忽悠了。但這些差別並沒有改變一個事實,就是光資訊的確是通過上圖那麼的資料展示的。所以視覺系統的使命就是讀懂這些資料。

       大部分凡人都會同意說,這些任務剛看起來會很難,但經過一定的思考後,就會覺得應該沒那麼難吧?影象灰度的邊緣不是可以檢測出來嗎?只要找到小數字和大數字相鄰的地方就是邊緣了呀。嗯,是的,邊緣特徵檢測的方法目前已經可以公式計算和實現了。那邊緣得到了,將這些邊緣片段連線到一起,那物體的輪廓或者說某種直觀的物體表達形式是不是就出來了呢?嗯,你是聰明的,這種直觀的想法造就了目前很多計算機視覺的演算法。很遺憾的是,這些演算法在一些合成影象或者一些在高度限制環境中的影象才有好的表現,但對於無約束的自然影象來說,他們的表現就很一般。經過多年的研究,有一個結論:real-world images is extremely difficult!就算是找到物體輪廓這樣一個任務也變得非常困難,因為一般物體的輪廓在物理世界中是不夠清晰的,如下圖:

       這不就是一個杯子嗎?你看,你看,你就只在乎結果!!!我們慢慢分析下嘛。圖中放大了兩個地方,一個是本來杯子有邊緣的地方,在影象中卻沒有了邊緣,因為背景和杯子很像,邊緣不清晰了。另一個是本來杯子沒有邊緣的地方,在影象中因為光照的關係,卻變得有邊緣了。這無中生有,有中化無,大自然的招數,怎麼破!

       也許這還不能說服你。我們看看下圖。我們教小孩子識圖的時候,是不會拿個這麼變態的圖來嚇他的。但不拿這個給你看,是說服不了你的。說服什麼?就一點:視覺有多難,你的視覺系統有多牛掰!

        我們再看看下面的人臉:

        不要驚訝。實際上一個小孩在六歲之前,就已經認識一萬到三萬類的物體了。而這個物理世界,大約也就是三萬種物體。你說,目前的演算法如何才能夠強大到囊括這三萬種物體(包括能識別它們在所有環境下的所有形態)。那你會想,那人為什麼可以呢?你終於問出這個問題了,累覺不愛。因為人有種能從少量樣本學習的能力!一類物體,變化萬千。但人只要認識其中一兩個,剩下的就不攻自破了。融會貫通,舉一反三,乃人類與生俱來的才能!說這個好像又沒什麼實際意義,是吧。要怎麼利用這個來指導目前的視覺才是王道。但鄙人才疏學淺,往下就講不了了。這也是生物視覺和機器視覺研究者窮盡一生想要共同探索的神祕世界。希望有生之年,能瞥見這美麗的星空吧。

       我有時候會想。人從呱呱墜地開始,花了六年的時間,來建立自己強大的大腦,也就是硬體設施。在這裡,我還是要對人腦的硬體裝置驚歎一番。據瞭解(這三個字就表示了不知道對不對,呵呵),人腦的CPU主頻是320GHZ,目前電腦因為半導體工藝的限制,能做到3GHZ左右每個CPU核。所以咱們搞個300個CPU就可以了麼?NO,NO。要運算,每個CPU之間還得通訊,訪問記憶體資料等,這些通訊頻寬的限制才是這種大叢集的最大瓶頸。但人腦呢?它的儲存體您得按斤算,哈哈。據猜測(哈哈,這算嚴謹麼),人腦儲存大概10^15GB,這還不是牛的,最牛的來了,這些空間可以作為記憶體和快取使用!不要問我這代表什麼了!懷疑懷疑為什麼自己老忘記前天老師上課講的東西,我昨天還記得的啊,怎麼就忘了呢,這海馬體廢了麼!哈哈,可能是忘了儲存到硬碟了!然後大腦一宕機,就沒有了!所以記得每天要記得好好吃飯,補充能量。再來膜拜下人眼。人眼是很不可思議的精密系統,它能自動對焦,曝光自動補償,自動運動模糊處理,目前所有讓凡人窮三代的單反都望塵莫及的!還包括免費贈送的夜視功能……最神奇的是,實現這些功能,不需要升級windows和安裝任何驅動,不需要耗電!每個人出生的時候就被裝配了所有這些功能。所以在這裡也呼籲大家好好珍愛如此高檔的裝置吧,追劇不要太晚,打遊戲不要太晚,上班看電腦多用眼藥水,哈哈。

       扯遠了。回來說說大腦的系統和軟體吧。我們除了睡覺的時間,每時每刻都在接收輸入,然後通過自己強大的硬體設施來處理輸入。非常關鍵的一點是,大腦裡面會慢慢的建立歷史學習到的東西的知識關聯庫。隨著知識的擴充與完善,大腦的網路越來越複雜。神經元個數,神經元連線的個數,千絲萬縷卻又理不清。但對於計算機呢?我們的硬體設施呢?最牛掰的就是超算了。我們也建立了一個很大的網路,與人的大腦相當的網路,然後期待著幾天、幾個月的時間就可以讓我們的計算機能達到人腦的水平,這會不會太苛刻了呢?當然了,這其中有幾點不公平對比的差別。一是大腦的高層結構和運作機制實際上是不清晰的,所以目前計算機所做的高層模擬是否與大腦高層類似,這個也沒有答案。二是到底是計算機快還是人腦快?做同樣的事情,超算運作需要消耗一個城市一個月的電量,但人腦只需要你吃個雞腿補充下就好了。OK,what is your point?! I am Sorry!

       生物上的啟發對計算機視覺的研究者是非常重要的。很多視覺的處理過程和演算法就是模擬生物視覺系統來進行設計的,而且也顯示出了有效性。但到目前為止,人類對自身大腦所知還是九牛一毛,更談不上對視覺更有力的指導了。但實際上,視覺計算理論和生物界實驗沒有什麼誰靠誰,誰欠誰的說法。這裡面官方點算就是相輔相成:視覺計算理論可以指導生物實驗性研究,實驗性研究結果又可以指導計算理論的研究。