尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

街景门牌号数据集构建与目标检测实战:从标注到YOLOv8训练全攻略

街景门牌号数据集构建与目标检测实战:从标注到YOLOv8训练全攻略 简介街景门牌号数据集是一份面向计算机视觉研究与AI开发者的图像识别专用数据包聚焦自动识别街景中的门牌号码可支撑智能导航、自动驾驶与智慧城市等场景中的目标检测和文字识别任务。压缩包共7个文件大小约885.18MB包含3个zip图像包、2个csv表格与2个json标注文件zip按训练、验证、测试划分图像json记录对应门牌号位置与类别标注csv提供数据列表和样例提交格式方便直接构建训练流程。数据集已对训练、验证、测试集做了明确切分能有效避免模型过拟合配合data_loader等工具可批量完成图像预处理与格式转换快速接入CNN等深度学习模型进行训练与调优。目前已有517人学习下载适合中高级开发者用于图像识别模型实验、算法精度对比或相关竞赛题的实战演练是一份结构清晰、可直接落地的数据集资源。 街景门牌号这个方向说实话在计算机视觉里一直是个“看着简单、做起来全是坑”的任务。这两年做自动驾驶、配送机器人、甚至房产测绘的朋友应该都有感触——门牌号识别精度上不去下游业务根本跑不起来。我也在街景门牌号数据集构建和模型训练上折腾了大半年踩过不少坑今天把完整思路和实操过程整理出来希望给正在做或者准备做这块的朋友一些参考。1. 项目概述与数据集定位1.1 街景门牌号数据集到底是什么街景门牌号数据集核心就是收集街道场景下包含门牌号的图片并对门牌号位置和内容进行标注形成一个可供目标检测和OCR识别任务使用的标准数据集。它和普通的车牌识别数据集不同门牌号的形态千奇百怪有横排的、竖排的、带中文单位名称的、纯数字的、手写体的还有被树枝、电线杆挡了一半的。这类数据集的典型应用场景非常明确自动驾驶车辆定位与导航特别是最后100米的精确停靠。外卖/快递配送机器人或骑手快速定位目标楼栋。GIS测绘地图厂商更新门址数据比人工外业采集效率高得多。应急管理救援人员快速识别建筑物编号。这个领域最早被大家熟知的是Google的Street View House NumberSVHN数据集但SVHN是已经裁切好的数字级图像直接拿来做端到端检测不行。真实场景里门牌号往往只占整张街景图的一小块区域背景噪声巨大光照变化剧烈这就是我们需要自己构建数据集的根本原因。1.2 适合谁来参考如果你正在做以下事情这篇文章应该能帮到你自己采集了街景图像、但不知道如何规范标注门牌号。想基于公开数据集如Mapillary、SVHN、OpenImages组合出一个可用的训练集。需要在YOLOv8或MMDetection等框架下训练门牌号检测模型。想把检测和OCR串成一条完整pipeline但总在数据环节掉链子。无论你是算法工程师、数据标注团队负责人还是研究生核心思路都适用。我下面讲的流程既有数据层面的操作细节也有模型训练层面的参数和经验。2. 数据采集与清洗经验2.1 数据来源怎么选构建数据集的第一步不是写爬虫而是想清楚数据来源。我用过的来源主要有三类各有优劣。公开数据集组合是性价比最高的起点。SVHN提供了超过60万张数字级图像适合作为字符分类的补充Mapillary的street-level imagery数据量大而且很多国家有专门的门牌号标注图层OpenImages里也有不少带门牌号的街景图但噪声较大。如果项目对地理范围有要求比如只做国内门牌号那公开数据基本不够用必须自己采集。自己采集这块主要有两种方式。一种是车载摄像头或行车记录仪扫街成本低但数据质量受天气、车速影响大另一种是直接使用腾讯地图、百度地图的街景API采集静态图优点是画面清晰、角度丰富缺点是需要处理API调用的配额限制和合规问题。我自己的项目里大概70%来自API街景图30%来自公开数据集效果比较均衡。合成数据是很多人忽略的选项。用3D渲染或图像合成的方式把不同类型的门牌号贴到街景背景图上可以快速生成大量带精确标注的数据。我试过用Blender生成底图再叠加字体渲染虽然和真实场景有domain gap但用来预训练模型、让模型先学会“门牌号长什么样”还是很有效的。2.2 数据清洗到底洗什么很多人拿到数据就直接标注这个习惯要改。街景数据不洗后面都是事。我总结了三层清洗规则第一层清晰度过滤。用Laplacian算子计算图像梯度方差低于阈值的直接丢弃。门牌号本身是细节纹理图像一模糊就彻底没法标了。实际操作中我会把分辨率低于720p的图统一降级处理优先保证近景和中等距离的图。第二层重叠与重复过滤。街景API连续拍摄的帧之间重叠率非常高如果直接用训练集和验证集之间会有大量近似重复导致验证指标虚高。我按感知哈希pHash计算帧间相似度相似度超过0.85就只保留一张。第三层场景均衡。这一步很多人不做但特别重要。如果数据集中在晴天、正午、商业区模型一到阴天或住宅区就崩。我会统计每张图的亮度直方图、对比度和纹理复杂度然后按照光照条件晴天/阴天/夜晚、场景类型住宅/商业/工业、拍摄角度正面/侧面做分层抽样确保每个子类都有足够的样本。3. 标注规范设计与质量控制3.1 标注类别怎么定门牌号标注不是简单画个框就完事。我最初犯的错误就是只标一个“门牌号”类别结果模型把很多店招、消防牌都当成门牌号精度惨不忍睹。后来参考了SVHN和ICDAR的标注思路做了分层设计Level 1门牌号区域House Number Region。覆盖整个门牌号物理载体的外接框比如一块搪瓷牌、一个灯箱或一行喷绘字。Level 2字符级Character-level。框出每一个数字或字母用于后续OCR识别或端到端识别。检测模型用Level 1的框训练识别模型用Level 2的框训练两个模型串成pipeline。这样做的好处是当门牌号区域检测正确但字符识别错误时可以单独优化OCR模型而不需要重新训检测模型。另外我还增加了一个“ignored”类别。街景图中经常有被车辆、行人、树干大面积遮挡的门牌号或者严重倾斜畸变到人眼都难以辨认的门牌号。这些对象标注为ignored训练时不计入loss但也不会被当成负样本误伤。3.2 标注工具与规范细节标注工具我推荐X-AnyLabeling和LabelStudio都不需要配置太复杂的环境支持矩形框、多边形和属性标签。团队协作的话LabelStudio更好用可以多人同时标注并管理审核流。标注规范上有四个细节一定要写进SOP里框的紧致度Level 1框必须紧贴门牌号外围不能留太多背景但如果是灯箱、招牌这类边缘带装饰的可以包含完整载体宁大勿小。遮挡规则遮挡面积小小于20%且能判断完整内容的正常标注遮挡面积大或结构明显不完整的标为ignored。多行门牌号很多门牌号是两行或三行比如“XX路”一行、“168号”一行Level 1只画一个包含所有文本的大框Level 2按物理行分别画框并标注阅读顺序。单字符框的边界数字“1”和字母“I”很容易混淆框的边界必须贴着字符的可见边缘不能把衬线字体装饰部分裁掉。3.3 质量控制在标注环节有多重要标注质量直接影响模型上限我在这块吃过亏。第一次训练时验证集mAP达到0.85但实际测试很差后来发现是因为标注员把很多模糊背景也画进了框里模型学了一堆噪声特征。现在我要求所有标注数据必须经过双重审核第一轮由质检员按5%比例抽检框的IoU偏差超过0.2的退回重标第二轮训练负责人随机抽300张图亲自看图对比标注。如果实际业务场景允许还可以让审核员用模型预测结果辅助检查挑出那些“置信度高但明显标错”的样本。虽然这套流程前期慢一点但后期模型收敛速度会明显更快。4. 模型训练与评估配置4.1 检测模型选型门牌号检测本质上是小目标检测问题。我用YOLOv8n和YOLOv8m对比过也试过RT-DETR最后回归到YOLOv8m。原因很现实边缘设备部署时RT-DETR的显存占用和延迟还不适合YOLOv8n速度快但小目标召回率不足。关键配置上有几个参数值得注意输入分辨率我采用1280x1280而不是默认的640x640。门牌号在整张街景图里常常只有几十个像素宽分辨率不够根本检不到。anchor虽然是auto但小目标场景建议手动指定anchor比例在数据集中统计所有标注框的宽高分布后填入让anchor初始位置更贴近真实分布。数据增强里mosaic和mixup我保留但调低了概率因为门牌号可能被拼接边界切断导致标注语义被破坏。我更依赖copy_paste把一些“门牌号主体”贴到其他街景图里做增强。close_mosaic设置为最后10个epoch关闭让模型在接近真实分布的数据上微调。4.2 训练细节和loss调优训练过程我分两阶段。第一阶段用公开数据集预训练batch size 32训练80个epoch输入分辨率640第二阶段用自建数据集微调输入分辨率1280batch size减半训练120个epoch。学习率用余弦退火初始0.001warmup 3个epoch。Loss函数默认的CIoU在常规框上没问题但门牌号长宽比极端竖长条CIoU对长宽比过于敏感容易导致loss震荡。我改用SIoU它在长宽比惩罚项上更平滑实测收敛速度和mAP都有小幅提升。如果你用的是YOLOv8原生代码直接修改loss函数的替换成SIoU就行代码改动量不大。分类loss我建议保留BCE因为门牌号类别不多纯数字、数字单位、数字字母BCE在多标签情况下更稳定。如果你要处理一个门牌号框同时包含中文和数字的情况BCE比softmax更合适。4.3 评估指标不能只盯着mAP这是我最想强调的一点。mAP是整体指标但门牌号场景里一定要分难度看指标。我把测试集按难度分为三档难度定义样例简单门牌号占图像面积5%光照均匀无遮挡晴天正面的金属牌匾中等门牌号占图像面积1%-5%轻微倾斜或阴影侧面拍摄、傍晚光照困难门牌号占图像面积1%部分遮挡或强反光远处小铭牌、雨天反光简单档mAP一般都能做到0.9以上中等档至少要0.75困难档如果低于0.4基本没法实际部署。我还额外统计了小目标召回率AR0.5 for tinyCOCO工具链里没有可以自己写脚本把所有标注框面积小于32x32像素的样本单独统计。ARtiny小于0.5就说明模型对小门牌号根本没学会需要回到数据层面解决而不是加数据增强。5. 常见问题与排查技巧5.1 模型老是漏检小门牌号怎么办这是问得最多的问题。我的排查路径很固定看特征图可视化。把某张含小门牌号的图送入模型提取backbone第3、4、5层的特征图如果小目标位置在第5层几乎看不见响应说明特征已经丢失需要加大输入分辨率或引入更浅层的特征融合。检查anchor的匹配情况。YOLO系列的标签分配和anchor尺寸强相关如果GT框和某个anchor的IoU低于阈值该目标就不会被分配为正样本等于直接忽略。通过分析匹配结果如果大量小目标没有匹配到anchor就要修改anchor尺寸。增加小目标的过采样。在数据加载器里按需对小目标密集的图片做repeat采样让模型多“看到”几次。5.2 训练loss收敛但验证mAP不动这种情况一般不是模型问题是标注噪声问题。用置信度阈值0.9的预测结果和GT做比对把“预测置信度很高但GT里没有对应框”的样本全部挑出来人工看一遍。你会发现很多漏标、错标的框把这些样本修正后重新训练mAP通常能涨3到5个点。另一个容易被忽视的是数据集划分泄漏。街景API采集时相邻帧往往来自同一条街的连续拍摄如果划分时随机打乱同一条街的图片会同时出现在训练和验证集里——模型记忆了街道场景而不是学会了识别门牌号。这种泄漏比标注错误更隐蔽验证mAP虚高测试集马上打回原形。解决办法是按街道名或地理位置分组划分。5.3 部署时门牌号误检特别多训练时mAP不低一部署到真实环境就到处乱框。大概率是训练数据的背景太单一。我的做法是准备一个“难例背景库”从实际部署场景中截取不包含门牌号的街景图作为负样本加入训练集。刚开始负样本比例加到10%就见效如果误检还多可以逐步加到20%。负样本不能直接全部丢进去要筛选背景有代表性的比如墙面纹理丰富的、有大量文字的店招区域、栏杆区域。6. 最终可以怎么扩展街景门牌号数据集的构建流程本质上是一个“小目标检测细粒度识别”的问题这套方法论完全可以迁移到其他场景。比如交通标志牌检测、店面招牌识别、能源行业里的电表读数识别甚至农业领域的果实计数技术栈和踩坑点几乎一致。如果你打算接着往下做有几个方向值得探索端到端识别检测和OCR合并成一个模型直接用detection transformer做端到端文本识别省去两阶段pipeline的麻烦。多模态融合结合GPS轨迹、点云数据对门牌号做三维定位形成真正的门址数据库。持续学习街景数据会随时间变化店铺装修、新建楼房都会影响模型。设计一个增量学习方案每次新增数据只微调部分层成本会低很多。我个人实际操作中的体会是数据集的质量决定了整个项目的天花板模型结构反而没那么关键。与其花时间刷各种backbone不如把数据清洗和标注规范做扎实。最后再分享一个小技巧所有数据在训练前用模型推理一遍把置信度在0.3到0.7之间的样本单独拿出来看这些往往是“模型有争议”的样本也是最能反映数据问题的地方很多标注错误和边界模糊都藏在这里修正它们的性价比非常高。本文还有配套的精品资源点击获取
返回列表