作者介紹:李雨珂博士,網易易盾資深演算法專家,畢業於浙江大學資訊與電子工程學系,研究方向包括資料探勘、機器學習以及計算機視覺,目前在網易易盾主導內容安全領域多媒體資訊相關人工智慧演算法研發。
深度學習影像演算法近年來在學術領域經歷了爆發式的發展,目前已經在工業界多個實際場景取得了較完整的應用落地,例如安防、營銷、娛樂、金融等場景。其中內容安全也是非常典型的落地案例,深度學習影像演算法在鑑黃鑑暴、廣告識別、違禁攔截、敏感人物過濾等方向都取得了不錯的應用效果。
演算法自動識別一方面可以全面減輕人工稽核投入,另一方面可以更有效率、更快速地對資訊進行判斷。本篇分享將會介紹如何快速搭建深度學習影像演算法服務以及易盾在影像演算法優化方面的經驗。
一、內容安全難點
內容安全領域是一個相對特殊的場景,我們面對的問題往往目標定義不明確,資料種類繁雜多變、影像質量差距大,還會經常面臨對抗攻擊,這一場景對演算法能力的要求較高。
相比較而言,在2C營銷場景中,例如手機掃描商品/圖示,對使用者來說召回能力相對重要一些,誤判在使用過程中不容易被發現;在門禁考勤場景中,由於攝像頭採集到的影像質量較高,演算法需要解決的是限定圖片質量範圍內的效果問題。
而在內容安全領域,由於線上資料正常比例較高,且影像型別眾多,誤判問題非常容易集中體現;另一方面,由於UGC影像質量參差不齊,影像敏感特徵往往不夠明顯,小目標、模糊、形變等問題較常出現。
伴隨易盾內容安全業務的發展,我們深入探索了深度學習影像演算法在這個領域內的應用,在實際場景中取得了預期效果。
二、小試牛刀:教你快速搭建深度學習影像演算法服務
深度學習演算法已經成為影像演算法中的重要組成部分,深度學習相關公開資源已經非常豐富,針對影像任務建立一個簡單模型是十分容易上手的,這裡將會展示如何快速搭建一個深度學習影像分類服務。
我們以場景識別為例子,即根據影像全域性資訊判斷拍攝場景,例如泳池、車內、公寓等。我們可以選取公開資料集places365用於模型訓練、資料說明和下載連結參見[1],通過tensorflow-slim介面進行影像分類模型訓練[2],最終使用常見服務框架將演算法服務進行透出。
其中資料方面僅以公開資料為例,實際應用中需要以業務資料為主。模型訓練採用的框架可以選擇Tensorflow\Keras、Mxnet\Gluon、Pytorch、Chainer等。隨著深度學習框架的逐步發展,訓練便捷性越來越高,相比較而言Tensorflow-slim也不算特別友好,但其程式碼組織思路和擴充性還是很值得借鑑的。這裡我們將以Tensorflow-slim為例分幾個步驟完成這項工作。
2.1 資料處理
原始PLACES365資料集的標籤類別較多,為了快速驗證程式碼我們僅挑選了其中小部分類別,用作示例。資料按如下進行組織,一個資料夾儲存一類資料,資料夾為標籤名。
參考原始碼中flowers資料集處理指令碼download_and_convert_flowers.py,建立影像資料到tfrecord檔案轉換的指令碼,原始專案中似乎沒有一個通用的資料檔案轉換工具,建議可以自己簡單寫一個,將可變引數做成指令碼入參,轉換資料即可用命令方式執行,便於後續處理其他資料集。
指令碼處理結束後,目標影像資料將轉換成tfrecord檔案,同時標籤描述檔案label.txt會自動生成。參考原始碼中flowers資料集描述指令碼flowers.py,構建一個對應於場景資料的描述指令碼,這裡會對資料集的一些基本資訊進行定義,如下所示:
通過上面一系列操作,資料準備層面的工作基本完成。
2.2 模型訓練和測試
完成資料處理後,我們將挑選一個模型進行訓練,我們以inception-v3為例,實際工作中模型挑選主要考慮的是效能和效果的平衡,需要通過一定量的實驗來評估。
首先我們根據開源專案中提供的連結將IMAGENET預訓練模型下載到本地。tensorflow-slim專案已經對訓練功能進行了非常棒的上層包裝,我們在實際使用過程中直接呼叫train_image_classifier.py指令碼即可。我們首先以較大的學習率訓練最後一層全連線引數,其他引數保持不動,然後以較小的學習率對所有引數進行調整。
訓練指令碼train_image_classifier.py對資料讀取、預處理選擇、模型選擇、引數配置等都有較好的支援,建議詳細閱讀其中的程式碼和組織形式。完成訓練後,我們通過測試指令碼eval_image_classifier.py完成效果評估,如果在測試集上取得比較好的效果,我們就可以進入下一步。
2.3 服務透出
完成訓練和評估後,我們可以簡單寫一個轉換指令碼將原始模型檔案處理成pb檔案,這會帶來一系列好處,不但可以只保留inference所需的網路結構,砍掉一些訓練輔助結構,將網路引數值進行freeze,減小模型檔案大小,而且由於pb檔案和框架關聯性不大,可以脫離tensorflow進行使用和部署。tensorflow-slim已經提供了pb檔案轉換支援,但個人建議可以參考其他方式進行編寫[3],使用上更加直觀和簡便。
接下來是演算法模型服務化的工作,這一部分可以選擇的方案也比較多,可以使用基於tensorflow的tf-serving進行完整的服務管理,也可以只通過Flask、Tornado等通用框架建立HTTP服務,還可以選擇跨語言RPC框架構建服務。其中Flask方案可以參考[3]。我們需要寫一個服務指令碼來啟動服務,同時需要建立客戶呼叫指令碼對服務進行呼叫測試。如果有服務併發評估需求,建議可以通過Locust,使用上非常便捷[4]。
以上工作完成後,我們就基本上完成深度學習影像服務的簡單構建,如果有移動端方面的部署需求可以參考tensorflow官方iOS的例子[5]。以上內容以場景識別為例子進行簡單說明,實際上模型使用框架、服務使用框架選擇的空間都是比較大的,個人比較建議演算法模型部分可以按需求靈活挑選,服務部署部分需要有統一的規範進行約束。
三、重灌上陣:易盾實際優化經驗分享
以上工作非常容易實現,也僅僅是演算法工作的小開端,離演算法應用到實際場景還有非常遙遠的距離。
哪怕經歷了業務資料擴充、負樣本收集、引數調優、模型結構改造等大量工作之後,演算法應用到線上資料後的實際效果仍會非常糟糕,不但會出現大量解釋性較差的誤判,而且存在困難樣例不能召回的困境。
在實際工作中,網易易盾往往會從以下幾個角度著手來提升演算法真實效果:
- 標籤定義:明確識別範圍,建議先縮小識別範圍,再逐步增強召回能力,按照這種方式,效果測試相對容易進行。在場景識別中,總結出全域性特徵相似、具有分類意義的標籤是非常關鍵的;
- 資料有效收集:隨著資料量的不斷累積,資料收集的重點往往不是數量,而是收集效率和質量。我們在實際工作過程中採取了一些主動學習機制,既能保證資料有效性,又能儘可能減小標註成本。在場景識別中,我們利用初始資料訓練一個簡單模型後,就可以用於業務資料的過濾,挑選有效資料進行擴充。
- 測試集定義:挑選足夠代表線上實際情況的測試集,主要關注資料量和覆蓋範圍兩個方面,並且針對特殊問題收集特定型別測試集,測試的有效性對線上演算法效果起決定性作用。
- 演算法方案:結合多模型融合、目標檢測和判定策略,擴充演算法方案。場景識別相對來說使用全域性特徵為主,但如果遇到小目標、多尺度、模糊等問題,FPN、Attention等結構就可能發揮一定的作用。
- 線上閉環:服務上線後迴流資料,形成閉環迭代,對模型能力不斷進行矯正。
嘗試新演算法、學習新知識往往是非常愉快的,但上述這部分的工作卻是枯燥和痛苦的。真正對線上優化起到最直接幫助的往往不是模型調參,而是枯燥乏味的事前資料工作,以及不遺餘力的事後測試工作。
基於明確定義、重視大規模測試、形成資料閉環的演算法優化思路,易盾影像演算法在業務演算法上取得了一定的突破,核心演算法模組效果在過去的幾年中持續穩步提升,基礎能力越來越厚重,定向優化也取得進展,不斷提升識別精準度,並逐漸擴大識別範圍。
四、未來展望
易盾內容安全影像演算法服務經過多年發展,已經形成了一系列服務,形式多、範圍廣,維護成本也會逐漸增加。我們在這些專案經驗的基礎上凝練出最佳實踐方案(平臺方向),為快速搭建服務滿足客戶新需求提供了條件。當然,由於內容安全場景效果要求相對苛刻,解決特定業務問題往往需要通過特殊路徑(定製方向),進行長期投入,平臺化和定製化之間需要做到一定平衡。
另一方面,隨著業務量不斷增加,易盾團隊在效能和效果平衡方面也做了非常多的嘗試,通過網路剪枝量化、影像預處理優化、模型級聯等方法不斷減小服務響應時間,演算法吞吐能力也會是我們長期追求的重點目標。
以上分享是網易易盾演算法團隊在深度影像領域落地探索方面的一些初淺分享,實際上網易易盾在背後做了很多的工作,比如網易易盾人工智慧實驗室方正研究員在2018年研發出了一種對多視角多模態特徵資訊進行有效融合的自編碼器神經網路,在準確率、NMI、Purity、ARI等各項效能指標上,較當下多項國際先進的多視角多模態資訊融合技術有顯著性的領先。再比如今年,網易易盾人工智慧工程師姚益武在全球計算機多媒體頂級會議ICME 2019展示int8量化新演算法,有助於構建端到端的純整數運算通路,且統一表示層的設計簡化了網路結構的拓撲設計,應用於易盾內容安全影像識別上,則在確保業務模型推理精度的前提下,其服務的響應時間能得到顯著降低。
展望未來,網易易盾演算法團隊還將不斷研究、創造和創新,持續提升易盾在內容安全服務上的效果,幫助合作伙伴和客戶解決其遇到的內容安全問題。
文中資源彙總:
[1].PLACES365資料集說明和下載:http://places2.csail.mit.edu/download.html
[2].tensorflow-slim官方地址:https://github.com/tensorflow/models/tree/master/research/slim
[3].模型轉換和Flask服務編寫:https://blog.metaflow.fr/tensorflow-how-to-freeze-a-model-and-serve-it-with-a-python-api-d4f3596b3adc
[4].壓力測試:https://locust.io/
[5].IOS端部署:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios