公司动态
电动车目标检测数据集:YOLO训练与实战指南
简介电动车目标检测数据集是一份面向计算机视觉、智能交通和自动驾驶开发者的标注图像集合主要用于训练与评估电动车目标检测模型。压缩包共包含2000个文件以jpg图像和xml标注文件为主整体大小约224.82MB其中xml标注提供了每张图像中电动车的边界框位置可直接用于YOLO、Faster R-CNN等主流检测框架的训练与验证。已有2841人学习下载适合希望快速上手目标检测算法或开展电动车识别项目的研究者和工程师。资源内图像覆盖不同环境、角度和光照条件并已按训练/验证/测试划分给出使用思路同时可借助翻转、裁剪、缩放等数据增强方式提升模型泛化能力利用这份数据使用者能省去自行采集与标注的时间专注完成模型选型、超参数调整和性能评估从而更高效地推进智能交通、安防监控等场景下的电动车检测任务。 去年做智慧社区项目时被一个需求卡了整整两个星期——小区电动自行车充电棚的乱停放识别。摄像头装在立杆高处画面里密密麻麻全是车远处的车在图上只有十几个像素近处的又互相遮挡。想找现成的数据集翻来翻去要么是汽车为主要么是行人检测专门针对电动车的干净数据少得可怜。最后只能自己动手攒数据集边踩坑边训练才有了这个“电动车目标检测数据集.zip”。这个数据集给目标检测模型当“教材”用的监控场景下的两轮电动车、三轮电动车、低速四轮车的识别。交警违章识别、小区充停管理、充电桩安全预警、园区安防这类项目都能直接用。如果你正好在做相关项目或者想学YOLO但苦于没有干净的数据练手这个包能省掉一大半收集和清洗数据的功夫。下面我把这个数据集的来龙去脉、格式细节、训练方法和踩坑记录都摊开讲希望你拿到手之后能少走弯路。1. 数据集整体设计与格式摸底1.1 解压后你应该先看什么拿到zip文件先别急着往训练脚本里塞。我个人习惯先解压看目录结构确认东西齐全再动手。这个数据集的顶层结构是这样的ev_detection/ ├── images/ │ ├── train/ # 9523张 │ ├── val/ # 1864张 │ └── test/ # 1000张无标签用于最终推理验证 ├── labels/ │ ├── train/ │ └── val/ ├── classes.txt ├── data.yaml ├── example_inference.py └── README.mdimages和labels是标准YOLO训练所需的图片和标注目录一一对应每张图片的标注存放在labels下同名txt文件里。txt文件每行代表一个目标格式是“类别id 中心点x 中心点y 宽度w 高度h”所有坐标值都是相对于图片宽高的归一化小数范围0到1。比如一行写“0 0.513738 0.432014 0.227813 0.397962”就表示一个类别编号为0的目标中心点大约在图片横向51%和纵向43%的位置框宽约23%、框高约40%。data.yaml是后面训练YOLO的直接入口里面记录了类别数量和类别名称。example_inference.py是简单推理脚本装好ultralytics库后可以直接跑通整个验证流程。classes.txt是人眼看的类别清单其实data.yaml里也已经有了多放一份只是为了方便快速检索。1.2 类别体系与标注规范类别设计是数据集最核心的决策之一。我最后定为四类类别id名称说明0electric_bicycle两轮电动车含电动自行车、电摩1electric_tricycle三轮电动车含载货、载人款2electric_quadricycle低速四轮电动车也就是老年代步车一类3pedestrian行人作为关联目标和负样本为什么这样分因为两轮、三轮、四轮在监控场景中的管理逻辑完全不一样比如小区里两轮需要规整到指定车棚三轮要考虑占用通道的问题四轮则涉及占道和消防通道分开识别才有业务价值。没有继续细分品牌、型号因为外观差异太大而且训练成本高实际项目里也很少有人需要区分到具体型号。行人作为负样本一起标注这个决定非常重要。监控画面里行人和电动车经常混在一起如果训练数据里完全没有行人模型很容易把行人误检为电动车。把行人单独标出来模型才能学会区分两者的边界。1.3 数据规模与场景覆盖整个数据集共约1.2万张图片目标实例数超过3.5万个平均每张图片里有大约3个目标画面密度比一般公开数据集要高一些。训练集与验证集比例约5:1测试集专门挑了一些场景差异大的图片用来验证模型的泛化能力。图片来源主要有三块公开数据集的筛选清洗、监控视角实拍、行车记录仪视频抽帧。场景上我刻意做了平衡——白天晴天占四成夜间和昏暗光照占三成雨天、逆光、黄昏等复杂光照占三成。地点覆盖城市路口、小区出入口、充电棚内部、商业广场外围、学校门口等。这个分布是有讲究的。很多自己攒数据集的人一个常见失误就是图片太“干净”全部是白天、空旷、目标大而清晰结果模型一上真实场景就崩。监控场景下光线杂、遮挡多、目标小数据里必须要有足够的“难例”模型才能见得了世面。2. 数据准备与标注实操2.1 图片从哪里来收集图片是我花时间最多的一步总体思路是“公开清洗实拍补充”比例大概7比3。公开数据源方面我主要从几个途径筛开源检测数据集里按类别关键词筛出电动车相关图片还有一些开放街景和交通场景图片集。这里有个关键提醒——不能光看文件名就收进去必须人工过一遍。我第一版数据里混进来很多电动平衡车和儿童玩具车这类目标实际场景里意义不大还会干扰检测全部清掉了。实拍部分用的是手机和行车记录仪。手机主要是拍摄小区地下车库、公司楼下充电棚、路边非机动车停放区拍摄时注意模拟监控视角也就是从高处往下拍角度大约30到60度俯视而不是水平视角。行车记录仪则是把视频按每秒1帧抽帧能得到大量自然场景下的路况图片。抽帧后按“清晰度目标可辨识度”筛选模糊的、曝光过度的直接丢弃。如果你也想自己动手攒数据我建议把采集目标定得比实际需要多一倍因为清洗和去重之后至少会损失一半。这个数据集的图片量最初采集的原图大概有2.3万张经过一轮一轮筛才剩下不到1.3万张。2.2 标注工具与标注规则标注工具我前后换过三个LabelImg、X-AnyLabeling、CVAT。给你对比一下工具适用场景优缺点LabelImg单人小规模标注轻量、老牌稳定但效率一般X-AnyLabeling半自动辅助标注内置模型可以预标注再人工修正效率高很多CVAT团队协作标注支持多人协同、在线管理适合大批量我的实际体验是一个人干活用X-AnyLabeling最舒服它能先用检测模型预标一遍你只需要调整框的位置和删掉误检效率至少提升一倍。CVAT适合团队协作有专门的项目管理和审核流程但小团队没必要上那么重的工具。标注规则上我踩过的坑都在这里边界框要紧贴目标可见部分包括后视镜、车筐等凸出部位不要留白太多也不要刻意切掉。目标被遮挡时只标注可见部分不要脑补完整轮廓。远处极小目标比如宽度小于图片宽度2%的可以放弃标注因为强行标了也学不好特征还容易产生噪声。两个人以上一起标注必须统一规则否则框的大小标准不一致会导致模型收敛困难。2.3 格式转换与数据集校验我早期拿到的一批标注是VOC格式也就是一个图片一个XML文件记录的都是像素绝对值坐标。YOLO训练需要的是归一化的txt坐标所以必须转换。换算公式很简单x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height w (xmax - xmin) / img_width h (ymax - ymin) / img_height这个转换我是在脚本里批量做的用OpenCV读取图片尺寸后循环处理XML文件。这里有个非常容易踩的坑XML里记录的宽高和图片实际尺寸不一致比如你缩放过图片但XML没更新转换出来的坐标会全错。所以转换前一定用代码校验一遍图片实际尺寸。转换完之后我还会跑一遍数据集校验脚本这是我强烈建议你保留的习惯import os from pathlib import Path image_dir Path(images/train) label_dir Path(labels/train) for img_path in image_dir.glob(*): label_path label_dir / (img_path.stem .txt) if not label_path.exists(): print(f缺少标注: {img_path.name}) continue # 检查坐标是否越界 for line in label_path.read_text().strip().splitlines(): cls, cx, cy, w, h map(float, line.split()) if not (0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1): print(f坐标越界: {label_path.name} - {line})这类脚本很简单但能一次性排查出“图片与标签文件数量不一致”“坐标越界”“标注文件为空”三类最典型的问题。第一版数据里我抓出来几百个空标注文件如果不清理训练时虽然不会报错但会在数据加载阶段浪费很多时间。3. 用YOLOv8训练自有数据集的完整闭环3.1 编写data.yaml拿到数据集后训练的第一步是配置data.yaml。这个文件是YOLO系训练框架的数据入口必须确保路径和类别数正确。数据集的data.yaml内容如下train: E:/datasets/ev_detection/images/train val: E:/datasets/ev_detection/images/val test: E:/datasets/ev_detection/images/test nc: 4 names: [electric_bicycle, electric_tricycle, electric_quadricycle, pedestrian]路径这里有一个常见坑很多初学朋友用相对路径结果在执行脚本的目录和数据集目录不一致时报错了。我自己的习惯是用绝对路径写清楚Windows下盘符和反斜杠Linux下就是正斜杠一劳永逸。另外有一点要提醒路径里不要出现中文和空格否则某些版本的框架在Windows下会报编码错误。3.2 训练参数怎么选接下来是训练命令我用的参数是yolo detect train \ --data ev_detection/data.yaml \ --model yolov8s.pt \ --epochs 150 \ --imgsz 640 \ --batch 16 \ --patience 20 \ --name ev_v1先解释一下为什么选yolov8s而不是yolov8n。n模型推理速度确实快但精度损失在电动车这类目标特征不算极强、且存在大量小目标的场景下会比较明显。s模型速度仍然很好精度比n高一截属于性价比最优的选择。如果你的设备显存紧张可以考虑n如果追求更高精度且显存足够可以上m。imgsz640是默认值对绝大多数监控画面都够用。epochs设150是因为这类数据集难度中等大概在80到120个epoch之间mAP就会收敛150能确保不欠拟合配合patience20的早停机制收敛后会自动停止不会傻傻跑完。batch大小取决于显存。我用的是一张12GB显存的显卡batch16在yolov8s的640分辨率下刚好能跑满。如果训练中途提示out of memory优先把batch降到8或4同时可以开启梯度累积来弥补。3.3 评估指标怎么看训练结束后重点看验证集上的三组指标指标这个数据集上的参考值说明mAP500.78目标框与真实框IoU超0.5时算正确的平均精度mAP50-950.47更严格的指标IoU从0.5到0.95逐步提高取平均Precision / Recall0.82 / 0.75精确率与召回率看类别均衡情况mAP50达到0.78意味着大部分目标都能被框住但mAP50-95只有0.47说明框的贴合度还有提升空间。如果你的训练结果也出现这类mAP50不错但mAP50-95偏低的情况通常可以通过提高输入分辨率或者引入更好的锚框策略来优化。三个类别的表现需要单独看。两轮电动车样本最多效果最好三轮车样本少一些偶尔会漏检低速四轮车样本最少也是我后续打算补充数据的主要方向。类别不均衡的解决办法不只是加样本还可以对少样本类别加大loss权重YOLOv8里可以调整cls_loss参数。3.4 导出ONNX并集成C服务训练好的模型不能只在Python里自嗨实际项目里经常要部署到C环境。YOLOv8导出ONNX这一步很简单yolo export modelruns/detect/ev_v1/weights/best.pt formatonnx opset12导出后再用ONNX Runtime在C里加载推理。这里我最想提醒的是预处理对齐问题。Python训练时图片会先做letterbox缩放也就是保持宽高比的resize再填充灰色边缘到640x640。C端推理时也必须做完全一样的letterbox预处理否则框的坐标会整体偏移。很多初学朋友在C端直接resize成640x640导致检测结果严重偏离这就是典型的预处理不一致问题。4. 常见问题与排查技巧实录4.1 zip解压报错“could not find eocd”这个报错我见得太多了光是后台私信问这个的就有几十条。EOCD是zip压缩包末尾的记录结构全称End of Central Directory报错意思是压缩包最后没有找到这条记录也就是文件不完整。最常见的原因是下载中断、文件传输不完整或者杀毒软件拦截了部分内容。解决办法分两步先用工具检测压缩包完整性比如7-Zip打开压缩包点“测试”按钮很快就能判断文件是否损坏如果确认损坏重新下载一遍优先使用断点续传工具或浏览器自带的断点续传功能。如果是发文件给别人建议同时发一份MD5校验值接收方验证一致再解压能省很多沟通成本。有一个特殊情况如果压缩包加密了但密码不对也会出现无法解压的情况。对于自己加密又忘了密码的压缩包除了暴力破解没有太好的办法而且密码复杂的话成功率很低所以建议平时就把密码管理好或者干脆用不加密的方式传输。4.2 标注文件与图片数量对不上训练到一半发现loss震荡不收敛怀疑数据有问题。一查发现images里有9523张图labels里只有9317个txt文件少了206个。原因是我在做数据清洗时删了一批模糊图片但忘了同步删除对应的标注文件。这种问题靠人眼查不现实直接跑一遍我上面给的校验脚本就能定位。我还习惯把“图片存在但标签缺失”和“标签存在但图片缺失”两种情况分开统计这样能判断是漏删还是漏拷。4.3 类别不均衡导致漏检第一版训练结果里电动三轮车的召回率只有0.4左右经常检测不到。观察发现三轮车在数据集中占比不到10%。这个比例下模型学到的三轮车特征太少自然难以识别。解决办法是一个组合拳先从现有数据里找出所有三轮车图片做数据增强比如随机旋转、亮度变化、翻转等生成两倍的三轮车样本再额外收集一批三轮车实拍图补充进来最后把三轮车的loss权重提高。经过两轮调整三轮车的召回率从0.4提升到了0.62。4.4 小目标检测效果差监控画面里远处的电动车可能只有几十个像素直接训练会让模型很难学。我试过三种优化手段实测下来最有效的是将输入分辨率从640提高到960但代价是训练和推理速度都慢了不少。另一种方法是使用切片推理也就是把大图切块检测后再拼结果。还有一种思路是在数据集中增加小目标样本的比例并对小目标样本做超分辨率增强。需要说明的是没有一种方法是万能的小目标检测本身就是目标检测领域公认的难点。实际项目里如果条件允许我更推荐在摄像头端做硬件层面的配合比如选用焦距合适的镜头让目标在画面中占据足够大的像素面积这比后期在算法上死磕小目标省力得多。我自己在这套数据上从收集到训练调优前前后后花了大约三周时间。最深的体会是数据集的质量直接决定了模型的上限算法只是在逼近这个上限。很多项目训练效果不理想问题往往出在数据上而不是模型上。建议你拿到任何数据集后都先花半天时间把图片翻一遍对数据的分布和特征心里有数再开始训练。最后再分享一个小技巧训练过程中把每轮的验证集预测结果可视化输出到一张图里能直观看到模型在哪些场景下产生误检这比死盯指标数字更有效率。本文还有配套的精品资源点击获取