「回顧」如何打造一流的視覺AI技術
- 2019 年 11 月 22 日
- 筆記

本次分享主要分以下幾個部分:首先簡要介紹一下電腦視覺技術的相關背景,然後結合格靈深瞳的實踐,從演算法研發、訓練平台、智慧數據處理、異構計算等幾個方面著重介紹如何打造一流的視覺AI技術,最後介紹格靈深瞳在相關技術落地方面的情況。
1、電腦視覺及其相關技術
1.1 電腦視覺概述
電腦視覺作為人工智慧領域最重要的技術方向之一,其基礎是機器學習演算法,而深度學習演算法無疑是當前最受歡迎的機器學習演算法。隨著電腦算力的不斷增強,海量數據的增長,深度學習演算法的提出使得用更大量數據訓練更深的網路成為可能,在限定的場景下,一些影像識別演算法的準確率已經超越了人類。從應用角度,我們正處於電腦視覺應用爆炸性增長的智慧時代,包括移動互聯網、自動駕駛、智慧城市、智慧醫療、機器人、增強現實、智慧工業等在內的多個方向,都取得了非常多的進步。從另外一個視角看,電腦視覺是對物理世界的數字化,是智慧物聯網時代最大入口,和大數據技術結合擁有非常廣闊的應用場景。
1.2 電腦視覺技術願景

電腦視覺技術從廣義上講是讓電腦看懂世界,狹義上講就是通過豐富的視覺感測器,理解物理世界中每個物體的位置、屬性、身份以及行為等資訊。
電腦視覺技術從演算法方面期待:
·功能更加豐富:感知方面從位置檢測、屬性識別、身份識別,逐步向行為識別和關係識別(不同物體間的關係)發展;
·目標類別更全:分析目標從人臉、人體、車輛,拓展到商品,再拓展到其它物體;
·理解粒度更細:從理解影像中包含什麼物體的分類任務,到理解物體在圖中的具體位置和數目的檢測任務,進一步到理解物體的部件以及關鍵點位置的關鍵點定位技術,更進一步到理解每個像素所屬類別的語義分割任務。
電腦視覺技術從產品性能角度則期待:
精度更高、速度更快、成本更低、支援規模更大、功能更豐富。
2、如何打造一流的視覺AI技術
2.1 構建電腦視覺系統的基本流程

對於一個視覺應用系統而言,需要先將應用系統劃分為不同的子模組,比如人臉識別系統,就包括人臉檢測、特徵點定位、人臉識別等不同子模組。對於每一個子模組,都由輸入輸出定義、數據收集、數據標註,訓練框架選擇,演算法實現,模型訓練,模型選擇,模型上線等不同步驟組成。
2.2 構建視覺計算系統的關鍵因素

構建電腦視覺計算系統主要包含下面幾個關鍵因素:
·核心演算法研發:即如何開發出更準確、更快、更多功能的演算法;
·自動化大規模訓練框架:即如何支援更大規模集群,更加自動化地訓練演算法;
·智慧數據挖掘和標註:即如何做到高效的數據挖掘和低成本的標註;
·基於硬體平台的計算優化:即如何選擇硬體平台,以及在硬體平台上做性能優化。
2.2.1 核心演算法研發

演算法研發是一個不斷迭代、精心打磨的過程,工業界和學術界最大的區別是學術界希望創造更多的演算法,追求更多的是新穎性和創造性,而工業界追求的是系統的功能、性能、穩定性指標,並不要求發明最新穎的演算法,而是要依據業務需求和資源限制做出最好用的系統。在工業界進行演算法改進,包括很多維度,如數據如何處理、數據規模和來源,參數設置、模型結構,還包括損失函數設計,模型加速演算法等,每一個因素都可能對最終結果影響很大。還有非常重要的一點是,需要從系統角度去解決問題,比如設計新的系統處理流程,比如把問題定義為檢測問題還是識別問題。

人臉識別損失函數演進
以人臉識別演算法為例,由於我們無法訓練一個能分類世界上所有人的分類模型,所以人臉識別最終是希望訓練一個將人臉影像轉換為表示能力非常強的特徵模型,這裡面非常核心的是損失函數的設計。最早的人臉識別演算法是採用了softmax損失函數,但softmax損失函數的缺陷是當類別數非常大時參數規模非常大,並且,要求每個人的樣本數比較均衡,且不能太少,很多時候無法滿足。後來出現了pair-wise形式的損失函數,這個損失函數將分類轉換為兩類問題,即同一個人以及不同人兩類,希望同一個人兩張圖片之間的距離儘可能小,而不同人兩張圖片之間的距離儘可能大,從而不會有類別太多的參數規模問題,且不對樣本數目有太多要求。後來還出現了Triplet 損失函數形式,要求同一個人圖片之間的距離小於不同人圖片之間的距離。但是pair-wise和triplet損失函數的缺陷是容易受數據雜訊影響,比較難訓練,收斂也比較慢。後來大家又發現,將softmax形式做改進可以取得很好的效果,包括對特徵的歸一化、權重矩陣的歸一化以及加margin等。所以,我們看到僅僅是人臉識別損失函數這樣一個技術點,就包含了非常多的選擇和迭代。在工業界,想真正做好一個演算法模型,就都需要跟蹤很多工作,同時由於論文里的很多結論在大規模實際數據情況下,和論文中的結果可能會不同,所以需要結合實際數據和場景進行一一驗證。這要求我們在工業界真正想做一流的演算法,不僅僅要求我們可以正確理解論文中的演算法思路,還要求能夠在工業界的數據規模下正確實現,並設置正確的參數和訓練技巧,同時還需要結合實際情況去改進。

對於人臉識別系統而言,損失函數是影響人臉模型表示的一個因素。除此之外還包括訓練數據的數據量、純度和數據分布,數據增強的方式,比如收集的數據往往數據品質比較高,為了使得模型在低解析度數據上有好的效果,需要在訓練過程加入相應的擾動。除此之外,人臉識別的前序模組,比如人臉檢測和特徵點定位的精度也會影響識別效果。還有包括如何利用模型蒸餾等方法進行速度提升,如何利用人臉的多個部件融合進行效果提升,在影片中,如何通過人臉品質屬性選擇最優的人臉進行識別,如何融合多幀影像進行處理等。對於一個人臉識別系統而言,上述的每一個因素都會影響最終的系統效率和用戶體驗,每一點都需要精細打磨。

每一個智慧系統都是由多個智慧演算法模型組成的,以我們針對智慧城市、智慧商業領域研發的智慧影片理解系統而言,包括幾百個模型。這個系統裡面,從大的方面講,包括物體檢測、人臉識別、人體智慧分析、車輛智慧分析等幾個大模組,具體到比如智慧車輛分析這個子方向而言,則包括車牌識別、車型車款識別、車輛以圖搜圖(ReID)、車身顏色識別、標誌物識別、未系安全帶、開車打電話等很多子模型。

對於如此多的演算法模型,如果每個模型都需要不斷迭代,同時要支援不同硬體平台的不同版本,在研發人員和訓練硬體資源受限條件下,如何持續打磨核心演算法是一個很大的挑戰。傳統的演算法開發模式,演算法工程師往往提起數據標註任務,由數據標註員標註完成數據標註,但演算法工程師需要關心如何開發標註工具、如何培訓標註人員、如何轉換數據格式、如何提純標註完的數據,最後再手工方式在一台物理機上將模型訓練出來。這種模式下,演算法工程師有60%的時間都在處理和數據相關的工作,比如搜集數據、指導開發標註工具、清洗標註數據或者發起二次標註;還有20%的時間是在調參數,看訓練日誌,包括處理磁碟空間不足、GPU被別人佔用等意外;其實只有大約15%左右的時間在實現演算法,僅有5%的時間在思考演算法。同時,這個模式的缺點是數據標註成本很高,演算法工程師的時間利用率很低,同時由於沒有統一協調,GPU或者空閑或者被大家搶佔,GPU的利用率也很低。

更好的一種模式是為演算法研發團隊配備一個數據平台開發團隊,專門負責演算法團隊所需要的數據以及訓練平台。也就是說,演算法團隊僅僅需要提出數據的需求和要求,其它都由數據平台團隊去完成。數據平台團隊負責數據的收集、標註前處理、標註工具開發、標註後處理、訓練和測試數據管理等工作,其目標是為演算法團隊用最高效低成本的方式提供高品質的訓練數據。同時,為了提升訓練效率,數據平台團隊還需要負責打造統一的訓練平台。這種模式下,演算法工程師的工作20%花在溝通確定數據處理流程,同時由於有統一的訓練平台,演算法工程師只需要花費大約10%的時間在訓練調參上。那麼自然就會花費更多的時間在實現演算法和思考演算法上。這種模式下,不僅僅演算法工程師的效率得到提升,而且數據標註成本在降低,數據增長速度在提升,GPU利用率也在提高。還有一點非常重要的是,智慧數據處理平台在正常運行下,只需要標註人員進行標註,數據量就會不斷增長,不依賴演算法以及開發人員的投入,這是未來任何一個智慧學習系統需要具備的特性。
2.2.2 自動化大規模訓練框架

構建自動化訓練管理平台的目的是為了提升人員產出效率,節省人力,提高訓練資源的利用率。一方面對訓練數據進行統一管理,每台機器都能訪問,避免在機器間拷貝;第二,對訓練程式碼和參數進行管理,實現程式碼、參數、環境自由在多台機器間拷貝,省去環境搭建的時間;第三,對計算資源和任務進行管理,省去工程師關注資源空閑的時間,同時,可以在沒有空閑資源時任務排隊,省去關注時間,同時提升資源利用效率。此外,為了避免演算法人員看日誌的時間花費,增加模型評估和選擇,自動評估和選擇模型。對演算法人員而言,可以在網頁新建任務,選擇訓練數據,確定程式碼和參數,就可以開始訓練,同時可以設置幾套參數進行訓練,最終等待訓練產出的最優模型即可。
現在已經有很多優秀的深度學習開源框架,比如tensorflow、mxnet、pytorch等。有一些創業公司,自己自行開發了一套自己的開源框架,但我個人認為其實沒有太大的必要。一方面,私有的框架,很難保證比開源框架更加先進,開源框架吸收了世界上最先進的思想,有很多優秀的人會產生貢獻,創業公司很難有這樣的實力做得更好。此外,自己開發的框架,對於新入職員工而言有使用門檻,此外,由於很多好的演算法都是在開源軟體基礎上做的,使用自己的框架也不利於進行技術交流。但是,是不是直接利用開源軟體就夠了呢?我想答案也是否定的。現在的開源框架,在大規模數據訓練方面做得還不是很好,總是會有一些特別的任務是開源軟體無法支援的。所以,基於現有開源軟體,根據自己的任務做框架改進是一個對大多數公司而言都更加合理的選擇。

比如對於人臉識別任務而言,最終是一個上億類別的分類問題,如果直接採用現有框架,是無法完成這個任務的。採用softmax作為損失函數,在特徵維度僅僅是128維時,最後一個權重矩陣的數據規模是幾十G,遠遠超過了現在顯示卡的顯示記憶體。我們必須實現一種新的框架來完成數億類別的訓練任務。我們採用了一種「數據並行+模型並行」的方法,先將數據分配到不同的GPU上,先進行前向預測計算得到經過卷積網路之後的特徵,然後將不同卡上的特徵進行匯聚。但權重矩陣在一台機器上是無法保存下的,因此,需要把權重矩陣分配到不同的機器上進行運算這個時候就用到模型並行思路。我們知道,在並行計算中,計算是比較容易通過並行解決的,但是,通訊量往往會成為瓶頸。我們設計的這個數據並行加模型並行的方式,只需要把所有樣本的特徵在多機間做同步,數據量很少,所以可以得到很高的加速比。
2.2.3 智慧數據挖掘和標註

我們大家都知道數據很重要,但如何低成本、高效地獲取大量高品質數據其實是一件不那麼容易的事情。最簡單處理數據的方法就是收集數據直接人工標註,但直接標註的缺陷是效率很低,比如直接標註百萬級別人臉數據,需要花費近百萬費用,如果標註數億數據,費用顯然是無法承受的。一種常見思路是選擇標註工作量小的有先驗約束的數據源,如相冊數據,每個人的相冊基本上都是來自於家人或者朋友的數據,這樣的數據,直接標註也不合理,比如隱私問題,比如人的標註準確率問題。

我們實現了一套人臉自動數據標註系統,包括如何從圖片中檢測、定位人臉,包括人臉區域割取、特徵提取,包括人臉品質獲取,以及基於人臉品質做過濾,包括做子集中的聚類,以及類間去重,以及訓練人臉模型,同時,人臉模型還可以回饋重新進行人臉特徵提取和聚類,不斷迭代。當然,實際系統要更加複雜,有非常多的參數和細節邏輯,但是,這樣的一套系統,使得人臉識別數據標註成為一個自動化的過程,基本上不需要人工再參與,節省了大量的標註人力。類似的案例還有很多,比如可以依據車牌號碼進行車輛相關數據收集,可以只標註一輛車的屬性就可以得到同一個車牌的多輛車的結果。總之,實踐表明,在數據上花費的所有努力都是值得的,這已經成為技術驅動的創新型公司的核心競爭力之一。

數據平台團隊,除了準備數據和開發訓練平台外,還可以參與演算法的訓練和改進工作。很多演算法,經過演算法工程師的迭代之後,在演算法方面已經相對確定,更多的是調參和數據相關工作。這一塊是可以由數據平台工程師通過數據驅動的方式來改進的。比如,我們在一些任務中,就在演算法工程師基本不需要參與的情況下,數據平台工程師通過高效挖掘困難數據並標註的方式可以使演算法持續改善。
上述的智慧數據處理和自動化訓練平台系統,結合起來,在我們的內部被稱為深瞳大腦項目。深瞳大腦的終極目標是希望將人工智慧中人工的部門減少到最少,打造一套動態更新的「數據採集->標註->演算法研發->模型訓練->產品落地->數據產生」的閉環系統,最終僅僅在數據標註環節依賴人工,成為一套真正的基於自主學習的智慧系統。
2.2.4 基於硬體平台的計算優化

除了演算法效果、演算法功能外,還需要考慮預測速度以及承載硬體的成本。最底層是晶片等硬體平台的選擇,之上是預測框架,再之上是sdk封裝以及處理流程和分散式架構,再上層則是各種視覺應用。

這其中涉及很多工作,如硬體的選擇,GPU、Arm、FPGA、DSP還有專門為深度學習設計的ASIC晶片。硬體平台對整個電腦視覺識別系統非常重要,為了做一個正確的平台選擇,需要考慮主晶片的計算能力、成本,介面支援豐富程度,以及編解碼、ISP,軟體兼容性以及平台易用程度等。選定硬體平台之後,首先應該從演算法角度考慮如何減少計算量。比較簡單的是基於經典網路去改變總的層數以及每層特徵通道數目。進一步,可以結合各種經典網路去設計自己的網路,比如在嵌入式平台上,可以參考Depth-Wise結構、Shuffle Net結構中的核心思路設計自己的新網路。還可以基於強化學習模型搜索更優的網路。此外,還有一個非常重要的思路,就是如何通過模型蒸餾的方法去使得一個小網路訓練得到接近大網路的效果。除了演算法層面外,還可以從異構計算層面利用各個平台特性進行優化,比如NVIDIA GPU平台可以優先考慮TensorRT以及CUDA指令進行優化。
作者介紹:

鄧亞峰
鄧亞峰,北京格靈深瞳資訊技術有限公司CTO,畢業於清華大學,曾任職百度深度學習研究院,負責人臉識別方向,具有16年的電腦視覺和人工智慧方向的研發經驗。發表過論文十餘篇,申請中國專利超過100項,其中已經授權的有95項。
——END——
內容來源:AI先行者大會《如何打造一流的視覺AI技術》
出品社區:DataFun
註:歡迎轉載,轉載請註明出處。