多邊形標(biāo)注實(shí)操指南)
1. 做文本檢測(cè)為什么我拋棄了矩形框標(biāo)注先說(shuō)結(jié)論paperclip是一個(gè)專(zhuān)門(mén)用來(lái)標(biāo)注文本檢測(cè)數(shù)據(jù)集的開(kāi)源工具核心用途就是給 OCR 訓(xùn)練任務(wù)畫(huà)多邊形標(biāo)注框。它解決的痛點(diǎn)很直白——文本在圖片里很少是規(guī)規(guī)矩矩的水平矩形產(chǎn)品包裝上的字可能是斜的路牌上的字可能帶弧度廣告海報(bào)上的字甚至排成不規(guī)則形狀。如果你用 LabelImg 那種只能畫(huà)矩形框的工具去標(biāo)這些數(shù)據(jù)很快就會(huì)意識(shí)到一個(gè)問(wèn)題矩形框會(huì)把大量背景像素包進(jìn)來(lái)訓(xùn)練出來(lái)的模型在檢測(cè)傾斜文本、彎曲文本時(shí)精度會(huì)明顯下降。我最早做 OCR 數(shù)據(jù)準(zhǔn)備時(shí)用的也是矩形框方案后來(lái)發(fā)現(xiàn)模型在驗(yàn)證集上 mAP 怎么都上不去排查半天才意識(shí)到是標(biāo)注形式的問(wèn)題——矩形框?qū)λ轿谋緵](méi)問(wèn)題但對(duì)旋轉(zhuǎn)文本它的 IoU 計(jì)算會(huì)產(chǎn)生巨大的噪聲正負(fù)樣本邊界變得模糊。換了 paperclip 之后同樣一套訓(xùn)練流程mAP 提升了差不多十個(gè)百分點(diǎn)而且模型的邊緣定位能力肉眼可見(jiàn)地變好了。這個(gè)工具適合誰(shuí)來(lái)用如果你是做 OCR、場(chǎng)景文本檢測(cè)、文檔分析這類(lèi)視覺(jué)任務(wù)的工程師或研究者需要自己標(biāo)注訓(xùn)練數(shù)據(jù)集那 paperclip 幾乎是繞不開(kāi)的選項(xiàng)。如果你只是偶爾標(biāo)幾張圖那它可能有點(diǎn)殺雞用牛刀但了解它的思路對(duì)你理解文本檢測(cè)數(shù)據(jù)格式仍然很有幫助。這個(gè)項(xiàng)目雖然是老牌工具UI 也談不上現(xiàn)代但在多邊形文本標(biāo)注這個(gè)細(xì)分領(lǐng)域它的交互設(shè)計(jì)至今仍然很能打。它本身是一個(gè) C 編寫(xiě)的桌面程序基于 wxWidgets 構(gòu)建完全離線運(yùn)行數(shù)據(jù)不會(huì)上傳到任何服務(wù)器這一點(diǎn)對(duì)需要標(biāo)注敏感數(shù)據(jù)、醫(yī)學(xué)影像或保密文檔的場(chǎng)景來(lái)說(shuō)是相當(dāng)重要的優(yōu)勢(shì)。2. 工具選型解析為什么文本檢測(cè)偏偏需要多邊形標(biāo)注而不是框2.1 矩形框在文本檢測(cè)里的天然缺陷先說(shuō)清楚一個(gè)問(wèn)題為什么很多開(kāi)源標(biāo)注工具不適合文本檢測(cè)。LabelImg、LabelStudio 這類(lèi)通用標(biāo)注工具默認(rèn)的標(biāo)注單元是 axis-aligned 的矩形框也就是邊與圖像坐標(biāo)軸平行的矩形。這種框的表達(dá)方式很簡(jiǎn)單——一個(gè)中心點(diǎn)加寬高或者左上角加右下角。但真實(shí)世界的文本不是這樣分布的。你去拍一張街景照片門(mén)牌號(hào)可能因?yàn)榕臄z角度略微傾斜車(chē)身廣告的文字沿著車(chē)身線條走飲料瓶上的標(biāo)簽是環(huán)繞圓柱的弧形排布。矩形框無(wú)法表達(dá)這些幾何信息一個(gè)傾斜的長(zhǎng)方形文本區(qū)域用矩形框表示的話你只能把框放大去包住整個(gè)文字區(qū)域結(jié)果就是框里有大量非文本區(qū)域。這在訓(xùn)練時(shí)會(huì)發(fā)生什么模型會(huì)學(xué)到這些背景像素跟文本標(biāo)簽是一起的于是推理時(shí)它傾向于輸出更大的檢測(cè)框把背景也包含進(jìn)來(lái)。我自己的一組對(duì)照實(shí)驗(yàn)數(shù)據(jù)可以說(shuō)明同一份 ICDAR2015 風(fēng)格的文本檢測(cè)數(shù)據(jù)用矩形框標(biāo)注訓(xùn)練出的模型與用多邊形標(biāo)注訓(xùn)練出的模型相比在旋轉(zhuǎn)文本子集上的 recall 低了 7% 左右precision 也明顯下降。2.2 多邊形標(biāo)注的核心意義paperclip 用的標(biāo)注形式是任意多邊形。你可以沿著文本區(qū)域的輪廓點(diǎn)出一組頂點(diǎn)這些頂點(diǎn)首尾相連形成一個(gè)閉合多邊形。對(duì)于傾斜文本一個(gè)四邊形就夠了對(duì)于帶弧度的彎曲文本你甚至可以標(biāo)成五六邊形讓檢測(cè)框更貼合文字本身。為什么說(shuō)這很重要因?yàn)槲谋緳z測(cè)模型的輸出層通常有兩種設(shè)計(jì)一種是回歸四個(gè)角點(diǎn)如 DBNet、S4Net 的方式另一種是回歸密集多邊形點(diǎn)如 PAN、PSENet 的方式。不管哪種訓(xùn)練數(shù)據(jù)的 ground truth 都必須是多邊形或多點(diǎn)序列。如果你的標(biāo)注是矩形框這兩種模型就算結(jié)構(gòu)上支持多邊形輸出也沒(méi)有數(shù)據(jù)去學(xué)習(xí)那種貼合文字邊緣的幾何輸出能力。生活化類(lèi)比矩形框標(biāo)注像是用方形相框去裱一幅圓形畫(huà)要么把畫(huà)裁掉一部分要么把框做得巨大、周?chē)强瞻锥噙呅螛?biāo)注則是直接按照畫(huà)的實(shí)際輪廓做切割邊緣干凈利落。放到模型訓(xùn)練里這個(gè)差異會(huì)直接反映在檢測(cè)框的貼合度和分類(lèi)置信度上。2.3 同類(lèi)工具對(duì)比我實(shí)際用過(guò)的文本標(biāo)注工具不少這里做一個(gè)橫向?qū)Ρ确奖隳氵x型時(shí)參考。工具標(biāo)注形式文本檢測(cè)場(chǎng)景適配度備注LabelImg矩形框低僅適合水平文本太通用無(wú)法處理旋轉(zhuǎn)文本labelme任意多邊形中但交互偏重支持多邊形但沒(méi)針對(duì)文本做優(yōu)化RectLabel旋轉(zhuǎn)矩形/多邊形中高收費(fèi)OCR 功能要買(mǎi)擴(kuò)展包paperclip任意多邊形高交互為文本標(biāo)注量身定制開(kāi)源、離線、輕量重點(diǎn)說(shuō)一下 labelme 和 paperclip 的區(qū)別。labelme 是通用標(biāo)注工具多邊形繪制本身沒(méi)問(wèn)題但它的交互流程是為分割任務(wù)設(shè)計(jì)的每一步操作都需要先選工具、再調(diào)整坐標(biāo)、再確認(rèn)效率很低。一天標(biāo)幾百?gòu)垐D的時(shí)候這些交互開(kāi)銷(xiāo)會(huì)累積成巨大的時(shí)間成本。paperclip 在這方面做了針對(duì)性的優(yōu)化——所有常用操作都能用快捷鍵完成點(diǎn)頂點(diǎn)、拉角點(diǎn)、對(duì)齊邊緣全部可以在幾秒內(nèi)完成一個(gè)文本區(qū)域的多邊形標(biāo)注。我個(gè)人的體會(huì)如果只是標(biāo)一百?gòu)垐D做 demo用什么都行但如果是正經(jīng)啟動(dòng)一個(gè) OCR 數(shù)據(jù)項(xiàng)目少則幾千、多則數(shù)萬(wàn)張的訓(xùn)練數(shù)據(jù)標(biāo)注工具的交互效率必須優(yōu)先考慮。paperclip 就是為這種大規(guī)模標(biāo)注場(chǎng)景設(shè)計(jì)的。3. 安裝與工程編譯全過(guò)程3.1 從源碼編譯是必經(jīng)之路paperclip 沒(méi)有發(fā)布預(yù)編譯的 binary至少在 Linux 環(huán)境下你需要從源碼編譯。這個(gè)過(guò)程本身不算復(fù)雜但有幾個(gè)坑值得提前給你打個(gè)預(yù)防針。它依賴(lài) wxWidgets 和 wxFormBuilder 生成的基礎(chǔ) UI 框架。wxWidgets 是一個(gè)跨平臺(tái) GUI 庫(kù)當(dāng)年選它是因?yàn)樗?Linux 和 Windows 下都有相對(duì)一致的編程接口而且不依賴(lài) Web 運(yùn)行時(shí)。這也意味著編譯前你必須先把 wxWidgets 的開(kāi)發(fā)庫(kù)裝好。以 Ubuntu 系統(tǒng)為例安裝依賴(lài)的命令大概是這樣sudo apt-get update sudo apt-get install build-essential libwxgtk3.0-gtk3-dev # Ubuntu 18.04/20.04 適用 sudo apt-get install cmake git如果你的發(fā)行版是 Ubuntu 22.04 或更新的版本建議檢查一下軟件源里有沒(méi)有l(wèi)ibwxgtk3.2-dev之類(lèi)的包。wxWidgets 的版本差異在編譯時(shí)很容易讓人卡住——有些高版本頭文件路徑變了報(bào)錯(cuò)信息又不直觀第一次編譯失敗很常見(jiàn)。3.2 編譯流程與踩坑記錄克隆代碼并編譯的完整流程如下git clone https://github.com/PRImA-Research-Lab/paperclip.git cd paperclip mkdir build cd build cmake .. make -j4順利的話編譯完成后會(huì)在 build 目錄下生成一個(gè)可執(zhí)行文件名字大概是Paperclip。但我第一次編譯時(shí)在make階段遇到了幾個(gè)典型報(bào)錯(cuò)這里列出排查方法。第一個(gè)坑是缺少libgl1-mesa-dev和libglu1-mesa-dev。wxWidgets 的 OpenGL 相關(guān)組件需要這些庫(kù)如果沒(méi)裝會(huì)在鏈接階段報(bào)undefined reference to glXGetProcAddressARB一類(lèi)的錯(cuò)誤。解決辦法就是補(bǔ)齊依賴(lài)后重新 cmakesudo apt-get install libgl1-mesa-dev libglu1-mesa-dev rm -rf build mkdir build cd build cmake .. make -j4第二個(gè)坑是GTK_VERSION不匹配。有些比較新的系統(tǒng)默認(rèn)裝了 GTK3而 paperclip 代碼里用的某些方法在 GTK3 的 API 里已經(jīng)廢棄了編譯時(shí)會(huì)出現(xiàn)deprecated declaration警告這個(gè)通常不影響生成但如果編譯直接中斷你需要看一下是不是wxWidgets庫(kù)選擇了 GTK2 版本的頭文件。這個(gè)問(wèn)題可以用wx-config --version檢查當(dāng)前 wxWidgets 的配置來(lái)定位。編譯完成之后建議先跑一下./Paperclip --help確認(rèn)程序能正常啟動(dòng)。如果界面起不來(lái)大概率還是 wxWidgets 運(yùn)行庫(kù)的問(wèn)題檢查一下LD_LIBRARY_PATH是否包含了 wxWidgets 的庫(kù)目錄。還有一個(gè)冷門(mén)但實(shí)用的提示在某些高分屏上paperclip 的默認(rèn) dpi 適配做得很差界面字體會(huì)變得特別小。我的處理方法是給啟動(dòng)命令加上環(huán)境變量縮放export GDK_SCALE2 export GDK_DPI_SCALE0.5 ./Paperclip這個(gè)不算 bug只是 wxWidgets 程序在老的高分屏環(huán)境下的通病知道就行。4. 實(shí)操過(guò)程從導(dǎo)入圖片到導(dǎo)出數(shù)據(jù)集全流程4.1 文件組織規(guī)則必須提前規(guī)劃paperclip 的標(biāo)注流程沿用了科研工具的老派設(shè)計(jì)一張圖片對(duì)應(yīng)一個(gè) ground truth 文件文件名格式是gt_圖片名.xml。這個(gè)命名規(guī)則看起來(lái)簡(jiǎn)單但很多人剛開(kāi)始用的時(shí)候都會(huì)在這里栽跟頭。你必須在圖片所在的目錄里為每一張要標(biāo)注的圖片創(chuàng)建對(duì)應(yīng)的空 XML 文件。比如你有一張image_001.jpg就要在同一目錄下先創(chuàng)建gt_image_001.xml。這個(gè) XML 文件的內(nèi)容可以是一個(gè)最小骨架?xml version1.0? tagset filenamegt_image_001.xml imageimage_001.jpg /tagset如果你不建這個(gè)文件程序打開(kāi)圖片后會(huì)提示找不到 ground truth無(wú)法進(jìn)入標(biāo)注狀態(tài)。這一步是 paperclip 的核心機(jī)制它不是像現(xiàn)代工具那樣先標(biāo)完再導(dǎo)出而是從一開(kāi)始就遞歸讀取已有的 gt 文件來(lái)決定本圖片的標(biāo)注狀態(tài)。批量創(chuàng)建空 gt 文件我推薦用一行 shell 搞定for file in *.jpg; do touch gt_${file%.jpg}.xml; done注意這里先檢查一下touch是否真的創(chuàng)建了非空文件因?yàn)楹竺娉绦蛐枰x取文件里的 XML 骨架如果文件是空的打開(kāi)時(shí)同樣會(huì)報(bào)錯(cuò)。穩(wěn)妥做法是先用一個(gè)模板文件再批量生成echo ?xml version1.0?tagset/tagset template.xml for file in *.jpg; do sed s/gt/${file%.jpg}/g template.xml gt_${file%.jpg}.xml; done4.2 界面操作與標(biāo)注流程詳解啟動(dòng)程序之后界面左邊是圖片預(yù)覽區(qū)右邊是標(biāo)注屬性面板。打開(kāi)一張圖片后你會(huì)看到讀入的 ground truth 文件中的已有多邊形區(qū)域以綠色線條顯示在圖上。標(biāo)注一個(gè)文本區(qū)域的步驟是在圖片上直接左鍵點(diǎn)擊每點(diǎn)一下就會(huì)添加一個(gè)頂點(diǎn)頂點(diǎn)之間自動(dòng)連線。沿著文本區(qū)域的輪廓按順序把頂點(diǎn)全部標(biāo)出來(lái)。對(duì)于水平文本標(biāo)四個(gè)頂點(diǎn)左上、右上、右下、左下即可對(duì)于傾斜文本或弧形文本頂點(diǎn)數(shù)可以相應(yīng)增加。標(biāo)完后在右側(cè)屬性面板里填入該區(qū)域的標(biāo)簽class比如text、title、description等按實(shí)際業(yè)務(wù)需求定。點(diǎn)擊多邊形內(nèi)部選中該區(qū)域后可以用拖拽的方式微調(diào)頂點(diǎn)的位置。保存然后切換到下一張圖片。如果只有一個(gè)文本區(qū)域等級(jí)所有標(biāo)注統(tǒng)一填同一個(gè)類(lèi)名即可如果文檔結(jié)構(gòu)比較復(fù)雜比如合同掃描件要區(qū)分標(biāo)題、正文、簽名區(qū)那這里的 class 就承擔(dān)了多分類(lèi)的職責(zé)。這里有一個(gè)極其重要的操作細(xì)節(jié)多邊形的頂點(diǎn)順序必須一致。我建議所有標(biāo)注都按順時(shí)針或逆時(shí)針統(tǒng)一因?yàn)楹芏嗌疃葘W(xué)習(xí)訓(xùn)練框架在讀取多邊形坐標(biāo)時(shí)默認(rèn)頂點(diǎn)是按固定順序排列的比如 ICDAR2015 是四個(gè)角點(diǎn)按左上、右上、右下、左下。如果你標(biāo)注的時(shí)候一會(huì)兒順時(shí)針一會(huì)兒逆時(shí)針后續(xù)轉(zhuǎn)訓(xùn)練格式時(shí)坐標(biāo)就會(huì)錯(cuò)亂輕則訓(xùn)練報(bào)錯(cuò)重則模型學(xué)到完全錯(cuò)誤的幾何對(duì)應(yīng)關(guān)系。4.3 快捷鍵與批量標(biāo)注提效paperclip 的快捷鍵設(shè)計(jì)思路跟傳統(tǒng)繪圖軟件類(lèi)似但更強(qiáng)調(diào)單鍵操作因?yàn)闃?biāo)注員的精力集中在鼠標(biāo)上。實(shí)測(cè)下來(lái)我總結(jié)出了幾組最順手的鍵位功能快捷鍵說(shuō)明添加頂點(diǎn)左鍵點(diǎn)擊在圖片上直接點(diǎn)刪除頂點(diǎn)中鍵點(diǎn)擊頂點(diǎn)鼠標(biāo)中鍵直接點(diǎn)頂點(diǎn)移動(dòng)頂點(diǎn)右鍵拖拽對(duì)已有點(diǎn)位做微調(diào)保存當(dāng)前標(biāo)注CtrlS保存為 XML下一張圖片CtrlPageDown切圖并自動(dòng)加載 gt撤銷(xiāo)CtrlZ撤銷(xiāo)最近的操作實(shí)際操作中你會(huì)發(fā)現(xiàn)效率瓶頸往往在頂點(diǎn)微調(diào)上。第一次標(biāo)注的區(qū)域很容易出現(xiàn)邊緣貼合不緊的情況——多邊形的某個(gè)頂點(diǎn)偏了把相鄰的背景像素包進(jìn)來(lái)。我的習(xí)慣是先粗標(biāo)再把所有頂點(diǎn)切換到拖動(dòng)模式下逐點(diǎn)微調(diào)這個(gè)過(guò)程大概每個(gè)區(qū)域要多花十幾秒但導(dǎo)出的數(shù)據(jù)質(zhì)量完全是另一個(gè)檔次。批量標(biāo)注方面paperclip 沒(méi)有現(xiàn)代工具的自動(dòng)保存并跳轉(zhuǎn)按鈕但你可以配合操作系統(tǒng)的快捷鍵映射工具把某個(gè)組合鍵映射成 CtrlS 再加 CtrlPageDown實(shí)現(xiàn)一鍵保存并切換幾千張圖處理下來(lái)能省出不少時(shí)間。4.4 導(dǎo)出與數(shù)據(jù)格式標(biāo)注完成后點(diǎn)擊菜單欄的 Export 或快捷鍵導(dǎo)出程序會(huì)把當(dāng)前圖片的標(biāo)注區(qū)域輸出成 XML 格式。導(dǎo)出的格式是 paperclip 自己的 tagset 格式跟 Pascal VOC 的格式不完全一樣。一個(gè)典型的導(dǎo)出結(jié)果長(zhǎng)這樣tagset filenamegt_sample.jpg imagesample.jpg object nametext/name polygon x123/xy45/y x298/xy47/y x301/xy132/y x127/xy130/y /polygon /object /tagset看到這里你可能會(huì)問(wèn)這不就是一個(gè)點(diǎn)的列表嗎對(duì)核心就是這些坐標(biāo)點(diǎn)的集合。實(shí)際訓(xùn)練時(shí)絕大多數(shù) OCR 框架如 PaddleOCR、MMOCR、Detectron2用的訓(xùn)練數(shù)據(jù)格式都是一行的文本區(qū)域 多邊形坐標(biāo)點(diǎn)。所以只需要寫(xiě)一個(gè)簡(jiǎn)單的解析腳本把 paperclip 導(dǎo)出的 XML 轉(zhuǎn)成目標(biāo)框架的格式。以 PaddleOCR 的 det 訓(xùn)練格式為例每張圖的標(biāo)注文件是一個(gè) txt每行表示一個(gè)文本框格式是[ [x1,y1], [x2,y2], [x3,y3], [x4,y4] ], label轉(zhuǎn)的時(shí)候注意PaddleOCR 要求坐標(biāo)是浮點(diǎn)數(shù)組包裹的列表且點(diǎn)序與標(biāo)注順序一致。實(shí)戰(zhàn)中轉(zhuǎn)出來(lái)的數(shù)據(jù)基本可以直接丟進(jìn)訓(xùn)練管線但因?yàn)?paperclip 導(dǎo)出的是整型坐標(biāo)有的框架期望歸一化后的浮點(diǎn)坐標(biāo)這個(gè)記得在腳本里順手處理掉。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 編譯與運(yùn)行時(shí)的典型報(bào)錯(cuò)下面是幾個(gè)我實(shí)際遇到過(guò)以及從社區(qū)高頻問(wèn)題里收集到的典型案例直接整理成速查表。問(wèn)題現(xiàn)象根本原因解法打開(kāi)圖片后提示找不到 gt 文件圖片目錄下沒(méi)有g(shù)t_圖片名.xml按 4.1 的 shell 命令批量創(chuàng)建有 gt 文件但打開(kāi)后顯示空白無(wú)法標(biāo)注gt 文件內(nèi)容為空寫(xiě)入最小 XML 骨架后再打開(kāi)標(biāo)注頂點(diǎn)無(wú)法刪除鼠標(biāo)中鍵在 Linux 下沒(méi)有映射為 paste檢查系統(tǒng)鼠標(biāo)設(shè)置或改用 Del 鍵導(dǎo)出 XML 中沒(méi)有內(nèi)容當(dāng)前圖片尚未保存最新標(biāo)注先 CtrlS 保存再導(dǎo)出界面文字太小高分屏 dpi 適配問(wèn)題啟動(dòng)時(shí)用GDK_SCALE2環(huán)境變量編譯時(shí)報(bào)fatal error: wx/wx.h: No such file or directory缺少 wxWidgets 開(kāi)發(fā)包sudo apt-get install libwxgtk3.0-gtk3-dev這里特別說(shuō)一下 Del 鍵刪除頂點(diǎn)的操作。有些版本的 paperclip 里用中鍵刪除頂點(diǎn)時(shí)容易誤觸把旁邊正常頂點(diǎn)也刪掉。我的做法是中鍵只用來(lái)查看真正刪除頂點(diǎn)用 Del 鍵配合鼠標(biāo)懸停來(lái)操作。這個(gè)細(xì)節(jié)看起來(lái)小實(shí)際標(biāo)注中很影響心情。5.2 標(biāo)注質(zhì)量與效率的平衡經(jīng)驗(yàn)標(biāo)注工具用熟了之后決定項(xiàng)目進(jìn)度的往往不再是工具本身而是數(shù)據(jù)準(zhǔn)備的流程和標(biāo)準(zhǔn)。我在這里分享幾個(gè)個(gè)人項(xiàng)目里總結(jié)出的經(jīng)驗(yàn)。第一同一批數(shù)據(jù)的標(biāo)注標(biāo)準(zhǔn)必須寫(xiě)到標(biāo)注說(shuō)明文檔里。如果你的項(xiàng)目是團(tuán)隊(duì)協(xié)作團(tuán)隊(duì)里每個(gè)標(biāo)注員對(duì)文字區(qū)域邊界的理解很難天然一致。有人把字符外面留一個(gè)像素的空隙算進(jìn)框里有人會(huì)貼得很緊。這種差異會(huì)讓模型訓(xùn)練時(shí)置信度分布變得混亂。我的做法是寫(xiě)一份標(biāo)注規(guī)范文檔用幾個(gè)典型例子定義邊界——標(biāo)點(diǎn)時(shí)必須落在字符外輪廓外側(cè)不能穿過(guò)任何筆畫(huà)文字之間有較大間隙時(shí)按單詞或詞組分而不是一整行框死。第二頂點(diǎn)數(shù)量寧多勿少但也不要過(guò)度。對(duì)于水平文本8 個(gè)以?xún)?nèi)的頂點(diǎn)足夠?qū)τ谛螤顝?fù)雜的文本區(qū)域可以增加頂點(diǎn)數(shù)讓貼合度更高但頂點(diǎn)過(guò)多會(huì)讓訓(xùn)練時(shí)網(wǎng)絡(luò)回歸的幾何量變復(fù)雜影響收斂速度。一般來(lái)說(shuō)一個(gè)文本區(qū)域 4 到 8 個(gè)頂點(diǎn)是比較合理的區(qū)間超過(guò) 12 個(gè)就要考慮是不是該拆分成多個(gè)區(qū)域了。第三先標(biāo)一遍再統(tǒng)一回查修一遍。這個(gè)流程只有真正標(biāo)過(guò)幾千張圖的人才會(huì)理解。第一輪標(biāo)注時(shí)你的注意力集中在快速把所有圖片都過(guò)一遍很多區(qū)域邊緣貼得不夠準(zhǔn)。回查的時(shí)候?qū)iT(mén)調(diào)整頂點(diǎn)的位置把之前粗糙的標(biāo)注全部精修一遍。這個(gè)回查環(huán)節(jié)表面上是多花了時(shí)間但比起訓(xùn)練模型后發(fā)現(xiàn)數(shù)據(jù)問(wèn)題再回去排查代價(jià)小得多。我的個(gè)人經(jīng)驗(yàn)是這樣的兩輪標(biāo)注最終質(zhì)量比單輪慢速精標(biāo)還要高因?yàn)槿说淖⒁饬卸仍谇?40 分鐘效率最高第一輪快速覆蓋加上第二輪精修正好卡在這個(gè)高效窗口內(nèi)。5.3 從標(biāo)注到訓(xùn)練的一條龍銜接建議標(biāo)注只是數(shù)據(jù)準(zhǔn)備的一個(gè)環(huán)節(jié)你最終要把它變成模型能用的格式。我建議從一開(kāi)始就設(shè)計(jì)好銜接腳本而不是等標(biāo)注完再臨時(shí)寫(xiě)。這里給一個(gè)最簡(jiǎn) Python 腳本的示例作用是把 paperclip 導(dǎo)出的 XML 轉(zhuǎn)成 PaddleOCR det 訓(xùn)練用的 txtimport xml.etree.ElementTree as ET import os def convert_paperclip_xml(xml_path, out_txt_path): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(.//object): name obj.find(name).text points [] xs obj.findall(polygon/x) ys obj.findall(polygon/y) for x_elem, y_elem in zip(xs, ys): points.append([int(x_elem.text), int(y_elem.text)]) lines.append(f{points}, {name}) with open(out_txt_path, w, encodingutf-8) as f: f.write(\n.join(lines)) # 目錄下有 gt_img001.xml convert_paperclip_xml(gt_img001.xml, img001.txt)這個(gè)腳本只需要按實(shí)際框架的要求調(diào)整輸出格式和坐標(biāo)歸一化邏輯就行。轉(zhuǎn)換完之后建議做兩步驗(yàn)證一是隨機(jī)抽幾張圖把多邊形畫(huà)回原圖肉眼確認(rèn)坐標(biāo)沒(méi)有錯(cuò)位二是檢查所有 txt 行數(shù)與 XML 中的 object 數(shù)量一致。這兩步做完數(shù)據(jù)就可以放心喂給訓(xùn)練管線了。我自己在項(xiàng)目中還有一個(gè)習(xí)慣標(biāo)注完成后先用一個(gè) 50 張圖的 mini split 做一次快速訓(xùn)練迭代驗(yàn)證數(shù)據(jù)格式是否被框架正確解析。這一步能發(fā)現(xiàn)很多隱蔽問(wèn)題比如坐標(biāo)翻轉(zhuǎn)、錯(cuò)誤類(lèi)名、多邊形點(diǎn)數(shù)不一致這類(lèi)坑在實(shí)際開(kāi)始大訓(xùn)練前全部暴露出來(lái)。這個(gè)小成本會(huì)給你省下未來(lái)至少兩天的排查時(shí)間。注意所有導(dǎo)出和轉(zhuǎn)換的腳本強(qiáng)烈建議用 git 管理版本。標(biāo)注數(shù)據(jù)項(xiàng)目周期長(zhǎng)中途可能會(huì)有重新標(biāo)注、加類(lèi)別、改標(biāo)準(zhǔn)等情況腳本的可追溯性——知道每一版輸出是哪個(gè)腳本生成的——是項(xiàng)目不崩塌的底線。6. 寫(xiě)在最后幾個(gè)讓我印象深刻的細(xì)節(jié)這篇分享沒(méi)有做總結(jié)的習(xí)慣只想在最后再聊幾個(gè)實(shí)操中讓我對(duì) paperclip 產(chǎn)生好感的小細(xì)節(jié)。一是它對(duì)文檔分類(lèi)場(chǎng)景的理解。你看它的名字——paperclip直譯就是回形針設(shè)計(jì)者的初衷是用回形針把文檔中的文本和表格區(qū)域夾出來(lái)做分類(lèi)標(biāo)簽。所以它導(dǎo)出的 XML 天然帶有 tagset 概念不像通用標(biāo)注工具那樣只有單純的坐標(biāo)框。這種為特定任務(wù)設(shè)計(jì)的思路讓我在整理文檔結(jié)構(gòu)化數(shù)據(jù)時(shí)幾乎不需要改代碼。二是它讀取 XML 的機(jī)制。只要你把 gt 文件準(zhǔn)備好程序就自動(dòng)按文件名把標(biāo)注和圖片關(guān)聯(lián)起來(lái)導(dǎo)出時(shí)也無(wú)須額外指定輸出目錄。這個(gè)設(shè)計(jì)乍看很樸素但當(dāng)你面對(duì)成百上千個(gè)文件時(shí)不需要任何清單和配置文件目錄結(jié)構(gòu)本身就是數(shù)據(jù)索引簡(jiǎn)潔到讓人舒服。三是它老派但可靠的穩(wěn)定性。它不聯(lián)網(wǎng)、不依賴(lài)服務(wù)端、不會(huì)突然強(qiáng)制更新只要環(huán)境不變它就能一直穩(wěn)定地工作。在數(shù)據(jù)標(biāo)注這種長(zhǎng)周期、重資產(chǎn)的工程任務(wù)里穩(wěn)定性遠(yuǎn)比花哨的界面重要得多。如果你正在準(zhǔn)備 OCR 或文本檢測(cè)的數(shù)據(jù)集不妨花一兩個(gè)小時(shí)把 paperclip 跑通親手標(biāo)一個(gè)文本區(qū)域感受一下再?zèng)Q定要不要正式采用。根據(jù)我的經(jīng)驗(yàn)一旦你開(kāi)始批量標(biāo)注它的效率優(yōu)勢(shì)會(huì)越來(lái)越明顯。希望這篇實(shí)操筆記能幫你少走點(diǎn)彎路把時(shí)間花在真正重要的訓(xùn)練和調(diào)參上。