圖像异常質量檢測

字節跳動技術質量團隊 2022-01-07 18:38:41 阅读数:269

异常

一、背景

目前國內/國際大型互聯網公司已經有了很多的APP或遊戲遍曆測試工具,公司內部每天也有很多UI自動化的任務在跑。隨著自動化遍曆工具的逐漸成熟和日常任務的進行,每次任務都會產生大量的遍曆過程截圖,對於這大量的截圖,很難有人力逐張檢查是否存在异常,人力成本過大,但也許花了很多人力去檢查,但實際可以看到的圖像异常問題卻很少。針對這個問題,顯然需要圖像异常的自動斷言能力進行判斷自動化任務截圖是否存在某種异常。

通過提供多種圖像异常檢測能力,期望探索解决各類UI自動化任務中的UI圖像异常自動斷言。並提供接入簡單,接入方式多樣的工具或服務。

二、整體方案

方案主要由算法能力接入、算法訓練框架以及圖像數據庫三個部分組成。

方案主要提供兩種接入方式:SDK和服務的方式。目前SDK主要提供Python SDK,SDK的方式主要適用於保密項目或不希望相關截圖流出生產環境的業務和項目。為每個圖像質量檢測算法提供了單獨的API供接入方自定義選擇。服務方式主要是HTTP服務,提供了通用的服務端接入方式。同時還可以通過自動化任務插件方式接入圖像异常檢測,在自動化Case跑完之後,對過程截圖進行圖像質量异常斷言。

訓練框架部分目前只用到了圖像分類相關的框架,包括圖像預處理、圖像增强、圖像對抗樣本生成、模型訓練等。後續會加入更多的圖像算法相關的框架,例如圖像分割、目標檢測等。

圖像數據庫中的數據來源主要由業務异常數據以及异常圖像生成器組成,由於真實异常圖片的本身就很少,我們需要在异常圖片的基礎上通過某些算法生成一些人造的异常圖片。同時,也可以由業務同學,通過損壞某些圖像資源,來得到。

檢測的流程主要有三個部分組成:通用質量檢測算法、場景分類、場景定制算法。之所以需要場景分類,是因為很多APP對於不同的APP場景(比如詳情頁、視頻頁等)對於某些圖像質量异常的定義各不相同,使得需要根據場景適配不同的算法。

三、核心算法

由於异常檢測的數據通常是長尾分布,針對大部分算法,我們都采取了傳統圖像處理的方式來解决,而針對圖像處理解决不了的情况,我們使用异常圖片生成+深度學習的方式來解决。

傳統圖像處理的優勢在於對數據量的要求相對較低,但泛化性較差,隨著時間和异常數據的逐步積累,會逐漸轉換為傳統方法召回+深度學習方法精確分類的模式。

3.1 核心指標

對於圖像异常檢測算法,我們除了精確率和召回率(Precision,Recall)以外,定義了兩個指標來評估算法的好壞:檢出率、誤檢率。設圖片總數為x,异常圖片總數為y,正確檢出异常數為c,錯誤檢出异常數為w

檢出率 M 檢出率 = c y M_{檢出率}=\cfrac{c}{y}

誤檢率 M 誤檢率 = w x y M_{誤檢率}=\cfrac{w}{x-y}

其中檢出率用來評估算法能從海量圖片中識別出存在异常圖片的能力;誤檢率用來評估檢出圖片中真實存在异常的概率。對於圖像异常檢測來說,我們對檢出率的要求更高,而對誤檢率相對要求較寬松。原因是我們不希望漏掉任何的异常圖像,但少量的錯誤識別Case可以在人工Review的時候篩掉。

3.2 黑白屏檢測

(1) 概述

用於檢測當前界面截圖是否為黑屏白屏异常。示例如下:

(2) 原理

將界面分割成由上到下的若幹個區域,通過計算區域內所有32 * 32灰度圖像的像素區域的像素均值和標准差的均值來檢測當前界面是否存在黑屏或者白屏的异常出現。根據不同業務定義的黑白屏情况,支持按業務定制不同的黑白屏標准。

3.3 損壞檢測

損壞檢測會根據不同的業務場景會出現的不同的損壞异常進行檢測,業務方可以自定義調用哪些檢測算法。比較常見的損壞异常有紫色塊异常、白色塊异常和花屏异常。

3.3.1 紫色塊异常

(1) 概述

紫色塊异常通常出現在遊戲場景中,配合UI自動化在遍曆或者是執行Case的過程中檢測是否有紫色塊异常。通常造成紫色塊异常的原因是貼圖或者模型圖片的損壞或者丟失。

(2) 原理

通過計算截圖中判定為紫色像素的占比來確定是否有紫色塊异常。由於貼圖或模型圖像損壞時的紫色塊也會受到陰影的效果影響,所以判斷為紫色塊的RGB值範圍限制在R >= 220, G <= 60, B >= 220。

3.3.2 白色塊异常

(1) 概述

白色塊异常通常出現在遊戲場景中,配合UI自動化在遍曆或者是執行Case的過程中檢測是否有白色塊异常。通常造成白色塊异常的原因是UI圖片的損壞或者丟失。

(2) 原理

通過檢測畫面中的白色矩形區域來判斷是否存在白色塊异常。具體原理見上圖。其中計算像素均值的時候可以適當放寬像素均值的閾值以檢測下圖這種白色矩形异常。

(3) 效果

測試集效果檢出率 99.8% (4826/4836),誤檢率 0.1% (209/15w), Precision 96%, Recall 99.8%

3.3.3 花屏

(1) 概述

檢測遊戲或視頻中的花屏异常。

(2) 原理

通過异常圖片生成的方式(主要為圖像處理和人工收集)構建分類數據集,利用訓練二分類CNN模型。

(3) 效果

測試集准確率98.7% (961/974),其中异常圖片准確率99.4%(484/487),正常圖片98.1%(478/487)。CPU單張圖片預測時長約42ms。模型大小4 MB

3.4 屏幕黑框檢測

(1) 概述

檢測圖像是否有黑框

(2) 原理

判斷圖片四周是否有超過閾值寬度的黑色區域

3.5 過曝檢測

(1) 概述

檢測圖像中特效是否出現過曝

(2) 原理

  1. 通過二值化保留高亮區域
  2. 利用形態學開操作去除噪點
  3. 通過高亮區域的面積和形狀進行過濾

3.6 文字重疊檢測

(1) 概述

檢測頁面中的文字區域是否存在文字重疊异常

(2) 异常數據構建

實際場景中,正常樣本的圖片數量是非常多的,我們通過OCR 對文字區域進行定比特,通過算法將背景和文字顏色提取出來後,疊加上特定大小、特定字體、特定顏色的錯比特字體構建文字重疊的异常圖像。通過這種方法,我們構建了文字重疊區域的數據集,其中异常區域量級2w+

(3) 原理

由於文字區域的尺寸太小,從整圖維度作為輸入做檢測的方式經過實驗後都認為不可行,最後采取了當前的方案:

通過OCR 提取文字區域的比特置,將文字區域送入訓練好的文字重疊分類器當中,判斷是否存在文字重疊。測試集准確率Precision 88%,Recall 62%

3.7 無監督場景聚類

(1) 概述

在圖像异常檢測的場景下,對於每個不同的場景,需要應用的檢測算法及相同算法的檢測標准都不同,所以需要智能算法對同一個APP的多個場景進行場景聚類後進行不同場景的定制化檢測。在這裏我們可以通過無監督的方式,從海量的自動化產生的截圖中獲取一個自動的場景劃分,避免了監督學習中對海量數據的人工標注工作和長時間的模型訓練和調優過程。

(2) 原理

  1. 通過Sift + Spatial Pyramid Pooling 提取多尺度下的Sift 特征點及特征向量,這裏選擇了3個尺度下的Sift特征。
  2. 對整個數據集所有的圖片所提取的所有尺度下的特征向量進行KMeans聚類,獲得一個codebook。
  3. 根據codebook,對每個圖片的的Sift特征進行計算直方圖向量,並拼接3個尺度1+4+9 共14個直方圖向量作為圖片的全局錶述
  4. 使用Bisecting KMeans對全局向量做自適應聚類,無需人工指定簇的個數。
  5. 對最終的聚類結果做可視化後挑選相同場景的簇做合並,得到最終的場景分類器。

(3) 效果

四、技術難點

4.1 數據

對於所有异常檢測的任務來說,异常數據的獲取都是最困難的。為了解决這種數據獲取的困難,我們采取了三種手動制造异常圖片的方式——GrabCut算法(紫塊异常)、隨機疊加圖片(花屏异常)和文字區域疊加(文字重疊异常)的方式。

GrabCut算法是基於GMM和圖算法對圖片中的前景和背景進行分割的算法,通過GrabCut算法我們提取了前景圖片之後,對前景物體利用紫色色塊填充後形成了人造的异常圖片。

隨機疊加圖片的方式主要用來生成遊戲中的花屏圖片。通過少數的幾張真實的花屏圖片,我們發現花屏异常通常都是由前後幾幀的圖片混合出現的。通過隨機疊加生成了一批和真實异常圖十分接近的异常圖。

在文字區域疊加的方式中,我們通過OCR 對文字區域進行定比特,通過算法將背景和文字顏色提取出來後,疊加上特定大小、特定字體、特定顏色的錯比特字體構建文字重疊的异常圖像。通過這種方法,我們構建了文字重疊區域的數據集,其中异常區域量級2w+

4.2 Over Confident

由於人造的异常圖片進行分類任務對於深度卷積神經網絡來說過於簡單,最終的得到的模型的預測結果的Score 通常都接近1,通常在0.99 左右,這對實際任務十分不利。在這裏我們引入了標簽平滑(Label Smoothing)的正則方式,以緩解模型Over Confident的問題。

4.2.1 標簽平滑(Label Smoothing)

標簽平滑簡單來說就是將計算Loss時候的Hard One Hot Label (一個類別為 1 其餘為0)替換成Soft One Hot Label (一個類別接近1,其餘接近0)的方式,來緩解Over Confident問題。

這種正則方式在大多數分類任務中都被證明有效。

4.3 樣本過於簡單

對於人造樣本過於簡單的問題,會發現一些明顯是無异常圖片的Case被錯分到有异常這一類。我們嘗試對人造的樣本及真實的正常圖片,加入一些對抗樣本(Adversarial Examples)來使得分類的邊界更加的清晰魯棒。

4.3.1 對抗樣本(Adversarial Examples)

在分類任務中,有時候我們會發現,一張預測正確的圖片,加入了一些非常小的肉眼看不出的噪聲後,會使得分類器完全預測錯誤,雖然肉眼看起來完全沒有差別。這些樣本就是對抗樣本。

通過加入對抗樣本,使得分類器學到的數據分布的邊界更加清晰,防止模型學習到一些我們觀察不到的未知的視覺信息。

4.4 計算資源

測試過程中,圖像分析的請求數量大,對算法的實時性要求比較高。在上述提到的算法中,花屏檢測算法對計算資源的要求最高,通過選擇適合移動端的輕量級網絡MobileNet 加上Tensorflow提供的TF Lite Uint8量化,可以在精度損失不大的情况下,獲得極大的速度提昇和計算資源的節省。

五、落地效果

這裏只針對落地遊戲場景的三種算法做了落地效果的實驗

5.1 測試集效果

檢出率 誤檢率
紫色塊 96.4%(53/55) 0%(0/15w)
白色塊 99.8% (4826/4836) 0.1% (209/15w)

花屏算法測試集准確率98.7% (961/974),其中异常圖片准確率99.4%(484/487),正常圖片98.1%(478/487)。CPU單張圖片預測時長約42ms。模型大小4 MB

5.2 落地效果

總數 异常圖片 無异常圖片
總數 13856 1 13855
紫塊 1 1 0
白塊 70 0 70
花屏 140 0 140

紫塊

預測是否存在异常
實際是否存在异常 Yes No
Yes 1 0
No 0 13855

白塊

預測是否存在异常
實際是否存在异常 Yes No
Yes 0 0
No 70 13786

花屏

預測是否存在异常
實際是否存在异常 Yes No
Yes 0 0
No 140 13716

可以看出,通過圖像質量檢測插件,大大降低需要做斷言的截圖數量(13856->211)。就算法效果而言,紫塊算法已經無需優化,白塊和花屏算法需要後續收集誤檢圖片做進一步的調優。

版权声明:本文为[字節跳動技術質量團隊]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071838413679.html