習(xí)的工業(yè)儀表讀數(shù)識別方案與實(shí)戰(zhàn)解析)
簡介本資源是一份面向本科生期末大作業(yè)與畢業(yè)設(shè)計(jì)的深度學(xué)習(xí)實(shí)踐項(xiàng)目聚焦工業(yè)場景下儀表讀數(shù)的自動(dòng)化識別問題適用于具備Python基礎(chǔ)與機(jī)器學(xué)習(xí)入門知識的學(xué)習(xí)者。項(xiàng)目基于卷積神經(jīng)網(wǎng)絡(luò)CNN構(gòu)建端到端識別流程涵蓋圖像預(yù)處理、指針/刻度檢測、傾斜校正及數(shù)字讀數(shù)解析等核心環(huán)節(jié)可直接用于課程設(shè)計(jì)、畢設(shè)原型開發(fā)或工業(yè)視覺初探。壓縮包共11個(gè)文件含5個(gè)核心Python腳本實(shí)現(xiàn)檢測、匹配、變換與主控邏輯、3個(gè)PyTorch訓(xùn)練好的模型權(quán)重.pt格式以及requirements.txt依賴清單、README.md使用說明和.gitignore配置文件整體大小為16.65MB結(jié)構(gòu)清晰、模塊職責(zé)明確便于理解與二次開發(fā)。目前已有74人學(xué)習(xí)下載提供完整可運(yùn)行代碼鏈路與典型儀表如溫度計(jì)的專用檢測與讀數(shù)模型顯著降低從理論到落地的實(shí)踐門檻。 我去年在化工廠做巡檢系統(tǒng)改造最頭疼的就是那一排排壓力表、溫度表。老師傅拿個(gè)本子挨個(gè)抄抄完還要手工錄進(jìn)系統(tǒng)費(fèi)時(shí)不說一個(gè)筆誤可能就釀成大錯(cuò)。后來我們用攝像頭固定機(jī)位自動(dòng)抓拍跑起了基于深度學(xué)習(xí)的儀表讀數(shù)識別模型這才把這條鏈路徹底打通。這套方案的核心思路我拆解一下從模型選型、數(shù)據(jù)處理到部署上線完整走一遍希望能給做工業(yè)視覺、智能巡檢方向的朋友一點(diǎn)參考。如果你手上拿到的是“基于深度學(xué)習(xí)的儀表讀數(shù)識別.zip”這樣的項(xiàng)目包里面一般會(huì)有訓(xùn)練代碼、模型權(quán)重、樣本數(shù)據(jù)集和推理腳本但真正能不能跑起來、跑起來準(zhǔn)不準(zhǔn)還得看你對整個(gè)技術(shù)鏈路的理解。下面這篇內(nèi)容就是把這條鏈路一層層剝開講清楚每個(gè)環(huán)節(jié)為什么要這樣做、現(xiàn)場會(huì)踩什么坑。1. 為什么儀表讀數(shù)識別是深度學(xué)習(xí)落地的好場景1.1 人工抄表的痛點(diǎn)和傳統(tǒng)視覺方案的局限先說痛點(diǎn)。工業(yè)現(xiàn)場的壓力表、溫度表、液位計(jì)、水表氣表很多還停留在人工巡檢抄表的狀態(tài)。一個(gè)小時(shí)巡一次一次幾十塊表抄完要整理成Excel再錄入業(yè)務(wù)系統(tǒng)。效率低只是表面問題更大的風(fēng)險(xiǎn)有兩個(gè)一個(gè)是人為誤讀指針式儀表的刻度間距很小不同人看同一個(gè)表讀數(shù)都可能差出兩三個(gè)小格另一個(gè)是危險(xiǎn)環(huán)境高壓配電室、化工裝置區(qū)、鍋爐房這些地方每多進(jìn)去一個(gè)人就多一分安全風(fēng)險(xiǎn)。所以很多團(tuán)隊(duì)早就想用機(jī)器視覺替代人工。傳統(tǒng)做法一般是先對表盤圖像做預(yù)處理然后用Hough變換檢測圓形表盤和指針直線再用模板匹配去比對刻度盤上的數(shù)字和量程最后根據(jù)指針角度計(jì)算讀數(shù)。這個(gè)方法在最理想的實(shí)驗(yàn)條件下確實(shí)能跑通表盤正對相機(jī)、光照均勻、表盤干凈的時(shí)候精度可以做到挺不錯(cuò)。但一到現(xiàn)場就露餡了。工業(yè)現(xiàn)場的光照是變化的早晨和傍晚陽光角度不同表盤玻璃罩會(huì)反光相機(jī)安裝位置稍微偏一點(diǎn)表盤變成橢圓Hough圓檢測就開始飄表盤用久了刻度發(fā)黃、表殼有油污模板匹配的相似度會(huì)一落千丈。還有更要命的不同廠家、不同型號的壓力表刻度分布、量程范圍、指針樣式都不一樣傳統(tǒng)方案每換一種表型就要重新設(shè)計(jì)一版特征規(guī)則維護(hù)成本高到讓人崩潰。我在早期做視覺方案時(shí)Hough直線檢測加角度換算的流程調(diào)試了快兩個(gè)月調(diào)參調(diào)到懷疑人生最后換一個(gè)型號的表又要重新調(diào)一遍。用傳統(tǒng)方法做儀表讀數(shù)識別本質(zhì)上是在用手工特征去擬合整個(gè)儀表盤的外觀規(guī)律而這個(gè)規(guī)律的復(fù)雜度遠(yuǎn)超預(yù)期。1.2 深度學(xué)習(xí)方案的核心優(yōu)勢深度學(xué)習(xí)換了個(gè)思路不再去手工設(shè)計(jì)“指針該長什么樣”“刻度盤的刻度間距是多少”這些規(guī)則而是讓網(wǎng)絡(luò)自己從大量標(biāo)注樣本里學(xué)出儀表盤的結(jié)構(gòu)化特征。具體到儀表讀數(shù)識別任務(wù)深度學(xué)習(xí)帶來了幾個(gè)實(shí)打?qū)嵉暮锰帯5谝环夯芰?qiáng)。訓(xùn)練數(shù)據(jù)里覆蓋足夠多樣的表型、光照、角度后模型能自動(dòng)兼容各種表盤風(fēng)格差異。同樣是壓力表A廠家的表盤是白底黑字、量程0到1.6兆帕B廠家的表盤是黑底白字、量程0到2.5兆帕對深度學(xué)習(xí)模型來說都是“同一類對象”的變體只要訓(xùn)練樣本夠全它就能同時(shí)搞定。第二端到端可優(yōu)化。檢測模型直接輸出表盤位置識別模型直接輸出數(shù)字或指針角度整個(gè)流程不需要人工設(shè)計(jì)中間特征后面要做模型迭代只需要往數(shù)據(jù)里補(bǔ)新樣本就行不用重新寫規(guī)則。第三可以形成標(biāo)準(zhǔn)化流水線。目標(biāo)檢測網(wǎng)絡(luò)負(fù)責(zé)“定位”——找到表盤在哪分類網(wǎng)絡(luò)或者OCR網(wǎng)絡(luò)負(fù)責(zé)“理解”——讀出數(shù)字或指針角度后面的后處理代碼只是做單位換算和結(jié)果校驗(yàn)。這條流水線可以復(fù)用到各種表型上新接入一種表只需要標(biāo)注一批數(shù)據(jù)做微調(diào)比傳統(tǒng)方案的一表一套規(guī)則省太多事。1.3 拿到ZIP項(xiàng)目包后先做什么如果你下載了一個(gè)“基于深度學(xué)習(xí)的儀表讀數(shù)識別.zip”先別急著解壓就訓(xùn)練先花半小時(shí)做三件事。第一看目錄結(jié)構(gòu)。一個(gè)規(guī)范的項(xiàng)目包通常應(yīng)該包含data目錄原始圖像和標(biāo)注文件、config目錄訓(xùn)練參數(shù)配置、models目錄網(wǎng)絡(luò)結(jié)構(gòu)定義和訓(xùn)練好的權(quán)重、scripts目錄訓(xùn)練和推理腳本、requirements.txt依賴庫版本清單、README.md項(xiàng)目說明和復(fù)現(xiàn)步驟。如果缺了標(biāo)注文件或者權(quán)重文件項(xiàng)目可復(fù)現(xiàn)性就要打問號。第二確認(rèn)環(huán)境版本。很多項(xiàng)目跑不起來的原因不是代碼爛而是PyTorch和CUDA版本不匹配。打開README先看作者用的什么環(huán)境實(shí)在沒寫就翻requirements.txt再不行就直接跑一句python -c import torch; print(torch.version, torch.cuda.is_available())。第三找?guī)讉€(gè)樣例圖像先跑通推理再回頭看訓(xùn)練代碼。先做預(yù)測能讓你快速理解這個(gè)模型處理的是單張圖片還是視頻流輸入尺寸是多少輸出的是讀數(shù)數(shù)值還是中間特征圖。我的習(xí)慣是先把推理腳本讀透再?zèng)Q定要不要?jiǎng)佑?xùn)練代碼這樣能少走很多彎路。2. 核心方案拆解檢測、識別與讀數(shù)換算三件套2.1 數(shù)字式儀表檢測OCR組合拳數(shù)字式儀表在工業(yè)現(xiàn)場也很常見比如智能數(shù)顯表、電子水表、數(shù)碼管顯示的溫控儀。這類儀表的讀數(shù)識別在技術(shù)棧上和指針表完全不同它不需要做角度換算核心是兩步先找到數(shù)字顯示區(qū)域再把數(shù)字序列讀出來。第一步是定位。用目標(biāo)檢測模型我用的是YOLOv5后來換到Y(jié)OLOv8檢測整個(gè)數(shù)顯屏區(qū)域。這里要注意檢測的目標(biāo)不是整塊儀表外殼而是數(shù)碼管或液晶顯示區(qū)域本身因?yàn)橥鈿み吙?、按鈕、銘牌等背景信息會(huì)讓后續(xù)識別步驟受到干擾。標(biāo)注的時(shí)候把邊界框緊貼顯示區(qū)四邊寧小勿大。第二步是字符識別。檢測到顯示區(qū)域后把裁剪出來的圖像輸入到OCR網(wǎng)絡(luò)。這里有兩個(gè)技術(shù)選項(xiàng)一是直接用PaddleOCR或者CRNN這類成熟的文字識別方案它會(huì)把圖像序列轉(zhuǎn)換成文本二是更輕量的做法先對數(shù)字區(qū)域做數(shù)字分割再用分類網(wǎng)絡(luò)逐字符識別。如果屏幕上的數(shù)字是固定寬度等距顯示的第二種方案穩(wěn)定性非常高但一旦數(shù)字出現(xiàn)偏移或者有小數(shù)點(diǎn)和單位混排還是端到端的OCR識別更省心。我自己的經(jīng)驗(yàn)是數(shù)碼管數(shù)字的表型差異很大紅色數(shù)碼管和液晶黑底白字的成像特征完全不一樣。彩色信息對識別是有幫助的但部署時(shí)為了追求速度很多同學(xué)會(huì)把圖像轉(zhuǎn)成灰度這時(shí)數(shù)碼管的亮度輪廓可能變得不清晰。建議先用灰度圖做一輪實(shí)驗(yàn)如果精度不達(dá)標(biāo)再考慮把圖像分成三個(gè)通道單獨(dú)處理讓模型自己決定用哪路特征。2.2 指針式儀表表盤定位、指針檢測與角度換算指針式儀表才是這個(gè)項(xiàng)目里的重頭戲因?yàn)樗淖x數(shù)不是一個(gè)簡單的OCR問題而是一個(gè)幾何計(jì)算問題。整個(gè)流程分三步。第一步用目標(biāo)檢測模型定位表盤。這一步把圓形表盤從復(fù)雜背景里摳出來排除掉周圍管道、閥門、墻面的干擾。檢測框最好能框住整個(gè)表盤外圈因?yàn)楹罄m(xù)的透視矯正和刻度識別都依賴完整的表盤圓。第二步確定量程范圍和零刻度位置。這一步最關(guān)鍵。雖然量程是儀表的固有屬性但算法并不知道這塊表是0到1.6兆帕還是0到4兆帕。通常的做法是檢測表盤上的數(shù)字文本這個(gè)可以用OCR或者模板匹配來做識別出最小刻度和最大刻度對應(yīng)的數(shù)值再根據(jù)刻度位置計(jì)算出量程。另一種偷懶但很實(shí)用的方法是在部署時(shí)手動(dòng)配置每個(gè)表位的量程參數(shù)把量程放到配置表里。對固定工位的巡檢系統(tǒng)來說表位和型號本來就是固定的提前配置好量程反而比現(xiàn)場識別更穩(wěn)。第三步是檢測指針位置并換算讀數(shù)。指針檢測有三種實(shí)現(xiàn)路徑一是用目標(biāo)檢測或關(guān)鍵點(diǎn)檢測直接定位指針尖端和轉(zhuǎn)軸中心得到一條直線的角度二是用語義分割模型把指針像素分割出來再擬合指針中心線三是把整張表盤圖像輸入一個(gè)回歸網(wǎng)絡(luò)直接輸出角度值。路徑三最簡單但精度受限于表盤形變和遮擋我建議優(yōu)先用路徑一也就是關(guān)鍵點(diǎn)檢測穩(wěn)定性和精度都更好。算讀數(shù)用的是一個(gè)兩段式線性映射公式假設(shè)零刻度線與水平方向的夾角為A0滿量程刻度線與水平方向的夾角為A1指針夾角為Ap量程為R則當(dāng)前讀數(shù)V的計(jì)算方式為V (Ap - A0) / (A1 - A0) × R這里有個(gè)容易踩的坑角度的周期性。如果用atan2之類的函數(shù)計(jì)算角度返回值落在-180度到180度之間當(dāng)指針從350度轉(zhuǎn)到10度時(shí)角度差會(huì)被算成340度而不是20度。換算時(shí)一定要先對角度差做歸一化處理確保差值落在合理的角度范圍內(nèi)。我在實(shí)際項(xiàng)目中就在這里吃過虧。第一版代碼在指針指向表盤底部區(qū)域時(shí)讀數(shù)在正常范圍波動(dòng)但指向表盤右上方時(shí)讀數(shù)突然跳變排查了半天才發(fā)現(xiàn)是角度跨越了正負(fù)180度邊界。后來統(tǒng)一改成“先計(jì)算Ap - A0如果絕對值大于180度就加減360度”問題立刻消失。2.3 模型選型與精度/速度取舍模型選型不用追求最炫的夠用就好。我列一個(gè)現(xiàn)場實(shí)測過的配置建議任務(wù)推薦方案備選方案備注表盤檢測YOLOv8sYOLOv5s、Faster R-CNN輕量級即可重點(diǎn)是小目標(biāo)檢測能力數(shù)字OCRPaddleOCRCRNN、CNN分類數(shù)字表優(yōu)先端到端OCR指針關(guān)鍵點(diǎn)HRNet或輕量關(guān)鍵點(diǎn)網(wǎng)絡(luò)語義分割中心線擬合關(guān)鍵點(diǎn)穩(wěn)定性最好數(shù)字分類MobileNetV3ResNet18固定顯示區(qū)時(shí)使用我用的主力是YOLOv8s做表盤定位關(guān)鍵點(diǎn)檢測用了一個(gè)簡化的HRNet結(jié)構(gòu)。在NVIDIA Jetson Orin Nano上表盤檢測加指針關(guān)鍵點(diǎn)檢測兩個(gè)模型串行跑單幀推理時(shí)間大概在60到80毫秒完全滿足實(shí)時(shí)視頻流的需求。如果算力特別緊張可以考慮模型蒸餾和量化。把大模型的檢測結(jié)果當(dāng)作偽標(biāo)簽去訓(xùn)練一個(gè)小型檢測網(wǎng)絡(luò)配合INT8量化能把推理時(shí)間壓縮到30毫秒以內(nèi)。代價(jià)是精度會(huì)有輕微下降需要在實(shí)際場景里做一次完整的A/B測試。3. 訓(xùn)練數(shù)據(jù)的真實(shí)成本采集、標(biāo)注與增強(qiáng)3.1 數(shù)據(jù)采集的覆蓋策略很多同學(xué)把這個(gè)項(xiàng)目當(dāng)成純算法問題上來就找公開數(shù)據(jù)集訓(xùn)練結(jié)果一到現(xiàn)場泛化性能稀爛。儀表讀數(shù)識別本質(zhì)上是一個(gè)感知任務(wù)模型的性能上限由數(shù)據(jù)分布決定。公開數(shù)據(jù)集里大多是正對表盤、光照均勻、表盤干凈的照片而現(xiàn)場的相機(jī)角度、光照條件、表盤狀態(tài)遠(yuǎn)遠(yuǎn)超出這個(gè)范圍。所以數(shù)據(jù)采集要帶著“覆蓋現(xiàn)場變化”的意識去做。我建議按這幾個(gè)維度來規(guī)劃采集光照條件早上、中午、傍晚、夜間如果安裝補(bǔ)光燈分別采集覆蓋順光、逆光、側(cè)光情況。拍攝角度儀表在視野中的位置可以有輕微偏移模擬安裝誤差造成的角度變化。拍攝距離覆蓋安裝高度變化造成的尺度差異。表盤狀態(tài)干凈表盤、輕微灰塵、明顯污漬、表盤起霧、玻璃罩劃傷。表型種類如果現(xiàn)場有20種不同型號的儀表每種表至少收集30到50張代表性圖像。起步階段每類表500張左右就夠做第一版模型了。這里說的是“每類”不是總數(shù)。對于同一個(gè)表位可以通過連續(xù)視頻抽幀的方式采集幾段視頻就能抽出一兩百幀成本并不高。3.2 標(biāo)注規(guī)范與常見錯(cuò)誤標(biāo)注是項(xiàng)目里最枯燥但最決定成敗的環(huán)節(jié)。標(biāo)注質(zhì)量差再好的模型也白搭。對于表盤檢測任務(wù)標(biāo)注規(guī)范很簡單把整個(gè)表盤外圈框進(jìn)去邊界框包含完整的圓形表盤。但最容易犯的錯(cuò)誤是只框了表盤內(nèi)圈或者把表殼邊框也框了進(jìn)去。我的經(jīng)驗(yàn)是檢測框稍微比表盤外圈大一點(diǎn)點(diǎn)沒關(guān)系但絕對不能比表盤內(nèi)圈小因?yàn)楹罄m(xù)的圖像裁剪和透視變換都以這個(gè)框?yàn)榛鶞?zhǔn)框小了會(huì)把刻度標(biāo)尺切掉。對于指針關(guān)鍵點(diǎn)任務(wù)標(biāo)注內(nèi)容比較復(fù)雜表盤中心點(diǎn)、指針尖端、零刻度點(diǎn)、滿量程刻度點(diǎn)。四個(gè)點(diǎn)的順序要固定比如代碼里約定“中心點(diǎn)在下標(biāo)0指針尖端在下標(biāo)1”標(biāo)注時(shí)不能換順序。指針尖端點(diǎn)在有遮擋的情況下比如遮住部分指針要用推斷的延伸位置來標(biāo)否則模型學(xué)到的指針長度分布是亂的。如果項(xiàng)目用的是多邊形分割來做指針提取那標(biāo)注時(shí)要把指針主體完整畫出來表針和表盤背景交界處要標(biāo)到位不要偷懶只標(biāo)指針的一部分。我推薦用LabelImg標(biāo)檢測框用Labelme標(biāo)關(guān)鍵點(diǎn)和多邊形。兩個(gè)工具都是開源的支持VOC和COCO格式輸出社區(qū)資料也很多。3.3 數(shù)據(jù)增強(qiáng)性價(jià)比最高的性能提升手段數(shù)據(jù)增強(qiáng)是儀表讀數(shù)識別項(xiàng)目里性價(jià)比最高的模塊。很多現(xiàn)場工況比如玻璃罩反光、輕微模糊、光照變化都可以通過數(shù)據(jù)增強(qiáng)來模擬不用真的扛著相機(jī)去現(xiàn)場蹲一天。我常用的增強(qiáng)策略分三個(gè)優(yōu)先級。第一優(yōu)先級幾何增強(qiáng)。隨機(jī)旋轉(zhuǎn)-10度到10度角度不要太大否則影響指針角度計(jì)算、隨機(jī)平移、隨機(jī)縮放。幾何增強(qiáng)對檢測和關(guān)鍵點(diǎn)任務(wù)都有效。第二優(yōu)先級光學(xué)增強(qiáng)。亮度擾動(dòng)、對比度擾動(dòng)、飽和度擾動(dòng)、HSV通道隨機(jī)偏移。這一組專門模擬現(xiàn)場光照變化實(shí)測下來對提升模型在晨昏光照下的魯棒性效果最明顯。第三優(yōu)先級模糊和噪聲。高斯模糊、運(yùn)動(dòng)模糊、高斯噪聲、隨機(jī)遮擋。這組增強(qiáng)模擬攝像頭對焦不準(zhǔn)、儀表被遮擋的情況。注意運(yùn)動(dòng)模糊的方向要隨機(jī)高斯模糊的核大小也要隨機(jī)不然模型會(huì)過擬合到特定模糊模式。還有就是隨機(jī)擦除。我甚至?xí)S機(jī)在表盤區(qū)域畫一些黑色小塊模擬表盤被標(biāo)簽紙或管道遮擋的情況。這種方法在工業(yè)場景里非常實(shí)用因?yàn)楝F(xiàn)場儀表周圍往往布滿管線遮擋是家常便飯。增強(qiáng)參數(shù)不是越大越好。旋轉(zhuǎn)角度太大標(biāo)注的指針角度和實(shí)際角度就會(huì)對不上模型學(xué)出來的角度分布是亂的。我一開始把旋轉(zhuǎn)范圍設(shè)成正負(fù)30度訓(xùn)練完發(fā)現(xiàn)模型對小角度偏移都判斷不準(zhǔn)因?yàn)樗谟?xùn)練階段幾乎沒見過正的、未增強(qiáng)的表盤。后來把旋轉(zhuǎn)范圍縮到正負(fù)10度性能反而上來了。4. 從ZIP到生產(chǎn)系統(tǒng)部署、推理優(yōu)化與誤差控制4.1 模型導(dǎo)出與推理加速訓(xùn)練完的PyTorch模型不能直接扔到工業(yè)現(xiàn)場跑需要做模型轉(zhuǎn)換和推理加速。我的標(biāo)準(zhǔn)流程是PyTorch模型轉(zhuǎn)ONNX再用ONNX Runtime或TensorRT做推理。ONNX是一個(gè)中間格式它把網(wǎng)絡(luò)結(jié)構(gòu)和權(quán)重統(tǒng)一成標(biāo)準(zhǔn)的計(jì)算圖描述方便在不同推理引擎之間切換。導(dǎo)出命令很簡單torch.onnx.export( model, dummy_input, meter_detector.onnx, opset_version11, input_names[input], output_names[output] )導(dǎo)出時(shí)要注意兩點(diǎn)。第一dummy_input的尺寸要和訓(xùn)練時(shí)一致YOLO系列一般是用640x640或者416x416。第二opset_version別設(shè)太低太低會(huì)丟失一些算子支持太高又可能碰到推理引擎不支持的情況11和13是兼容性比較好的選擇。拿到ONNX模型后如果部署在GPU設(shè)備上強(qiáng)烈建議轉(zhuǎn)TensorRT它能做層融合和精度校準(zhǔn)推理速度能提升兩到三倍。TensorRT的INT8量化需要準(zhǔn)備一部分校準(zhǔn)圖片在校準(zhǔn)階段統(tǒng)計(jì)每層激活值的分布范圍找到合適的量化縮放系數(shù)。校準(zhǔn)圖片不用太多二三百張覆蓋典型場景就夠了。如果部署環(huán)境是純CPU可以用OpenVINO它在Intel CPU上的優(yōu)化相當(dāng)強(qiáng)小模型的推理延遲能做到幾十毫秒級別。我自己在工控機(jī)上用OpenVINO跑過YOLOv5s單幀推理大約90毫秒對巡檢場景完全夠用。4.2 邊緣設(shè)備部署的技術(shù)選型工業(yè)現(xiàn)場的部署環(huán)境五花八門。有的在配電房有的在空曠的裝置區(qū)有的在防爆區(qū)。部署設(shè)備選擇也完全不同。如果現(xiàn)場有網(wǎng)絡(luò)機(jī)柜和比較充足的供電用一臺帶GPU的工控機(jī)最省事。一個(gè)RTX 3060級別的顯卡足夠帶動(dòng)YOLOv8s加關(guān)鍵點(diǎn)模型雙路推理。如果現(xiàn)場空間有限只能裝一個(gè)類似槍機(jī)攝像頭大小的小盒子那就要考慮Jetson系列。Jetson Nano跑輕量模型比較吃力Jetson Orin Nano/NX是更好的選擇能支撐兩個(gè)輕量模型串行推理。防爆區(qū)是另一個(gè)大坑。防爆攝像頭或者防爆箱的價(jià)格很貴而且對設(shè)備的散熱和功耗有嚴(yán)格限制。遇到這類場景我的建議是采用邊緣端輕量模型加中心端重模型的方案邊緣端跑一個(gè)只做表盤檢測的微型模型把裁切后的表盤圖像傳到中心服務(wù)器由中心服務(wù)器完成讀數(shù)和結(jié)果校驗(yàn)。關(guān)于攝像頭選型固定機(jī)位用工業(yè)相機(jī)更好它的曝光參數(shù)可以手動(dòng)固定不會(huì)像普通網(wǎng)絡(luò)攝像頭那樣自動(dòng)調(diào)節(jié)曝光導(dǎo)致畫面忽明忽暗。我遇到過一次很詭異的問題表盤識別白天正常晚上飄排查了一周才發(fā)現(xiàn)是攝像頭在低照度下自動(dòng)提高ISO導(dǎo)致畫面噪聲暴增模型在噪聲圖上泛化很差。后來把攝像頭Gain固定問題立刻消失。4.3 讀數(shù)校驗(yàn)與異常兜底模型能讀出值了不代表系統(tǒng)能上線。工業(yè)現(xiàn)場最怕的不是偶爾讀錯(cuò)怕的是系統(tǒng)讀錯(cuò)還當(dāng)成正確值寫進(jìn)數(shù)據(jù)庫。我的后處理管線里加了三道校驗(yàn)。第一道置信度門控。檢測模型的每個(gè)輸出框都有置信度分?jǐn)?shù)只有高于閾值的檢測結(jié)果才會(huì)進(jìn)入讀數(shù)階段。閾值的選取不要只靠驗(yàn)證集調(diào)要在現(xiàn)場采集一段包含各種異常情況的視頻統(tǒng)計(jì)在視頻上的表現(xiàn)來定。第二道時(shí)間窗口仲裁。對于固定工位儀表讀數(shù)每秒都在變化但相鄰幾幀的讀數(shù)應(yīng)該是平滑的。我保留最近5幀的讀數(shù)用中位數(shù)作為最終輸出同時(shí)計(jì)算這5幀的方差。如果方差突然變大說明模型在多幀之間產(chǎn)生了沖突這時(shí)需要輸出一個(gè)“讀數(shù)不穩(wěn)定”的告警而不是直接輸出某個(gè)值。第三道業(yè)務(wù)規(guī)則校驗(yàn)。每種儀表都有自己的合理讀數(shù)范圍比如壓力表量程0到1.6兆帕讀數(shù)出現(xiàn)1.8兆帕必然是異常。把儀表ID、量程范圍、讀數(shù)變化率上限都放到配置表里算法輸出時(shí)逐項(xiàng)校驗(yàn)。校驗(yàn)不通過就觸發(fā)人工復(fù)核流程同時(shí)在界面上標(biāo)紅提示。這三道校驗(yàn)看起來簡單但真能在現(xiàn)場救你命。有一次現(xiàn)場因?yàn)闃O端光照導(dǎo)致模型大面積誤讀置信度門控和業(yè)務(wù)規(guī)則校驗(yàn)把80%的錯(cuò)誤值都攔下來了最后系統(tǒng)只報(bào)了十幾條待復(fù)核記錄沒有污染數(shù)據(jù)庫。5. 現(xiàn)場踩坑實(shí)錄光照、傾斜和表盤干擾的應(yīng)對經(jīng)驗(yàn)5.1 反光與玻璃罩最難啃的硬骨頭儀表讀數(shù)識別最讓人頭疼的就是表盤玻璃罩的反光。工廠車間里頂燈、窗外陽光、附近設(shè)備的指示燈都會(huì)在弧形玻璃罩上形成高光區(qū)域輕則遮擋部分刻度重則讓整個(gè)表盤的成像質(zhì)量崩塌。應(yīng)對反光有幾個(gè)層次的方案。物理層面最簡單粗暴的方法是在攝像頭和表盤之間裝一個(gè)偏振片利用偏振方向過濾鏡面反射光。這個(gè)方法效果立竿見影但對設(shè)備安裝要求高而且偏振片本身會(huì)降低進(jìn)光量光線不足的環(huán)境反而不推薦。算法層面我強(qiáng)烈建議在訓(xùn)練數(shù)據(jù)里加入反光樣本?,F(xiàn)場采集時(shí)如果遇到反光不要覺得是廢圖就刪掉反而要刻意多采集幾張。模型只要見過足夠多樣的反光模式就能自動(dòng)學(xué)會(huì)在反光區(qū)域看不清時(shí)依靠周圍完整刻度來推斷指針位置這比任何去反光算法都有效。還有一個(gè)技巧是連續(xù)幀融合。反光通常不是靜止的燈管的位置固定但攝像頭安裝后可能有人走動(dòng)反光區(qū)域會(huì)移動(dòng)。取連續(xù)幾幀圖像在像素域做一個(gè)中值融合就能讓反光區(qū)域被其他幀的完整信息填補(bǔ)掉。我試過用5幀中值融合反光區(qū)域的干擾能大幅降低。5.2 視角傾斜帶來的讀數(shù)偏差理想情況下攝像頭應(yīng)該正對表盤但現(xiàn)場安裝時(shí)受空間限制攝像頭可能在側(cè)上方、側(cè)下方或者斜向安裝。一旦視角傾斜圓形表盤在圖像里就變成橢圓指針角度的幾何關(guān)系會(huì)發(fā)生非線性畸變。我踩過最深的一個(gè)坑就是儀表裝在管道側(cè)面攝像頭從正前方偏上約20度俯拍。第一版模型在實(shí)驗(yàn)室測試精度很高到現(xiàn)場一測讀數(shù)值系統(tǒng)性偏大。起初以為是模型問題后來仔細(xì)分析才發(fā)現(xiàn)是透視畸變導(dǎo)致刻度角度分布不均勻。表盤上下兩端的刻度在圖像里被壓縮指針掃過同樣角度對應(yīng)的圖像像素距離不一樣用公式V(Ap-A0)/(A1-A0)×R來算誤差在高壓區(qū)域特別明顯。應(yīng)對辦法是在讀數(shù)換算前先做透視矯正。用表盤檢測網(wǎng)絡(luò)輸出的邊界框四個(gè)角點(diǎn)信息配合表盤圓形先驗(yàn)做一次透視變換把橢圓表盤拉回正圓。在標(biāo)注數(shù)據(jù)時(shí)加一個(gè)額外的圓形回歸頭或者直接用檢測框的寬高比例估算透視參數(shù)都能有效矯正。如果不想在算法上做矯正另一個(gè)笨辦法是在安裝階段盡可能保證攝像頭正對表盤。安裝時(shí)用手機(jī)的水平儀App輔助校準(zhǔn)把鏡頭的傾角控制在5度以內(nèi)這樣透視畸變的影響可以小到忽略不計(jì)。5.3 表盤臟污和表型差異現(xiàn)場儀表用了十幾年表盤上可能布滿灰塵、油污甚至腐蝕斑塊。臟污對傳統(tǒng)視覺方案是致命打擊對深度學(xué)習(xí)模型相對友好但前提是訓(xùn)練數(shù)據(jù)里要見到臟污樣本。一個(gè)很實(shí)用的做法是在標(biāo)注階段就把“干凈表盤”和“臟污表盤”分開編組在訓(xùn)練時(shí)按組別做采樣均衡避免模型過度偏向干凈樣本。我一般會(huì)保證訓(xùn)練集中臟污樣本占比不低于20%。表型差異又是一個(gè)大坑?,F(xiàn)場可能有幾十種不同量程、不同外觀的儀表每種的刻度分布都不一樣。如果模型要同時(shí)支持上百個(gè)表位的識別不要試圖訓(xùn)練一個(gè)“萬能模型”去覆蓋所有表型。更好的做法是訓(xùn)練一個(gè)“通用表盤檢測模型”把表盤拎出來然后針對每種表型訓(xùn)練一個(gè)輕量分類模型或者做兩次級聯(lián)識別先判斷這是什么表型再送進(jìn)對應(yīng)的讀數(shù)模型。整個(gè)系統(tǒng)的維護(hù)邏輯變成新增一種表型時(shí)只需要給它標(biāo)注一批數(shù)據(jù)并微調(diào)一個(gè)小模型不需要重訓(xùn)全局模型。5.4 可靠性紅線寧可漏報(bào)不可誤讀儀表讀數(shù)識別系統(tǒng)在工業(yè)場景里的核心價(jià)值不是“每幀都能讀出來”而是“讀出來的每一個(gè)值都可靠”。算錯(cuò)了不如不算這個(gè)原則必須刻進(jìn)系統(tǒng)設(shè)計(jì)的骨髓里。我遇到的第一個(gè)版本就是太追求識別率把置信度閾值調(diào)得特別低只要模型認(rèn)為讀出來了就上報(bào)。結(jié)果在反光和遮擋嚴(yán)重的時(shí)段系統(tǒng)輸出了不少錯(cuò)誤讀數(shù)?,F(xiàn)場工程師看著屏幕上的錯(cuò)誤數(shù)據(jù)對整個(gè)系統(tǒng)失去了信任這個(gè)信任崩塌以后很難挽回。后來我調(diào)整策略把目標(biāo)從“最大化識別率”改成“在誤報(bào)率可控的前提下最大化識別率”。具體做法包括置信度閾值調(diào)高寧可一部分幀被拒絕識別也不要把低置信度結(jié)果上報(bào)連續(xù)幀仲裁時(shí)間窗口拉長用中位數(shù)過濾波動(dòng)增加人工復(fù)核接口現(xiàn)場運(yùn)維人員可以對自動(dòng)識別結(jié)果一鍵打回打回的樣本進(jìn)入后續(xù)訓(xùn)練集形成反饋閉環(huán)。一套系統(tǒng)能不能在工業(yè)現(xiàn)場長期存活往往不是看它最好的表現(xiàn)有多好而是看它最差的表現(xiàn)有多糟糕。把可靠性紅線焊死項(xiàng)目才能從“demo”變成“產(chǎn)品”。我在這類項(xiàng)目上跑了幾輪以后最大的感受是模型結(jié)構(gòu)只是整個(gè)系統(tǒng)里相對較小的一部分真正決定成敗的是數(shù)據(jù)質(zhì)量、前后處理邏輯和現(xiàn)場的工程化能力。如果你也是拿著別人的ZIP項(xiàng)目包起步建議先把推理流程跑通再花大力氣把數(shù)據(jù)采集和校驗(yàn)規(guī)則做好這個(gè)方向上的投入回報(bào)率遠(yuǎn)高于調(diào)模型結(jié)構(gòu)。以后如果要把這套能力擴(kuò)展到數(shù)字工廠、遠(yuǎn)程運(yùn)維的大框架里你會(huì)發(fā)現(xiàn)這里沉淀的數(shù)據(jù)和規(guī)則才是最有價(jià)值的資產(chǎn)。本文還有配套的精品資源點(diǎn)擊獲取