用計算機視覺來作異常檢測


點擊上方智能算法」,選擇加"星標"或「置頂python

重磅乾貨,第一時間送達git

做者:Mia Morton github

編譯:ronghuaiyang(AI公園)web

導讀

建立異常檢測模型,實現生產線上異常檢測過程的自動化。在選擇數據集來訓練和測試模型以後,咱們可以成功地檢測出86%到90%的異常算法

介紹

異常是指偏離預期的事件或項目。與標準事件的頻率相比,異常事件的頻率較低。產品中可能出現的異常一般是隨機的,例如顏色或紋理的變化、劃痕、錯位、缺件或比例錯誤。json

異常檢測使咱們可以從生產流程中修復或消除那些處於不良狀態的部件。所以,因爲避免生產和銷售有缺陷的產品,制形成本下降了。在工廠中,異常檢測因爲其特色而成爲質量控制系統的一個有用工具,對機器學習工程師來講是一個巨大的挑戰。數組

不推薦使用監督學習,由於:在異常檢測中須要內在特徵,而且須要在完整數據集(訓練/驗證)中使用少許的異常。另外一方面,圖像比較多是一個可行的解決方案,但標準圖像處理多個變量,如光線、物體位置、到物體的距離等,它不容許與標準圖像進行像素對像素的比較。在異常檢測中,像素到像素的比較是不可或缺的。微信

除了最後的條件外,咱們的建議包括使用合成數據做爲增長訓練數據集的方法,咱們選擇了兩種不一樣的合成數據,隨機合成數據和類似異常合成數據。(詳見數據部分)網絡

這個項目的目標是使用無監督學習和合成數據做爲數據加強方法來分類異常 — 非異常。架構

背景研究

異常檢測與金融和檢測「銀行欺詐、醫療問題、結構缺陷、設備故障」有關(Flovik等,2018年)。該項目的重點是利用圖像數據集進行異常檢測。它的應用是在生產線上。在項目開始時,咱們熟悉了自動編碼器在異常檢測中的功能和架構。做爲數據計劃的一部分,咱們研究了包括合成噪聲圖像和真實噪聲圖像的重要性(Dwibedi et al, 2017)。

數據計劃是這個項目的重要組成部分。選擇一個數據集,有足夠的原始圖像和足夠的真實噪聲的圖像。同時使用合成圖像和真實圖像。在處理真實圖像時,這些數據須要對目標有全覆蓋,可是在尺度和視角方面沒法徹底得到。「……要區分這些實例須要數據集對對象的視角和尺度有很好的覆蓋」(Dwibedi et al, 2017)。合成數據的使用容許「實例和視角的良好覆蓋」(Dwibedi et al, 2017)。合成圖像數據集的建立,包括合成渲染的場景和對象,是經過使用Flip Library完成的,這是一個由LinkedAI建立的開源python庫。「剪切,粘貼和學習:很是簡單的合成實例檢測」,經過這些數據的訓練和評估代表,使用合成數據集的訓練在結果上與在真實圖像數據集上的訓練具備可比性。

自動編碼器體系結構「一般」學習數據集的表示,以便對原始數據進行維數縮減(編碼),從而產生bottleneck。從原始的簡化編碼,產生一個表示。生成的表示(重構)儘量接近原始。自動編碼器的輸入層和輸出層節點數相同。「bottleneck值是經過從隨機正態分佈中挑選出來的」(Patuzzo, 2020)。在重構後的輸出圖像中存在一些重構損失(Flovik, 2018),能夠經過分佈來定義原始圖像輸入的閾值。閾值是能夠肯定異常的值。

去噪自動編碼器容許隱藏層學習「更魯棒的濾波器」並減小過擬合。一個自動編碼器被「從它的一個損壞版本」來訓練來重建輸入(去噪自動編碼器(dA))。訓練包括原始圖像以及噪聲或「損壞的圖像」。隨着隨機破壞過程的引入,去噪自編碼器被指望對輸入進行編碼,而後經過去除圖像中的噪聲(破壞)來重建原始輸入。用去噪自編碼器提取和組合魯棒特徵,去噪自編碼器應該可以找到結構和規律做爲輸入的特徵。關於圖像,結構和規律必須是「從多個輸入維度的組合」捕獲。Vincent等(2020)的假設引用「對輸入的部分破壞的魯棒性」應該是「良好的中間表示」的標準。

在這種狀況下,重點將放在獲取和建立大量原始和有噪聲圖像的能力上。咱們使用真實數據和合成數據建立了大量的圖像來訓練咱們的模型。

根據Huszar(2016)的說法,擴張卷積自動編碼器「支持感覺野的指數擴展,而不丟失分辨率或覆蓋範圍。「保持圖像的分辨率和覆蓋範圍,對於經過擴大卷積自動編碼器重建圖像和使用圖像進行異常檢測是不可或缺的。這使得自動編碼器在解碼器階段,從建立原始圖像的重建到更接近「典型」自動編碼器結構可能產生的結果。Dilated Convolutional Autoencoders Yu et al.(2017),「Network Intrusion Detection through Stacking Dilated Convolutional Autoencoders」,該模型的目標是將無監督學習特徵和CNN結合起來,從大量未標記的原始流量數據中學習特徵。他們的興趣在於識別和檢測複雜的攻擊。經過容許「很是大的感覺野,而只以對數的方式增長參數的數量」,Huszar (2016),結合無監督CNN的特徵學習,將這些層堆疊起來(Yu et al., 2017),可以從他們的模型中得到「卓越的性能」。

技術

Flip Library (LinkedAI)
https://github.com/LinkedAi/flip

Flip是一個python庫,容許你從由背景和對象組成的一小組圖像(可能位於背景中的圖像)中在幾步以內生成合成圖像。它還容許你將結果保存爲jpg、json、csv和pascal voc文件。

Python Libraries

在這個項目中有幾個Python庫被用於不一樣的目的:

可視化(圖像、指標):

  • OpenCV
  • Seaborn
  • Matplotlib

處理數組:

  • Numpy

模型:

  • TensorFlow
  • Keras
  • Random

圖像類似度比較:

  • Imagehash
  • PIL
  • Seaborn (Histogram)

Weights and Biases

Weights and bias是一個開發者工具,它能夠跟蹤機器學習模型,並建立模型和訓練的可視化。它是一個Python庫,能夠做爲import wandb導入。它工做在Tensorflow, Keras, Pytorch, Scikit,Hugging Face,和XGBoost上。使用wandb.config配置輸入和超參數,跟蹤指標併爲輸入、超參數、模型和訓練建立可視化,使它更容易看到能夠和須要更改的地方來改進模型。

模型&結構

咱們基於當前的自動編碼器架構開始了咱們的項目,該架構專一於使用帶有卷積網絡的圖像(見下圖)。通過一些初步的測試,基於研究(參見參考資料)和導師的建議,咱們更改成最終的架構。

自編碼器的典型結構

使用擴張特徵

擴張特徵是一種特殊的卷積網絡,在傳統的卷積核中插入孔洞。在咱們的項目中,咱們特別的對通道維度應用了膨,不影響圖像分辨率。

最終的結構

圖像類似度

這個項目的關鍵點之一是找到一個圖像比較的指標。利用圖像比較度量對模型進行訓練,創建直方圖,並計算閾值,根據該閾值對圖像進行異常和非異常的分類。

咱們從逐個像素的L2歐氏距離開始。結果並不能肯定其中的一些差別。咱們使用了帶有不一樣散列值(感知、平均和差別)的Python Imagehash庫,對於類似的圖像,咱們獲得了不一樣的結果。咱們發現SSIM(結構類似度指數度量)度量爲咱們提供了一對圖像之間類似度的度量,此外,它是Keras庫的一個內置損失。

直方圖

在對模型進行訓練和評估後,利用其各自的數據集,對重建後的圖像和原始圖像之間的類似度進行識別。固然,因爲原始圖像的多樣性(如,大小,位置,顏色,亮度和其餘變量),這種類似性有一個範圍。咱們使用直方圖做爲圖的表示,以可視化這個範圍,並觀察在哪一個點會有不一樣的圖像。

直方圖的例子

數據

使用的數據從Kaggle下載:表面裂紋檢測數據集:

https://www.kaggle.com/arunrk7/surface-crack-detection

鑄造產品質量檢查圖像數據:

https://www.kaggle.com/ravirajsinh45/real-life-industrial-dataset-of-casting-product?select=casting_data。

第一個是裂縫數據集,包含20,000張負樣本牆圖像(無裂縫)和20,000張正樣本牆圖像(有裂縫)。在這種狀況下,裂縫被認爲是異常的。全部數據都是227x227像素的RGB通道。

咱們從沒有異常的組中選取了10,000張圖像來生成不一樣的合成數據集。而後合成的數據集被分爲兩種類型:一種是帶有相似異常的噪聲(51張圖像是用Photoshop建立的),另外一種是使用水果、植物和動物等隨機物體。全部用做噪聲的圖像都是png格式的,背景是透明的。

第二個數據集,cast數據集分爲兩組,一組爲512x512像素的圖像(有異常的781張,無異常的519張),另外一組爲300x300像素的圖像(有異常的3137張,有異常的4211張)。全部圖像都有RGB通道。使用的是300 x 300像素的圖像。後者,來自Kaggle,91.65%的數據被分爲訓練,其他的測試。對於該數據集,異常包括:邊緣碎片、劃痕、表面翹曲和孔洞。下面是一些有和沒有異常的圖像示例。

咱們使用1,000張屬於訓練組的完好陷圖像來生成合成數據數據集。在前面的例子中,咱們建立了兩種類型的數據集:一種帶有相似於異常的噪聲(51張圖像是用Photoshop建立的),另外一種帶有隨機對象的噪聲,如動物、花朵和植物(裂縫數據集中使用的相同的80張圖像)。下面是一些在模型訓練中使用的圖像示例。

全部合成數據都是使用Flip庫建立的。在每一個生成的圖像中,選擇兩個對象並隨機放置。對象應用了三種類型的轉換:翻轉、旋轉和調整大小。生成的圖像保存爲jpg格式。項目使用的數據集以下表所示:

實驗

根據上述表格說明,咱們的主要目的是研究數據集的哪些變化可能呈現最好的結果,咱們用這些數據和得到的結果訓練了模型(見下面的圖表)。

對於每一個數據集,咱們評估了幾個指標,如(SSIM)損失、召回、精度、F1和精度。在每一次實驗中,咱們將評估表明這組噪聲圖像和重建圖像之間圖像類似性的直方圖。

爲了跟蹤和比較咱們的結果,咱們使用了library Weight & bias,它容許一種簡單的方式來存儲和比較每一個實驗的結果。

訓練

爲了在咱們的環境中保持少許的變量,咱們決定老是使用一個有1000個樣本的數據集,而無論真實數據和合成數據之間的關係。

在算法中,咱們將各自的數據集分割爲95%進行訓練,5%進行測試結果。除此以外,咱們的評估只使用了真實的數據。

評估和結果

下面是一些實驗的主要結果。你可在如下連結找到全部的結果:

裂縫數據集:

https://wandb.ai/heimer-rojas/anomaly-detector-cracks?workspace=user-

裂縫直方圖

裂縫數據集的異常檢測

對於裂紋數據集,實驗結果也很好(91% ~ 98%),實驗之間沒有顯著差別。與無異常的圖像相比,其行爲主要取決於裂紋大小和顏色等變量。

鑄造工件數據集:

https://wandb.ai/heimer-rojas/anomaly-detector-cast?workspace=user-heimer-rojas

鑄造工件數據集的準確率和召回率

鑄造件E1&E3

鑄造件數據集的異常檢測

挑戰

  • 訓練時間長,在谷歌Colab和專業版中使用GPU訓練。
  • 經過上傳壓縮後的zip格式的數據來解決長時間的數據加載問題,這樣每一個數據集上傳一個文件,大大減小了時間。
  • 最初的提議是使用哥倫比亞汽車生產線的數據集,不幸的是,正樣本和負樣本圖像的質量和數量都不足以建立一個合適的機器學習模型。這種狀況促使咱們決定使用Kaggle的數據集,與生產線生產的條件相似。
  • 每一個數據集在異常狀況下的可視化差別是不一樣的,須要考慮正常的圖像結構,如圖像的顏色、亮度等內在特徵
  • 須要人類的專業知識來根據真實數據或合成數據的閾值選擇適當的閾值。這可能要視狀況而定。

討論

實現一個真正的機器學習項目須要幾個步驟,從想法到模型的實現。這包括數據集的選擇、收集和處理。

在使用圖像的項目中有「調試腳本」是很重要的。在咱們的例子中,咱們使用了一個容許咱們可視化的腳本:原始數據集、新的合成圖像和自編碼器去噪以後的圖像,使咱們可以評估模型的性能。

英文原文:

https://medium.com/linkedai/anomaly-detection-production-line-b8340e1eca43

 End 

  
        
        
        
         
         
                  
         
  
        

本文分享自微信公衆號 - 智能算法(AI_Algorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索