從Vehicle-ReId到AI換臉,應有盡有,解你所惑

最近在做視頻搜索的技術調研,已經初步有了一些成果輸出,算法準確性還可以接受,基本達到了調研的預期。現將該技術調研過程中涉及到的內容總結一篇文章分享出來,內容比較多,初看起來可能關係不大,但是如果接觸面稍微廣一些,就會發現其實原理都是差不多的。

先描述一下我要解決的問題:上傳任意一個車輛截圖,需要從海量的監控視頻中(高速監控)找到該車輛目標歷史經過點位的歷史視頻錄像。這個問題本質上其實就是圖像檢索或者叫Object-ReId問題,唯一不同的是,找到車輛目標後需要定位到視頻錄像,後者其實很簡單,只需要事先建立好圖片和錄像片段之間的索引關係即可,跟我們今天要討論的內容關係不大。(本文圖片點擊查看更清楚)

 

圖像檢索的本質

首先要清楚的是,機器是無法直接理解圖像或者聲音這種多媒體數據的,甚至也包括一些複雜的結構化數據(比如數據庫中的表數據)。傳統機器學習中一個常見的概念是“特徵工程”,說的是從原始的、複雜的數據中提取出有一定代表意義的特徵數據(簡單表示,比如用多維向量),這些特徵數據相比原數據要簡單得多!然後再用算法去分析、學習這些特徵數據,得出規律。基於神經網絡的深度學習中已經慢慢弱化了“特徵工程”這一概念,因爲深度學習主流的方式基本都是端到端的流程,輸入直接產生輸出,特徵提取的過程已經在神經網絡中的某個部分幫你做完了。

那麼現在圖片檢索的問題,其實已經被轉變成“特徵數據檢索的問題”了。原來需要進行圖像比對,現在只需要進行特徵比對,而顯然機器更擅長後者。

 

Object-ReId/Person-ReId/Vehicle-ReId的原理

ReId技術一般用於多攝像機目標重識別的場合,目標經過多個點位被多個攝像機拍攝錄像存儲,輸入該目標的一張截圖,可以利用ReId的技術將該目標經過的點位找出來,用於後續的運行軌跡分析,該技術一般用於安防/公安領域,目標一般可以是行人(Person-ReId)和車輛(Vehicle-ReId)。ReId的核心就是前面提到的圖像檢索技術,從海量圖片中(視頻由圖片組成)檢索指定的圖片,那麼這個檢索的準確性就依賴於前面提到的特徵比對算法準確性了。

上圖描述了Vehicle-ReId的一個完整流程,我們可以看到特徵比對只是其中的一個環節,完整的流程還要包括車輛目標提取(目標檢測)、特徵提取、索引建立。

 

圖像特徵提取

前面已經知道了圖像檢索的本質其實就是特徵的比對,那麼這個特徵應該如何提取得到呢?

傳統的機器學習可能需要手工設計算法去提取特徵,提取的方式有多種多樣,拿圖像而言,可以從顏色角度入手,提取圖像的顏色特徵。比如大部分人可能比較熟悉的顏色直方圖,這個算法就可以用來計算圖像的“像素組成”(比如各種顏色分別佔比多少),像素組成確實可以在一定程度上代表原始圖片。在某些數據集中,像素組成相似的原始圖片也比較相似。然後拿像素組成數據去做分類/聚類,基本就可以搞定這種機器學習任務。

現在流行的深度學習已經拋棄了人工提取特徵的做法,取而代之的是直接上神經網絡。還是拿圖像而言,直接用卷積網絡無腦捲一捲,就可以得到對應的圖像特徵。這種方式提取到的特徵是unreadable的,不像像素組成,它確實可以被人理解。卷積網絡最後提取到的特徵人工無法直觀理解,它可能僅僅是一個高維向量,不做處理的話,你都無法在二維/三維空間中顯示出來。所以很多人說深度學習(神經網絡)是不可解釋的,在某種程度上它確實無法被解釋。

由前面的內容我們不難發現,特徵提取是非常重要的一步,直接關係到後面基於特徵的一切應用的準確性。特徵是對原始數據的一種表達,是計算機容易識別的一種理想格式。理想情況下,特徵之間的特性和規律可以直接反應原始數據之間的特性和規律。傳統機器學習過程中,如何找到合適的特徵提取方法是一項非常難的事情,現在主流的深度學習過程中,已經簡化了該步驟。

需要注意的是,一些論文、博客、文章中對特徵的稱呼不盡相同,比如Features(特徵)/Representation(表達或表示)/Embedding(嵌入)/Encoding(編碼)等等基本都是一個意思(注意中文翻譯可能不太準確)。其實從這些英文單詞不難看出,不管用什麼詞,人們想要表達的意思大概都是差不多的,即特徵是對原數據的簡要表達。

上圖是深度學習中利用神經網絡來提取特徵,原始神經網絡是一個多分類網絡,我們可以使用分類數據集去擬合該神經網絡中的參數,待訓練完畢後,去掉最上(最右)用於分類的網絡層,倒數第二層即可輸出128維的特徵數據。基於這個128維的特徵數據,我們可以做很多事情:

1、原網絡做的分類任務。例子中原網絡本身就是一個分類網絡,對這些特徵數據進行分類,推理出原輸入圖片的類型。看看是鞏俐還是奧巴馬;

2、本文的重點。特徵數據比對,用於圖像檢索、人臉識別、Vehicle-ReId等;

3、用於無監督學習。先對一堆沒有標籤的圖片數據集合進行特徵提取,基於這些特徵數據利用K-Means或DBSCAN等算法自動將這些圖片分成若干類,類似Iphone相冊自動分類功能(比如相同的人臉歸爲一類)。

總之,特徵數據非常有用,是一切機器學習(深度學習)任務中的重中之重。

 

圖像特徵比對

前面已經多次提到特徵比對,那麼特徵比對的方式有哪些呢?二維空間中的2個點,我們可以通過計算之間的直線距離來判斷它們是否相似(越小越相似,爲零表示完全相同。反之亦然);三維空間中的2個點,我們照樣可以通過計算之間的直線距離來判斷它們是否相似(越小越相似,爲零表示完全相同。反之亦然)。那麼對於更高維的點呢?照樣可以用這種方式去做比較!

這裏需要說的是,直線距離只是手段之一,還有其他距離可以計算。比如不太常見的餘弦距離,它代表兩個點到座標原點線段之間的夾角餘弦值,角度越小代表2點距離越近。餘弦距離跟直線距離不同,一個是用角度大小衡量、一個是用線段長短衡量。

我們可以看到,直線距離(歐氏距離)關注點是2個特徵的各個維度具體數值,而餘弦距離關注點是2個特徵的維度分佈。直線距離爲零,代表2個特徵的各個維度數值完全相同;而餘弦距離爲零,代表2個特徵的維度分佈完全相同。(1, 1, 1)和(2, 2, 2)兩個特徵的直線距離不爲零,因爲它們各個維度的數值不同,但是它們的餘弦距離爲零,因爲它們的維度分佈是完全一樣的,都是1:1:1。

舉一個實際的例子,張三的語數外三科的成績爲(80, 80, 80),李四的語數外三科的成績爲(90, 90, 90),這兩的直線距離不爲零,李四的三科成績明顯跟張三不同。但是這兩的餘弦距離爲零,可以理解爲李四的三科平衡程度跟張三一致,都不偏科。所以不同的距離代表含義不同,直線距離可以用來衡量他們的成績是否差不多,而餘弦距離則可以用來衡量他們偏科程度是否差不多。兩個距離,視角不一樣。

 

高維特徵降維和可視化

前面舉例子用的是二維或者三維數據,其實特徵數據大部分時候都是高維的,比如128維或1024維等等。在不做任何處理的情況下,我們無法直觀看到這些高維數據之間的關係,因爲它既不是二維的我們可以畫到平面座標系中、也不是三維的我們可以畫在立體座標系中。如果想要直觀看到數據之間的關係,我們需要對這些特徵再次進行降維處理,將之前的高維數據一一映射到二維或者三維空間。比如現在提取到了1000張圖片的特徵數據,每個數據都是128維,我們如果想要在二維或三維空間觀察這1000個特徵數據之間的關係(比如特徵數據之間的緊密程度),從而判斷原始圖片之間的關係、或已經知道原始圖片之間的關係我們需要驗證提取到的特徵數據是否合理。

值得高興的是,已經有非常成熟的降維技術可以使用,比如常見的PCA和t-SNE算法,直接可以將高維數據降到二維或者三維,而依然保留原始數據的特性。通過這些手段我們可以直觀看到高維特徵數據在二維/三維空間中的呈現,從而觀察原數據之間的關係。下圖是我提取高速公路視頻畫面中車輛目標的特徵數據,原始特徵是128維,然後利用t-SNE算法進行降維處理,最後得到的二維格式數據並在二維座標系中將原始圖片一一對應繪製出來。

我們可以看到,外觀相似的車輛(這些圖片是隨機抽取的,並沒有標籤數據)聚集在一起,用前面講到的距離來說,就是越相似的圖片特徵距離越近。這個可視化的過程基本可以證明我前面設計的特徵提取網絡是合理的,這個網絡用於提取其他類似車輛圖片的特徵也是OK的。

看到這裏的朋友其實可能已經注意到,機器學習(或深度學習)的主要工作其實說白了就是一個不斷對數據進行降維的過程,我們可以將原始非結構化數據諸如文字/圖片/音頻看成是一個維度很高(超高維)的數據格式,然後設計算法將這些超高維數據降到低維格式,再去應用。前面講到的特徵提取也算是降維的一種。

 

自編碼器

談到降維技術,這裏我想介紹一個超級牛逼的結構,學名叫auto-encoder(翻譯過來就是自編碼器)。我剛開始接觸這個東西的時候就感嘆於它的神奇強大,因爲它結構相當簡單,而且理解起來並不費勁,但是起到的效果驚人。它的結構是對稱的,前面半部分主要對輸入(一般指圖片)進行編碼,其實就是特徵提取,比如提取得到一個128維的特徵數據。後半部分馬上對該特徵進行解碼,還原成原來的圖片。前半部分叫編碼器,後半部分叫生成器。這個東西可以由兩個神經網絡組成,大概結構類似如下圖:

如上圖這種結構的神經網絡訓練也相當容易,你的訓練數據集不需要提前標註,因爲網絡的輸出就是網絡的輸入,換句話說,你可以把它當作無監督學習!有人可能就要問了,一編一解到底想要幹什麼呢?這樣操作的主要目的是得到中間的特徵數據(論文術語叫space representation),沒錯,用這種方式訓練出來的前半部分可以當作一種特徵提取器(原定義叫編碼器),將它作用在其他類似圖片數據上,就可以得到對應的特徵數據,起到的作用跟前面介紹的其他特徵提取方式差不多。

這種自編碼器的一大優勢是訓練它的數據集合不需要標註,訓練是一個無監督學習過程。它不像前面提到的那些特徵提取方法,大部分都是基於監督學習的。也就是雖然我們的目的是訓練一個特徵提取的網絡(網絡輸出是高維特徵數據),但是往往需要提前準備帶有標籤的訓練數據(如分類數據)。當然,除了這裏提到的自編碼器之外,還有其他的一些特徵提取結構,也屬於無監督學習的範疇,比如孿生網絡、或者採用triplet loss訓練時,這些都是無監督學習的例子。

 

AI換臉技術

這個話題其實跟今天談到的特徵數據(提取/比對)關係不是特別大,只是前面我已經提到了自編碼器,知道了這個結構的前半部分能夠應用於特徵提取的任務,而剛纔沒說的是,它的後半部分(生成器)是可以用於AI換臉的,之前火爆全網的AI換臉可以採用類似技術實現。

其實AI換臉原理也非常簡單,自編碼器的前半部分用於人臉編碼(特徵數據,下同),它的後半部分基於該編碼進行人臉還原(圖像生成),這個過程即是我們進行網絡訓練的過程:一個人臉輸入,不斷擬合網絡讓它輸出同一個人臉。如果我們在應用該網絡結構的時候稍微改變一下:將A人臉輸入到它的編碼器,得到它的人臉編碼後,不要使用對應的生成器去還原人臉,而是改用另外B人臉的生成器去還原人臉!那麼會得到什麼呢?答案是:得到一張A的臉部輪廓+B的五官細節。下圖顯示AI換臉的技術原理:

如上圖可知,編碼器輸出的人臉編碼在某種意義上可以看作是臉部輪廓的表示,生成器基於該輪廓進行五官細節恢復,最終得到一個合成後的人臉。下面是一個將趙本山五官換到楊瀾臉部的例子(完整視頻鏈接):

通過AI換臉的這個例子我們可以得知,特徵提取相當重要,整個流程能夠正常work(或work得很好)大部分依靠中間生成的特徵數據(人臉編碼)。神經網絡的神奇之處就在於,有些東西你無法解釋,但是就是湊效。

 

其他常見的無監督學習

既然提到了AI換臉,索性就將本篇文章的主題扯遠一些。自編碼器的訓練過程屬於無監督學習的範疇,根據相關大神的名言:無監督學習纔是真正的人工智能。確實沒錯,監督學習在某些場合有非常多的侷限性。那麼除了上面提到的自編碼器訓練屬於無監督學習,機器學習領域還有哪些無監督學習的例子呢?

1、類似K-Means這些聚類算法,算法可以自動從給定的數據(特徵數據)尋找規律,無需事先提供參考樣例

2、類似t-SNE這種降維算法,算法可以自動從給定的數據(特徵數據)尋找規律,無需事先提供參考樣例

3、類似上面提到的自編碼器,以及其他一些生成型網絡,包括GAN相關技術,都屬於無監督學習

4、類似採取triplet loss等技術直接操控特徵數據的網絡訓練方式(基於特徵數據計算loss),也屬於無監督學習

只要在訓練過程中無需事先提供參考樣例(標註樣本)的機器學習過程全部都可以看作是無監督學習,無監督學習跟算法並沒什麼直接關係,傳統機器學習、現在主流基於神經網絡的深度學習都可以有無監督學習方式。

好了,本篇文章到這裏結束了。由於時間原因,以及查資料驗證費時間,前前後後花了半個月功夫。其實主要目的是爲了說明特徵數據在機器學習(深度學習)領域的重要性,這個領域基本所有的東西全部圍繞它展開的,所有的原始非結構化數據/結構化數據都需要先轉成特徵數據,再被機器學習算法(深度學習神經網絡)學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章