目前,深度學習幾乎成了計算機視覺領域的標配,也是當下人工智慧領域最熱門的研究方向。計算機視覺的應用場景和深度學習背後的技術原理是什麼呢?下面讓我們來一探究竟。
計算機視覺的應用
什麼是計算機視覺呢?形象地說,計算機視覺就是給計算機裝上眼睛(照相機)和大腦(演算法),讓計算機可以感知周圍的環境。目前計算機視覺研究主要集中在基礎應用場景,像圖片分類、物體識別、人臉的3D建模等。
識別物體是圖片分類的一個比較常見的應用,例如一個簡單的貓咪識別模型,我們首先要給計算機定義模型,然後準備大量貓咪的照片去訓練這個模型,讓計算機能識別出來,輸一張圖片的時候能識別出圖片是不是貓咪。正常情況下計算機模型能識別得比較準確,但是當我們輸入了一些有遮擋、形態多變或者角度、光照不一的圖片時,之前我們建立的模型就識別不出來。這就是計算機視覺在應用中存在的難點問題。
深度學習背後的技術原理
機器學習
在計算機視覺領域中是怎麼運用深度學習來解決問題的呢?深度學習作為機器學習的一種,這裡先簡單介紹下機器學習。
機器學習的本質其實是為了找到一個函式,讓這個函式在不同的領域會發揮不同的作用。像語音識別領域,這個函式會把一段語音識別成一段文字;影像識別的領域,這個函式會把一個影像對映到一個分類;下圍棋的時候根據棋局和規則進行博弈;對話,是根據當前的對話生成下一段對話。
機器學習離不開學習兩個字,根據不同的學習方式,可以分為監督學習和非監督學習兩種方式。
監督學習中,演算法和資料是模型的核心所在。在監督學習中最關鍵的一點是,我們對訓練的每個資料都要打上標籤,然後透過把這些訓練資料輸入到演算法模型經過反覆訓練以後,每經過一次訓練都會減少演算法模型的預計輸出和標籤資料的差距。透過大量的訓練,演算法模型基本上穩定下來以後,我們就可以把這個模型在測試資料集上驗證模型的準確性。這就是整個監督學習的過程,監督學習目前在圖片分類上應用得比較多。
再來看非監督學習。跟監督學習不同的地方是,非監督學習不需要為所有的訓練資料都打上標籤。非監督學習主要應用在兩個大類,第一類是做聚類分析,聚類分析是把一組看似無序的資料進行分類分組,以達到能夠更加更好理解的目的;另外是做自動編碼器,在資料分析的時候,原始資料量往往比較大,除了包含一些冗餘的資料,還會包含一些對分析結果不重要的資料。自動編碼器主要是對原始資料做降維操作,把冗餘的資料去掉,提高後面資料分析的效率。
透過不同的學習方式獲取到資料後,演算法是接下來非常重要的一環。演算法之於計算機就像大腦對於我們人類,選擇一個好的演算法也是特別重要的。
上面是ImaegNet競賽的結果,2012年以前圖片分類採用的機器學習的模型是特徵+支援向量機的模型,2012年以後是卷積神經網路的模型,卷積神經網路在計算機視覺領域發揮著至關重要的作用。為什麼2014年以後卷積神經網路才發揮它的作用呢?我們先來看看神經網路。
神經網路
神經網路是受人腦神經元結構的啟發,研究者認為人腦所有的神經元都是分層的,可以透過不同的層次學習不一樣的特徵,由簡單到複雜地模擬出各種特徵。
上圖是計算機應用數學的方式來模擬人腦中神經元的示意圖。a1到ak是訊號的輸入,神經元會對輸入訊號進行兩次變換。第一部分是線性變換,因為神經元會對自己感興趣的訊號加一個權重;第二部分是非線性變換。
神經網路就是由許多的神經元級聯而形成的,每一個神經元都經過線性變換和非線性變換,為什麼會有非線性變換?從數學上看,沒有非線性變換,不管你神經網路層次有多深都等價於一個神經元。如果沒有非線性變換,神經網路深度的概念就沒有什麼意義了。
這是大家知道的神經元網路整體的模型,我們具體怎麼來訓練神經網路呢?
第一步,定義一個網路模型,初始化所有神經網路的權重和偏置。定義好網路模型以後再定義好這個模型的代價函式,代價函式就是我們的預測資料和標籤資料的差距,這個差距越小,說明模型訓練得越成功。第一次訓練的時候會初始化所有神經元的引數。輸入所有訓練資料以後,透過當前的模型計算出所有的預測值,計算預測值以後和標籤資料比較,看一下預測值和實際值有多大的差距。
第二步,不斷最佳化差距,使差距越來越小。神經網路根據導數的原理發明瞭反向傳播和梯度下降演算法,透過N次訓練後,標籤資料與預測值之間的差距就會越來越小,直到趨於一個極致。這樣的話,所有神經元的權重、偏置這些引數都訓練完成了,我們的模型就確定下來了。接下來就可以在測試集上用測試資料來驗證模型的準確率。
卷積神經網路
以上所講的都是一般的全連線神經網路,接下來進入卷積神經網路。卷積神經網路是專門針對圖片處理方面的神經網路。卷積神經網路首先會輸入一張圖片,這張圖片是30×30,有三個顏色通道的資料,這是輸入層。下面是卷積層,有一個卷積核的概念,每一個卷積核提取圖片的不同特徵。
提取出來以後到池化層,就是把卷積層的資料規模縮小,減少資料的複雜度。卷積和池化連起來我們叫做一個隱層,一個卷積神經網路會包含很多個隱層,隱層之後是全連線層,全連線層的目的是把前面經過多個卷積池化層的特徵把資料平鋪開,形成特徵向量,我們把特徵向量輸入到分類器,對圖片進行分類。
簡單來說,卷積神經網路更適合計算機視覺主要有兩個原因,一是引數共享,另外一個是稀疏連線。
基於深度學習的人臉識別演算法模型
以上是深度學習在計算機視覺領域的相關應用以及它背後的技術原理,接下來看看基於深度學習的人臉識別演算法模型。
先看一下人臉識別的應用場景,主要分三個方面:一是1:1的場景,如過安檢的時身份證和人臉比對、證券開戶;二是1:N的場景,比如說公安部要在大量的影片中檢索犯罪嫌疑人;三是大資料分析場景,主要是表情分類,還有醫學的分析等。
上圖主要是人臉識別簡單的流程,右邊的是訓練模型,有人臉的大資料庫,經過Gabor、LBP等經驗描述子,或深度學習演算法提取特徵模型,這個模型部署在應用上,應用透過攝像頭、影片獲取到人臉以後做預處理,進行特徵提取,特徵比對,最後輸出結果,這是比較通用的人臉識別的流程。
DeepID演算法
DeepID演算法的目的是識別兩張圖片,最後的輸出是兩張圖片的相似度。輸入圖片A和圖片B,經過DeepID卷積神經網路模型會計算出向量A和向量B,合併成向量AB。然後將向量AB輸入分類器,算出向量AB的相似度,最後以這個相似度區分這兩個圖片是不是同一類。
這裡要提到的兩個模型,一是DeepID的模型,二是分類器的模型。DeepID模型是用卷積神經網路演算法訓練的,最後的應用是把卷積神經網路後面的softmax分類層去掉,得到softmax前面的特徵向量;分類器模型是比較經典的如支援向量機/聯合貝葉斯分類。訓練過程中,把訓練樣本分成五份,四份用來訓練卷積神經網路,一份用來訓練分類器,可以相互印證。
DeepID除了在網路模型上做的工作,還會對圖片做預處理。像Patch的處理,按照圖片以人臉的某一個部位為中心生成固定大小的圖片,然後對每一個特定的Patch訓練卷積神經網路。一張圖片輸入後,切分成多個patch,分別輸入到對應的卷積神經網路。每一個卷積神經網路輸出一個向量,透過降維的演算法,把所有patch對應的輸出向量進行處理,去除冗餘資訊,得到人臉的向量表示。
最後在比較兩張人臉時,就是分別將兩張人臉的這個向量輸入分類器得到相似度結果的。這裡多patch切分有一個優勢,比如在現實應用中有一些人的臉部是被遮擋的,由於它是分為不同的patch,這樣的場景下魯棒性會比較好。
DeepFace演算法
再來看DeepFace演算法。這是人臉對齊的流程,這張圖是史泰龍的側臉圖片,第一步是把人臉擷取出來,對人臉上面68個基本點,描述出基本點以後,用三角剖分的演算法把68個基本點連起來,然後將標準的人臉模型運用到三角剖分上,這樣標準的人臉模型就具備了這樣的深度。
經過仿射變形後,將側臉模型轉成正臉模型,最後把這個模型應用到具體的圖片上,就得到了人的正臉圖片。這個演算法的主要作用是透過一些模型將人物的側臉轉成正臉,以便做進一步的人臉識別/人臉分類 。
DeepFace神經網路如圖所示,前面三個卷積層比較普通,是用來提取臉部的一些基本特徵;後面三個卷積層有一些改進,用的是引數不共享的卷積核,我們提到卷積核的基本特徵有一個是引數是共享的,因為研究認為圖片中不同的部位一些基本特徵是相似的。
但在這個演算法中,經過人臉對齊之後,它的不同的區域會有不同的基本特徵,所以這裡運用了引數不共享的卷積核。引數不共享,就不會發揮出卷積核引數少的優勢,這樣可能增加訓練的複雜度。
FaceNet演算法
FaceNet演算法是谷歌人臉識別的一種演算法,FaceNet演算法提出三元組的概念:三張圖片放在一起,兩張圖片是同一個人的,一張圖片不是同一個人的。如果一個三元組中,同一個人的圖片的距離要大於不同人之間的距離,那麼經過學習以後,這個三元組中同一個人的圖片之間的距離,會小於不同人的圖片之間的距離。它不用做分類,直接計算出兩張圖片之間的距離。
其他演算法
其他演算法如FR+FCN,透過神經網路去訓練,當你得到一個人側臉照的時候,可以透過神經網路生成正面照;Face+baidu是傳統的卷積網路,建立在大資料的基礎上,訓練了數百萬張人臉。
Pose+Shape+expression augmentation,這篇論文是透過三個變數擴充資料集,讓資料蒐集工作變得容易;CNN-3DMM,它在標準的3D人臉模型基礎上,訓練一個神經網路,來給標準3D模型生成不同的引數,這個神經網路會根據不同的圖片生成不同的引數,給個體建立不一樣的3D模型。
基於DeepID演算法的人臉搜尋專案
最後介紹一下我們曾做過的一個人臉識別模型的專案。活動攝影承接商需要把一些會場活動、體育賽事等活動照片拍攝下來以後上傳到他們的網站上,因為圖片有幾百上千張,活動參與者很難找到自己的圖片。如果用人臉識別的模型,就可以把自己的臉部拍下來上傳,在圖片集中快速找到自己的照片。
我們看一下它整體的架構。右邊是人臉庫的匯入,活動攝影承接商獎會場拍攝的一千張照片匯入搜尋目標庫。匯入以後做多patch預處理,運用DeepID的演算法,計算每張圖片各patch的特徵向量,放到特徵向量庫裡,建立一個從特徵向量到原始圖片的索引。
左邊的部分是使用者搜尋,拍攝了自己的頭像後,把它上傳上來進行搜尋,後臺同樣先對使用者頭像做多patch切分,透過DeepID模型計算出使用者頭像的特徵向量,然後在特徵向量庫中逐步比對目標特徵向量,將相似度最高的N個特徵向量檢索出來,最後透過索引查到原始圖片,返回給使用者。
以上是深度學習背後的技術原理以及它在計算機視覺領域常見的應用,希望透過對這些原理的解析及應用的分享,讓大家更加直觀快速地瞭解人工智慧技術層面的基礎概念,並且對人工智慧技術的學習和運用有所啟發。