據(jù)集:YOLO訓練實戰(zhàn)與避坑指南)
簡介街景門牌號數(shù)據(jù)集專門面向計算機視覺領域的門牌號識別任務適用于圖像分類、目標檢測等方向的AI研究者和開發(fā)者可用于訓練和評估自動識別街景門牌號的模型為智能導航、自動駕駛車輛、智慧城市等場景提供數(shù)據(jù)支撐。資源共7個文件壓縮包整體約885MB包含3個ZIP圖像數(shù)據(jù)包、2個CSV數(shù)據(jù)清單及提交樣例、2個JSON標注文件。ZIP包將街景門牌號圖像劃分為訓練、驗證、測試三部分便于隔離測試集防止過擬合CSV文件提供樣本提交模板與圖像元信息JSON文件則包含門牌號碼位置與類別標注。已有517人學習下載。數(shù)據(jù)完整度高可直接接入深度學習框架配合data_loader批量加載和預處理適合需要開展端到端門牌號識別實驗或完成競賽方案的中高級開發(fā)者。1. 街景門牌號數(shù)據(jù)集到底在解決什么問題大概兩年前我接到一個挺頭疼的需求做一個能自動識別臨街商鋪門牌號的小工具。甲方給的原始素材是一堆從街景視頻里截出來的圖每張圖上都有門牌但位置、角度、光照、遮擋程度千奇百怪。當時第一反應是去找現(xiàn)成數(shù)據(jù)集但找了一圈發(fā)現(xiàn)像SVHN街景門牌號碼這種經(jīng)典數(shù)據(jù)集雖然學術上很權威放到真實業(yè)務場景里卻不太夠用——圖上門牌太小、樣本分布單一、背景過于干凈跟實際街景里的復雜情況差太多。最后沒辦法只能自己動手搞了一套街景門牌號-數(shù)據(jù)集邊整理邊訓練效果反而比預期好不少。這篇文章就想把我做這套數(shù)據(jù)集的完整過程、標注思路、訓練細節(jié)和踩坑記錄分享出來。如果你是做目標檢測、OCR識別、街景理解或地圖數(shù)據(jù)相關工作的想自己造一套高質量數(shù)據(jù)集來訓練YOLO或類似模型這里面大部分經(jīng)驗應該可以直接拿來用。先說清楚這套數(shù)據(jù)集解決的核心問題有三個第一讓模型在復雜街景里能找到門牌這個大目標而不是直接扔給OCR一整個畫面第二用一套統(tǒng)一的標注規(guī)范把門牌檢測任務和后續(xù)的文字識別任務解耦第三用可控的數(shù)據(jù)分布讓訓練過程更穩(wěn)定避免模型在真實場景里泛化崩掉。2. 數(shù)據(jù)集整體設計與構建思路拆解2.1 場景定義與樣本采集策略做數(shù)據(jù)集第一件事不是打開標注工具而是定義清楚什么算門牌。這個看起來很簡單實際特別容易出分歧。比如墻上寫的樓棟號算不算門牌臨街商鋪的招牌上掛著XX路88號算門牌還是算招牌大門口的立體字算不算我最后定的標準是在物理上獨立存在、用于標識地址信息的牌匾或銘牌才標注為門牌。純招牌文字不算貼紙打印的臨時編號不算因為這些目標形態(tài)差異太大混在一起會讓模型學得很困惑。采集策略上我用了三個渠道公開街景視頻抽幀、自己拿手機在城市里沿街拍攝、以及從合作方拿到的脫敏街景圖片。三條渠道的比例控制在6:3:1左右保證樣本覆蓋度。公開街景數(shù)據(jù)雖然量大但往往因為拍攝設備統(tǒng)一畫面風格太一致模型容易過擬合自己拍的補足了不同天氣、不同時段、不同手機鏡頭帶來的色彩和紋理差異合作方的數(shù)據(jù)則提供了很多極端角度和晚上低照度的樣本。抽幀時有一個細節(jié)如果視頻幀率是30fps直接逐幀抽出來的畫面在時間上高度相關很多幀之間的差異只有輕微的視角變化放進訓練集里基本等于重復樣本。我的做法是每隔30幀抽一幀同時用圖片相似度算法做一次去重把結構相似度高于0.9的相鄰幀干掉用這種方法把初始拿到的2萬多張圖壓縮到8000多張有效樣本。2.2 標注規(guī)范與格式選型標注規(guī)范是整個數(shù)據(jù)集的地基這一步如果偷懶后面訓練、評測、迭代全都會很被動。我用的標注方案是目標檢測方向框每個門牌目標用一個帶旋轉角度的四邊形框框出來而不是傳統(tǒng)的軸對齊矩形框。理由很簡單——街景里的門牌基本都是掛在墻上的攝像角度稍微偏一點門牌在畫面里就是斜的。用普通矩形框會把大量背景包進來模型學到的特征是矩形區(qū)域里有門牌的影子而不是門牌本身推理時框的位置就經(jīng)常飄。標注格式我選了DOTA格式作為中間存儲然后轉成YOLO訓練需要的形式。DOTA格式用四點坐標表示任意四邊形配合一個表示角度的概念。對于門牌這種近似矩形的目標四點坐標比中心點寬高角度的參數(shù)化方式更直觀標注工具支持度也更好。如果你只是做水平框檢測不用旋轉框那直接用YOLO格式class cx cy w h就好但后續(xù)如果發(fā)現(xiàn)檢測效果遇到瓶頸可以考慮升級到旋轉框方案。這里我踩過一個坑剛開始標注的時候標注員對門牌被樹擋住三分之一這類情況是否標注有分歧。后來規(guī)定只要人能根據(jù)可見部分判斷出這是個門牌就標注完整外接框完全看不見的標注為忽略區(qū)域ignore region。忽略區(qū)域在訓練時要專門做掩碼處理不然會教模型這里明明是門牌但你不能預測反而造成錯亂。2.3 類別體系與標簽平衡門牌數(shù)據(jù)集的類別設置我前后改了三版。最初想做得精細一點按門牌材質分類金屬牌、亞克力牌、木質牌、石質牌。后來訓練時發(fā)現(xiàn)根本沒必要模型對材質的敏感度遠低于對文字區(qū)域紋理的敏感度而且材質類別之間肉眼差異也不大標注成本卻高了不少。最終版本只保留了門牌house_number這一個類但增加了一個附加屬性文字方向。文字方向分成三類水平閱讀大多數(shù)、垂直閱讀豎排門牌多見于老街巷、角度傾斜門牌本身是斜的或拍攝視角造成。這個屬性不是作為獨立類別參與訓練而是以分組標簽的形式記錄在元數(shù)據(jù)里方便訓練完做分組成維度評估——比如看看模型在垂直門牌上的recall是不是明顯低于水平門牌從而針對性補數(shù)據(jù)。單類設計還有一個額外的好處樣本不均衡問題基本消失了。在目標檢測任務里如果A類樣本是B類的10倍模型會不由自主地偏向A類導致B類的召回率慘不忍睹。單類模型只需要關注門牌在哪兒配合一個簡單的二分類判斷在真實場景里反而更實用。實際測試下來單類檢測器加后續(xù)OCR識別的pipeline比端到端多任務模型更穩(wěn)。2.4 標注質量控制流程標注質量問題我在第一次做數(shù)據(jù)集時吃過虧。當時外包給標注團隊回來一檢查大約有8%的框偏移超過5個像素還有不少漏標。后來我搭了一套初標→質檢→修正→抽檢的流程初標由標注員完成質檢員用專門的檢查工具把標注結果疊加在原圖上重點看框的邊是否貼住目標邊緣、角度是否對齊、有沒有漏標修正版回來后我自己按5%的比例隨機抽檢抽檢不合格就退回整批重做。這里有一個很實用的技巧每張圖標注完成后把標注框裁剪出來單獨拼成一張大圖grid做人工巡檢。因為當你連續(xù)看幾百個裁剪出來的門牌圖塊時任何標注偏差都會變得非常扎眼比直接看整張圖的效率高很多。這個裁剪巡檢法后來我也一直沿用在其他數(shù)據(jù)集項目里收益很大。3. 核心細節(jié)解析怎么把數(shù)據(jù)變成YOLO能吃的樣子3.1 數(shù)據(jù)清洗與預處理原始圖片從街景視頻里抽出來之后首先要做的是清洗。我寫了個pipeline按順序做以下幾件事剔除完全模糊的幀用拉普拉斯方差做判斷低于閾值的直接丟剔除光線極度過曝或過暗的幀用直方圖統(tǒng)計判斷剔除沒有門牌的幀先用一個預訓練的檢測器粗篩保留置信度高于0.1的結果再人工確認。這個階段不用太精確目標只是把明顯無效的數(shù)據(jù)清掉。然后把所有圖片統(tǒng)一縮放到1280×1280同時確保標注坐標跟著等比縮放。之所以選1280而不是640或1920是因為街景里的門牌很多屬于小目標在畫面中占比不到5%640分辨率下目標只有30多個像素特征太少模型很難學到有效信息1920分辨率能保留細節(jié)但顯存占用太高訓練速度太慢。1280是精度和訓練效率的平衡點??s放時還要注意一個細節(jié)原圖寬高比如果不是1:1直接壓縮會把門牌壓變形導致文字扭曲、檢測器學到的形狀特征失真。正確的做法是等比例縮放后用灰色填充letterbox補齊到1280×1280標注坐標不變這樣既不丟信息也不會扭曲目標。3.2 YOLO格式轉換與數(shù)據(jù)劃分數(shù)據(jù)轉換這一步本身不復雜就是坐標格式的換算但容易出低級錯誤而且錯誤很難發(fā)現(xiàn)——模型訓練loss不下降找半天原因發(fā)現(xiàn)是標注坐標搞錯了。我自己封裝了一個小函數(shù)把DOTA格式的四點坐標轉成YOLOv8需要的歸一化中心點坐標import numpy as np def dota_to_yolo(points, img_w, img_h): 將DOTA四點坐標轉換為YOLO格式的(cx, cy, w, h) points: 8個數(shù)值 [x1, y1, x2, y2, x3, y3, x4, y4] img_w, img_h: 圖片原始寬高 返回: (class_id, cx_norm, cy_norm, w_norm, h_norm) pts np.array(points).reshape(4, 2).astype(np.float32) x_min, y_min pts[:, 0].min(), pts[:, 1].min() x_max, y_max pts[:, 0].max(), pts[:, 1].max() cx (x_min x_max) / 2.0 cy (y_min y_max) / 2.0 w x_max - x_min h y_max - y_min # YOLO需要歸一化到[0, 1] cx_norm cx / img_w cy_norm cy / img_h w_norm w / img_w h_norm h / img_h return (0, cx_norm, cy_norm, w_norm, h_norm)轉換完成后數(shù)據(jù)劃分我按7:2:1切分為訓練集、驗證集和測試集。有一個容易忽略的問題來自同一段街景視頻的連續(xù)幀如果被同時分進訓練集和驗證集會造成數(shù)據(jù)泄漏——驗證集的圖像與訓練集高度相似評估結果虛高。我的做法是按視頻來源做分組劃分同一個視頻的抽幀全部進入同一個集合而不是按單張圖隨機劃分。這個問題在業(yè)務場景里特別重要如果忽略了模型在真實數(shù)據(jù)上的表現(xiàn)會跟驗證集結果差很多。3.3 數(shù)據(jù)增強策略門牌檢測任務的數(shù)據(jù)增強不能直接套用常規(guī)檢測任務的增強套餐。原因在于門牌的判定依賴文字的可讀性如果把圖像增強過頭門牌文字變得模糊、扭曲或變形標注框里的內容就不是門牌了等于強行制造噪聲。最有效的一組增強組合我實測下來是輕度隨機亮度擾動±20%、輕度隨機色彩抖動飽和度±15%、色相±5%、隨機水平翻轉注意門牌文字方向會翻轉但這個影響可以接受因為檢測器主要學外觀紋理而不是語義內容、隨機縮放0.5到1.5倍和隨機平移±10%。像隨機擦除random erasing這種增強手段用在門牌上會讓文字區(qū)域直接缺失反而教壞模型不推薦。Mosaic增強YOLO自帶的四圖拼接可以開但要注意關閉crop類操作或者把拼接時隨機裁剪的幅度調小否則門牌目標很容易被切掉一半。我試過Mosaic開啟和關閉兩種情況開啟后小目標遠處門牌的recall提升了約4個百分點收益是正面的。4. 實操過程用YOLOv8訓練門牌檢測模型4.1 環(huán)境搭建與關鍵參數(shù)配置訓練在我的單卡RTX 3090上進行24GB顯存對1280分辨率的YOLOv8訓練來說足夠。環(huán)境用ultralytics官方包版本鎖在8.x。數(shù)據(jù)集的目錄結構按YOLO慣例組織house_number_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml這樣寫train: /path/to/house_number_dataset/images/train val: /path/to/house_number_dataset/images/val test: /path/to/house_number_dataset/images/test nc: 1 names: [house_number]訓練命令我采用的是固定隨機種子跑方便問題復現(xiàn)yolo detect train \ modelyolov8m.pt \ datahouse_number_dataset/data.yaml \ imgsz1280 \ epochs150 \ batch16 \ lr00.01 \ lrf0.01 \ optimizerAdamW \ seed42 \ patience20模型選yolov8m而不是s或者l我基于經(jīng)驗做權衡s參數(shù)量小、訓練快但小目標檢測精度明顯不夠l精度好但在1280分辨率下batch size必須降到8以下訓練時間翻倍性價比一般。m是單卡訓練時精度和速度最均衡的選擇。4.2 訓練過程觀察與調整訓練過程我建議重點盯兩條曲線驗證集的mAP50和mAP50-95。正常情況下mAP50從第10個epoch開始快速爬升到80個epoch左右趨于平緩mAP50-95的絕對值不會太高小目標數(shù)據(jù)集的mAP50-95普遍在0.3到0.5之間但它能反映定位精度——如果mAP50還可以但mAP50-95上不去說明框的位置不穩(wěn)定邊界貼合度不夠這時候要考慮錨框設置或回歸損失權重的問題。我訓練時遇到過一個典型現(xiàn)象loss在30個epoch之前下降正常之后就震蕩不降。檢查學習率后發(fā)現(xiàn)問題——用默認的SGD在1280分辨率下loss容易震蕩換成AdamW后從第35個epoch開始重新穩(wěn)定下降。如果你的訓練也遇到類似情況優(yōu)先檢查優(yōu)化器和學習率不要一上來就去調網(wǎng)絡結構。另外我習慣在訓練到一半時手動跑一次推理挑幾張驗證集圖片看看檢測結果。這一步比看任何指標都直觀模型有沒有把招牌上的數(shù)字當門牌遠處的小門牌能不能召回框有沒有歪這些視覺檢查能快速暴露出指標上看不到的細節(jié)問題。4.3 推理與后處理細節(jié)訓練完成后推理端的處理也會影響最終效果。我在實際項目里把檢測結果接了一個輕量級OCR模塊流程是YOLO檢測出門牌區(qū)域 → 做透視矯正因為很多門牌在畫面里是斜的 → 送入OCR做文字識別 → 用正則表達式過濾識別結果比如只保留包含數(shù)字的文本。透視矯正在這一步很關鍵。因為檢測框輸出的是旋轉矩形直接把這個旋轉區(qū)域喂給OCR識別效果會受文字傾斜影響。我的做法是利用四點坐標計算透視變換矩陣把門牌區(qū)域矯正成正面視角后再送OCR。這一步操作大約能讓OCR識別準確率提升15個百分點具體數(shù)值取決于原始圖像中門牌的傾斜程度。5. 常見問題與排查技巧實錄5.1 問題一訓練損失不下降這是目標檢測訓練里最常見的幽靈問題。我在這個數(shù)據(jù)集上遇到的第一個損失不下降排查了半天發(fā)現(xiàn)是標注坐標轉換出了問題——DOTA格式的坐標原點在左上角沒錯但某些標注工具的坐標原點在左下角轉換后所有框的y坐標都反了模型在空轉。所以建議開始訓練前先手工驗證10張圖的轉換結果把標注框畫出來看一遍不要直接開跑。還有一種情況是前景背景類別極度不平衡。門牌在1280分辨率的圖中占比太小負樣本數(shù)量壓倒性占優(yōu)正樣本的梯度被淹沒。通過調整focal loss的alpha和gamma參數(shù)能改善我是把alpha設為0.75、gamma從默認的1.5提到2.0對提升小目標的收斂速度有幫助。5.2 問題二小目標漏檢嚴重漏檢的典型場景是遠處的小門牌目標只有20×30像素大小。這個問題是結構性的光靠調參解決不徹底。我的排查思路按優(yōu)先級排序首先是確認訓練分辨率——1280分辨率下20像素的目標確實存在但不可分辨建議做一次標注目標尺寸分布統(tǒng)計如果大量目標長邊小于32像素就只能提高輸入分辨率或者做切片推理。其次是數(shù)據(jù)增強里加一個隨機裁剪放大操作以目標為中心隨機裁剪1.5到3倍的區(qū)域再放大后參與訓練相當于讓模型見過更多放大了的門牌。實測小目標recall提升了3個百分點左右。這個方法實現(xiàn)簡單收益穩(wěn)定推薦優(yōu)先嘗試。5.3 問題三驗證集指標高但真實場景效果差這類問題的頭號嫌疑人是數(shù)據(jù)泄漏原因就是我上面提到過的同源視頻幀被分到了不同集合。換成按視頻分組劃分之后驗證集和真實場景的差距立刻縮小。另一個原因是驗證集圖片太干凈——如果我們手工刪掉了那些嚴重遮擋、極端光照、運動模糊的圖片驗證集就會整體偏樂觀。建議把一些難樣本刻意留在驗證集里寧可在驗證時被虐也不要上線后被虐。5.4 避坑清單我把做這套數(shù)據(jù)集過程中最值得記的教訓整理成一張速查表方便你對照環(huán)節(jié)易踩的坑正確做法數(shù)據(jù)采集同源視頻幀大量重復抽幀間隔不少于30幀再做結構相似度去重標注規(guī)范目標定義模糊標注員標準不一致寫明物理獨立門牌才算歧義情況設忽略區(qū)標注質檢只看單張圖檢查效率低用裁剪巡檢法把門牌裁剪拼圖批量檢查數(shù)據(jù)劃分同源幀跨集合導致驗證集虛高按視頻/場景分組劃分不按單張隨機劃分數(shù)據(jù)增強隨機擦除或過度扭曲使文字失真輕量亮度色彩擾動為主避免破壞文字結構訓練配置小目標多但用640分辨率直接訓練用1280輸入配合Mosaic增強和焦距損失調節(jié)推理部署斜門牌直接送OCR識別率低先透視矯正再送入OCR準確率提升明顯6. 擴展思路這套數(shù)據(jù)集的后續(xù)玩法數(shù)據(jù)集本身做完不代表事情結束了我后來基于這套數(shù)據(jù)還做了幾個方向的延伸都很實用。第一個是基于檢測結果直接生成門牌號碼位置的GIS標注數(shù)據(jù)給地圖應用用。把YOLO檢測輸出的坐標投影到對應的地理位置坐標自動生成門牌點人工只需要做確認而不是從零標注。第二個是給OCR模型做細粒度訓練數(shù)據(jù)的思路。檢測模型把門牌區(qū)域切出來之后如果某個門牌的文字特別小或者模糊OCR識別不準就可以把這些失敗樣本自動收集起來人工補充清晰版本形成一個迭代式的數(shù)據(jù)飛輪。這個循環(huán)跑起來之后識別準確率的提升會非常明顯。之后再用同樣的思路去擴展其他街景元素的檢測比如紅綠燈、路標、路燈桿。標注規(guī)范、訓練流程、問題排查的思路都完全可以復用整個流程跑通后新增一個目標類別大概只需要一到兩周。7. 總結做數(shù)據(jù)集是門檻活不是體力活回到開頭說的那件事真正做完這套街景門牌號數(shù)據(jù)集之后最大的感受是數(shù)據(jù)集的好壞七成取決于前期定義和中期質控只有三成取決于采集了多少張圖。很多人一上來就拼命爬數(shù)據(jù)反倒忽略了檢測目標邊界怎么定義標注標準怎么統(tǒng)一數(shù)據(jù)怎么劃分才不泄漏這些基礎工作。這些基礎沒打好數(shù)據(jù)越多模型越混亂。如果你也準備做自己的門牌號數(shù)據(jù)集或者要基于類似街景數(shù)據(jù)做目標檢測我的建議是先花幾天時間把標注規(guī)范和劃分策略想清楚再用一個幾百張的小樣集跑通訓練和評測全流程確認所有環(huán)節(jié)都順了再上量采集。小樣集跑通后后面加數(shù)據(jù)只是體力活不會再有方向性的返工。這套流程我后來在好幾個項目里都復用了一遍每次都省了大量時間。本文還有配套的精品資源點擊獲取