速記AI課程-Convolutional Neural Networks for Computer Vision Applications(二)
CNN 於電腦視覺之應用
講完了CNN及經典模型,林接著提到一些常見的電腦視覺應用與重要論文。
Object Recognition
電腦視覺的物件辨識領域中,可分為一般分類(Generic)與細部分類(Fine-grained)兩大類。Generic是針對物件進行大方向的分類,比如辨識出照片內的寵物是狗、貓還是兔子;而Fine-grained則是進行更細緻的分類,如辨識照片內的狗,是拉布拉多、黃金獵犬還是哈士奇。
要做到Fine-grained,代表必須再深入影像的細節,才能分辨不同品種的狗,如哈士奇的耳朵是三角形,但拉布拉多是垂耳,唯有讓電腦看懂耳朵(以及其他細部特徵),方能做到細部分類,這種方式稱為Part-based Method。
因為CNN是電腦視覺必用的模型,所以許多論文都利用CNN搭配Part-based Method,如DPM-CNN、SPDA-CNN等。Part-based的缺點是在訓練模型時,需要藉助事先把物件的邊界標出(Bounding Box),並且定義出物件的各個重要位置(Part Annotation),才會有必較好的偵測效果。
林介紹了自己參與的一篇論文,其重點為在類神經網路中,引入了一層新的co-occurrence layer,用來學習不同Part之間的關聯。所謂關聯,是指拿不同part所產生的Feature map比較,若有重疊的部分,代表這兩個Part是非常相關的。(如頭跟身體)
以下是此論文辨識五種不同的鳥類(同一列為同一種)的結果。可以看出無論是照片是什麼樣的角度,對於同種鳥類,它所判定的重點特徵(有熱圖紅綠藍的部分)都是一樣的,如第一排的Parakeet auklet,最重要的特徵就是「喙」以及「眼睛」。
在 CUB-200–2011資料集中(200種鳥類),此論文模型的正確辨識率最高可達85.8%,遠超過以往傳統的方式,十分厲害。
Object Detection
物件偵測是指在影像之中,標示出物件的範圍,並且標示為何種物件。下圖即為一明確的範例,各汽車都被黃框正確標註,黃框的左上方亦有「car」的標籤。辨識出是什麼物件,稱為Recognition,而辨識出物件位置在哪,又稱為Localization。
反應比較快的讀者,應該會聯想到即然之前介紹的CNN模型這麼厲害,拿它來做Recognition不就好了?至於Localization,就把影像利用不同大小的框框逐一切出,總會有物件被完全命中的框框吧?這個方法就是傳統的Sliding Windows。
由於需要偵測的物件,在影像中的大小不定,因此需要不同大小的框框來去配適,且一張影像需要從頭到尾逐一掃瞄,越多大小的框就要掃描越多次,非常耗費資源(俗稱暴力),實務上很難有應用場景。
於是,R-CNN(Region CNN)出現了。R-CNN捨棄暴力法,利用Selective Search演算法先找出約2000個可能包含物件的框框(專業術語是proposed regions,候選區域),把這2000個框框切出的影像都丟入已訓練好的CNN(前一篇提及的任一CNN皆可)來擷取特徵,再丟入每個物件類別的SVM(狗與貓的SVM不同)進行二元分類(結果只有是或不是),最後使用線性迴歸來細修框框的邊界。
Selective Search演算法把需要運算的區域減少到了約2000個,可說是R-CNN的精華。Selective Search首先利用Efficient Graph-Based Image Segmentation把影像依照物件的形狀(以及分割時給的參數)分割成各種區域,接著依照區域的相似程度開始合併,合併後再找相似的區域合併,直到整個影像都成為一個區域為止。過程中的曾經出現的每個區域,經過一個評分的機制後,就選出了候選區域。
R-CNN雖然把框框減少至2000個左右,但每一個框框都要丟到CNN運算,再丟到不同類別SVM計算,還是需要不少的運算資源,在Fast R-CNN的論文中,一個影像需要47秒方能計算完成,與實務上應用場景還是有一些差距。
Fast R-CNN?
沒錯,比R-CNN還快的Fast R-CNN。R-CNN的2000個候選區域中,有極高比例都會重疊,每個都丟入CNN計算提取特徵,其實造成了不必要的浪費,Fast R-CNN就把順序稍微改了一下,先把「整個」影像直接丟入CNN提取特徵,再框出候選區域,大幅減少了運算。另外,R-CNN針對多種分類需要多個SVM,Fast R-CNN改用softmax直接產出分類結果(如是貓、狗還是兔子)。當然,連框框精修也被整合到CNN中。這樣的整合效果,在Fast R-CNN的論文中,讓一個影像僅需要0.32秒就能計算完成!
快還要更快,好還要更好,一直是電腦科學界所樂見的挑戰。Fast R-CNN的計算瓶頸,在於找出2000個左右的候選區域,也就是Selective Search演算法,那麼我們可不可以也把挑選候選區域的工作,也包給CNN呢?
可以的,這就是Faster R-CNN(名字也太直覺)中的RPN(Region Proposal Network)。RPN是在影像經過CNN提取特徵成為Feature Map後,才開始利用Sliding window在Feature Map上找出物件,而且預設採用 3 種不同大小配上 3 種不同長寬比,共僅九個框框,因此運算上更快速。(框框不準確就交給精修層去處理囉)
Faster R-CNN的速度有多驚人?論文中一張影像Fast需要2秒處理,Faster僅需0.2秒,比傳統R-CNN快上250倍!
一路看來,物件偵測的四大步驟(產生候選區域、提取特徵、物件分類、區域精修)開始逐漸整合到同一網路中,整合的越好,速度就越快。
Faster R-CNN很不錯了,But(人生最厲害就是這個BUT)在即時影像的辨識上還是不夠快,因此又出現了更變態的YOLO!
YOLO(You only look once)諧趣地借用了青少年愛用縮寫(You only live once),且「模」如其名,經過單一CNN處理過的每張影像直接輸出物件類別與位置,非常強悍。前面介紹的R-CNN類模型都需要找出候選區域,然後用分類演算法判定類別。YOLO採用不同的設計思維,一次檢視整張圖片,且用迴歸的方式算出每種類別的機率,因此速度十分驚人。
YOLO會將影像切割為S x S個格子,每個格子以自己為中心,判斷B個框框中包含物件的信心,以及是哪類物件。下圖為YOLO針對此圖的計算,S=7且B=2,代表紅格子為7x7個格子中的一個,黃色框框為2個框框,其中一個直框包含了狗,因此包含物件的信心會比橫框來得高。
因此,YOLO是名符其實的Deep Learning,一個包含24層Conv以及2層FC的End-to-End模型。
不意外的是,YOLO也不是無敵,因為只有7x7個格子,每個格子又只要處理兩個框框,因此在Localization(畫出物件邊界)的表現上自然不如 Fast R-CNN,於是出現了更厲害的YOLOv2、YOLO9000(9000種類別)、YOLOv3,一版比一版更快、更準、更適應不同的影像。
以下文章對歷代YOLO有非常詳盡的介紹!
以下則是中文界物件辨識寫得非常深入的文章,有興趣深究者可參考。
Semantic segmentation
Object Detection可以用方框標出物件的範圍,那麼可否做得再更細緻,完全描繪出物件的形狀呢?
CNN最後幾層,通常都是用FC,輸入資料也都成為一維,用於產生這張圖屬於何種分類。而FCN(Fully Convolutional Networks)顧名思義,是一種只使用Conv的CNN,它把最後的FC層換成Conv層,因此仍舊保留了影像的特徵,才可能做到像素級的預測!
不過,影像經過多個Conv跟Pooling層後,最後的大小會比原始輸入更小(如VGG16經過五次Pooling後圖片縮小了32倍),這樣就無法正確標出物件位置,因此需要以下兩種技巧的搭配來克服上述問題。
一是Upsampling,又稱為反卷積(Deconvolution)或轉置卷積(Transposed convolution),可以想像成是試圖把最後卷積結果放大至原始影像大小的一種特殊Conv層。
二是Skip架構。既然最後一層的結果已經濃縮到不行(32倍),還原的效果可能沒這麼好,那麼乾脆直接參考還沒那麼濃縮的圖片,比如說池化3(8倍)跟4(16倍)的結果,再結合最後一層的32倍濃縮,效果十分不錯。(池化三再往前效果就不好了,論文作者有實驗過)
以下是FCN-32s(最濃縮版)、FCN-16s(參考池化4)、FCN-8s(參考池化3)的切分效果。
Instance Segmentation
Semantic segmentation可以做到像素級的分類,不過沒有辦法做到分辨出相同物件的不同實體。以下圖為例,右下角的兩個Cube,對於Semantic segmentation來說是一整區像素都屬於Cube,但Instance Segmentation可以做到辨識出有藍色跟綠色兩個Cube。
Mask R-CNN可以說是這方面的翹楚。Mask R-CNN基本上就是Faster R-CNN,再加上了用來精準切割Instance的遮罩層,下圖的兩層Conv就是在實作這個遮罩。
以下是遮罩的範例,以及示範套上Mask後如何明確切出Instance。
由於一脈相傳,找了張清楚的族譜(?)來比較R-CNN到Mask R-CNN的架構差別。
更多Mask R-CNN的技術細節可以參考以下這篇文章。
Super Resolution
將影像從原本的低解析度,轉化為清楚的高解析度,稱為Super Resolution(簡稱SR),在衛星影像、監控設備或醫學領域都有非常高的實用價值。
SRCNN(Super-Resolution Convolutional Neural Network)是這個領域的開山始祖,低解析度影像輸入前,會先透過Bicubic插值演算法放大為目標尺寸,再經過三層Conv,分別進行特徵擷取、特徵之非線性對應以及重建三步驟,最後輸出高解析度之影像。
還原的效果好不好,通常是透過PSNR(Peak Signal to Noise Ratio,峰值信號雜訊比)這個指標來看,越高代表越未失真,效果越好。下圖是SRCNN發表時,各種演算法還原結果的比較。
當然,後續又出現了DRCN(加入了RNN概念)、VDSR(用了20層Conv)、SRGAN(利用GAN)等等不同的方法,細節就不再贅述。
Saliency detection
顯著性偵測(Saliency detection)主要目的是標出影像中最容易「吸引眼球」的部分,也就是人眼會最先注意的地方。常見方式分為Bottom-up與Top-down兩大類,Bottom-up是透過底層的特徵來找出顯著性,Top-down則是先定義出目標(如找出圖片中的汽車)。
林並沒有過於深入介紹此模型,但從以下論文的結果比較,可以發現林參與的論文方法較之前更準確偵測顯著性。
Image style transfer
就像許多App提供的相片風格化功能,提供一個「內容」影像(如風景照),以及想要採用的「風格」影像(如梵谷的畫),就可以將內容影像的樣貌轉換成想要的「風格」。
首先利用VGG19針對內容與風格影像分別擷取特徵,混和後產生合成圖,整個模型就是在找出與原內容與原風格影像差距最小的合成圖。
更多技術細節可參考以下對岸文章。
Action and gesture recognition
辨識出影像或影片中人的動作或手勢,也是電腦視覺熱門的領域之一,2014年牛津大學提出的Two –Stream CNN是一個重要里程碑。Two –Stream CNN的Spatial ConvNet處理每一個Frame(幀)的影像資訊,Temporal則處理Frame之間的物件移動資訊,並採用 HMDB-51跟UCF-101(不同的動作資料庫)作為與傳統方式的比較。
以下是實際上的成果,頗驚人!
Image matching and alignment
Image matching目的在先比對兩張照片是否相似(如從不同角度拍的照片、相同物件的不同照片),重點在於關鍵點的比對;而Image Alignment則是要從像素等級把相片拼接起來,如環拍了五張照片,最後透過精準拼貼(Alignment)成為一全景相片。
其中一種Image matching的方式,是透過下圖的UCN(Universal Correspondence Network),細節可參考原論文。
寫到這邊,才知道電腦視覺領域已經發展得這麼蓬勃,想要一天吸收這些知識,真的是不可能的任務!