上一篇最後留下了一個問題:
既然現在很多電腦視覺的任務都使用深度學習技術,那為什麼 CNN 能夠取代過去大量依賴人工設計的特徵?
要回答這個問題,可以先回頭看看我們前面學過的方法。
傳統的電腦視覺中,有很大一部分工作是由人先根據經驗設計方法。
例如:
找邊緣?使用 Sobel。
找角點?使用 Harris。
找特徵點?使用 SIFT 或 ORB。
找直線?使用 Hough Transform。
這些方法本身並沒有問題,而且其中不少方法到現在仍然有實際用途。
但它們都有一個共同的限制:
我們必須先決定,要從圖片中找出什麼樣的資訊。
以 SIFT 為例,它會透過一套設計好的流程,從影像中找出具有辨識性的局部特徵。
這些特徵提取方式,是人類根據對影像結構的理解與數學方法所設計出來的。
但如果今天要辨識的是一隻貓,情況就複雜很多。
到底哪些資訊最能代表「貓」?
耳朵?眼睛?毛髮的紋理?身體輪廓?
不同的圖片、角度、光線和背景,都可能讓這個問題變得更難。
這也是學習式方法開始受到重視的原因。
卷積神經網路(CNN),全名是 Convolutional Neural Network。
看到這個名字,應該會覺得有點熟悉。
因為 CNN 裡面的 Convolution,正是我們前面介紹過的 Convolution。
傳統影像處理中,我們通常會先設計一個 Kernel,再使用它處理影像。
例如 Sobel:
-1 0 1
-2 0 2
-1 0 1
這個 Kernel 的目的,是讓影像中某個方向的灰階變化產生較強的反應,因此可以用來偵測邊緣。
CNN 也會使用卷積運算,但差別在於,CNN 中的卷積核參數通常不是人事先設計好的,而是透過訓練從資料中學習出來的。
一開始,這些參數通常會經過初始化。
模型取得訓練資料後,會根據預測結果與正確答案之間的誤差,透過反向傳播計算梯度,再利用梯度下降等最佳化方法更新參數。
經過訓練後,卷積層中的權重會逐漸調整,讓模型能夠學到對目前任務有用的特徵表示。
所以比較精確地說:
傳統方法需要人工設計特徵或特徵提取方法,而 CNN 可以透過資料學習適合目前任務的特徵表示。
這也是兩者最重要的差異。
CNN 的有趣之處在於,雖然我們沒有直接告訴它「這裡是一條邊緣」,但在許多 CNN 模型中,可以觀察到比較前面的 Layer 傾向學習一些低階視覺特徵。
例如:
再往後,這些低階特徵會逐漸被組合成更複雜的表示。
例如可能開始對:
產生較強的反應。
到了更深的 Layer,模型則可以利用前面累積的資訊形成更高階的特徵表示,最後用來完成分類、偵測或分割等任務。
所以 CNN 並不是:
第一層學邊緣,第二層學XXX,第三層......。
沒有這麼固定。
不同的模型、資料集、架構與訓練方式,都可能產生不同的特徵表示。
比較合理的理解是:
CNN 會透過多層可學習的運算,逐漸從低階的局部資訊建立更高階的特徵表示。
而這些特徵表示最後會被用來完成我們真正關心的電腦視覺任務。
我們常常會說,CNN 取代了手工特徵。
但比較精確的說法應該是,CNN 在許多任務中,降低了對人工設計特徵與特徵提取流程的依賴。
例如傳統的 Pipeline 可能會是:
Image
↓
人工設計的特徵提取
↓
Feature
↓
Classifier
↓
Result
而深度學習則可以直接從影像開始學習:
Image
↓
CNN
↓
Learned Features
↓
Prediction
中間的特徵不是消失了。
相反地,CNN 正是在學習如何從影像中建立這些特徵表示。
差別只是以前需要人先決定「應該提取什麼特徵」,現在則可以讓模型從資料中自己找出對任務有用的特徵。
這也是深度學習帶來的重大改變。
回到昨天探討的問題:
傳統影像處理還重要嗎?
答案還是很明確:
重要。
CNN 的出現,不代表 Sobel、Morphology、Hough Transform 或其他傳統方法都沒有用了。
在很多實際系統裡,傳統影像處理仍然很有價值。
例如影像前處理、二值化、去除雜訊、形態學處理、幾何分析等工作,有時候使用傳統方法就能有效解決。
而且它們通常具有:
等優點。
所以真正需要思考的不是:
CNN 和傳統影像處理哪一個比較厲害?
而是:
面對一個問題,哪一種方法比較適合?
回頭看看這 30 天的內容。
一開始,我們先從最基本的東西認識圖片:
先知道一張圖片到底是由什麼組成的。
接著開始處理圖片:
這個階段主要是在處理影像本身,讓我們可以把需要的資訊留下來,或把不需要的資訊去掉。
再往後,我們開始從圖片裡面找特徵:
到了這裡,問題開始從「怎麼處理圖片」慢慢變成「怎麼從圖片裡找到有用的資訊」。
最後再看到 CNN,就能把前面的內容串起來。
以前需要人類根據經驗設計特徵與特徵提取方法。
現在則可以讓模型直接從資料中學習適合任務的特徵表示。
這也是從數位影像處理進一步走向現代電腦視覺的其中一條路。
其實我在學數位影像處理的時候,也常常遇到一個問題。
公式看得懂、程式也可能寫得出來,但就是不知道:
這東西到底在幹嘛?
所以這個系列沒有一開始就塞很多數學公式,而是想先把每個東西的概念弄清楚。
知道 Edge Detection 是在找什麼,再回頭看 Sobel。
知道 Convolution 在做什麼,再去理解 Kernel。
知道 CNN 也是利用 Convolution 進行特徵提取,再去理解它為什麼能夠從資料中學習特徵。
把這些東西串起來之後,原本看起來零散的演算法,才慢慢變成一條完整的路。
這 30 天,我們從 Pixel 開始,一路走到 CNN。
從最基本的影像資料,到影像處理、特徵偵測,再到讓模型自己學習特徵表示。
回頭看會發現,這些方法其實都在面對同一個問題:
我們要怎麼從一張圖片裡取得有用的資訊?
傳統影像處理提供了很多經典的方法,讓我們可以直接操作影像、分析影像。
深度學習技術則讓模型能夠從資料中學習複雜的特徵表示,降低對人工設計特徵的依賴。
兩者之間並不是單純的新方法把舊方法淘汰的關係。
理解前面的 Pixel、Histogram、Convolution、Edge、Corner 和 Feature,反而會讓後面學 CNN 時更容易知道它到底在做什麼。
這 30 天,我們只是把數位影像處理的基礎走過一遍。
接下來,才是真正進入 Computer Vision 的下一段路。
CNN、Object Detection、Segmentation、3D Vision、模型部署,還有更多實際的問題,都還在後面。
這個系列到這裡結束,謝謝各位看到這裡的讀者們。