深度學習圖像演算法在內容安全領域的應用實踐和優化
作者 | 李雨珂
責編 | 屠敏
深度學習圖像演算法近年來在學術領域經歷了爆髮式的發展,目前已經在工業界多個實際場景取得了較完整的應用落地,例如安防、營銷、娛樂、金融等場景。其中內容安全也是非常典型的落地案例,深度學習圖像演算法在鑒黃鑒暴、廣告識別、違禁攔截、敏感人物過濾等方向都取得了不錯的應用效果。
演算法自動識別一方面可以全面減輕人工審核投入,另一方面可以更有效率、更快速地對信息進行判斷。本篇分享將會介紹如何快速搭建深度學習圖像演算法服務以及易盾在圖像演算法優化方面的經驗。
內容安全難點
內容安全領域是一個相對特殊的場景,我們面對的問題往往目標定義不明確,數據種類繁雜多變、圖像質量差距大,還會經常面臨對抗攻擊,這一場景對演算法能力的要求較高。
相比較而言,在2C營銷場景中,例如手機掃描商品/圖標,對用戶來說召回能力相對重要一些,誤判在使用過程中不容易被發現;在門禁考勤場景中,由於攝像頭採集到的圖像質量較高,演算法需要解決的是限定圖片質量範圍內的效果問題。
而在內容安全領域,由於線上數據正常比例較高,且圖像類型眾多,誤判問題非常容易集中體現;另一方面,由於UGC圖像質量參差不齊,圖像敏感特徵往往不夠明顯,小目標、模糊、形變等問題較常出現。
伴隨易盾內容安全業務的發展,我們深入探索了深度學習圖像演算法在這個領域內的應用,在實際場景中取得了預期效果。
小試牛刀:教你快速搭建深度學習圖像演算法服務
深度學習演算法已經成為圖像演算法中的重要組成部分,深度學習相關公開資源已經非常豐富,針對圖像任務創建一個簡單模型是十分容易上手的,這裡將會展示如何快速搭建一個深度學習圖像分類服務。
其中數據方面僅以公開數據為例,實際應用中需要以業務數據為主。模型訓練採用的框架可以選擇Tensorflow\Keras、Mxnet\Gluon、Pytorch、Chainer等。隨著深度學習框架的逐步發展,訓練便捷性越來越高,相比較而言Tensorflow-slim也不算特別友好,但其代碼組織思路和拓展性還是很值得借鑒的。這裡我們將以Tensorflow-slim為例分幾個步驟完成這項工作。
數據處理
原始PLACES365數據集的標籤類別較多,為了快速驗證代碼我們僅挑選了其中小部分類別,用作示例。數據按如下進行組織,一個文件夾存儲一類數據,文件夾為標籤名。
參考源碼中flowers數據集處理腳本download_and_convert_flowers.py,創建圖像數據到tfrecord文件轉換的腳本,原始項目中似乎沒有一個通用的數據文件轉換工具,建議可以自己簡單寫一個,將可變參數做成腳本入參,轉換數據即可用命令方式執行,便於後續處理其他數據集。
腳本處理結束後,目標圖像數據將轉換成tfrecord文件,同時標籤描述文件label.txt會自動生成。參考源碼中flowers數據集描述腳本flowers.py,構建一個對應於場景數據的描述腳本,這裡會對數據集的一些基本信息進行定義,如下所示:
通過上面一系列操作,數據準備層面的工作基本完成。
模型訓練和測試
完成數據處理後,我們將挑選一個模型進行訓練,我們以inception-v3為例,實際工作中模型挑選主要考慮的是性能和效果的平衡,需要通過一定量的實驗來評估。
首先我們根據開源項目中提供的鏈接將IMAGENET預訓練模型下載到本地。tensorflow-slim項目已經對訓練功能進行了非常棒的上層包裝,我們在實際使用過程中直接調用train_image_classifier.py腳本即可。我們首先以較大的學習率訓練最後一層全連接參數,其他參數保持不動,然後以較小的學習率對所有參數進行調整。
訓練腳本train_image_classifier.py對數據讀取、預處理選擇、模型選擇、參數配置等都有較好的支持,建議詳細閱讀其中的代碼和組織形式。完成訓練後,我們通過測試腳本eval_image_classifier.py完成效果評估,如果在測試集上取得比較好的效果,我們就可以進入下一步。
服務透出
完成訓練和評估後,我們可以簡單寫一個轉換腳本將原始模型文件處理成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等結構就可能發揮一定的作用。
線上閉環:服務上線後迴流數據,形成閉環迭代,對模型能力不斷進行矯正。
嘗試新演算法、學習新知識往往是非常愉快的,但上述這部分的工作卻是枯燥和痛苦的。真正對線上優化起到最直接幫助的往往不是模型調參,而是枯燥乏味的事前數據工作,以及不遺餘力的事後測試工作。
文中資源匯總:
[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
作者介紹:李雨珂博士,網易易盾資深演算法專家,畢業於浙江大學信息與電子工程學系,研究方向包括數據挖掘、機器學習以及計算機視覺,目前在網易易盾主導內容安全領域多媒體信息相關人工智慧演算法研發。
【END】
熱 文推 薦
※豆瓣評分 9.7,等了好久的《操作系統導論》Operating Systems 終於來了
※程序員寫代碼為什麼需要 review?
TAG:CSDN |