作者:海濱
導讀 在傳統的工業生產制造,主要是采用人工檢測的方法去檢測產品表面的缺陷,不僅受限于檢測人員的技術,而且檢測的速度慢、效率低,更重要的是檢測的結果不精確。本文從算法工程師的角度總結視覺類表面缺陷檢測項目相關技術。
零、前言
做這個方向的項目也有一段時間了,作為算法工程師,主導的大大小小的項目也有幾個,有成功交付的,誠然也有爛尾的。回顧整個項目流程,盡管經歷酸甜苦辣,但收獲頗豐,估寫下此文當成2023年終總結吧。
本文不僅僅涉及的是技術,也有一些對于項目管理,需求溝通的相關的內容,算是自己的一點點感悟。
表面缺陷檢測項目,同事更多稱之為“質檢項目”,我總覺得這個范圍太大了。盡管PPT里面寫的看著我們什么都能做,但是當面對一些刁鉆需求時,實事求是地講我們還是做不了。
本文不會涉及太多技術細節相關的東西,主要是一些方法論。
一、任務定義
表面缺陷檢測任務是指通過對產品表面進行仔細的檢查和評估,以發現和識別任何不符合質量標準或設計要求的表面缺陷。這項任務的目的是確保產品的外觀質量和功能性滿足預定的要求,從而提高產品的整體質量和客戶滿意度。
表面缺陷檢測廣泛應用于多個行業,以確保產品質量符合標準,提升產品競爭力。這其中包括
制造業:
汽車制造業:檢測車身、零部件等的表面缺陷。
航空工業:檢測飛機機身、零件等的表面缺陷。
機械加工:檢測機床床身、導軌等部件的表面缺陷。
家用電器:檢測塑料外殼、金屬部件等的表面缺陷。
材料加工業:
鋼鐵行業:檢測鋼材表面的裂紋、折疊等缺陷。
有色金屬行業:檢測鋁、銅等金屬材料的表面缺陷。
陶瓷和玻璃行業:檢測陶瓷和玻璃產品的表面缺陷。
紡織品和服裝行業:
檢測紡織品的破損、污漬、顏色不均勻等表面缺陷。
檢查服裝紐扣、拉鏈等附件的表面缺陷。
食品和包裝行業:
檢測食品包裝袋、容器等的印刷質量、漏印等表面缺陷。
檢查包裝材料的密封性、透明度等表面缺陷。
建筑行業:
檢測混凝土結構表面的裂縫、蜂窩等缺陷。
檢查建筑材料如磚、石、木材等的表面缺陷。
能源行業:
檢測風力發電機葉片、太陽能電池板等的表面缺陷。
檢查石油、天然氣輸送管道的防腐層、焊縫等表面缺陷。
這些行業的表面缺陷檢測不僅關系到產品質量,還可能影響到產品安全、耐用性和市場競爭力。因此,通過嚴格的表面缺陷檢測,可以確保產品在設計、生產和使用過程中的安全和可靠性。
跟一個行業大佬聊過AOI行業,個人感覺AOI聚焦于電子器件的檢測:
AOI(Automated Optical Inspection,自動光學檢測)是一種利用光學原理和自動化技術對印刷電路板(PCB)或其他電子組件進行表面缺陷檢測、尺寸測量、焊點檢查等的一種技術。AOI系統通常包括光源、光學鏡頭、圖像采集設備、數據分析軟件等組件。
二、需求溝通
由任務定義可知,這類項目是定制化的項目,且ToB為主。有些規則是行業里頭的,有些規則是工廠自己定義的。
前期的需求溝通主要以缺陷種類、缺陷的重要性為主。后面需要更進一步討論質量標準、檢測標準和評估可行性。
明確好缺陷種類后,還需要評估對于算法的要求,包括實時性、精度、檢測范圍等。此外在項目的立項階段,驗收標準也需要確定好。
缺陷樣例的收集也是重中之重的工作,如果某類客戶要求必須做的缺陷比較難收集,需要評估是否可以人為造一些、通過算法造一些樣本或者評估下具體的收集時間是否滿足項目要求。比如實時性要求較高的時候,乙方就需要要求甲方購買計算能力較好的硬件,或者計算卡的數量多一些也可以。精度一般存在于驗收標準中,指標的定義要明確清楚。
檢測范圍即檢測缺陷的種類有哪些,哪些允許漏檢,哪些至少檢出一個等。最常見也是最頭疼的是檢測“異物”,如果客戶定義是一個開放集合,就需要慎重考慮,因為常見的有監督目標檢測深度學習的方法還做不到。如果客戶定義是一個閉集,那就需要統計一下每個"異物"種類缺陷的可收集樣本數量,重新按照新的缺陷類別進行評定。
需要注意的是,這類項目再好的檢測算法,那也局限于檢測,不具有修復缺陷的功能,這在前期需求溝通時就需要對齊。
此外,發會議績效也是家常便飯,郵件留底是對甲方乙方領導都有交代。
三、成像方案
成像方案的選取取決于多種因素,包括被檢測物體的材質、表面特性、所需的檢測精度、檢測速度以及成本等。以下是一些常見的成像方案:
光學顯微鏡成像:
適用于小尺寸缺陷的高分辨率成像,比如一些電路板檢測。
光學檢測成像系統(如CCD/CMOS相機):
可以配合不同類型的光學鏡頭和光源使用,適用于多種表面缺陷檢測,常見的有鋼鐵表面缺陷檢測、布匹表面缺陷檢測。
紅外成像:
對熱特性的變化敏感,適用于檢測某些材料的熱缺陷。
紫外成像:
某些表面缺陷在紫外光下更為顯著,適用于特定材料的表面缺陷檢測。
激光掃描成像:
通過激光掃描器逐點掃描物體表面,再通過傳感器收集數據,適用于大型物體的高精度檢測。
超聲波成像:
通過超聲波在材料中的傳播特性來檢測內部和表面的缺陷。
從算法工程師角度,我們往往關注于整個系統的節拍和成像的耗時(工控機最終得到單個完整圖片的時間),以及最后的圖像是單通道的還是多通道的,是2D檢測還是三維檢測。
成像還需要注意兩點:
一定要求驗證環節,確保每一類缺陷都可以拍的到,且比較好區分,不受正常區域影響。后續改成像成本很大,牽一發而動全身。
成像方案要確保可遷移性,即在驗證階段搭的實驗條件下的成像效果,在正式投入使用時依然可以保證原來極為接近的成像效果。
四、缺陷收集和對齊
缺陷圖片的收集是一個體力活,主要分為兩種方式:
人工收集:依賴于甲方客戶工人師傅收集樣本,然后乙方或者甲方派人人工進行照片取樣。
半人工收集加自動采集:這種收集方式常見于鋼板和布匹紡織品缺陷檢測領域,這類任務有一個重要的特點是攝像頭拍攝的每張圖像在空間上對齊的,即每一處位置在圖片上的語義不會變。這種特征保證了可以采用一些半監督或者無監督的異常檢測方法來從收集的大量正常樣本中獲取到異常樣本。后續還需要收集固定類別的樣本,比如劃傷、裂紋等,這個時候就需要人工訓練一個CNN分類模型來對缺陷樣本進行細粒度的分類。
缺陷對齊環節在需求溝通階段已經有綱要了,在缺陷對齊環節更多的是對齊細節,這個時候就要確定缺陷的標注問題了,是標框還是標像素點,框是外接矩形框還是旋轉矩形框,這需要根據客戶需求、缺陷描述準確性、算法實現難易程度綜合考慮。
五、整體推理服務框架
表面缺陷檢測算法常常以目標檢測算法來實現,它有著輸入圖片較大、實時性要求高的特點。
表面缺陷檢測算法的框架個人總結如下:
大圖預處理:對于大圖的預處理包括去除非檢測區域以及特定異常的分類,這些一般可以手寫一些特征來處理(比如去黑邊),有時也需要訓練一些模型來處理(比如對于大圖特定缺陷的分類),還有是需要提取一些檢測區域(ROI區域,Region of Interesting)
大圖上的缺陷檢測:有些缺陷在大圖上容易定位特征比較明顯,可以放在大圖中去檢測。需要注意的是,在大圖上做缺陷檢測是耗費總體時長的,所以后續步驟如果需要在小圖上做檢測,那么從整體系統延遲角度考慮,大圖的檢測盡量還是放到小圖上、
根據ROI區域切小圖:有ROI區域就根據ROI區域坐標切,這里有兩個超參數,即小圖切多大和stride是多少,這些可以根據檢測精度要求、系統延遲要求和小圖目標檢測器的輸入圖片大小來判定。
小圖預處理:對于小圖預處理的包括對于小圖異常的分類判定,在一個正常的檢測流程中,正常樣本占大多數,這樣一個耗時較小的分類器可以擋掉后續大圖分正常小圖的目標檢測。
小圖上的目標檢測:小圖的目標檢測以識別小目標為主,即在大圖上是在檢索不到的,一般在7x7像素至30x30像素之間,小目標的檢測是一個難題,但在工業界提升精度并保證推理速度最快的方式就是加數據和堆卡,至于模型的選型,自然是滿足推理時延范圍內選精度比較高且其他方面相對合適的。
檢測結果合并:最后結果的輸出需要合并小圖和大圖的檢測結果,包括將小圖檢測坐標還原到大圖位置,以及檢測結果目標框的合并(切小圖時候有overlap導致)
六、模型訓練和調優迭代
模型的訓練和調優主要包括以下幾個過程:
數據預處理:這是模型訓練的第一步,包括收集數據、清洗數據、處理缺失值、數據標準化或歸一化、特征選擇和特征工程等。目的是將原始數據轉換成適合模型訓練的形式。
選擇模型:滿足小數據就用小模型,大數據就用大模型。簡單任務就用小模型,復雜任務考慮大模型或者小模型組合。比如ROI區域檢測有一些小的檢測模型足以,檢測小目標的模型small量級能滿足要求用就好,不需要動不動就transformer、大模型,盡管它很火。
訓練模型:使用已標記的數據集對模型進行訓練,調個幾次參數足以,我個人一般將學習率設置為原來的0.1,然后加載預訓練參數,其余保持一致。當然時間充裕的時候我也有過創新,下面章節會說到。
模型評估:使用驗證集或測試集評估模型的性能。常見的評估指標有準確率、召回率、F1分數、mAP等。
調優模型:根據模型評估的結果,對數據進行調整。注意是數據,經過學術界驗證的論文,一般不會對模型進行魔改,除非任務特殊。指標低一般就是數據的問題,找標注人力修數據就好。
在模型訓練和過程中,我一般基于一些框架寫一些適配的小工具,比如
獲取每一個缺陷類別的檢測指標
可視化數據集標注
可視化模型預測
模型預測轉換為預標注,給一些數據打偽標簽
獲取bad base和原始標注,方便標注人員修復
最佳分類閾值搜索
常用的應該如上面所示,個人更習慣于打造工具的可復用性,所以一些簡單的需求我還是會寫一寫腳本嵌套到模型檢測訓練框架當中工具化。
七、模型部署
模型部署是將訓練好的模型轉化為實際可用服務的過程。模型部署包括以下幾個主要工作內容:
環境配置:為模型部署準備合適的環境,包括硬件資源(如CPU/GPU、內存、存儲等)、操作系統、依賴庫和框架等,一般這些都是供應商準備,算法工程師將所有服務打包到docker當中即可。
模型轉換:將訓練好的模型轉換為適合部署的格式。這可能包括將模型轉換為特定的格式(最常見的即ONNX),或者將模型的代碼優化以提高推理速度。
服務構建:將模型集成到服務器或應用程序中,以便可以對其進行遠程調用。這通常涉及到編寫API接口代碼,以及創建相應的服務架構,如微服務、RESTful API等。
性能優化:確保模型在部署后能夠高效運行。這可能包括對模型進行壓縮、量化,或者對服務架構進行優化,以降低延遲和提高吞吐量。
測試:在部署前后進行全面的測試,確保模型的功能和性能都符合預期。一般需要找測試的同事測試一下并給出測試報告。
監控:部署監控系統來跟蹤模型的性能,包括準確率、響應時間、資源消耗等指標。對于部署系統的準確率和資源消耗壓測是必不可少的環節,這涉及到服務的可用性。
日志記錄和錯誤處理:配置日志記錄系統,以便在模型出現問題時可以追蹤和分析。同時,實現錯誤處理機制,以便在出現異常時能夠給出適當的反饋或解決方案。
文檔和培訓:為使用模型的人員提供必要的文檔和培訓,確保他們了解如何正確地使用模型和服務。
安全性和合規性:確保模型的部署符合數據安全和隱私保護的法規要求,包括數據加密、模型加密、用戶身份驗證、訪問控制等。
部署服務架構的優化體現在如下原則:
充分采用加速卡GPU/NPU硬件資源,比如對輸入視頻或者圖片盡量采用硬解碼的形式,采用硬解碼后的輸出顯然是放在顯存上,這樣后續的預處理就不需要過CPU,對于輸入數據的預處理也盡可能放到加速卡上去做。
模型并行策略:比如在切小圖后,對多個小圖放到不同的計算卡上去推理,充分利用多卡推理資源。這里就涉及到負載均衡技術,比如如何將計算負責合理地分發到不同的計算設備上,我的個人博客當中有《對單機多卡AI模型推理場景下計算資源分配問題的思考》這篇文章,歡迎大家去閱讀。
服務并行策略:運行多個推理服務,采用nginx代理方式,對外提供一個接口,提升服務穩健性和并發度。
八、一些節省推理延遲的trick
圖像輸入大小
圖像輸入不一定非得是正方形,可以按照等比例壓縮,比如原來圖像的寬高比是4:1,那么在訓練分類或者檢測模型時,保持4:1寬高比即可,這樣既可以滿足性能要求也可以極大降低節省推理時間。
輸入通道大小
灰度圖的通道數為1,不需要為了滿足模型要求輸入,在channel維度上再復制兩分,我們可以通過改模型的方式將模型輸入通道數修改為1且不影響加載預訓練,歡迎閱讀我的博客中的其他文章《灰度圖分類采用Imagenet預訓練時卷積核壓縮Trick》
模型量化
目前對于檢測模型和分類模型的8bit量化方案已經很成熟,如果優化后依然不能滿足系統延遲要求可以考慮量化模型。
九、后續運維
表面缺陷檢測是制造業中的一項重要質量控制工作,在服務有效期內,有必要對軟件服務進行運維。
后續運維工作主要包括以下幾個方面:
數據管理與分析:收集和存儲檢測數據,進行定期分析,以優化檢測流程和提高檢測效率。這可能涉及到使用專業的數據分析軟件,對檢測結果進行統計和分析。
交付人員培訓:對交付人員進行培訓,包括模型的升級策略、bad case數據收集,模型服務的部署等內容。
故障應對與反饋:在檢測過程中,如果發現檢測服務存在問題,需要迅速應對,找出原因并進行修復。同時,將問題及解決方案記錄下來,以便未來避免類似問題的發生。
總結
一直想寫這篇文章,可是一直排不上時間,我很享受做這些項目的過程,可以從客戶的認可中獲得滿足感。
記得本科階段,作為下位機軟件開發人員參與流水線檢測項目,總覺得設計視覺算法的人很牛,若干年后我也變換了角色,成為了一名算法工程師。命運總是很奇妙,不是么?
工作上暫時不再涉及此類項目,寫下此文以作總結。
審核編輯:黃飛
?
評論
查看更多