別:CAD國(guó)產(chǎn)化遷移中圖紙智能化解析的關(guān)鍵技術(shù))
國(guó)產(chǎn)化替代這件事落到CAD領(lǐng)域遠(yuǎn)比很多人想象的復(fù)雜。換掉一個(gè)軟件裝一裝就行真正的難點(diǎn)在于過去十幾年甚至二十幾年積累下來的幾十萬張圖紙要全部無縫遷移到新平臺(tái)還能繼續(xù)編輯、審閱、復(fù)用。我前后參與過幾個(gè)大規(guī)模遷移項(xiàng)目最大的感受是圖元識(shí)別從來不是錦上添花的功能而是遷移項(xiàng)目能否順利落地的生死線。圖紙打不開、顯示亂碼還能靠格式轉(zhuǎn)換兜底但如果圖元類別認(rèn)不準(zhǔn)、圖層語(yǔ)義對(duì)不上后續(xù)的工程量統(tǒng)計(jì)、模型復(fù)用、BIM對(duì)接全部都會(huì)崩掉。這篇內(nèi)容我就圍繞AI圖元識(shí)別這件事把從數(shù)據(jù)準(zhǔn)備、模型選型、訓(xùn)練調(diào)優(yōu)到部署集成的完整鏈路拆開講。不只是講理論重點(diǎn)是我在實(shí)際項(xiàng)目里踩過哪些坑、哪些方案看著合理但根本跑不通、哪些環(huán)節(jié)看起來不起眼卻決定了最終上線效果。適合正在做CAD國(guó)產(chǎn)化遷移、圖紙智能化處理、或者想用AI技術(shù)解析工程圖紙的工程師不管你現(xiàn)在處于選型階段還是已經(jīng)跑通Demo都應(yīng)該能從里面找到一些直接能用的經(jīng)驗(yàn)。1. 國(guó)產(chǎn)化CAD遷移進(jìn)程中為什么卡在圖元識(shí)別這個(gè)環(huán)節(jié)1.1 從能打開到看得懂中間的差距有多大很多團(tuán)隊(duì)在遷移初期會(huì)拿到國(guó)產(chǎn)CAD廠商提供的格式轉(zhuǎn)換插件把DWG批量轉(zhuǎn)成自家格式。測(cè)下來發(fā)現(xiàn)日常圖紙確實(shí)能打開但這時(shí)候只完成了幾何無損這一步離業(yè)務(wù)可用還差著十萬八千里。怎么理解這個(gè)差距舉個(gè)例子一張?jiān)O(shè)備布置圖里有個(gè)閥門符號(hào)在原始圖紙里它可能是一個(gè)塊Block塊內(nèi)包含若干線條、圓弧和屬性文字。轉(zhuǎn)換插件能把這些線條圓弧原樣搬過來圖面看起來什么都沒缺。但如果業(yè)務(wù)部門要在新平臺(tái)上做設(shè)備清冊(cè)統(tǒng)計(jì)系統(tǒng)需要知道這個(gè)塊代表的是閥門型號(hào)是DN50——這層語(yǔ)義信息格式轉(zhuǎn)換是給不了的。更麻煩的是很多老圖紙里同類設(shè)備圖塊沒有統(tǒng)一命名有的是VALVE-50有的是V50-1甚至有的是散線沒做成塊。這時(shí)候AI的作用就體現(xiàn)出來了它得從幾何形狀、尺寸比例、文字標(biāo)注等信息里反推出這個(gè)圖元到底是什么。我實(shí)際遇到的案例某制造企業(yè)的工藝管道圖純粹因?yàn)閴K命名不統(tǒng)一導(dǎo)致遷移后設(shè)備統(tǒng)計(jì)表里少了將近40%的條目。后來我們用AI模型對(duì)圖元做形狀-語(yǔ)義雙通道識(shí)別先把散線組合識(shí)別成閥門符號(hào)再通過模型預(yù)測(cè)類別標(biāo)簽統(tǒng)計(jì)完整率終于拉回到97%以上。這個(gè)項(xiàng)目讓我徹底意識(shí)到圖元識(shí)別解決的是看得懂的問題它決定了國(guó)產(chǎn)CAD替代到底能不能支撐實(shí)際業(yè)務(wù)。1.2 為什么傳統(tǒng)幾何匹配算法在這個(gè)階段不夠用了早期業(yè)界也不是沒有做圖元識(shí)別很多老系統(tǒng)用幾何匹配和模板庫(kù)就能干活。模板庫(kù)里存幾百種常見符號(hào)的標(biāo)準(zhǔn)幾何然后用形狀匹配算法去掃描圖紙命中了就認(rèn)為識(shí)別成功。這種方案的局限在于三點(diǎn)。第一模板庫(kù)的構(gòu)建和維護(hù)成本極高一個(gè)行業(yè)的標(biāo)準(zhǔn)符號(hào)可能上千種而且不同設(shè)計(jì)院畫的同類符號(hào)細(xì)節(jié)都不一樣第二圖紙里圖元經(jīng)過縮放、旋轉(zhuǎn)、鏡像、部分遮擋后純幾何匹配的魯棒性會(huì)迅速下降第三遇到?jīng)]有標(biāo)準(zhǔn)模板的野路子畫法系統(tǒng)完全無能為力。我在某個(gè)項(xiàng)目里接過一套老的識(shí)別模塊它的符號(hào)庫(kù)已經(jīng)有五千多個(gè)模板按說覆蓋夠廣了但切換到一個(gè)新行業(yè)的圖紙后準(zhǔn)確率直接掉到60%以下。新增模板需要人工把每個(gè)符號(hào)的幾何特征一條條錄進(jìn)去一個(gè)工程師忙一天也就處理幾十個(gè)。這種效率在國(guó)產(chǎn)化浪潮的批量遷移場(chǎng)景里根本扛不住——我們面對(duì)的是幾十萬張圖紙不可能每張都人工介入。深度學(xué)習(xí)和大模型的介入改變了這塊的效率上限。模型可以自動(dòng)從標(biāo)注數(shù)據(jù)里學(xué)形狀特征和語(yǔ)義特征新增類別只需要準(zhǔn)備一定量的標(biāo)注樣本不像模板庫(kù)那樣需要手工拆解幾何關(guān)系。所以現(xiàn)在做圖元識(shí)別大家默認(rèn)的技術(shù)路線都已經(jīng)轉(zhuǎn)向數(shù)據(jù)驅(qū)動(dòng)區(qū)別只是數(shù)據(jù)的質(zhì)量和模型怎么設(shè)計(jì)。2. 圖元識(shí)別的技術(shù)全景幾何規(guī)則與深度學(xué)習(xí)的邊界2.1 圖元類別這個(gè)概念先理清楚再談模型做AI識(shí)別之前有一個(gè)很容易被忽略但極其重要的問題你到底要把圖元識(shí)別成哪些類別在CAD數(shù)據(jù)里圖元有底層圖元和業(yè)務(wù)圖元兩種理解角度。底層圖元就是幾何元素本身線Line、圓Circle、圓弧Arc、多段線Polyline、樣條曲線Spline、填充Hatch、文字Text、標(biāo)注Dimension、塊Block這些。業(yè)務(wù)圖元?jiǎng)t是指這些幾何元素組合起來表達(dá)出來的業(yè)務(wù)對(duì)象比如閥、泵、管道、墻體、門窗、橋墩、樁基等。很多做AI識(shí)別的人一開始沒想清楚這個(gè)問題拿了一份底層圖元的標(biāo)注數(shù)據(jù)去訓(xùn)練模型做出來一個(gè)識(shí)別效果不錯(cuò)的Demo但業(yè)務(wù)方用起來發(fā)現(xiàn)根本對(duì)不上需求因?yàn)闃I(yè)務(wù)方要的是這個(gè)塊是泵不是這個(gè)對(duì)象是塊引用。我們的經(jīng)驗(yàn)是先把分類體系拆成兩層。第一層是基礎(chǔ)幾何類別模型輸出Line/Circle/Arc/Polyline等基本類型用來支撐格式轉(zhuǎn)換質(zhì)量審計(jì)第二層是業(yè)務(wù)對(duì)象類別模型結(jié)合上下文識(shí)別閥、泵、儀表、設(shè)備編號(hào)等用來支撐工程語(yǔ)義檢索和統(tǒng)計(jì)。兩層模型可以共用底層的特征處理流程但標(biāo)簽體系和模型輸出頭完全獨(dú)立混在一起訓(xùn)練不會(huì)有任何好結(jié)果。2.2 規(guī)則算法在哪些地方仍然好用深度學(xué)習(xí)說了這么多優(yōu)點(diǎn)但也不是萬能。在我負(fù)責(zé)的系統(tǒng)里有幾類場(chǎng)景堅(jiān)決用傳統(tǒng)規(guī)則算法效果反而更穩(wěn)定。第一類是純幾何屬性的篩選。比如判斷一個(gè)圖元是否閉合、是否互相重疊、是否共線這類問題用向量幾何算法算一遍就非??鞗]必要上模型。第二類是文字和標(biāo)注的解析。DWG里文字圖元自帶字符串屬性直接讀取屬性就行不需要OCR只有掃描后的光柵圖紙才需要OCR介入。第三類是圖框中標(biāo)題欄信息的提取這些信息的位置相對(duì)固定用基于坐標(biāo)格的規(guī)則提取比識(shí)別模型更可控。實(shí)際的系統(tǒng)里我用規(guī)則算法做了大量前置處理和候選項(xiàng)篩選深度學(xué)習(xí)模型只需要處理規(guī)則引擎過濾后的語(yǔ)義嫌疑對(duì)象。這樣既減少了模型的計(jì)算量也顯著降低了誤判率。一個(gè)典型的閥門識(shí)別前置規(guī)則先找到所有包含文字標(biāo)注的、存在孔特征的、尺寸在某個(gè)范圍的閉合幾何集合再交給模型判斷類別速度和準(zhǔn)確率都有明顯提升。2.3 深度學(xué)習(xí)介入的典型場(chǎng)景與價(jià)值深度學(xué)習(xí)真正發(fā)揮價(jià)值的場(chǎng)景主要集中在以下幾個(gè)方向。第一個(gè)方向是散線符號(hào)的聚合識(shí)別。大量老圖紙里的設(shè)備符號(hào)并不是規(guī)范的塊而是由幾十根零散線條湊出來的。規(guī)則算法沒辦法靈活組合這些線條但目標(biāo)檢測(cè)類模型可以通過先檢測(cè)幾何元素、再用圖神經(jīng)網(wǎng)絡(luò)聚合候選符號(hào)這種方案來處理。第二個(gè)方向是矢量化——很多老底圖只有紙質(zhì)掃描件或位圖沒有CAD源文件需要把柵格圖像里的圖元自動(dòng)提取成矢量圖元線、圓弧、圓這幾乎必須依靠深度網(wǎng)絡(luò)。第三個(gè)方向是圖元的語(yǔ)義分類特別是圖塊的多義性問題同一形狀在不同上下文里可能是泵也可能是電機(jī)模型可以借助周圍的文字標(biāo)注和管線連接關(guān)系給出更準(zhǔn)確的語(yǔ)義判斷。我們把系統(tǒng)里的識(shí)別模塊做了一個(gè)分層設(shè)計(jì)輸入層做格式解析和圖形預(yù)處理中間層拆成規(guī)則引擎和深模型兩個(gè)并行通道最后還有個(gè)語(yǔ)義融合層把兩邊的結(jié)果匯總。整個(gè)系統(tǒng)上線后處理一張1000個(gè)圖元的復(fù)雜裝配圖深度模型推理耗時(shí)約85毫秒規(guī)則引擎耗時(shí)約35毫秒比純規(guī)則方案在召回率上提升了約20%比純端到端模型方案在準(zhǔn)確率上提升了約8%。這個(gè)對(duì)比測(cè)試我們反復(fù)跑過多次結(jié)論很穩(wěn)定混合架構(gòu)是這個(gè)場(chǎng)景下的最優(yōu)解。3. 數(shù)據(jù)準(zhǔn)備識(shí)別效果的天花板早就在數(shù)據(jù)工程這里焊死了3.1 訓(xùn)練數(shù)據(jù)的來源與格式轉(zhuǎn)換問題很多團(tuán)隊(duì)一上來就找人標(biāo)數(shù)據(jù)標(biāo)了兩個(gè)月發(fā)現(xiàn)模型效果還是不行。問題通常不在模型而在數(shù)據(jù)源頭。做CAD圖元識(shí)別首先要解決數(shù)據(jù)怎么來來的數(shù)據(jù)長(zhǎng)什么樣。如果手里的原始圖紙是DWG格式第一步要把它們統(tǒng)一導(dǎo)出成我們方便解析的格式。我實(shí)際用得最多的是DXF文件它本質(zhì)上是文本化的交換格式每個(gè)圖元都有明確的類型標(biāo)識(shí)和坐標(biāo)參數(shù)便于程序批量讀取。這里有個(gè)很容易踩的坑DWG版本差異很大老的R14版本、中間的2007版本、現(xiàn)在的2018版本內(nèi)部對(duì)象存儲(chǔ)結(jié)構(gòu)變了不止一次。如果你直接調(diào)用某個(gè)單一的讀取庫(kù)去解析所有版本大概率會(huì)在某些圖紙上解析出錯(cuò)或者丟掉圖元屬性。我們的做法是準(zhǔn)備三套解析通道成熟的開源解析庫(kù)比如處理DXF的庫(kù)、商業(yè)格式轉(zhuǎn)換組件以及自研的兜底解析器。三個(gè)通道互相校驗(yàn)解析日志里如果發(fā)現(xiàn)某個(gè)文件在通道A報(bào)錯(cuò)、通道B正常就自動(dòng)打上標(biāo)記做人工復(fù)核。另一類重要數(shù)據(jù)源是掃描圖紙。很多設(shè)計(jì)院的存量資料只保留過紙質(zhì)版或掃描件數(shù)字化的時(shí)候只是因?yàn)閳D紙掃描存檔并沒有重建矢量CAD文件。這批數(shù)據(jù)做圖元識(shí)別走的是完全不同的鏈路先對(duì)掃描圖像做預(yù)處理二值化、去噪、傾斜校正然后做矢量化把像素級(jí)線條轉(zhuǎn)成矢量線段和圓弧最后再進(jìn)行圖元幾何分類和語(yǔ)義識(shí)別。這個(gè)流程對(duì)數(shù)據(jù)集的要求不只是圖元類別標(biāo)簽還需要像素級(jí)分割標(biāo)簽標(biāo)注成本高一個(gè)量級(jí)。如果沒有足夠的標(biāo)注預(yù)算我的建議是別一開始就碰掃描圖紙先把原生CAD圖紙的鏈路跑通收益會(huì)大得多。3.2 標(biāo)注規(guī)范與質(zhì)檢流程怎么設(shè)計(jì)標(biāo)注環(huán)節(jié)最容易出現(xiàn)的問題是標(biāo)注標(biāo)準(zhǔn)不統(tǒng)一。兩個(gè)人標(biāo)同一個(gè)閥門符號(hào)一個(gè)人把周圍的管線也圈進(jìn)去了另一個(gè)人只圈了閥門主體這兩個(gè)樣本喂給同一個(gè)模型模型就會(huì)學(xué)到互相矛盾的信息。為了避免這種情況我在項(xiàng)目里強(qiáng)制推行了一套標(biāo)注規(guī)范有幾條核心約定可以分享。第一每個(gè)業(yè)務(wù)圖元的標(biāo)注框必須包裹整個(gè)符號(hào)的最小外接矩形但不能包含其他無關(guān)圖元。第二一個(gè)圖元只能有一個(gè)主標(biāo)簽類別歸屬以最核心的業(yè)務(wù)語(yǔ)義為準(zhǔn)。第三散線組合的符號(hào)需要先用工具進(jìn)行幾何合并再給合并后的對(duì)象打標(biāo)簽不能讓標(biāo)注員對(duì)著幾十根散線分別打標(biāo)。第四每批次標(biāo)注完成后必須有雙人復(fù)核復(fù)核不一致的樣本回到爭(zhēng)議池由領(lǐng)域?qū)<也枚ú荒芎?jiǎn)單投票解決。標(biāo)注的質(zhì)檢指標(biāo)也不僅僅是準(zhǔn)確率還要看標(biāo)注邊界的一致性。我們統(tǒng)計(jì)過標(biāo)注員之間的框交并比IoU如果平均IoU低于0.85說明標(biāo)注標(biāo)準(zhǔn)已經(jīng)失控必須停下來重新培訓(xùn)。很多團(tuán)隊(duì)習(xí)慣性開啟標(biāo)就完了的模式極容易在這種細(xì)枝末節(jié)上翻車。3.3 數(shù)據(jù)增強(qiáng)、樣本不均衡與噪聲標(biāo)簽這三件套CAD圖元數(shù)據(jù)和自然圖像的差異非常大共享一套增強(qiáng)策略會(huì)出大問題。以圖塊識(shí)別為例圖元的位置、旋轉(zhuǎn)角度、縮放比例本身就有很強(qiáng)的業(yè)務(wù)含義你不能隨便旋轉(zhuǎn)90度——那可能把一個(gè)閥門語(yǔ)義變成另一個(gè)設(shè)備的語(yǔ)義。所以增強(qiáng)策略要限制在合理范圍內(nèi)平移和縮放可以適量做旋轉(zhuǎn)必須按固定角度比如15度的倍數(shù)且有語(yǔ)義審查顏色/線型的變化不能隨機(jī)要按行業(yè)制圖規(guī)范來。樣本不均衡同樣是重災(zāi)區(qū)。一個(gè)完整的圖紙庫(kù)里直線和圓弧這些底層圖元占了絕大多數(shù)業(yè)務(wù)符號(hào)的占比可能只有幾個(gè)百分點(diǎn)。如果不做處理模型會(huì)學(xué)會(huì)把絕大多數(shù)樣本都預(yù)測(cè)成高頻類別準(zhǔn)確率虛高但業(yè)務(wù)完全不能用。我們的處理方式有三板斧對(duì)高頻基礎(chǔ)圖元做降采樣訓(xùn)練對(duì)低頻業(yè)務(wù)符號(hào)做幾十倍過采樣并配合輕微形變?cè)鰪?qiáng)同時(shí)引入Focal Loss讓模型把注意力集中到難分的少數(shù)類樣本上最后對(duì)過采樣樣本和真實(shí)樣本混合做批次訓(xùn)練避免模型過擬合到增強(qiáng)樣本。噪聲標(biāo)簽問題在CAD場(chǎng)景里也特別突出主要來源是老圖紙本身的錯(cuò)誤比如設(shè)計(jì)修改后圖元沒刪干凈、重復(fù)繪制、圖層命名混亂。這類噪聲不會(huì)因?yàn)闃?biāo)注認(rèn)真而消失它們藏在數(shù)據(jù)里。我的策略是引入標(biāo)簽清洗模型先訓(xùn)練一個(gè)初始模型用模型預(yù)測(cè)置信度結(jié)合標(biāo)注結(jié)果做對(duì)比把置信度極低但被標(biāo)成確定類別的樣本挑出來交給專家二次判定是改標(biāo)簽還是刪樣本。這樣一輪清洗下來通常可以減少大約15%的標(biāo)簽錯(cuò)誤模型的準(zhǔn)確率能直接提升3到5個(gè)百分點(diǎn)。4. 模型選型與訓(xùn)練細(xì)節(jié)不是堆大模型就能贏4.1 圖元小尺寸特征與輕量化網(wǎng)絡(luò)的設(shè)計(jì)選擇圖元識(shí)別有一個(gè)特殊的難點(diǎn)很多關(guān)鍵符號(hào)在圖紙里的尺寸很小。一個(gè)閥門符號(hào)在整張A0圖紙里可能只占據(jù)幾十個(gè)像素如果用整圖縮放后直接丟給目標(biāo)檢測(cè)模型小目標(biāo)的特征幾乎全丟了。針對(duì)這個(gè)問題我們做了兩個(gè)關(guān)鍵設(shè)計(jì)。第一不直接對(duì)整圖做統(tǒng)一縮放而是先按圖幅分塊把圖紙切成若干瓦片tile每個(gè)瓦片內(nèi)部保持原始比例再對(duì)瓦片做檢測(cè)。第二在模型結(jié)構(gòu)上沒有盲目用ResNet-50或更深的主干網(wǎng)絡(luò)。對(duì)CAD圖紙這種干凈、高對(duì)比度、幾乎沒有紋理噪聲的圖像輕量級(jí)的CNN主干類似ResNet-18甚至更小配合特征金字塔結(jié)構(gòu)檢測(cè)小圖元的效果已經(jīng)足夠好。對(duì)比實(shí)驗(yàn)里ResNet-50比ResNet-18在業(yè)務(wù)符號(hào)上的精確率只提升了不到1%但推理耗時(shí)增加了將近3倍部署成本和響應(yīng)速度都吃緊。如果是基于矢量的原生CAD數(shù)據(jù)我會(huì)更推薦走幾何特征工程 輕量分類器的路線。先把每個(gè)候選圖元/圖元集合的幾何特征面積、周長(zhǎng)、頂點(diǎn)數(shù)、曲率均值、凸包比、各方向投影長(zhǎng)度等抽出來構(gòu)建成特征向量然后丟給一個(gè)多層感知機(jī)或者梯度提升樹模型做分類。這么做的好處是特征可解釋、調(diào)試方便、推理極快而且對(duì)算力幾乎沒有要求。只有當(dāng)矢量化特征表達(dá)不了復(fù)雜語(yǔ)義比如圖形形狀很不規(guī)則、類別極度依賴上下文的時(shí)候才需要把圖元柵格化后交給CNN。4.2 損失函數(shù)與訓(xùn)練策略怎樣避免模型原地踏步模型訓(xùn)練我在項(xiàng)目里踩過最深的一個(gè)坑是直接拿標(biāo)準(zhǔn)的交叉熵?fù)p失去訓(xùn)練多標(biāo)簽圖元分類損失函數(shù)一直在降但業(yè)務(wù)準(zhǔn)確率卻始終上不去。后來分析發(fā)現(xiàn)圖元類別之間存在大量互斥但不完全互斥的關(guān)系——一個(gè)對(duì)象同時(shí)被識(shí)別為管線和標(biāo)注線在損失函數(shù)里是可接受的但對(duì)業(yè)務(wù)來說就是致命錯(cuò)誤。解決這個(gè)問題的思路是設(shè)計(jì)組合損失。主損失仍然是類別交叉熵但疊加了兩項(xiàng)輔助損失一項(xiàng)是結(jié)構(gòu)一致性損失強(qiáng)制模型預(yù)測(cè)的圖元類別分布與圖元間的幾何拓?fù)潢P(guān)系保持一致比如一個(gè)符號(hào)內(nèi)部不應(yīng)該出現(xiàn)外部是管線的起點(diǎn)這種互相矛盾的組合另一項(xiàng)是層級(jí)約束損失業(yè)務(wù)對(duì)象的類別預(yù)測(cè)必須與底層幾何類別預(yù)測(cè)兼容比如業(yè)務(wù)預(yù)測(cè)是閥門時(shí)底層幾何不能全部預(yù)測(cè)成文字。加上這兩項(xiàng)之后模型的業(yè)務(wù)準(zhǔn)確率提升大約6個(gè)點(diǎn)誤判率顯著降低。訓(xùn)練策略上也有一些細(xì)節(jié)。第一階段用完全平衡的采樣訓(xùn)練跑基礎(chǔ)特征第二階段切換為盡量貼近真實(shí)圖紙分布的采樣讓模型重新適應(yīng)類別的先驗(yàn)分布最后再做幾輪困難樣本挖掘把前兩階段預(yù)測(cè)錯(cuò)誤的樣本增強(qiáng)后單獨(dú)回喂。整個(gè)過程大約3萬步后可以穩(wěn)定收斂繼續(xù)加大訓(xùn)練量對(duì)效果影響很小這時(shí)候就該把精力放到推理加速和數(shù)據(jù)清洗上而不要在訓(xùn)練上無限加時(shí)。4.3 后處理用幾何約束把模型的低級(jí)錯(cuò)誤糾正過來模型是概率輸出最后落庫(kù)的必須是確定性的圖元類別和幾何關(guān)系。很多團(tuán)隊(duì)在做后處理時(shí)只做取置信度最高類別這一步這就浪費(fèi)了大量可利用的領(lǐng)域知識(shí)。我在系統(tǒng)里加了一套幾何約束修正器專門跑三類規(guī)則。第一類是閉合性校驗(yàn)如果模型把某條圓弧預(yù)測(cè)成非閉合曲線但它的起點(diǎn)和終點(diǎn)距離小于閾值就強(qiáng)制改成閉合圓弧。第二類是圖層歸屬校驗(yàn)?zāi)承┬袠I(yè)規(guī)范要求特定圖元必須在特定圖層如果模型的類別預(yù)測(cè)和圖層屬性沖突標(biāo)記為待人工確認(rèn)。第三類是上下文語(yǔ)義校驗(yàn)類似剖面線和填充圖案的預(yù)測(cè)結(jié)果不能出現(xiàn)在模型類別為文字的區(qū)域這類規(guī)則。這套后處理邏輯看起來不起眼但在實(shí)際測(cè)試中它能把最終錯(cuò)誤率再降低約30%。比如有些圓在圖紙里既是實(shí)際的螺栓孔又是標(biāo)注用的輔助圓純模型區(qū)分不了規(guī)則加進(jìn)去之后根據(jù)螺栓孔的陣列分布規(guī)律就能把所有等距排布的圓統(tǒng)一修正為螺栓孔而不是零散地被分類成兩種。這就是模型規(guī)則的典型配合方式。5. 部署與集成圖紙識(shí)別完了業(yè)務(wù)閉環(huán)才算數(shù)5.1 推理引擎的部署形態(tài)與兩種落地路徑訓(xùn)練完成后的推理引擎部署我建議根據(jù)業(yè)務(wù)緊迫程度選擇兩條路徑不要一上來就上昂貴的推理服務(wù)器。路徑一是離線批量識(shí)別適合歷史圖紙庫(kù)的整體遷移。把引擎封裝成一個(gè)批量處理服務(wù)輸入一批DWG/DXF文件輸出識(shí)別結(jié)果JSON和校驗(yàn)報(bào)告跑完整個(gè)流程后人工抽查即可。路徑二是在線增量識(shí)別適合新圖紙產(chǎn)生時(shí)的實(shí)時(shí)處理。接入CAD軟件的事件回調(diào)機(jī)制圖紙保存或打開時(shí)自動(dòng)觸發(fā)識(shí)別推理結(jié)果實(shí)時(shí)回寫圖元屬性。兩種部署形態(tài)我都在實(shí)際項(xiàng)目里跑過。離線方式對(duì)時(shí)延不敏感可以采用較大的模型甚至跑多模型集成投票在線方式就要嚴(yán)格控制模型大小和推理耗時(shí)。我們最后在線引擎用的是量化后的輕量模型在國(guó)產(chǎn)CPU上單張圖紙平均推理大約320毫秒加上格式解析和結(jié)果回寫整個(gè)流程控制在1.5秒以內(nèi)用戶基本無感知。5.2 與國(guó)產(chǎn)CAD內(nèi)核的數(shù)據(jù)交互要注意什么部署環(huán)節(jié)最容易被低估的是與CAD內(nèi)核之間的數(shù)據(jù)交互復(fù)雜度。識(shí)別引擎要把結(jié)果寫回圖紙本質(zhì)上是對(duì)圖元對(duì)象的擴(kuò)展屬性XData或自定義屬性字典進(jìn)行操作。不同國(guó)產(chǎn)CAD平臺(tái)對(duì)擴(kuò)展屬性的支持程度不一樣有的支持標(biāo)準(zhǔn)XData有的需要走自定義字典接口有的底層API對(duì)批量屬性寫入的性能極差。我曾經(jīng)在一個(gè)項(xiàng)目里踩過坑推理引擎已經(jīng)跑完識(shí)別了結(jié)果寫回階段因?yàn)槠脚_(tái)對(duì)象屬性接口要逐條推送2000個(gè)圖元寫回竟然耗時(shí)超過10秒。后來改成批量事務(wù)接口并利用平臺(tái)自帶的批量修改能力耗時(shí)降到1.8秒。這里的關(guān)鍵經(jīng)驗(yàn)是開發(fā)之前一定先做一個(gè)寫回性能壓測(cè)別等全部開發(fā)完了再發(fā)現(xiàn)時(shí)間都耗在屬性回寫上。另外一個(gè)容易被忽略的點(diǎn)是識(shí)別結(jié)果與圖元對(duì)象的關(guān)聯(lián)穩(wěn)定性。CAD圖元在圖紙保存再打開后句柄Handle通常保持不變但如果圖紙經(jīng)過轉(zhuǎn)版本、修復(fù)或者另存句柄也可能變化。我們做結(jié)果回寫時(shí)用的是句柄幾何坐標(biāo)的雙重關(guān)聯(lián)先按句柄精確匹配匹配不上再用坐標(biāo)最近鄰匹配并在結(jié)果里記錄匹配置信度。這樣即使出現(xiàn)句柄漂移也能通過坐標(biāo)兜住絕大多數(shù)情況。5.3 性能優(yōu)化與國(guó)產(chǎn)硬件適配這幾個(gè)指標(biāo)必須盯住國(guó)產(chǎn)化語(yǔ)境下推理引擎往往要適配國(guó)產(chǎn)CPU、國(guó)產(chǎn)GPU以及國(guó)產(chǎn)深度學(xué)習(xí)框架。這個(gè)適配過程的工程量經(jīng)常被低估。我實(shí)際測(cè)過的幾個(gè)國(guó)產(chǎn)平臺(tái)上通用X86上跑得很順的模型遷移后可能遇到算子缺失、精度下降或者內(nèi)存占用翻倍的問題。所以我的建議是在模型選型階段就要圍著一個(gè)具體的國(guó)產(chǎn)推理目標(biāo)平臺(tái)來做約束。比如目標(biāo)平臺(tái)只支持INT8量化那訓(xùn)練時(shí)就考慮量化感知訓(xùn)練而不是訓(xùn)練完再臨時(shí)量化目標(biāo)平臺(tái)支持的卷積算子有限就避免在骨干網(wǎng)絡(luò)里使用過于冷門的算子結(jié)構(gòu)。先把算子支持列表拿到手再定網(wǎng)絡(luò)結(jié)構(gòu)比回頭做兼容性改造省力得多。性能監(jiān)控不能只看平均推理耗時(shí)至少還要盯三個(gè)指標(biāo)耗時(shí)P95/P99、首包時(shí)延、以及長(zhǎng)時(shí)間運(yùn)行后的顯存/內(nèi)存水位。CAD圖紙尺寸差異極大小圖可能幾十毫秒出結(jié)果大圖可能幾秒甚至十幾秒只看平均值會(huì)掩蓋很多實(shí)際問題。有一次我們優(yōu)化后平均耗時(shí)才100毫秒但P99高達(dá)3秒一查發(fā)現(xiàn)是某些超大圖塊的尺寸不受控制后續(xù)做了圖塊切分和超時(shí)降級(jí)策略P99才壓到500毫秒以內(nèi)。6. 我踩過的坑和幾條可復(fù)用的建議做AI圖元識(shí)別項(xiàng)目容易犯的最大錯(cuò)誤是把精力過多放在模型迭代上卻忽略了整個(gè)系統(tǒng)的漏斗轉(zhuǎn)化率。我一開始也是這么干的模型準(zhǔn)確率從88%調(diào)到95%花了兩周時(shí)間但整體業(yè)務(wù)指標(biāo)幾乎沒變化。后來把所有識(shí)別流程拆開做耗時(shí)分析才發(fā)現(xiàn)卡點(diǎn)在格式解析環(huán)節(jié)——有個(gè)老舊的圖紙格式解析庫(kù)在處理某些版本時(shí)效率極低單文件解析耗時(shí)達(dá)到了模型推理的10倍。把解析庫(kù)換了之后整個(gè)流程提速了60%比調(diào)模型收益大得多。還有一次我們?cè)谏暇€前做最后一輪大規(guī)模測(cè)試發(fā)現(xiàn)識(shí)別結(jié)果出現(xiàn)大面積圖元偏移。排查了很久最后發(fā)現(xiàn)是圖紙?jiān)谶w移過程中被某個(gè)轉(zhuǎn)換組件做了1:0.99的隱式縮放導(dǎo)致了坐標(biāo)錯(cuò)位。從那以后我要求所有原始圖紙?jiān)谶M(jìn)入識(shí)別管線前必須做兩次幾何特征一致性校驗(yàn)比如對(duì)比所有閉合圖形的質(zhì)心分布、比較圖框的對(duì)角線尺寸和標(biāo)注尺寸是否吻合。這種校驗(yàn)一小時(shí)就能跑完但能避免整個(gè)識(shí)別批次因?yàn)樽鴺?biāo)系統(tǒng)性偏移而全部作廢。關(guān)于模型結(jié)構(gòu)我的建議是別盲目追求大而全的模型。圖元識(shí)別這張任務(wù)大多數(shù)環(huán)節(jié)是簡(jiǎn)單的幾何分類和符號(hào)檢測(cè)需要的計(jì)算總量并不高輕量模型加規(guī)則后處理已經(jīng)能覆蓋絕大多數(shù)業(yè)務(wù)需求。真正復(fù)雜的場(chǎng)景是語(yǔ)義級(jí)圖元理解——比如理解一個(gè)符號(hào)是由哪些基礎(chǔ)圖元構(gòu)成、它的功能和關(guān)聯(lián)對(duì)象是什么——這部分目前還沒有統(tǒng)一的成熟方案更適合用工程手段給每個(gè)行業(yè)定制語(yǔ)義模板而不是指望一個(gè)通用模型解決一切。如果你現(xiàn)在正打算啟動(dòng)這類項(xiàng)目我的具體建議有三條。第一先花兩周時(shí)間把已有圖紙的圖元分布統(tǒng)計(jì)搞清楚高頻類別和低頻類別分開處理這會(huì)直接影響整個(gè)數(shù)據(jù)標(biāo)注的策略第二一定要做規(guī)則引擎和深度模型的混合架構(gòu)純規(guī)則方案扛不住多樣性純模型方案又缺乏可解釋性只有混合方案能同時(shí)兼顧業(yè)務(wù)方對(duì)準(zhǔn)確率和可控性的要求第三上線前必須留出至少三周做深度模型誤判樣本的專項(xiàng)分析把錯(cuò)誤類型分門別類整理成識(shí)別問題清單再逐項(xiàng)決定是用數(shù)據(jù)增強(qiáng)、規(guī)則修正還是人工復(fù)核來解決。圖元識(shí)別這套系統(tǒng)本質(zhì)上不是單點(diǎn)算法問題而是數(shù)據(jù)、規(guī)則、模型和業(yè)務(wù)校驗(yàn)的整體工程。我也是在反復(fù)踩坑和拆解流程之后才慢慢把整個(gè)鏈條理順的。希望這篇分享能讓你少走一些彎路在國(guó)產(chǎn)化遷移的大項(xiàng)目里把有限的精力花在最有杠桿的地方。