中科視拓李凱周:人臉識別應用實戰——SeetaFace2

  • 2019 年 10 月 11 日
  • 筆記

演講嘉賓

李凱周,天津大學計算機科學與技術專業碩士。現擔任中科視拓研發部產品總監兼研發總監,負責研發算法部署、SDK化和數據分析管理工作,主導SeetaFace2的算法發佈。

回顧正文

大家好,簡單介紹一下,我是李凱周,現擔任中科視拓研發部產品總監兼研發總監,負責研發算法部署、SDK化和數據分析管理工作,現在開始我們今天的分享。

今天跟大家分享的題目是人臉識別應用實戰:SeetaFace2,就是以SeetaFace2為例簡述人臉識別技術如何從算法到應用在工業上的人臉識別系統。首先介紹SeetaFace2的主要內容,然後介紹SeetaFace2檢測、定位、識別的核心接口,使用這些核心接口進行典型應用的舉例,包括:跟蹤、質量評估、人證對比、動態識別,之後再深入地挖掘SeetaFace2的源碼,給大家呈現把AI的算法包裝成SDK的系統應該經過哪些步驟,最後是求職分享,包括我對 AI 工程師的認識以及作為 AI 工程師的基本要求。

下面簡要說明一下SeetaFace2包含的核心接口以及接口的含義,要做人臉識別首先要把圖片或者圖片序列中的人臉找出來,所以第一個模塊就是人臉檢測模塊,人臉檢測模塊是C++庫,最重要就是要包含這些頭文件。人臉檢測的話要包括人臉檢測器叫FaceDetector的對象,通過給定對應的模型文件,就可以檢測一個實體對象。要把待檢測的圖片轉化為SeetaFace2支持的圖像格式,是內存上連續存儲的HWC格式和BGR彩色通道的一個圖像格式,這個跟 OpenCV是一樣的。可以把OpenCV的對象轉化成SeetaImageData的對象。後面的操作就很簡單了,就是通過detect接口把每張人臉用數組反應出來。需要注意的是data的指針是一個禁用的內部指針,不需要外部進行釋放。

獲取到圖片中的每張人臉之後,只知道人臉位置,檢測到人臉之後,要對人臉進行標定,把關鍵點找出來,找出關鍵點之後就知道人臉姿態和具體人臉在圖片中的細節狀態。而關鍵點定位的接口和檢測的接口是高度類似的,也是要通過對應的模型文件構建人臉關鍵點的定位器,同樣的把圖片轉化成ImageData對象,而ImageData對象是可以復用的。最後檢測的時候mark接口要輸入原圖和人臉位置。

定位到人臉之後要對人臉做一個識別,識別過程提取了兩套接口,分別是FaceDatabase、FaceRecognizer,如下圖所示,FaceDatabase提供了內存中管理人臉庫,包含了註冊(Register)和查詢(QueryTop)接口;FaceRecognizer包含了特徵提取(Extract)和特徵比對的接口(CalculateSimialrity),詳細講解請參看視頻回放。

在這些基礎上,就可以得出一個簡單的人臉識別的示例,這裡給出一個示例的代碼,如下圖:

人臉識別中大家很關心的問題還有人臉識別和質量評估,而且識別系統還有兩個關鍵問題。首先,在算力有限的情況下同時應對應用級別的需求,不必要每幀處理,只要確定視頻中抓拍到的多張圖片哪些是一個人,一個人只識別一次就可以了;還有,可以通過跟蹤,預先判斷抓拍到的圖片哪些是一個人,同時需要質量評估從這些圖片中選擇哪些是可以識別的。

下面簡要講述一下人臉跟蹤,怎麼通過人臉檢測去實現跟蹤,如圖所示:人臉跟蹤的基本問題是在前一幀檢測到了兩張人臉(PID0和PID1),那後一幀檢測到的人臉是前面出現的哪個人臉?還是新的人臉?PID相同的我們認為是同一個人,具體講解請觀看視頻回放。

這裡給出一種實現方式,可以計算後一幀的每一張和前一幀的每一張人臉的交並比,從而可以找到重疊率最大的人臉。

如果重疊率超過閾值,則人臉是一張人臉。否則賦予新的PID。

下面我們講質量評估,這裡列舉了幾種最直接影響人臉識別判斷效果的因素:

接下來依次講一下這幾個方面的質量該通過什麼方法去判斷,詳細講解請觀看視頻回放:

姿態中,平面內旋轉角度,可以通過兩眼連線與水平的夾角判別;偏轉角度,可以通過鼻尖到人臉中心線的距離判別;俯仰的角度可以通過鼻尖在眉心和嘴中心的投影位置判別。

面部亮度就是每個像素灰度值的均值。

清晰度參考採用一種無參考的判別方式,通過判斷原始圖像再次模糊後的梯度信息損失程度來判斷原始圖像的清晰程度。

下面說一下經常會遇到的基本問題,對剛剛接觸人臉識別的同學來說可能會有一些幫助,詳細講解請參看視頻回放。

之前講的可以算是純工程化的部分,現在我們展開來介紹SDK源碼,給大家展示一個AI算法是經過哪些步驟變成一個一個SDK的。不過今天不會涉及算法模型的具體介紹。考慮到部分同學可能還不了解SeetaFace2是什麼,所以不會太展開講所有的源碼內容,今天主要的目的就是介紹源碼,然後展示我們的算法是如何封裝的,同時我們封裝或者分析的時候應該關注哪幾個方面。

下圖展示的是我們的源碼結構圖:

接下來介紹一下SeetaNet的這兩個相關接口:

模型加載之後就是模型推理的部分:

有了網絡的初始化和前向,更重要的就是網絡的前處理和後處理:

還會涉及到一些參數轉換的問題:

最後來看一下總結圖:

今天沒有深入介紹具體算法的實現,下圖給出了不同算法的參考文獻,有興趣的同學可以看一下。同時希望通過今天的分享,大家能夠了解到一個AI算法,是如何變成可復用的SDK,然後怎麼把SDK應用到業務系統的。

最後一點時間和大家分享一下AI工程師的職業基本素質和技能,我會從實踐方面來分享一下成為AI工程師的基本要求。一般說的AI工程師這個職位是算法工程師、軟件工程師結合的角色,分別有些什麼要求,如圖所示(詳細講解請觀看視頻回放):