
简介面向目标检测算法研究与自动驾驶项目开发者的道路异常检测数据集资源。内容聚焦真实道路场景包含8000张高质量道路图片覆盖轻型机动车汽车、摩托车、小型卡车、小型货车、重型机动车公交车、卡车、拖拉机、挖掘机、厢式货车、道路损坏坑洼、裂缝、凸起、井盖、未铺面道路、行人、减速带等六大类别可用于道路异常检测、自动驾驶感知模型训练及通用道路数据集补充。资源包为单个PDF文件约5.08MB其中说明数据集结构、标注规范及百度网盘下载方式标注采用labelimg完成提供VOC、COCO、YOLO三种主流格式兼容常见检测框架另附YOLO11一键训练脚本和博主训练日志便于快速验证效果。已有203人学习浏览适合具备一定检测基础、希望扩充真实场景数据并开展自动驾驶道路感知项目的研究者与工程师。1. 道路异常检测数据集在解决什么问题8000张图与通用目标检测的本质差别做自动驾驶目标检测的同学应该都体会过一件事公开的COCO、VOC数据集里杯子、椅子、人、车一大堆可真到了自己的路测场景最要命的反而是路面上突然多出来的一个坑洞或者一段裂缝——通用检测模型根本没见过这种负样本场景。今天要拆的这套道路异常检测数据集是8000张图每张图都配好VOC、COCO、YOLO三种格式的标签再给一个直接训练YOLO11的一键脚本。它解决的核心问题是没有路测样本的时候想先把检测pipeline跑起来数据准备这一步就能卡住一整天。适合谁刚开始做交通基础设施巡检、用YOLO做路面病害检测或者正在给自动驾驶感知系统补道路异常类别的工程师和学生团队。这不是一个通用检测任务而是把数据背景、类别定义和标签输出都收敛到“路面上到底有什么异常”这一个窄而具体的任务拿过来就能练手、能对比、能往下扩展。2. VOC、COCO、YOLO三种标签格式的底账同一个目标框的三套写法2.1 VOC的XML里不止有坐标还有经常被忽略的size信息VOC格式的历史最长标注文件是XML一张图片对应一个XML文件根节点annotation下面通常挂着folder、filename、source、size和object列表。实际训练模型时能用到的主要是size节点里的width、height以及每个object节点里的name和bndbox。bndbox里存的是xmin、ymin、xmax、ymax四个绝对像素坐标都是直接在原图上量的。这套格式对人不友好XML冗余字段多但对机器解析很稳定所以早期检测任务都拿它当交换格式。我在处理别人给的VOC数据时第一步从来不直接写转换脚本而是先写一个小工具统计所有XML里有没有坐标超出图像宽高、有没有出现负坐标、有没有object节点缺name。原因很简单标注工具会产脏数据而你后面所有格式都会从它转出去脏数据会一级级放大。比如某个XML把xmax标成了1930而图宽是1920转成YOLO归一化坐标后w就会大于1Ultralytics训练时会把该框判定为无效样本直接丢掉。表面上loss还在降但训练完检测效果莫名差这种问题最难查。一个容易被新手忽略的点是XML里的坐标字段可能是小数。有些标注工具不管你怎么画框导出时坐标统一保留一位小数比如xmin328.5。所以转换脚本里应该先把字符串转成float再转int而不是直接int()否则坐标偏移1像素在小目标上会有可感知的影响。另外bndbox里值的顺序必须是xmin、ymin、xmax、ymax别对着别的项目的解析代码套有些工具导出的是左上角和宽高。2.2 COCO的JSON结构categories、images、annotations是怎么关联起来的COCO格式的整体形态是一个大JSON文件里面有三个顶层数组images、annotations、categories。images数组给每张图分配一个唯一id记录file_name、width、heightcategories数组给每个类别分配id和nameannotations数组存的是检测框本体每条annotation里最关键的是image_id、category_id、bbox、area、iscrowd。image_id指向images里的idcategory_id指向categories里的id这样三张表通过两个外键串起来逻辑上和关系型数据库很像。这里最反直觉的坑是category_id从1开始而不是从0开始。COCO官方把0号位置留给了背景所以pothole分到的id可能是1crack可能是2。但YOLO训练时类别id必须从0开始。把COCO JSON直接转成YOLO txt时如果不处理这个偏移pothole会被模型当成crack学习整个类别全错位。我一般会先遍历categories数组做一张原id到新id的映射表再逐条处理annotation。COCO bbox字段是[x, y, w, h]x和y是左上角绝对像素坐标w和h是框宽高不是右下角坐标。这一点和VOC完全不一样VOC的bndbox是左上角和右下角COCO是左上角和宽高。转换时如果按VOC的习惯去算中心点中心点会整体偏移半个框宽和半个框高。area字段官方含义是分割区域的像素面积但纯检测任务里基本都用w*h代替不影响YOLO训练。iscrowd默认填0表示这个目标不是一群密集不可分的个体。基于COCO转YOLO的脚本核心代码可以精简成下面这样import json def coco_to_yolo(input_json, output_dir): with open(input_json, r, encodingutf-8) as f: coco json.load(f) # 构建原category_id到连续新id的映射 new_id_map {} for new_id, cat in enumerate(coco[categories]): new_id_map[cat[id]] new_id # 建立image_id到图像信息的索引 img_index {img[id]: img for img in coco[images]} for ann in coco[annotations]: img img_index[ann[image_id]] img_w, img_h img[width], img[height] x, y, w, h ann[bbox] # COCO bbox可能带负坐标或越界统一裁剪到图像范围内 x max(0, x) y max(0, y) if x w img_w: w img_w - x if y h img_h: h img_h - y center_x (x w / 2) / img_w center_y (y h / 2) / img_h norm_w w / img_w norm_h h / img_h cls_id new_id_map[ann[category_id]] print(f{cls_id} {center_x:.6f} {center_y:.6f} {norm_w:.6f} {norm_h:.6f}) coco_to_yolo(road_anomaly.json, yolo_labels)这段逻辑的核心在new_id_map它把COCO里可能不连续的category_id压缩成从0开始连续的YOLO类别号。另一个重点是bbox越界修正切图工具从大图上切patch时会产出负坐标或右侧越界的框不修正的话后面归一化结果要么为负、要么超过1YOLO训练阶段直接拒收。输出到文件时建议用“.6f”格式保留六位小数精度足够且文件体积小。2.3 YOLO的txt标注五个数字背后的归一化换算YOLO标注文件的格式很简单一行五列类别id加四个归一化浮点数分别代表中心点x、中心点y、框宽、框高全部相对于图像宽高做了归一化。没有文件夹没有XML根节点没有JSON的缩进整个文件几KB就能装下几千个标注。Ultralytics训练时直接按行读取txt再拼接到数据加载队列里这也是YOLO系列训练速度快的底层原因之一。正因为格式极简它把信息表达压缩到了极限代价是脱离了原图坐标体系几乎不可读。实际做转换时三个最容易写错的地方一是VOC转YOLO时把xmax、ymax直接用成右下角坐标时忘减1导致w和h多1像素二是除以宽高时忘记先转floatPython整数除法直接得到0所有归一化坐标全变成0模型训练直接崩三是类别id不连续时忘记了重映射把VOC里的name先塞进一个有序列表再按下标取值不要用物理存储位置当类别号。三种格式对同一个框的表达差异可以看这个简单的对照格式文件形态坐标表达类别表达常见使用场景VOCXML一图一文件左上角右下角绝对像素object name文本早期检测数据集交换COCOJSON全量一个文件左上角宽高绝对像素category_id数字大规模数据集发布YOLOtxt一图一文件中心点宽高归一化行首类别id数字Ultralytics训练转换之后的校验我一般按三步走第一步统计所有txt里每列的最小值、最大值确认都落在0到1之间第二步把所有标注框画回到对应图片上用OpenCV的rectangle逐框渲染随机抽查30张重点看类别对不对、框与目标边缘贴不贴第三步把原始VOC或COCO解析出来的标注数量与转换后的txt行数对齐数量不一致就说明有样本被吞了。校验这一步看着麻烦却能省掉后面训练失败的一次次返工属于典型的“多花十分钟、少跑十轮训练”的买卖。3. YOLO11一键训练脚本从目录结构到能跑通的最小配置3.1 先把数据集目录约定固定下来用Ultralytics训练YOLO11第一步不是写训练脚本而是约定数据目录结构。8000张图的数据集我一般会把图片分成images/train、images/val、images/test三个子目录标签按同名文件名分到labels/train、labels/val、labels/test三个子目录。这样data.yaml里只需要写两个路径就行。注意图片文件名和标签文件名必须完全一致后缀分别是.jpg和.txt。如果原始数据集的标签是png或xml格式先统一转成txt再放进来。下面是典型目录布局road_anomaly/ ├── images/ │ ├── train/ │ │ ├── road_0001.jpg │ │ └── ... │ └── val/ ├── labels/ │ ├── train/ │ │ ├── road_0001.txt │ │ └── ... │ └── val/ ├── data.yaml └── train_script.pydata.yaml的内容很简单path: /home/user/road_anomaly train: images/train val: images/val names: 0: pothole 1: crack 2: debris 3: water 4: traffic_cone网上的data.yaml样例会把train写成绝对路径我建议用path字段指定根目录train和val填相对路径这样整份yaml换个机器也能跑。names里的顺序决定了模型最终输出的类别顺序一旦训练开始就别改改了就要全部重新转标注。还有一个习惯yaml文件保存成UTF-8不带BOMWindows上记事本保存容易带BOMUltralytics读的时候会在names第一个key上报奇怪的解析错误。3.2 一键脚本里真正要调的参数epochs、imgsz、batch、device一键训练脚本的本质就是把Ultralytics的YOLO11训练接口包一层命令行参数让不熟悉代码的人也能直接跑。用YOLO11n.pt作为预训练权重脚本核心部分如下from ultralytics import YOLO import argparse parser argparse.ArgumentParser(descriptionRoad anomaly detection training) parser.add_argument(--data, typestr, defaultdata.yaml) parser.add_argument(--model, typestr, defaultyolo11n.pt) parser.add_argument(--epochs, typeint, default100) parser.add_argument(--imgsz, typeint, default640) parser.add_argument(--batch, typeint, default16) parser.add_argument(--device, typestr, default0) parser.add_argument(--patience, typeint, default15) args parser.parse_args() model YOLO(args.model) results model.train( dataargs.data, epochsargs.epochs, imgszargs.imgsz, batchargs.batch, deviceargs.device, patienceargs.patience, save_period5, cacheram, plotsTrue, )命令行执行方式python train.py --data data.yaml --epochs 100 --imgsz 640 --batch 16 --device 0每个参数的解释先说一遍。epochs是训练轮数道路异常检测这种小目标任务100轮起步150轮以内通常能收敛太多轮数配合早停机制反而浪费算力。imgsz是输入图像边长YOLO11训练时会按这个尺寸做letterbox缩放默认640如果图中目标普遍很小建议调到960或1280但显存占用会翻倍。batch是一次迭代喂给GPU的图片张数16或32比较常见显存不够时优先降batch而不是降imgsz。device指定用哪块GPU多卡可以填0,1,2,3单卡填0没有GPU就填cpu但速度很慢。cacheram表示把训练集图片缓存在内存里第一次慢后面每轮读取速度大幅提升。save_period5表示每5轮保存一次中间权重后期想回滚到某个早期epoch时不至于无权重可用。plotsTrue会在跑完每个epoch后自动在results目录里生成训练曲线图包括loss曲线和mAP曲线。这里有个容易被忽视的坑默认模型yolo11n.pt是nano规模参数最小跑得最快但检测精度也最低。如果机器显存允许把model参数换成yolo11s.pt或yolo11m.pt道路异常检测的小目标效果会比nano好一截。标题里写的一键训练脚本通常是默认nano因为它在任意一张消费级显卡上都能跑先把流程跑通再考虑换大模型。3.3 训练完看什么权重落盘路径和四个关键指标训练结束后Ultralytics会在当前目录下生成runs/detect/trainN/N是第几次训练的数字默认每次自动递增。这个目录里有weights/best.pt和weights/last.ptbest.pt是根据验证集指标选出的最优权重实际部署基本都拿它。还有results.png和results.csv前者是训练曲线汇总图后者是所有指标逐轮记录的CSV想精确对比不同参数组合的效果读CSV比看曲线图靠谱。验证阶段的关键指标有四个precision、recall、mAP50、mAP50-95。precision是查准率recall是查全率mAP50是IoU阈值0.5下的平均精度均值mAP50-95是IoU从0.5到0.95每间隔0.05计算一次再取平均后者更严格对框的定位精度要求更高。道路异常检测场景里pothole和crack这种目标往往形态不规则框的IoU天然偏低mAP50-95通常会比通用目标检测低5到10个点这是正常的别一开始就焦虑。训练脚本跑完会自动调用model.val()完成验证并把指标打印出来这个动作不用额外写。用训练好的模型对单张图推理验证脚本里最常用的是from ultralytics import YOLO model YOLO(runs/detect/train5/weights/best.pt) results model.predict( sourcetest_videos/segment_01.mp4, conf0.35, saveTrue, )conf参数是置信度阈值低于0.35的框会被过滤掉。这个值在训练后不要急着定死先用0.1跑一遍看漏检和误报的分布再慢慢往上调找一个精确率和召回率平衡且业务上能接受的值。saveTrue会把检测结果渲染成视频或图片存到runs/detect/predict/下面这是人工复核结果的最快路径。4. 道路异常检测的类别体系与标注边界哪些该标成目标4.1 类别体系怎么定才有实用价值一个8000张图的数据集类别怎么定直接决定模型的可用范围。道路异常检测常见类别体系包含五类坑洞、裂缝、抛洒物、积水、交通锥。坑洞指路面结构性破损形成的坑裂缝包括横向、纵向和网状裂缝抛洒物是路面上出现的石块、货物、轮胎碎片积水是路面积水交通锥是临时施工路障。这五类覆盖了道路上最常见异常类型类间差异大不容易混淆训练难度适中。类别的数量本身没有标准答案。类别越多单类样本越少特征差异越小模型越容易混淆所以我的习惯是尽量压缩类别维度。比如施工区域和交通锥可以合并成一类因为它们都是临时的道路标识物外观和危险程度都高度一致。真正需要拆开的情况是两类外观相似但危险等级完全不同。下面这个表是个人推荐的类别定义和典型标注对象可以参考类别名典型标注对象容易混淆的对象pothole路面坑洞、下沉区域检修井盖、阴影crack横向/纵向/网状裂缝路面接缝、刹车痕debris石块、货物托架、轮胎碎片阴影、油渍water积水、反光水膜油渍、低洼反光traffic_cone锥桶、水马、施工围挡白色车道线远距离这几类里最容易翻车的是crack。路面接缝和刹车痕在视觉上跟裂缝很像如果标注时不制定规则同一张图在不同批次标注里会出现crack和背景两种截然不同的答案。我的规则是裂缝必须有明显的不规则轮廓路面接缝是等宽的规则直线刹车痕是带轮胎纹理的平行短条。标注工人在实际操作中记不住文字描述所以最好的做法是让同一批数据只由同一个人完成减少主观偏差。8000张图听着量大其实每人每天能标800到1000张五天左右就能完成一轮完整标注。还有一点容易被低估data.yaml里的names顺序必须和标注文件中的类别id严格对应。一旦确认了pothole是0、crack是1整个训练过程都不能动这个顺序。如果中途发现某类样本太少需要合并宁可重新生成一遍所有txt也不要手改names。4.2 标注边界遮挡、模糊、小目标怎么定规则标注边界其实是数据质量的核心8000张图的标注如果没有统一的边界规则模型训出来会出现很多莫名其妙的行为。拿遮挡来说一个交通锥被车头挡了一半但不影响人眼判断它的类型标注框就应该框住整个可见部分还是推测完整目标我的习惯是框住可见部分。因为模型学到的是可见外观和类别的关系强行框出不可见的完整范围标注框和图像像素之间有大片无关背景等于给模型加噪声。模糊和小目标是另一个争议点。小于16x16像素的目标在640分辨率下如果是一段细小裂缝标了之后模型基本学不到什么有效特征反而会把类似纹理全部误检成裂缝。我的建议是小目标不排除在标注之外但要在训练参数上做补偿比如把imgsz提升到960或1280或者用slicing技术把大图切成小块再分别检测。反过来背景区域中明显的裂缝不能因为小就漏标漏标会让模型在对应位置学到假负例推理时即使目标再小也容易被当作背景跳过去。然后是重叠场景。坑洞上方压着一片落叶或者积水里反射出天空的云这类目标应该标成两个独立目标还是一个我建议按实际危险程度来坑洞的核心形态没有被完全盖住就标坑洞落叶不算异常目标积水即使反光强烈只要水面边界清晰也正常标。重叠目标的处理原则是一个标注框内不允许同时包含两个类别如果一个框里既能看到坑洞又有明显的裂缝延伸到框外优先标更影响通行安全的那一类另一个在下一张独立图中再补。天气和光照的边界同样要在标注阶段就先约定好。同一个坑洞白天和晚上的外观差异极大。如果数据集中80%是白天样本晚上样本只有20%模型会严重偏向白天特征夜间检测精度大幅下降。处理方式有两个一是给晚上样本更高的采样权重二是复制夜间样本做数据增强。最稳妥的是数据划分时按时间段做分层抽样保证训练和验证集合各有合理的昼夜比例而不是纯随机切分。5. 道路异常检测训练避坑5个最容易翻车的样本问题5.1 VOC转YOLO时坐标越界导致标签出现负值或超过1现象转完标签后训练启动日志里偶尔提示跳过无效标签但loss还在降模型也能收敛最后在测试图上明明有裂缝却框不出来。原因转标签时把VOC的xmin、ymin、xmax、ymax直接做归一化没有做边界裁剪。标注工具边缘误点导致的xmax大于width、xmin小于0归一化后出现大于1或小于0的值Ultralytics在读取数据时直接把该标签判定为无效样本丢弃。解决转换脚本里加一层clip。用max(0, min(xmin, img_w))这种方式把四个坐标全部限制在图像范围内再归一化。转换完成后写一个统计脚本扫描所有txt把每列最大值和最小值打印出来只要出现负数或大于1的值立即回头查对应的源文件和转换逻辑。5.2 COCO的category_id和YOLO类别id错位现象训练曲线正常验证的precision也不低但拿模型去单张图测试类别名和框对不上比如把pothole检成crack而且这种错位是有规律的所有框都偏移一个类别。原因COCO的category_id从1开始YOLO的类别id从0开始转换时没有重映射。如果把COCO转YOLO的脚本写成直接减去1也不一定对因为COCO的id不连续categories里的顺序和id不一定一致减1只适用于id天然连续且从1开始的特殊情况。解决先遍历categories数组用enumerate生成新id映射表再按原id查表不要写死offset。转换完跑一次数据校验把txt里第一列的最大值打印出来它必须等于类别总数减1小于等于总和否则一定有样本id越界。5.3 按8:2随机划分后小类别在验证集里消失现象训练集有8000张图pothole样本数6000debris样本数只有300。按8:2随机划分后debris的训练样本和验证样本数量可能只有240和60还分散在各种场景里模型根本没学会debris的样子。原因随机划分对长尾分布不敏感稀缺类别经过切分变得更稀缺甚至某类在验证集里一个都没有导致mAP50看起来虚高或整体偏低。解决按类别做分层抽样先按图片里是否包含稀有点标注样本手动把含debris、water、traffic_cone的图片抽出一部分固定给验证集然后再从剩余图里随机补足验证集数量。最简单直观的做法是用shutil和random.seed固定随机种子把包含特定类别的文件单独捞出来剩下的按8:1:1划分最后合并。具体划分脚本大概长这样from pathlib import Path import random, shutil random.seed(42) rare_classes {debris, water, traffic_cone} image_dir Path(images/all) label_dir Path(labels/all) train_img, val_img Path(images/train), Path(images/val) train_lbl, val_lbl Path(labels/train), Path(labels/val) images list(image_dir.glob(*.jpg)) rare [] normal [] for img in images: lbl label_dir / (img.stem .txt) if not lbl.exists(): continue content lbl.read_text() if any(line.startswith(idx) for idx in rare_classes for line in content.splitlines()): rare.append(img) else: normal.append(img) val_imgs random.sample(rare, int(len(rare) * 0.2)) val_imgs random.sample(normal, int(len(normal) * 0.1)) for img in val_imgs: shutil.move(str(img), str(val_img / img.name)) shutil.move(str(label_dir / (img.stem .txt)), str(val_lbl / (img.stem .txt)))这段脚本的核心是rare_classes集合先把含有稀缺类别的图片单独隔离再给它们一个比正常类更高的比例分到验证集保证验证集里不缺稀有类别。random.seed(42)固定随机种子这样每次跑划分的结果一致方便别人复现你的对比实验。如果不固定种子每次重新划分都会得到不同分布两个模型间的精度差异就很难归因。5.4 夜间样本占比过低导致天黑就失效现象白天测试mAP50在0.7以上晚上同一路段检测效果直接腰斩坑洞漏检、积水误检成裂缝。原因8000张图里绝大多数是白天采集夜间样本的亮度、对比度和颜色分布与白天差异巨大模型没学到夜间表象推理时自然失效。这不是模型玄学是数据分布问题和特征域偏移的必然结果。解决一是优先补夜间数据实在没有就用albumentations做亮度、对比度、随机gamma增强把白天样本模拟成夜间的低光效果二是把白天和夜间样本的划分做成两个桶每个桶内部再按8:2切分保证训练和验证集合都有足够夜间样本三是训练参数里适当降低mosaic概率因为夜间样本本来就少mosaic会把它们和白天样本混合成更奇怪的光照分布。提示imgsz由640往上调的时候batch建议同步减半显存占用控制在显卡可用容量的一半以内留出推理时复制临时张量的余量。5.5 imgsz设640时裂缝和小目标漏检现象模型对井盖大小的大目标能检测但对路面上远处的裂缝、小碎片完全没反应增大置信度阈值后小目标没了调小阈值后误报满天飞。原因输入分辨率640下远处目标的像素尺寸只有20x20左右YOLO11n的特征图在深层下采样后一个小目标的特征可能只占一个网格特征信息不足检测头学不到有效模式。这不是模型的问题是输入分辨率和目标尺度不匹配。解决把imgsz从640调到960或1280。显存不够可以先降低batch到8或者换成yolo11n的小模型再开大分辨率。另一个可行方案是SAHI切片推理把大图切成若干小块各自检测完再合并结果这套方法对小目标检测提升非常明显代价是推理耗时成倍增加不适合实时场景。以上两种方案可以用在一键脚本里作为可切换参数训练时用大分辨率部署到实时推理时再根据算力预算做取舍。6. 验证与进阶mAP之外用真实路测片段定置信度阈值模型训练完很多人盯着mAP50就开始调参其实对于道路异常检测这种安全相关任务mAP是离线指标真正决定模型能不能上车的是连续视频帧上的行为。我拿到best.pt后做的第一件事不是写报告而是拿一段没有参与训练的路测视频用conf0.05的低置信度跑一遍把所有检测结果全渲染出来。这步看着笨但能暴露出标注阶段埋下的所有问题比如把道路接缝当裂缝、把井盖当坑洞、把交通锥漏掉。逐帧跑完低置信度推理后接下来重点统计两个指标连续帧的检测稳定性也就是同一目标在相邻帧里是否持续被检出同类目标在整条视频里的召回情况和真实人工标注一对比就能算出漏检率。这个阶段我会用下面这段脚本做帧级别统计from ultralytics import YOLO model YOLO(runs/detect/train5/weights/best.pt) results model.predict(sourcenight_test.mp4, conf0.05, saveFalse) class_counts {} for r in results: boxes r.boxes if boxes is None: continue for cls in boxes.cls: name model.names[int(cls)] class_counts[name] class_counts.get(name, 0) 1 print(class_counts)统计完类别计数再看哪些目标在连续10帧里只出现1、2帧这类目标大概率是误报。真正的坑洞和交通锥不会只闪一帧。置信度阈值的最终选择我会取一个“漏检代价大于误报代价”的平衡点道路异常检测里漏掉一个坑洞可能导致车辆损伤误报一个阴影通常不影响决策所以我最后往往会把conf压在0.3左右而不是网上教程常用的0.5。这个值没有通用答案必须拿自己的路测视频试出来。训练脚本本身通常只覆盖训练和验证我自己每次还会补一个导出步骤把best.pt转成ONNX或TensorRT格式方便部署到车端的推理引擎。转换命令就一行yolo export modelruns/detect/train5/weights/best.pt formatonnx imgsz640导出后建议用ONNX Runtime或TensorRT做一次推理一致性校验把PyTorch模型和导出模型的输出结果对齐避免部署后精度骤降。我遇到过TensorRT的fp16精度导致小目标漏检的问题最后的做法是保留fp32推理或者用TensorRT的strict_type_constraints参数强制某些层走fp32这类细节只有真跑到部署阶段才能暴露。做自动驾驶目标检测这两年我的体会是数据集和脚本都不难理解难的是愿意花时间把每一张训练图的标签和模型输出对齐起来看一遍。每次训练失败我第一反应不是调参数而是先质疑数据这个习惯帮我省下过无数次返工。希望帮到你。本文还有配套的精品资源点击获取