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

周見智發表於2021-06-17

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

先描述一下我要解決的問題:上傳任意一個車輛截圖,需要從海量的監控視訊中(高速監控)找到該車輛目標歷史經過點位的歷史視訊錄影。這個問題本質上其實就是影像檢索或者叫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),也屬於無監督學習

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

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

相關文章