習(xí)與CCPD/CRPD數(shù)據(jù)集的多任務(wù)車牌識別實戰(zhàn)解析)
簡介一套完整的車輛與車牌多屬性識別系統(tǒng)基于PyTorch深度學(xué)習(xí)框架融合CCPD、CRPD等公開數(shù)據(jù)集支持車輛檢測、車牌檢測識別、車身顏色識別和車牌顏色識別識別準(zhǔn)確率達(dá)98.5%并兼容國內(nèi)多種車牌樣式。適用于計算機(jī)、人工智能、自動化等專業(yè)學(xué)生用于課程設(shè)計、畢業(yè)設(shè)計或項目演示也適合初學(xué)者入門進(jìn)階和開發(fā)者二次開發(fā)。資源包共154個文件包含43個Python源碼、模型權(quán)重文件、YAML配置、測試圖片及少量Shell腳本等整體約39.03MB結(jié)構(gòu)清晰既可直接推理測試也支持CPU或GPU環(huán)境自行訓(xùn)練模型。壓縮包內(nèi)目錄劃分明確測試圖片與結(jié)果保存邏輯完整。目前已有1181人學(xué)習(xí)下載項目代碼經(jīng)測試運行穩(wěn)定可作為深度學(xué)習(xí)目標(biāo)檢測與識別方向的學(xué)習(xí)范本。1. 為什么車牌識別是個看著簡單、落地?zé)┤说姆较蛲砩暇劈c停車場的出閘機(jī)剛抬桿又落下屏幕上是皖A(yù)·D123 請通行副駕的人臉不清晰但車牌與車身顏色被識別得清清楚楚。這個場景背后是一套典型的基于深度學(xué)習(xí)與CCPD、CRPD數(shù)據(jù)集的車牌識別系統(tǒng)它不只輸出那串車牌字符還要同時給出車牌顏色藍(lán)/黃/白/綠/黑和車輛顏色紅/黑/白/銀/灰……。很多人以為拿一個YOLO模型跑通檢測就完了真正接項目才會發(fā)現(xiàn)三個任務(wù)混在一個pipeline里有多考驗數(shù)據(jù)處理和工程排錯。這篇筆記就是拆這樣一個打包好的Python實踐項目源碼、CCPD與CRPD數(shù)據(jù)集、模型權(quán)重一應(yīng)俱全但再完整的zip也比不上一張能講清楚標(biāo)注怎么轉(zhuǎn)、損失怎么設(shè)、閾值怎么調(diào)的作戰(zhàn)地圖。適合正在跟著源碼復(fù)現(xiàn)的訓(xùn)練者也適合評估多任務(wù)車牌識別技術(shù)選型的部署工程師。2. 核心識別鏈路與數(shù)據(jù)集選型CCPD與CRPD在車牌識別里的分工2.1 兩個數(shù)據(jù)集怎么看一熱一冷互相補(bǔ)短板CCPD全稱Chinese City Parking Dataset中文常叫中國城市停車場數(shù)據(jù)集視角高度統(tǒng)一停車場出入口的槍機(jī)車頭正對鏡頭一張圖一輛車、一個車牌車牌區(qū)域大且清晰。CCPD的強(qiáng)項是檢測和字符識別因為樣本干凈模型很容易把基礎(chǔ)精度拉上來。它最大的弱項是車牌顏色極度偏科藍(lán)牌占比高得離譜新能源綠牌只是點綴黃牌、白牌幾乎見不到。CRPD是沖著復(fù)雜場景去的全稱常被寫作Chinese Plate Recognition Dataset。夜間、雨雪、傾斜、污損、模糊、低分辨率CRPD里全都有車牌顏色也比CCPD豐富得多網(wǎng)約車、公交車的黃牌特種車白牌貨車黑牌都占了合理比例。兩個數(shù)據(jù)集一冷一熱合在一起正好互補(bǔ)CCPD把場景分布打底CRPD把泛化能力逼出來。這是標(biāo)題里不單獨放某個數(shù)據(jù)集、而是同時放CCPD和CRPD的根本原因。我常用下面這個對比輔助選型也建議你先按行核對一遍再動手維度CCPDCRPD場景分布停車場出入口車頭正對目標(biāo)大夜間/雨雪/遮擋/傾斜難樣本多車牌顏色藍(lán)牌為主少量綠牌藍(lán)/黃/白/綠/黑多色混合標(biāo)注形式JSON含車輛框與車牌四點坐標(biāo)矩形框字符級標(biāo)注格式以txt/csv為主適合用途訓(xùn)練檢測與字符識別的干凈基線給模型加抗干擾能力和顏色多樣性需要潑一盆冷水如果你拿到的是未經(jīng)清洗的zip先把CRPD里分辨率過低、人眼都看不清的圖挑出來別直接塞進(jìn)訓(xùn)練集。那些圖在驗證集里當(dāng)負(fù)樣本可以當(dāng)正樣本只會把loss曲線抖成心電圖。2.2 為什么做成檢測分類而不是端到端序列識別車牌識別這個需求有兩種主流實現(xiàn)路徑。第一種是Detection OCR先檢測車牌再用CRNN或者Transformer把車牌字符挨個識別出來適合需要精細(xì)輸出省份簡稱字母數(shù)字的場景。第二種是Detection 分類頭檢測到車牌后不打字符而是分類出藍(lán)牌/黃牌/綠牌同時檢測車輛區(qū)域并分類車輛顏色。標(biāo)題里這套.zip顯然指向第二種因為它的輸出物不是字符序列而是兩個顏色標(biāo)簽加一個定位框。選擇第二種的工程理由是明顯的字符級OCR中文車牌維護(hù)成本高省份簡稱幾十類、字體形狀多變要求訓(xùn)練數(shù)據(jù)逐字符標(biāo)注CCPD和CRPD的標(biāo)注格式對字符識別并不友好。更現(xiàn)實的是停車場和路側(cè)監(jiān)控的核心需求往往是這輛車的顏色是什么、掛什么顏色的牌而不是把字符一個一個打出來。先檢測再分類檢測用YOLO系列分類接管出的區(qū)域用ResNet或者M(jìn)obileNet之類的小分類頭訓(xùn)練時互不干擾排錯時邊界清晰。有人問為什么不用HALCON那種傳統(tǒng)模板匹配來做如果你之前在HALCON里用字符模板跑過車牌項目就會知道它在一張曝光均勻、角度端正的圖上確實能跑通但一到傾斜、反光、夜間就立刻變脆。這也是這些年大家都在往深度學(xué)習(xí)遷移的原因。2.3 多任務(wù)輸出設(shè)計一個頭部還是拆成三個模型設(shè)計輸出時常見做法有兩種。第一種是共享一個backbone在Detection層上直接掛多個分類分支一次前向同時輸出目標(biāo)框、車牌顏色和車輛顏色。第二種是YOLOv5只負(fù)責(zé)檢測車輛與車牌車牌顏色和車輛顏色各接一個獨立的小網(wǎng)絡(luò)。從源碼包的交付習(xí)慣來看訓(xùn)練時通常合并成一個多任務(wù)loss推理時再拆出三類結(jié)果。我偏向于在YOLOv5的Detect頭后面接自定義分支而不是純?nèi)齻€獨立模型原因只有一個推理耗時。三個串行模型在樹莓派或者Jetson上可能拖到幾百毫秒而一次前向把三個結(jié)果全部帶出來典型的輸出通道數(shù)大約是這樣的前景目標(biāo)類別2類車輛、車牌車牌顏色5類車輛顏色8類再加上坐標(biāo)與置信度結(jié)果是41258Detect輸出的特征圖通道數(shù)會改到20左右。多任務(wù)loss的常規(guī)寫法是一個加權(quán)和坐標(biāo)回歸用CIoU Loss負(fù)責(zé)把矩形框框準(zhǔn)目標(biāo)類別用BCE Loss負(fù)責(zé)區(qū)分前景目標(biāo)和背景車牌顏色、車輛顏色用CrossEntropy Loss某個小分類的loss配一個系數(shù)。這里有個血淚經(jīng)驗一開始把三個任務(wù)權(quán)重全設(shè)成1你會發(fā)現(xiàn)藍(lán)牌大樣本把黃牌和綠牌完全淹沒模型永遠(yuǎn)在輸出藍(lán)牌。正確做法是給樣本量少的顏色類提高權(quán)重或者用類平衡采樣把每個車牌顏色的batch占比盡量對齊。這是后面訓(xùn)練參數(shù)那一章的重點。3. 跑通代碼包的第一步從CCPD標(biāo)注到Y(jié)OLO訓(xùn)練集的最小閉環(huán)3.1 環(huán)境準(zhǔn)備不要照搬Python教程里的默認(rèn)安裝法先把工程目錄結(jié)構(gòu)捋順。拿到zip解壓后我一般先按下面的規(guī)劃重建目錄而不是直接在解壓根目錄下訓(xùn)練plate_recognition/ ├── data/ccpd/ # CCPD原始圖json標(biāo)注 ├── data/crpd/ # CRPD原始圖標(biāo)注 ├── data/ccpd/labels/ # 轉(zhuǎn)換后YOLO標(biāo)簽 ├── data/crpd/labels/ ├── models/yolov5s.pt # 預(yù)訓(xùn)練權(quán)重 ├── train.py ├── detect.py ├── convert_ccpd.py └── config/ccpd_crpd.yaml環(huán)境配置是第一個翻車點。很多入門教程直接讓你裝最新的Python和PyTorch但YOLOv5這類倉庫對版本其實很敏感。我一般用Python 3.8加PyTorch 1.10CUDA 11.3這一組合在大部分顯卡驅(qū)動上都能穩(wěn)定跑。用虛擬環(huán)境隔離別污染系統(tǒng)Python# 創(chuàng)建并激活虛擬環(huán)境注意指定Python版本 python3.8 -m venv venv source venv/bin/activate # 安裝CUDA 11.3對應(yīng)的PyTorch不要裝成CPU版 pip install torch1.10.0cu113 torchvision0.11.0cu113 -f https://download.pytorch.org/whl/torch_stable.html # 安裝yolov5倉庫的依賴 pip install -r yolov5/requirements.txt第一行命令里的python3.8是刻意指定的。如果直接用系統(tǒng)默認(rèn)的python3可能指向3.10以上版本YOLOv5的一些老接口在3.10上會報奇怪的類型錯誤。第三行指定CUDA版本是為了規(guī)避驅(qū)動新但PyTorch舊導(dǎo)致的算子不匹配。裝完跑python -c import torch; print(torch.cuda.is_available())輸出True再往下走。3.2 把CCPD的JSON標(biāo)注轉(zhuǎn)成YOLO格式轉(zhuǎn)換腳本與參數(shù)說明CCPD的標(biāo)注是JSON里面同時含車輛框和車牌四點坐標(biāo)結(jié)構(gòu)大體是bbox給出車體矩形points給出車牌四邊形的四個角點。YOLO訓(xùn)練標(biāo)簽要求是類別 中心x 中心y 寬 高而且全部歸一化到0到1所以轉(zhuǎn)換腳本至少要解決兩件事把四點坐標(biāo)折算成外接矩形把矩形歸一化。# convert_ccpd.py import json, os from pathlib import Path import numpy as np SRC Path(data/ccpd/images) DST Path(data/ccpd/labels) PAD 1.05 # 車牌框外擴(kuò)系數(shù)防止裁剪時切掉字符邊緣 def poly_to_xywh(points, img_w, img_h, pad1.0): 把四點坐標(biāo)轉(zhuǎn)成YOLO格式的歸一化xywh pts np.array(points, dtypenp.float32) x_min, y_min pts.min(axis0) x_max, y_max pts.max(axis0) cx ((x_min x_max) / 2.0) / img_w cy ((y_min y_max) / 2.0) / img_h w (x_max - x_min) * pad / img_w h (y_max - y_min) * pad / img_h return cx, cy, w, h for img_path in SRC.glob(*.jpg): json_path img_path.with_suffix(.json) if not json_path.exists(): continue # 從文件名或JSON頭部取圖像寬高CCPD的JSON里一般直接給 anno json.loads(json_path.read_text(encodingutf-8)) img_w, img_h anno[width], anno[height] lines [] # 類目0車輛1車牌 vehicle anno.get(cars, [{}])[0].get(bbox, [0,0,100,100]) v_x, v_y, v_w, v_h vehicle lines.append(f0 {((v_xv_w)/2)/img_w} {((v_yv_h)/2)/img_h} {v_w/img_w} {v_h/img_h}) # 車牌四點坐標(biāo)存于cars[*].plate.points plate_pts anno[cars][0][plate][points] cx, cy, w, h poly_to_xywh(plate_pts, img_w, img_h, PAD) lines.append(f1 {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) DST.mkdir(parentsTrue, exist_okTrue) DST.joinpath(img_path.stem .txt).write_text(\n.join(lines), encodingutf-8)這段腳本的關(guān)鍵參數(shù)是PAD 1.05。四點坐標(biāo)直接取min/max得到的是緊貼字符的外接矩形訓(xùn)練時如果數(shù)據(jù)增強(qiáng)做了隨機(jī)裁剪車牌邊緣的字容易被切掉。外擴(kuò)5%給增強(qiáng)留余量這是復(fù)制粘貼時最容易被忽略的細(xì)節(jié)。img_w和img_h必須從標(biāo)注文件讀不能自己猜因為CCPD原圖尺寸并不完全一致一旦寬高反了所有標(biāo)注坐標(biāo)都會錯位到圖像對角。轉(zhuǎn)換完務(wù)必抽驗。用YOLOv5自帶的train.py --cache跑一個epoch或者寫幾行腳本把標(biāo)簽畫回圖上看矩形框是否貼合車牌。這一步省掉后面訓(xùn)練出來的框偏上偏下你都不知道問題出在數(shù)據(jù)還是模型。3.3 訓(xùn)練主命令三個任務(wù)怎么配進(jìn)一條命令數(shù)據(jù)都準(zhǔn)備好后把兩類數(shù)據(jù)集的路徑寫進(jìn)一個YAML。注意CRPD如果已經(jīng)自帶txt格式標(biāo)注你需要先確認(rèn)它的坐標(biāo)是否歸一化、類別ID是否與CCPD一致不一致就在轉(zhuǎn)換腳本里做一次映射。數(shù)據(jù)集配置文件的寫法# config/ccpd_crpd.yaml train: data/ccpd/images data/crpd/images val: data/ccpd/images nc: 2 names: [vehicle, plate]nc這里先設(shè)成2因為YOLOv5的原生訓(xùn)練只負(fù)責(zé)檢測車輛和車牌車牌顏色與車輛顏色走自定義分類分支。接下來啟動訓(xùn)練python train.py \ --data config/ccpd_crpd.yaml \ --weights models/yolov5s.pt \ --img 640 \ --batch 32 \ --epochs 200 \ --hyp data/hyps/hyp.scratch-low.yaml \ --multi-scale--multi-scale是給車牌檢測模型用的它讓模型每隔幾次迭代隨機(jī)縮放輸入尺寸增強(qiáng)對不同距離車牌的適應(yīng)力代價是訓(xùn)練時間變長。--hyp選了hyp.scratch-low.yaml而不是高增強(qiáng)配置原因是車牌字符這類細(xì)節(jié)目標(biāo)對過強(qiáng)的HSV擾動很敏感。如果你發(fā)現(xiàn)驗證集上字符區(qū)域被過度扭曲優(yōu)先把hsv_h、hsv_s這些增強(qiáng)參數(shù)往低調(diào)。3.4 多任務(wù)loss的改造位置與權(quán)重初始化YOLOv5原版只輸出框和目標(biāo)類別要把車牌顏色、車輛顏色也塞進(jìn)同一次前向需要在Detect層改輸出通道數(shù)。常見做法是在model/yolo.py的Detect類里把輸出維度從5nc改成5nc_color_platenc_color_car然后在損失函數(shù)里分別計算。# 在訓(xùn)練循環(huán)的loss計算位置新增分支 from torch.nn import CrossEntropyLoss # 假設(shè)頭部特征圖已經(jīng)拆出分類結(jié)果 plate_color_logits outputs[:, 5:10] # 車牌顏色共5類 car_color_logits outputs[:, 10:18] # 車輛顏色共8類 plate_color_targets targets_plate_color # 從標(biāo)注中讀取的標(biāo)簽 # 加權(quán)交叉熵避免藍(lán)牌樣本淹沒其他顏色 class_weights torch.tensor([1.0, 2.0, 2.5, 1.5, 3.0]) # 藍(lán)/黃/白/綠/黑 loss_plate_color CrossEntropyLoss(weightclass_weights)(plate_color_logits, plate_color_targets) loss_car_color CrossEntropyLoss()(car_color_logits, targets_car_color) loss loss_detect 0.5 * loss_plate_color 0.3 * loss_car_color這里class_weights不是拍腦袋寫的而是先統(tǒng)計CCPD和CRPD里五個顏色類別的樣本數(shù)取中位數(shù)類別為基準(zhǔn)計算逆頻率得到。車輛顏色的8類權(quán)重同理。兩個輔助loss的系數(shù)設(shè)為0.5和0.3是讓主檢測任務(wù)的梯度占主導(dǎo)輔助分類只在骨干網(wǎng)絡(luò)共享部分產(chǎn)生影響防止分類任務(wù)把檢測特征帶偏。4. 把模型部署到真實畫面推理腳本、閾值與三類識別結(jié)果怎么讀4.1 推理腳本一次前向輸出全部標(biāo)簽訓(xùn)練完成后你手里的best.pt已經(jīng)能同時產(chǎn)出三個信息。推理時不建議重新寫一套復(fù)雜管線直接用YOLOv5的推理封裝再對輸出做后處理# detect.py 核心片段 import torch model torch.hub.load(yolov5, custom, pathruns/train/exp/weights/best.pt, sourcelocal) model.conf 0.35 # 檢測置信度閾值 model.iou 0.45 # NMS的IoU閾值 results model(test_imgs/night_vehicle.jpg) boxes results.xyxy[0].cpu().numpy() # x1,y1,x2,y2,conf,cls for box in boxes: x1, y1, x2, y2, conf, cls box cls int(cls) if cls 0: # 車輛區(qū)域 car_crop frame[int(y1):int(y2), int(x1):int(x2)] # 車輛顏色分類由單獨的輕量分類頭完成 car_color car_color_head(car_crop) # 輸出8類softmax elif cls 1: # 車牌區(qū)域 plate_crop frame[int(y1):int(y2), int(x1):int(x2)] plate_color plate_color_head(plate_crop) # 輸出5類softmax print(f車牌位置x1y1x2y2: {x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}, conf{conf:.2f}) print(f車牌顏色: {plate_color}, 車輛顏色: {car_color})model.conf和model.iou是關(guān)鍵取值。白天光線好conf設(shè)0.45能濾掉大量誤檢夜間置信度普遍下降我習(xí)慣動態(tài)調(diào)低到0.3否則會漏掉真實車牌。NMS的iou設(shè)0.45是平衡值設(shè)太大會把同一輛車上的車燈和車牌框合并成一個框設(shè)太小則同一個目標(biāo)多個框同時輸出。類別ID映射一定要對照訓(xùn)練時的namesID順序一變整批輸出含義就全反了。4.2 驗證指標(biāo)mAP和顏色準(zhǔn)確率分開看多任務(wù)系統(tǒng)最容易犯的錯誤是只看mAP。YOLOv5的val.py只評估檢測框車牌顏色和車輛顏色的精度在它里面看不到需要單獨寫評估腳本python val.py \ --data config/ccpd_crpd.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --iou 0.5--iou 0.5對應(yīng)mAP0.5即預(yù)測框與真實框的IoU超過0.5就算檢測成功車牌檢測這個任務(wù)看mAP0.5就夠了。mAP0.5:0.95是更嚴(yán)苛的多尺度IoU平均COCO類通用目標(biāo)檢測才更看重車牌目標(biāo)小、場景固定不要被這個數(shù)字勸退。顏色準(zhǔn)確率則是兩個分類頭的Top-1正確率。單獨跑評估集統(tǒng)計每個類別的混淆矩陣尤其是藍(lán)牌和黃牌之間的混淆——夜間光照下這兩個顏色在RGB空間非常接近。評估腳本的要點是按顏色類別分別統(tǒng)計而不是只算總準(zhǔn)確率否則藍(lán)牌占比高總準(zhǔn)確率會被它抬到虛高。5. 車牌識別系統(tǒng)實測避坑六條高頻踩坑與排錯實錄5.1 車牌框外擴(kuò)太大把相鄰車燈框進(jìn)裁剪區(qū)域現(xiàn)象檢測框貼合車牌但車牌顏色識別明顯不準(zhǔn)藍(lán)牌經(jīng)常識別成綠牌黃牌識別成白牌。原因訓(xùn)練時PAD設(shè)成了1.12外擴(kuò)12%的框在車燈、鍍鉻飾條附近時把環(huán)境顏色一起包進(jìn)了分類頭的輸入?yún)^(qū)域。解決把PAD收回1.05如果車牌有傾斜角先用仿射變換把車牌對齊到水平再做顏色分類而不是依賴矩形框裁剪。5.2 夜間圖像上黃牌幾乎全軍覆沒現(xiàn)象白天黃牌識別準(zhǔn)確率90%以上一到夜間掉到50%以下大量被誤判成白牌。原因黃色在低照度下飽和度下降通道統(tǒng)計上和白牌的高光區(qū)域極其接近。解決訓(xùn)練時單獨給車牌顏色分類分支增加夜間增強(qiáng)包括亮度抖動、飽和度降低、隨機(jī)加高斯噪點或者把夜間樣本按CRPD做一次偽影調(diào)色擴(kuò)充同時把黃牌類別的loss權(quán)重調(diào)到2.5以上。5.3 訓(xùn)練loss下降但val曲線在30輪后開始劇烈震蕩現(xiàn)象前30個epoch mAP一路向上之后訓(xùn)練集loss繼續(xù)降驗證mAP卻上下亂跳。原因--multi-scale配合過高的基礎(chǔ)學(xué)習(xí)率在訓(xùn)練后期讓已經(jīng)收斂的權(quán)重反復(fù)跳出不穩(wěn)定的解。解決第60輪后把學(xué)習(xí)率降到初始值的十分之一或者關(guān)閉--multi-scale如果用的是hyp.scratch-high.yaml先切回low配置。5.4 Windows下訓(xùn)練直接CUDA out of memory現(xiàn)象python train.py啟動后不到10秒就報錯顯存被拉滿。原因默認(rèn)batch在Windows上沒有自動按顯存縮放8GB顯存跑batch 32必然爆顯存。解決先按顯存折減8GB顯存從batch 16起步6GB就到8同時把--workers從默認(rèn)的8降到2Windows的DataLoader進(jìn)程啟動開銷比Linux大得多一樣會吃內(nèi)存。5.5 ONNX導(dǎo)出后輸出張量維度錯位現(xiàn)象PyTorch里推理正常導(dǎo)出ONNX后用TensorRT加載車牌顏色輸出全部變成亂標(biāo)簽。原因YOLOv5的Detect層在導(dǎo)出時會做一次維度重組自定義顏色分支的輸出位置被打亂。解決導(dǎo)出前固定模型的輸出shape打開--dynamic時不要開全軸動態(tài)只固定batch維導(dǎo)出后用onnxruntime跑同一張圖逐維度和PyTorch輸出對比確認(rèn)類別維順序一致再交給TensorRT。5.6 驗證集mAP很高但停車場現(xiàn)場新場景漏檢一半現(xiàn)象測試了自己的測試圖感覺不錯一到新停車場閘機(jī)就漏檢。原因CCPD的拍攝視角高度統(tǒng)一模型把停車場出入口的槍機(jī)視角當(dāng)成了隱含特征換了低角度或者側(cè)向安裝的相機(jī)特征分布整體漂移。解決最少引入100到200張現(xiàn)場角度的圖做微調(diào)把新舊數(shù)據(jù)按7比3混合訓(xùn)練不要全量重訓(xùn)加載best.pt繼續(xù)訓(xùn)30個epoch就能拉回現(xiàn)場分布。6. 臨近交付時的檢查清單用硬案例找系統(tǒng)邊界再談閾值是否可信系統(tǒng)交付前我習(xí)慣做一個硬案例篩選。把驗證集和現(xiàn)場測試圖全部跑一遍凡是檢測置信度低于0.4、顏色分類結(jié)果與標(biāo)注不一致的圖單獨復(fù)制到一個hard_examples目錄人工翻一遍。這一翻往往能發(fā)現(xiàn)標(biāo)注錯誤和類別邊界問題比空調(diào)閾值管用得多。import glob, shutil from pathlib import Path hard_dir Path(hard_examples) hard_dir.mkdir(exist_okTrue) for img_path in glob.glob(test_imgs/*.jpg): results model(img_path) boxes results.xyxy[0] max_conf boxes[:, 4].max().item() if len(boxes) else 0.0 if max_conf 0.4: shutil.copy(img_path, hard_dir / Path(img_path).name)硬案例看完之后再對閾值做分時策略。白天光線穩(wěn)定conf設(shè)0.45到0.5寧缺毋濫夜間或者逆光時段降到0.3再多跑一層車牌紋理校驗防止車燈反光區(qū)域被誤判成車牌。黃牌和綠牌因為樣本量少單獨再拉低閾值會比較有效。這套系統(tǒng)的邊界其實很清楚清晰藍(lán)牌車95%以上的檢測車色識別率黃綠白牌在良好光照下可用夜間只保證框得準(zhǔn)、顏色七成正確需要百分百顏色識別就得加補(bǔ)光燈。我的習(xí)慣是任何車牌識別項目上線前先固定一個本地驗證集把mAP和顏色Top-1做成一張表格每次調(diào)整都拿表格說話不然所有調(diào)參都成了玄學(xué)。希望這套方法能幫你少走兩步冤枉路也祝你的車牌識別系統(tǒng)一次落地就能過驗收。本文還有配套的精品資源點擊獲取