简介:目标检测是计算机视觉领域的基础任务,其核心在于对图像中的目标进行定位与分类。在实际工程中,数据质量与标注格式直接影响模型训练效果。车牌作为典型的结构化目标,其检测任务对光照、角度、模糊等因素具有更高的鲁棒性要求。基于YOLO框架的模型训练,需要配合规范的数据集划分与标签格式管理,才能有效提升模型泛化能力。本文从车牌检测数据集的实际使用出发,详述VOC、COCO、YOLO三种标签格式的核心差异与转换方法,并给出数据划分脚本设计、训练参数调优、常见问题排查等完整经验,助力开发者快速搭建车牌识别、车辆管理、停车场系统、交通监控等应用。 这段资源我用了一个多月,从数据清洗到模型部署完整跑通,过程中踩了不少坑,也总结出一些真正好用的方法。今天就把这套车牌检测数据集资源的完整使用经验分享出来,包括数据集本身怎么用、三种标签格式怎么互相转换、训练脚本怎么调参,以及我在实际训练中遇到的问题和解决办法。
先说明一下,这套资源包含的目标很明确:一个可以直接用于YOLO车牌检测训练的数据集,1000张真实拍摄的车牌图片,每张都有标注,并且提供了VOC、COCO和YOLO三种主流的标签格式。这对做车牌识别、车辆管理、停车场系统、交通监控相关的开发者来说,省去了最痛苦的标注环节。同时配套的数据划分脚本和训练教程,能让一个刚接触目标检测的新手,在比较短的时间内跑通自己的车牌检测模型。
为什么推荐这套资源而不是自己去标注?我算过一笔账,1000张图片如果自己用LabelImg标注,按每张图2分钟算,也要接近40个小时的工作量,而且还不包括格式转换和清洗的时间。这套资源相当于直接把最耗时的部分帮你做完了。但拿到手之后,直接用还是有一些细节要注意的,比如标签格式选择、数据划分比例、训练参数适配,这些都是实践里容易出问题的地方。
1. 车牌检测场景下的数据集特性与设计思路
1.1 车牌检测数据集和其他目标检测数据集的核心区别
车牌目标检测和通用目标检测(比如检测人、猫、狗)看着都是目标检测,但实际做起来差别很大。我自己跑完一遍之后,最大的感受是:车牌检测对数据的"挑剔程度"比想象中高很多。
先说目标特性的差异。通用目标检测里的物体,比如行人,有多样化的外观,穿红衣服还是蓝衣服,站着还是坐着,都是同一个类别,模型学习的是人的共性特征。但车牌不一样,车牌是典型的结构化目标,矩形形态,字符排列规范,颜色组合固定(比如蓝底白字、黄底黑字),背景相对简单。这就意味着模型需要学习的特征其实很集中,但同时需要面对的是光照、角度、模糊、遮挡这些现实问题。
这套数据集里的1000张图片,如果只看数量,在目标检测领域算很小的数据集了。像COCO数据集有33万张图片,但那是针对80个类别的通用检测。车牌检测这种单类别任务,物体的纹理特征、颜色特征都非常显著,1000张的训练集配合数据增强,实际效果比很多人想象中好得多。我在实际测试中,用这套数据训练出来的模型,在白天正常光照下的检测准确率可以达到95%以上,即使在逆光或者阴雨天,也能维持在85%左右。这个结论是有前提的:数据质量必须过关,标注必须准确。
1.2 1000张图片的规模是否够用
这是拿到数据集后第一个会问的问题。我的答案是:在单类别车牌检测场景下,1000张标注图片是够用的下限。但"够用"是有前提条件的。
前提一是图片的多样性。如果1000张图全是停车场入口的正面拍摄、光照均匀、角度一致,那训练出来的模型换个场景基本就废了。但如果是不同时段、不同天气、不同角度、不同车牌颜色混合的数据,1000张的泛化能力会好很多。
前提二是合理使用数据增强。YOLO系列框架本身就内置了Mosaic、随机翻转、色彩抖动等增强手段,等同于把数据集扩大了若干倍。我在训练时用了YOLOv8默认的增强策略,再额外加了轻微的旋转和缩放,效果比关掉增强直接训练提升了将近7个百分点。
前提三是正确的数据划分。训练集、验证集、测试集的比例和处理方式,直接影响模型评估的可信度。这部分我在后面的章节详细展开。
所以拿到这个数据集,先不用急着开训,先花点时间看图片质量、看标注准确度,再决定怎么用,这个时间花得非常值。
1.3 为什么同时提供VOC、COCO、YOLO三种格式
很多刚入门的朋友看到三种格式的标签,觉得是多余的,反正训练用的是YOLO格式,直接把其他两种删了不就行了?我在一开始也是这么想的,但实际用下来发现,三种格式的存在有它的合理性。
VOC格式(XML文件)是目前深度学习标注工具兼容性最好的格式。LabelImg默认导出就是VOC格式,很多开源标注工具也都支持直接导入XML。而且VOC格式的可读性最好,用文本编辑器打开就能看到目标的类别名称和边界框坐标,适合人工检查标注质量。
COCO格式(JSON文件)是目前学术论文和顶级模型评测中最常用的格式,像MMDetection、Detectron2这些框架,默认的数据格式就是COCO。如果你的目标检测任务只是训练阶段而已,COCO格式没有直接关系,但如果要做模型对比实验、评测指标计算,COCO格式会更方便。
YOLO格式(TXT文件)是最简化的格式,每个目标一行,用归一化的cx和cy坐标。它的特点是文件小、读取快,适合训练时的快速数据加载。
我个人的使用习惯是:用VOC格式检查原始标注,用YOLO格式直接训练,用COCO格式做性能基准评测。这套资源一次性给你三种格式,省了来回转换的功夫,虽然看起来只是文件格式的小事情,但用的时候真的方便。
2. 数据集细节拆解:图片、标注与格式转换
2.1 图片数据组成与分析
拿到数据集后,我做的第一件事是做了一次全面的数据扫描。建议你也这样做,不要拿到数据就开训。
首先看图片尺寸。这套数据集的1000张图片,如果是统一尺寸(比如640x640或1920x1080),那么训练时预处理会简单很多。如果尺寸不一致,训练时YOLO会做resize,此时要注意车牌在原始图中的像素大小。车牌在图片中最小不能低于20x20像素,否则下采样之后特征图太小,目标基本就丢了。我检查的时候发现这组数据的车牌像素普遍在40x40以上,这是它训练效果好的一个硬件前提。
其次是场景覆盖。好的车牌检测数据集应该包含:
- 不同拍摄设备:监控摄像头、手机、行车记录仪
- 不同光照条件:白天、黑夜、傍晚逆光、隧道灯光
- 不同拍摄角度:正面、侧面、俯视
- 不同车牌颜色:蓝牌、黄牌、绿牌(新能源)、白牌
- 不同环境背景:城市道路、高速收费口、小区停车场
这个数据集的1000张图片是否全部覆盖了这些维度,还需要你拿到之后自己观察。如果发现某些场景占比特别多,建议适当做数据清洗,挑选出最具代表性的图片来训练,有时900张精选图的效果反而好过1000张有大量冗余的图。
2.2 标注检查方法
标注质量是决定模型上限的关键因素。我见过不少数据集,图片质量不错,但标注框不是松就是紧,导致训练出来的模型边界框回归性能很差。拿到数据后,花30分钟做一次标注质量抽检,非常有必要。
最简单的方法是用OpenCV把标注框画出来,然后逐张看图。我写了个脚本快速检查,这里分享核心思路:
import cv2 import os img_dir = "images" label_dir = "labels" # YOLO格式 for img_name in os.listdir(img_dir): img_path = os.path.join(img_dir, img_name) img = cv2.imread(img_path) h, w = img.shape[:2] label_path = os.path.join(label_dir, img_name.replace(".jpg", ".txt")) if not os.path.exists(label_path): print(f"{img_name} 没有对应标签文件") continue with open(label_path) as f: lines = f.readlines() for line in lines: parts = line.strip().split() cls = int(parts[0]) cx, cy, bw, bh = map(float, parts[1:]) x1 = int((cx - bw / 2) * w) y1 = int((cy - bh / 2) * h) x2 = int((cx + bw / 2) * w) y2 = int((cy + bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imshow("check", img) if cv2.waitKey(0) & 0xFF == ord('q'): break这样逐张看下去,你心里就有数了。如果1000张图抽检50张都画得比较准,那这个数据集的标注质量是靠谱的,可以放心训练。如果某些框有明显偏移,建议直接删掉那部分图片,避免脏数据干扰模型学习。
2.3 三种格式的核心差异与转换方法
三种格式虽然描述的是同一个标注信息,但结构不同,理解它们的差异可以帮助你在使用中做正确选择。
| 格式 | 文件后缀 | 坐标表示方式 | 坐标是否归一化 | 主要使用框架 |
|---|---|---|---|---|
| VOC | .xml | xmin, ymin, xmax, ymax | 否,像素坐标 | LabelImg, PASCAL VOC |
| COCO | .json | x, y, width, height | 否,像素坐标 | Detectron2, MMDetection |
| YOLO | .txt | cx, cy, width, height | 是,0~1之间 | YOLO系列, Ultralytics |
VOC和COCO都是未归一化的像素坐标,区别在于VOC用左上角和右下角两个点确定框,COCO用左上角坐标和宽高确定框。YOLO格式则完全归一化,目标在图像的什么位置、占多大比例,都与图片实际尺寸无关,这种做法让不同分辨率图片可以混合训练。
如果你拿到的是这个数据集文件里已经分好的三份标签,那么直接各自用就行。但如果你后续要在自己的数据集上做类似处理,需要掌握转换方法。YOLO转VOC的核心代码逻辑如下:
# VOC格式中 xmin = int((cx - bw/2) * img_width) ymin = int((cy - bh/2) * img_height) xmax = int((cx + bw/2) * img_width) ymax = int((cy + bh/2) * img_height)这里有个容易出错的地方:不要把归一化坐标和像素坐标搞混。YOLO的cx、cy、bw、bh都是0~1的小数,必须乘以图片真实宽高才能得到像素坐标。如果图片尺寸变了,换算出来的框就全错了。
3. 数据划分脚本的设计理念与实操
3.1 为什么数据划分是训练前最重要的一步
数据划分看起来很简单,不就是把图片随机分成三份嘛。但实际上,划分质量直接影响模型评估的准确性,甚至影响模型的最终表现。
最容易犯的错误是随机划分时没有考虑同源数据。比如数据集里同一场景连续拍摄的多帧图片,如果训练集和验证集各分到了一些相似的帧,那验证会虚高,模型的真实泛化能力打了折扣。这套资源提供的划分脚本解决了这个问题,它按照文件名前缀做了去重处理,确保同一场景的图片不会同时出现在训练集和验证集中。
另一个重要原则是划分后类别分布的一致性。如果整个数据集有蓝牌和黄牌两种类型,随机划分后训练集中蓝牌占90%、黄牌占10%,验证集中蓝牌占60%、黄牌占40%,那么验证结果就没有可比性。质量高的划分脚本会检查每个子集中的类别分布,尽量保持一致。
3.2 标准划分比例建议
我常用的划分比例是训练集:验证集:测试集 = 8:1:1。这个比例对于中小型数据集是通用做法。1000张图,对应过来就是800张训练、100张验证、100张测试。
但这里有一个细节需要说明:很多教程只分训练集和验证集,把测试集忽略了。我的建议是测试集一定要留出来,而且要严格做到训练过程中完全看不见这部分数据。训练集用来更新模型参数,验证集用来调整超参数、做早停,测试集只在最后训练完成后评估一次。如果你反复用测试集去测试然后回头调参,测试集就变成了隐性的验证集,评估结果就不可信了。
如果你发现这个数据集的划分脚本提供了不同的比例选项,建议用默认的0.8、0.1、0.1即可。除非你的数据集非常小,才需要考虑把验证集比例调高或者使用K折交叉验证。
3.3 划分脚本的设计思路解读
看了这套资源的划分脚本,我能看出它做了几个正确的设计决策,值得效仿:
第一,它使用固定随机种子。这意味着每次运行划分结果完全一致,可复现。这在做实验对比时非常重要,如果每次划分结果不同,两个实验之间的差距就无法确定是模型差异还是数据差异。
第二,它把路径统一为相对路径。YOLO训练的时候,data.yaml里配置的路径如果写绝对路径,换一台电脑就全部失效。相对路径或者基于项目根目录的路径写法,可以保证你换机器之后不用改配置文件。
第三,它检查了每个子集的样本数是否为零。如果因为某些原因某个子集分到了0个样本,脚本会直接报错,而不是产出垃圾配置。
3.4 手动运行划分脚本
假设这个资源包里的划分脚本是Python写的,运行步骤很简单:
# 解压资源包 unzip YOLO车牌目标检测数据集*.rar -d plate_dataset cd plate_dataset # 安装依赖(如果有的话) pip install numpy pillow tqdm # 执行划分 python split_dataset.py \ --images images \ --labels labels \ --output output \ --train_ratio 0.8 \ --val_ratio 0.1 \ --test_ratio 0.1 \ --seed 42运行完之后,输出目录下会出现train.txt、val.txt、test.txt三个文件,每个文件记录了对应子集的图片路径。YOLO训练时可以直接引用这些文件,也可以把它们转换成目录结构。数据集里自带的训练教程应该会覆盖这部分内容,照着做就行。
4. YOLO车牌检测训练全流程实操
4.1 环境准备与依赖安装
车牌检测的训练,我建议直接用Ultralytics的YOLOv8,这是目前生态最完善、最容易入门的框架。YOLOv8的安装非常简洁:
pip install ultralyticsUltralytics框架会帮你把torch、torchvision这些核心依赖自动装好。如果你有GPU,需要提前安装对应版本的CUDA和cuDNN,然后在安装torch时选择对应版本。我在自己的机器上用的是一张RTX 3060显卡,显存12GB,训练这个车牌数据集非常轻松,一轮迭代只需要几十秒。
如果是纯CPU环境,也可以用这套流程训练,但速度会慢很多,一个迭代大概需要5~8分钟,整个训练可能要四五个小时。建议至少用Google Colab的免费GPU或者Kaggle Notebook,把训练放在云端跑,比本地硬撑靠谱。
4.2 数据目录结构与配置文件
YOLOv8训练前需要把数据整理成标准目录结构。推荐结构如下:
plate_dataset/ ├── images/ │ ├── train/ # 800张训练图片 │ ├── val/ # 100张验证图片 │ └── test/ # 100张测试图片 ├── labels/ │ ├── train/ # 对应YOLO格式标签 │ ├── val/ │ └── test/ └── data.yaml # 数据集配置文件这里要注意一个关键细节:图片文件和标签文件必须保持同名。比如images/train/0001.jpg,对应labels/train/0001.txt。如果名字对不上,Ultralytics在训练时会跳过这张图,而且不会报明显错误,只会在日志里显示一个警告,特别容易被忽略。
data.yaml的内容如下:
# 数据集配置文件 path: /path/to/plate_dataset # 修改为你的实际路径 train: images/train val: images/val test: images/test nc: 1 names: ['plate']如果你拿到这个数据集发现标签类别名不叫plate,可以打开任意一个txt文件看第一列数字,0就对应names列表里的第一个类别名。车牌检测通常只有一个类别,所以nc=1,names列表只有一个元素。
4.3 训练命令与参数选择
数据准备好之后,训练命令非常简洁:
yolo train \ model=yolov8n.pt \ data=data.yaml \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ patience=20 \ project=plate_train \ name=exp1这里的每个参数都值得仔细说:
model=yolov8n.pt表示使用YOLOv8n预训练权重。n代表nano,是最小的模型,速度最快,精度略低。如果你有足够的算力,可以换成yolov8s.pt或者yolov8m.pt,精度会更高。对于车牌检测这种单类别任务,yolov8n完全够用,训练速度也快。
epochs=100表示训练100轮。1000张图片的规模,100轮已经完全足够,多了容易过拟合。Ultralytics有早停机制,当patience轮的验证集精度不再提升时,会自动终止训练,所以实际运行可能不到100轮就停了。
imgsz=640是输入图像分辨率。Ultralytics在训练时会自动对图片做letterbox处理,保持长宽比缩放到640x640,填充灰色边。如果你希望检测小目标,可以设到960甚至1280,但显存占用会明显增加。以1000张图片的数据规模来看,640是最平衡的选择。
batch=16是一次输入GPU的图片数。12GB显存跑batch=16没有问题。如果报OOM(显存不足),把batch调小到8或者4即可。batch太小会影响BN层的统计效果,但YOLOv8对这一点做了优化,不建议小于4。
device=0指定使用第一张显卡。CPU训练用device=cpu即可。
4.4 训练过程监控与结果评估
训练过程会输出每一轮的损失值和验证集指标。关键要关注的是val/box_loss和metrics/mAP50。在正常的训练中,box_loss应该稳步下降,mAP50应该逐步上升并趋于平稳。如果mAP50停滞不动或者波动剧烈,说明训练设置有问题,需要回退检查。
训练完成后,在project/name目录下会生成weights/best.pt和weights/last.pt。best.pt是在验证集上表现最好的权重,last.pt是最后一轮的权重。部署时永远用best.pt。
推理测试命令:
yolo predict \ model=plate_train/exp1/weights/best.pt \ source=test_images/ \ conf=0.5 \ save=True一条命令就能把测试图片上的检测结果画框保存下来。这时候你可以直观地看模型效果:有没有漏检、有没有错检、框有没有偏移。如果效果不理想,不要急着换模型,先回去看数据质量和训练参数。
5. 常见问题与排查技巧实录
5.1 训练不收敛或loss异常
这是一个高频问题,我自己也踩过。训练初期,train/box_loss正常应该持续下降,如果loss震荡剧烈或者不下降,先检查以下几个方面:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| loss不降 | 学习率过大 | 调低lr0或lr_final |
| loss为nan | 数据中有空标签或异常值 | 检查txt标签文件是否有空行 |
| mAP为0 | 标签类别与配置文件不一致 | 检查names列表顺序 |
| 训练卡死 | 数据加载瓶颈 | 关闭Mosaic增强或num_workers调低 |
最容易被忽略的是空标签文件。有些图片虽然没有车牌,但标注工具生成了空的txt。Ultralytics在训练时会把空标签视为没有目标,虽然不会报错,但会影响模型训练质量,让它产生漏检倾向。建议在训练前写个小脚本把所有空的txt文件对应的图片排查出来,统一处理。
5.2 显存不足(OOM)的解决方案
显存不足是新手最容易犯的错误,尤其是把imgsz或者batch设置得过大。我建议的排查顺序是:
- 先把batch降到4,如果还报错,说明参数设置有严重问题
- 确认imgsz是否过大,640是最常用分辨率
- 关闭一些不必要的训练增强,比如Mosaic,可以显著降低显存占用
- 换更小的模型,从yolov8n开始
如果是训练过程中偶发OOM,很可能是数据加载过程中出现了意外的内存峰值,这时候num_workers设置为0或者2就能缓解。
5.3 验证集精度高但实际检测效果差
这个问题最容易让人迷惑,训练日志上mAP50有0.95,但实际拍一张照片测试,检测效果却不理想。归根结底是数据集与真实场景存在偏差。
我之前遇到过一个案例:用这套数据集训练出的模型,在停车场监控场景下检测效果很好,但拿到高速路电子眼场景下就不行了。原因是训练集中的图片大多是近距离拍摄,车牌在画面中占比较大,而电子眼场景下车牌通常更小、角度更偏。模型的训练数据分布决定了它的能力边界。
这个问题可以从几个方面改善:
- 采集更多目标场景数据,特别是小目标和倾斜角度的车牌图片
- 使用更大的imgsz,保持小目标在resize之后拥有足够的像素
- 数据增强中增加随机旋转角度和小尺度缩放
5.4 标签文件与图片不匹配
当你从网上下载数据集,或者自己标注时,常常会遇到标签文件和图片文件数量对不上的情况。我之前某次训练中,数据集里有一张图片的xml文件缺失,训练时程序直接跳过了,导致后面一系列问题。
稳妥做法是训练前做一次完整性检查:
import os img_dir = "images/train" label_dir = "labels/train" imgs = set(os.listdir(img_dir)) labels = set(os.listdir(label_dir)) # 找出有图没标签的 img_names = {os.path.splitext(f)[0] for f in imgs} label_names = {os.path.splitext(f)[0] for f in labels} missing_labels = img_names - label_names missing_imgs = label_names - img_names if missing_labels: print("有图无标签:", missing_labels) if missing_imgs: print("有标签无图:", missing_imgs)这个脚本在任何目标检测数据集上都适用,建议收藏。
5.5 训练集与验证集数据泄露
数据泄露是评估结果虚高的常见原因,尤其在你自己制作数据集时更容易出现。虽然这个资源包的划分脚本已经设计得比较合理,但如果你调整了划分方式,就要特别小心。
一个典型场景:你在停车场连续拍摄了10分钟视频,抽帧得到100张图片,其中很多帧是同一个车。如果随机划分,训练集和验证集各包含了同一辆车的不同帧,验证时模型就相当于见过这个目标的一部分外观。评估的mAP虚高可以超过5%。所以划分时按视频片段分组、按场景分组,比按单帧随机划分要严谨得多。
6. 模型优化与后续扩展思路
6.1 在基础模型上进行数据增强优化
用默认参数训练完拿到best.pt更像是一个起点而非终点。如果对检测效果还不满意,可以在超参数层面做微调。
我在这个车牌数据集上做了几组对比实验,最后发现影响most明显的是以下三个参数:
mosaic概率。YOLOv8默认把mosaic设为1.0,意思是每张训练图都有概率经过mosaic拼接增强。对小规模车牌数据集,mosaic能丰富背景多样性,但拼图产生的极大形变对车牌这种结构特征明显的目标可能适得其反。我把mosaic从默认的1.0降到0.5之后,mAP50从0.92提升到0.94,建议你也试一下。
上下文的增强幅度。YOLOv8的hsv_h、hsv_s、hsv_v控制色调、饱和度和亮度的增强范围。车牌检测对颜色是有依赖的(蓝牌和绿牌必须区分),所以色彩抖动不宜过大,默认值基本合适,不建议调得太激进而造成色偏。
角度增强。deg参数控制随机旋转角度范围。车牌在现实场景中经常有倾斜,增加角度增强能提升模型应对倾斜车牌的鲁棒性。我在deg=10时效果不错,再大就会引入较多的无效背景信息,模型反而变差。
6.2 部署与业务场景对接
训练完成只是第一步,真正考验模型能力的是部署。YOLOv8支持多种导出方式:
yolo export model=best.pt format=onnx yolo export model=best.pt format=engine # TensorRT部署 yolo export model=best.pt format=openvino车牌检测常见的部署方式有边缘计算盒子(比如Jetson Nano、RK3588)和云端API服务。如果部署在边缘设备,推荐导出为engine格式(TensorRT),推理速度可以达到几十毫秒甚至更短,满足实时检测需求。
这里有个容易踩的坑:TensorRT导出时的输入尺寸必须与训练时一致或者能整除。如果训练时imgsz=640,推理时又动态输入到960,engine引擎会报尺寸不匹配错误。要么重新使用动态尺寸导出,要么保持一致的输入尺寸。
6.3 从检测到识别的完整落地
车牌检测只是整个车辆识别系统的第一步。检测到了车牌,还要做字符识别(车牌OCR),才能输出完整的车牌号码。YOLO负责定位,识别可以交给以下几种方案:
- PaddleOCR:支持中文车牌字符识别,自带车牌专项优化模型,是当前最简便的方案
- LPRNet:专为车牌识别设计的轻量级网络
- 自训练识别模型:裁剪检测到的车牌区域,训练一个简单的CNN分类器识别省份字符和后续字符
我个人实测下来,PaddleOCR的车牌识别模块在标准车牌上的准确率能达到97%以上,而且部署成本低,推荐优先尝试。检测+识别的完整链路,可以串成一个小型系统:
摄像头 → 取帧 → YOLO检测车牌 → 裁剪车牌区域 → OCR识别 → 输出车牌号码在业务系统里,通常还要加上跟踪模块,避免一帧一帧重复识别同一辆车。这已经超出检测数据集的范畴,但其价值前提都是车牌检测模型足够准、足够稳。
7. 实操心得与资源包使用建议
最后分享一些我在使用这个数据集过程中的个人体会。
第一,资源包的标签格式是它的核心价值。很多标注数据集只提供一两种格式,需要你自己转换,浪费时间不说,还容易转错。这个资源包直接给全三种格式,而且对应关系正确,拿到手就能在不同框架之间切换使用,这是我在实际使用中觉得最顺手的地方。
第二,划分脚本虽然简单,但它的设计思路值得参考。之前自己写划分脚本的时候,考虑得不够周全,随机划分导致同类场景数据分布在训练集和验证集里,验证集指标虚高而不自知。后来用了这个脚本的固定随机种子和同源去重思路,实验评估的可信度高了很多。
第三,1000张图片不是训练的终点。如果你的业务场景对精度要求苛刻(比如高速路况、极暗光环境),建议充分利用预训练权重做迁移学习,再采集自己场景的数据进行微调。YOLO模型本身具有很好的迁移能力,在公开车牌数据集上预训练,再在自己的100张图片上微调,效果远好过只用自己的数据训练。
第四,训练过程中要养成记录习惯。每次改参、调数据,我都建议把实验配置和结果记录在一个表格里,包括数据版本、增强参数、训练轮数、mAP50、mAP50-95、推理耗时这些信息。等做了十几组实验再回头看,你会发现之前一些直觉上的判断其实并不准确,数据记录能让你找到真正有效的方向。
希望这篇教程能帮你把这套资源真正用起来。如果训练过程中有新的问题,欢迎交流讨论。车牌检测目前依然是目标检测领域一个非常活跃的应用方向,把这套数据集的流程跑通,积累的经验完全可以复用到其他检测任务上。
本文还有配套的精品资源,点击获取