從人工智能 (AI)發展應用看算法測試的測試策略
隨著人工智能的發展與應用,AI測試逐漸進入到我們的視野,傳統的功能測試策略對于算法測試而言,心有余而力不足,難以滿足對人工智能 (AI) 的質量保障。
結合在人臉檢測、檢索算法上的測試探索、實踐的過程,本文將從以下幾個方面介紹人工智能 (AI) 算法測試策略。
- 算法測試集數據準備
- 算法功能測試
- 算法性能測試
- 算法效果測試(模型評估指標)
- 算法指標結果分析
- 算法測試報告
我們將算法測試測試流程中的幾個核心環節提煉如上幾點,也就組成了我們算法測試的測試策略,在此,拋磚引玉的分享一下。
算法測試集數據準備
測試集的準備對于整體算法測試而言非常重要,一般測試集準備過程中需考慮以下幾點:
- 測試集的覆蓋度
- 測試集的獨立性
- 測試集的準確性
測試集的覆蓋度
如果,測試集準備只是隨機的選取測試數據,容易造成測試結果的失真,降低算法模型評估結果的可靠性。
好比我們的功能測試,根據功能測試設計,構造對應的數據進行測試覆蓋。算法測試亦然,以人臉檢測算法而言,除了考慮選取正樣本、負樣本外,還需要考慮正樣本中人臉特征的覆蓋,如人臉占比、模糊度、光照、姿態(角度)、完整性(遮擋)等特征。
選擇好對應的測試數據后,后來后期的指標計算、結果分析,還需對數據進行標注,標注對應的特征,以人臉檢測為例,使用工具對人臉圖標進行人臉坐標框圖,并將對應特征進行標注記錄及存儲,如下圖。
另外,除了數據特征的覆蓋,也需要考慮數據來源的覆蓋,結合實際應用環境、場景的數據進行數據模擬、準備。比如公共場所攝像頭下的人臉檢索,圖片一般比較模糊、圖片光照強度不一,因此準備數據時,也需要根據此場景,模擬數據。一般來講,最好將真實生產環境數據作為測試數據,并從其中按照數據特征分布選取測試數據。
此外,關于測試數據的數量,一般來講測試數據量越多越能客觀的反映算法的真實效果,但出于測試成本的考慮,不能窮其盡,一般以真實生產環境為參考,選取20%,如果生產環境數據量巨大,則選取1%~2%,或者更小。由于我們的生產環境數據量巨大,考慮到測試成本,我們選取了2W左右的圖片進行測試。
測試集的獨立性
測試集的獨立性主要考慮測試數據集相互干擾導致測試結果的失真風險。
我們以人臉檢索為例,我們準備200組人臉測試數據,每組為同一個人不同時期或角度的10張人臉照片,對人臉檢索算法模型指標進行計算時,如計算TOP10的精確率,此時若在數據庫中,存在以上200組人的其他照片時,便會對指標計算結果造成影響,比如我們200組人臉中包含Jack,但數據庫中除了Jack的10張,還存在其他的8張Jack的照片。若算法微服務接口返回的TOP10圖片中有我們測試集中的Jack圖片6張,非測試集但在數據庫中的其他Jack照片2張,還有2張非Jack的照片,測試的精確率該如何計算,按照我們的測試集(已標注)來看,精確率為60%,但實際精確率為80%,造成了精確率指標計算結果的失真。
因此,我們在測試集數據準備時,需考慮數據干擾,測試準備階段對數據庫的其他測試數據進行評估,比如從200組人臉測試數據組,進行預測試,對相似度非常高的數據進行研判,判斷是否為同一人,若是則刪除該照片或者不將該人從200組測試集中剔除。
測試集的準確性
數據集的準確性比較好理解,一般指的是數據標注的準確性,比如Jack的照片不應標注為Tom,照片模糊的特征不應標注為清晰。如果數據標注錯誤,那么直接影響了算法模型指標計算的結果。
對于測試集的準備,為了提高測試集準備效率及復用性,我們嘗試搭建了算法數倉平臺,實現數據(圖片)的在線標注、存儲等功能,作為算法測試數據的同一獲取入口。
算法功能測試
以我現在接觸的人工智能系統而言,將算法以微服務接口的形式對外提供服務,類似于百度AI開放平臺。

因此需要對算法微服務接口進行功能性驗證,比如結合應用場景從功能性、可靠性、可維護性角度對必填、非必填、參數組合驗證等進行正向、異向的測試覆蓋。此處不多做介紹,同普通的API接口測試策略一致。
算法性能測試
微服務接口的性能測試大家也比較了解,對于算法微服務同樣需要進行性能測試,如基準測試、性能測試(驗證是否符合性能指標)、長短穩定性能測試,都是算法微服務每個版本中需要測試的內容,同時產出版本間的性能橫向對比,感知性能變化。常關注的指標有平均響應時間、95%響應時間、TPS,同時關注GPU、內存等系統資源的使用情況。
一般使用Jmeter進行接口性能測試。不過,我們在實際應用中為了將算法微服務接口的功能測試、性能測試融合到一起,以降低自動化測試開發、使用、學習成本,提高可持續性,我們基于關鍵字驅動、數據驅動的測試思想,利用Python Request、Locust模塊分別實現了功能、性能自定義關鍵字開發。每輪測試執行完算法微服務功能自動化測試,若功能執行通過,則自動拉起對應不同執行策略的性能測試用例,每次測試執行結果都進行存儲至數據庫中,以便輸出該算法微服務接口的不同版本性能各項指標的比較結果。
算法模型評估指標

首先,不同類型算法的其關注的算法模型評估指標不同。
比如人臉檢測算法常以精確率、召回率、準確率、錯報率等評估指標;人臉檢索算法常以TOPN的精確率、召回率、前N張連續準確率。
其次,相同類型算法在不同應用場景其關注的算法模型評估指標也存在差異。
比如人臉檢索在應用在高鐵站的人臉比對(重點人員檢索)的場景中,不太關注召回率,但對精確率要求很多,避免抓錯人,造成公共場所的秩序混亂。但在海量人臉檢索的應用場景中,愿意犧牲部分精確率來提高召回率,因此在該場景中不能盲目的追求精準率。
除了上述算法模型評估指標,我們還常用ROC、PR曲線來衡量算法模型效果的好壞。


我們在算法微服務功能、性能測試中介紹到,使用了基于關鍵字驅動、數據驅動的測試思想,利用Python Request、Locust模塊分別實現功能、性能自定義關鍵字開發??紤]到測試技術棧的統一以及可復用性,我們基于上述設計,實現了算法模型評估指標的自定義關鍵字開發,每次運行輸出相同測試集下的不同版本模型評估指標的橫向比較。
當然除了不同版本的比較模型評估指標的比較,如果條件允許,我們還需要進行一定的競品比較,比較與市場上相同類似的算法效果的差異,取長補短。
算法指標結果分析
我們對算法模型指標評估之后,除了感知算法模型評估指標在不同版本的差異,還希望進一步的進行分析,已得到具體算法模型的優化的優化方向,這時候就需要結合數據的標注信息進行深度的分析,挖掘算法優劣是否哪些數據特征的影響,影響程度如何。比如通過數據特征組合或者控制部分特征一致等方式,看其他特征對算法效果的影響程度等等。
這時候我們一般通過開發一些腳本實現我們的分析過程,根據算法微服務接口的響應體以及數據準備階段所標注的數據特征,進行分析腳本的開發。
另外指標結果的進一步分析,也要結合算法設計,比如人臉檢索算法,每張圖片的檢索流程為“輸入圖片的人臉檢測“ -> “輸入圖片的人臉特征提取“ -> “相似特征檢索“,通過此查詢流程不難看出人臉檢索的整體精確率受上述三個環節的影響,因此基于指標結果的深度分析也需要從這三個層次入手。
算法測試報告
一般算法測試報告由以下幾個要素組成:
- 算法功能測試結果
- 算法性能測試結果
- 算法模型評估指標結果
- 算法指標結果分析
由于算法微服務測試的復雜度相對普通服務接口較高,在報告注意簡明扼要。