简介聚焦危化品运输安全监管的深度学习应用论文PDF面向交通管理、智能交通与计算机视觉方向的研究与工程人员讨论如何在高速公路实时场景中自动识别危化品车辆的货物类型标志以提升事故应急的针对性与监管效率。文中完整呈现了机器视觉抓拍系统的搭建思路高清监控摄像头配合红外补光以适应弱光环境、数据集构建过程约一万张车辆背面图像、23类标注、两万余个标注框以及YOLOv3的网格划分、边界框预测与目标损失函数设计并交代动量、权重衰减、学习率分段调整等训练参数给出多光照、多天气条件下的鲁棒性验证结果可与《危险货物分类及品名编号》的9类18种划分对照阅读。压缩包内仅1个PDF文件约2.41MB单篇即可读完便于快速把握该课题的技术路线与落地思路。目前已有107人学习适合作为目标检测落地交通场景的入门参考或方案论证素材。1. 从卡口盲区到货物类型识别这套方案要解决的真问题高速卡口的摄像机正对着车头车牌拍得清清楚楚可真正决定救援方案的那块菱形标志牌挂在车尾——系统知道来了一辆货车,却不知道罐里装的是什么。这条信息差在隧道、桥梁这类重点路段会被放大一旦发生泄漏现场处置人员最先问的就是货物类别翻台账、打电话确认的那几分钟往往就是最关键的几分钟。基于深度学习的危化品车辆货物类型识别解决的就是这个具体问题把车尾的危险货物标志牌当成目标检测对象用 YOLOv3 在卡口视频流里实时定位并分类把危险货物信息变成一条带置信度的结构化记录随过车数据一起送到监控中心。这套方案适合做目标检测方向毕设或课设的人照着搭一遍完整链路也适合正在做卡口智能化改造的工程人员参考。2. 需求拆解与技术选型为什么单阶段检测器更适合卡口这条实时链路2.1 四类硬约束先摆出来实时性、光照、类别体系、可追溯做目标检测的项目最容易犯的错是先挑模型再想场景。卡口这条链路的约束是从业务侧压下来的不是从论文里抄的先把约束列清楚选型才有依据。第一是实时性。一条车道的卡口车辆从入画到出画大概 0.5 到 1.5 秒25fps 的视频流里能拿到十几到三十几帧有效画面。不需要每帧都推理抽帧加跟踪去重就行但单帧的处理预算必须压在几十毫秒量级否则边缘计算盒的队列会越堆越长最后变成识别结果比车晚到半分钟联动就失去了意义。第二是光照鲁棒性。夜间靠红外闪光灯补光图像整体偏灰、对比度低标志牌的反光膜在补光下容易过曝成一团白隧道口进出时明暗突变逆光时车尾几乎全黑。模型必须在这些条件下保持召回而不是只在白天晴天好用。第三是类别体系。危险货物按主要特性分成 9 大类、18 个项别运输管理上还有一套更粗的属性口径。模型输出到底对应哪一层直接决定了监控中心拿到结果之后能不能用。第四是可追溯。识别结果不是给模型自己看的是要送到监控中心做监管和应急调度的所以每条结果得带抓拍原图、时间戳、车道、车牌和置信度人工能复核出了错能倒查。这四条约束合起来其实已经把要多高的精度、要多快的速度、要什么形式的输出框死了。2.2 两阶段与单阶段的取舍R-CNN 系列在这条链路上卡在哪深度学习目标检测主流就两条路线。两阶段检测器以 R-CNN 系列为代表流程是先生成候选区域再对每个候选区域抽固定长度的特征向量最后用分类器判定类别单阶段检测器直接把检测当回归问题做用预定义锚点密集覆盖整张图一次前向就出框和类别。两阶段的好处是精度稳尤其是小目标和密集场景代价是推理链路长候选区域生成和逐区域分类这两步都很吃算力。放在卡口场景里这个代价很难接受——边缘设备的算力预算本来就紧一条车道一秒钟可能要处理好几辆车两阶段方案要么降分辨率要么降帧率两种降法都会直接伤到小目标。单阶段里常见的有 YOLO 系列、SSD 和 RetinaNet。SSD 在浅层特征图上做预测对小目标不算友好RetinaNet 用 Focal Loss 解决正负样本失衡精度不错但结构更重。真正让我倾向 YOLOv3 的是它在三个尺度上都做预测这一点。标志牌在 4096×2160 的原图里可能只占 60×60 像素缩放之后如果只剩十几像素单尺度检测基本抓不住。YOLOv3 的 FPN 结构把 13×13、26×26、52×52 三个尺度的特征图都接出来做预测大中小目标各有对应的输出层这个设计对小目标 大分辨率原图的组合几乎是刚需。提示不要拿公开数据集上的 mAP 排名直接当选型依据。COCO 上差一两个点到了你自己的卡口数据上可能完全反过来因为目标尺寸分布、长宽比、背景复杂度都不一样。2.3 类别体系设计5 类属性标签与 18 项细分标签的双层结构类别体系这一步是整个项目里最容易被低估、也最容易在后面返工的地方。直接把 9 大类当类别训练粒度太粗救援时还是不知道该带什么装备直接把 18 个项别当类别样本少的类会严重欠拟合。实际工程里通常的做法是做成两层。第一层是属性标签按运输管理口径归并成 5 个大类样本量相对充足用来做快速判断和结果兜底第二层是细分标签对应标准的 18 个项别样本量少但信息更精确。两层标签共用一个检测头输出维度按 5 加 18 等于 23 类来算。这里的坑在于很多人下意识按单标签多分类来做也就是 softmax一个框只能属于一个类。但实际标注中一块标志牌可能同时表达易燃和某个具体项别强行互斥会把标签搞成玄学。YOLOv3 的分类分支用的是 logistic 输出而不是 softmax每个类别独立判定天然支持多标签这一点在双层体系下正好用得上不需要改结构。注意双层标签必须在标注阶段就定死规则——哪一层是主标签、什么情况下两个层都标、同一块牌出现多个语义时以哪个为准。规则写在标注文档第一页比事后清洗数据省十倍力气。2.4 YOLOv3 的三个适配点多尺度、多标签、工程成熟度把选型理由收敛一下大概三点。多尺度预测解决小目标问题前面已经说过。骨干网络用的是 Darknet-53靠残差结构把深度堆上去同时不像更重的骨干那样拖慢推理在边缘算力上是能接受的折中。多标签分类匹配双层类别体系这一点在 2.3 里展开过不再重复。它带来的实际好处是即使细分标签判错了属性标签那一路还能给出一个可用的粗结论系统的降级路径是通的。第三点是工程成熟度。这个项目不是实验室里跑个 benchmark 就完事它要落在边缘计算盒上、要接专网回传、要跟监控中心的业务系统对接。YOLOv3 的模型结构、配置文件、锚点聚类脚本、量化工具链都是现成的改一个类别数就能重新训部署侧的坑被前面的人踩得差不多了。对毕设和课设来说这意味着你能把时间花在数据集和评估上而不是卡在环境配置里出不来。3. 数据链路设计从抓拍单元到 22174 个标注框的完整链路3.1 抓拍单元怎么搭相机、补光与回传链路模型再强喂进去的图像不行也白搭。抓拍单元的设计目标很明确在白天、夜间、逆光、雨雾这些条件下都能拿到一张标志牌清晰可辨的车尾图。相机装在车道正上方偏后的位置俯角控制在 15 到 25 度之间正对车尾这样标志牌的正面畸变最小。分辨率选 4096×2160 这一档不是越高越好——再往上走单帧数据量和推理耗时都会明显增加而标志牌的有效像素并不会等比例提升。补光用红外闪光灯主要解决夜间和隧道内照度不足的问题但要注意补光强度和角度反光膜过曝之后标志牌上的图案会糊成一片白这是后面第 5 章要专门说的坑。图像采集之后有两条路一条是把原始图通过专有网络回传到监控中心做离线分析和标注另一条是在路侧的边缘计算盒上直接跑推理只把识别结果和小尺寸缩略图回传。实际部署里通常是两条路并存边缘侧负责实时告警中心侧负责统计、复核和模型迭代的数据回流。这套链路里最容易被忽略的是时间同步。边缘盒、相机、中心服务器三者的时钟如果不一致后面做多帧融合去重、做事件回溯时会对不上排查起来非常痛苦。上线前统一走 NTP是最便宜的一剂后悔药。3.2 三级筛选从全量过车图里捞出可用样本卡口每天过车几万张其中危化品运输车辆占比很低直接拿去标注是浪费人力。实际做下来是三级筛选。第一级用业务数据初筛。危化品运输车辆在运政系统里一般有备案把车牌白名单和过车记录做关联能先把大部分普通货车排掉。这一步的准确率不需要很高目的是把量级从几万降到几百。第二级用视觉特征粗筛。罐体车、厢式车在车尾形态上和普通货车有差别用一个轻量的分类器或者干脆用规则比如车尾高度、罐体轮廓占比再过一遍把明显不是的剔掉。这一级允许漏不允许错杀太多。第三级是人工复核逐张看确认是危化品运输车辆背面图且标志牌可见、可辨。遮挡严重、模糊、标志牌被泥污盖住的直接丢掉不要抱着说不定模型能学会的侥幸心理——这类样本进训练集只会让模型学到噪声。按这套流程筛下来最终形成的数据集规模是 10000 张危化品运输车辆背面图像标注框总数 22174 个其中属性分类 5 类共 8419 个框细分分类 18 项共 13755 个框。这个比例本身也说明了问题细分标签的框数更多但分布在不同项别上单个项别的样本量其实很有限。3.3 标注规范一块标志牌一个框边界怎么定标注工具用 labelImg 这类通用工具就行产出 Pascal VOC 格式的 xml和原图同名记录每个框的坐标和类别。规范定得细不细直接决定模型能不能收敛。框的边界紧贴标志牌外沿包括边框不包括车身背景。同一辆车挂了多块标志牌就标多个框不要合并成一个大框——合并之后模型学到的是车尾有一片花花绿绿的区域而不是这里有一块菱形标志。遮挡的处理要写死遮挡面积超过一半的不标低于一半的按可见部分标框仍然按标志牌的完整外沿画。这条规则看起来吹毛求疵但它保证了不同标注员之间的一致性而标注一致性差是目标检测项目里最隐蔽的性能杀手。类别判定上属性标签和细分标签分别标一块牌两个都标如果只能判出属性判不出项别只标属性层不要瞎猜。存疑的样本单独放一个待定目录由一个人统一裁决不要各自拍脑袋。annotation filenamecap_rear_000317.jpg/filename size width4096/width height2160/height depth3/depth /size !-- 一块标志牌一个 object属性层与细分层分别成条 -- object nameattr_flammable_liquid/name !-- 属性层易燃液体 -- difficult0/difficult bndbox xmin2380/xmin ymin940/ymin xmax2564/xmax ymax1128/ymax /bndbox /object object nameitem_class_3/name !-- 细分层第 3 项 -- difficult0/difficult bndbox xmin2380/xmin ymin940/ymin xmax2564/xmax ymax1128/ymax /bndbox /object /annotation这段 xml 里两个 object 共用同一组坐标这是双层标签的正常形态位置只有一个语义有两个。difficult字段用来标记模糊但仍有判断价值的样本训练时可以选择性忽略。坐标是原图坐标系下的绝对像素值转 YOLO 格式时再归一化不要在标注阶段就归一化否则分辨率一变数据就废了。3.4 数据集统计与类别不均衡处理标注完不能直接开训先做统计。要看的至少有四样每类的框数量、每类涉及的图片数量、框的宽高分布、每张图平均框数。前两个决定要不要做重采样后两个决定锚点怎么聚类。import os, xml.etree.ElementTree as ET from collections import Counter, defaultdict ann_dir annotations/train cls_cnt, cls_imgs Counter(), defaultdict(set) wh_list [] for fn in os.listdir(ann_dir): if not fn.endswith(.xml): continue root ET.parse(os.path.join(ann_dir, fn)).getroot() size root.find(size) W float(size.find(width).text) H float(size.find(height).text) for obj in root.findall(object): name obj.find(name).text cls_cnt[name] 1 cls_imgs[name].add(fn) # 记录该类别出现在多少张图里 bb obj.find(bndbox) w (float(bb.find(xmax).text) - float(bb.find(xmin).text)) / W h (float(bb.find(ymax).text) - float(bb.find(ymin).text)) / H wh_list.append((w, h)) for name, c in cls_cnt.most_common(): print(f{name:28s} 框数{c:6d} 图片数{len(cls_imgs[name]):6d})这段脚本输出的两个数含义不同别混着看。框数多但图片数少的类说明同一张图里反复出现泛化能力差框数少图片数更少的类就是典型的少数类需要单独处理。wh_list攒下来喂给锚点聚类脚本能得到适配标志牌长宽比的 anchor比直接用 COCO 的默认锚点收敛快很多。不均衡的处理上我一般走三步一是按类分层划分训练集和验证集保证每个类在验证集里至少有若干实例否则验证指标没有统计意义二是对少数类做过采样但只复制图片不复制整段视频的连续帧避免同一辆车的相邻帧同时进训练集和验证集造成数据泄漏三是用 Mosaic 之类的增强把多张图拼在一起间接提升小目标和少数类的出现频率。注意过采样之前先确认验证集是干净的。连续帧泄漏是最常见的一种指标虚高训练集里见过这辆车的第 3 帧验证集里放第 5 帧mAP 会好看得不像话上了路立刻打回原形。4. 模型与训练实现YOLOv3 的预测张量、损失函数与超参配置4.1 网格划分与预测张量S×S×B 在算什么YOLOv3 把输入图像划成 S×S 的网格每个网格生成 B 个边界框一张图总共得到 S×S×B 个预测框然后直接对这些框做边界回归和类别决策。具体到这套方案输入缩放之后三个尺度的特征图分别是 13×13、26×26、52×52每个网格分配 3 个锚点也就是 B 等于 3。每个预测框要输出 5 个基础量和若干类别量——5 个基础量是框中心点相对网格的偏移 x、y框的宽高 w、h以及一个置信度类别量按 23 类算。所以每个尺度上一个网格的输出通道数是 3×(523)84。这里的数字要理解透不然改类别数的时候会懵。你新增一个类别三个尺度的输出通道各加 3配置文件里classes和最后一个卷积层的filters必须同步改漏改一个就是维度不匹配训练脚本报的错还特别不直观。我见过不少人在这儿卡一整天。锚点的作用是把预测值从绝对尺寸变成相对某个先验框的缩放比让网络学起来更稳。三个尺度各有一组锚点浅层特征图配大锚点管大目标深层配小锚点管小目标。标志牌这种偏方形、尺寸跨度不大的目标聚类出来的锚点会比默认值收敛快得多。4.2 损失函数四项拆解每一项在纠什么错YOLOv3 的目标损失函数可以拆成四项相加中心点误差、宽高误差、置信度误差、分类误差。公式写出来是一行但每一项在纠什么错、什么时候会主导梯度值得单独说。中心点误差管的是框找没找对地方用二元交叉熵算只对包含目标的网格生效。这一项在训练前期降得最快因为它对应的是最粗粒度的定位。宽高误差管的是框大小对不对同样只对正样本生效。标志牌尺寸相对集中这一项收敛得也快但如果锚点聚类没做它会一直在那儿震荡。置信度误差管的是这个框里到底有没有目标正负样本都参与。这一项是 YOLO 训练里最容易出问题的地方——负样本数量远大于正样本如果不做权重平衡模型会倾向于把所有框都判成背景表现就是召回率极低、置信度普遍偏低。实际的配置文件里对objectness和class的损失权重是分开设的调这两个数的经验值比调学习率还重要。分类误差管的是是哪一个类在双层标签体系下它是多标签的 logistic 损失每个类别独立算不要求各类概率之和为 1。四项之间是有耦合的定位不准的时候置信度也很难上去因为 IoU 低。所以看训练日志不要只盯总 loss要把四项分开画曲线。总 loss 平稳但分类 loss 不降一般是类别不均衡或者标签噪声定位 loss 震荡多半是学习率太大或者锚点不匹配。4.3 训练配置与启动脚本训练在深度学习服务器上跑动量设 0.9权重衰减设 0.0005总训练周期 300 轮在第 70% 和第 90% 这两个节点做学习率衰减衰减系数 0.1。这套超参不是拍脑袋来的动量 0.9 是 YOLO 系列的常规配置能有效抑制小批量下的梯度抖动权重衰减 0.0005 用来压过拟合样本量一万张这个量级正则化不能太松300 轮配两次衰减是先快速下降、再精细收敛的经典节奏。配置文件里要改的地方不多但每一处都不能漏[net] width416 # 输入宽必须是 32 的倍数 height416 # 输入高 learning_rate0.001 # 初始学习率 burn_in1000 # 前 1000 次迭代预热 max_batches300000 # 对应 300 轮按 batch 数换算 policysteps steps210000,270000 # 70% 与 90% 处衰减 scales.1,.1 # 衰减系数 0.1 [yolo] mask 6,7,8 # 当前尺度使用的锚点索引 anchors 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes23 # 5 类属性 18 项细分 num9 # 锚点总数max_batches和轮之间的换算是新手最容易算错的地方。轮数等于总批次除以每轮批次而每轮批次又等于训练集图片数除以 batch size。如果训练集是一万张、batch size 取 8一轮就是 1250 次迭代300 轮对应 375000 次而不是随手填个 300000。这一步算错学习率衰减的时机会整体偏移收敛曲线会很难看。启动训练的命令本身很简单关键是日志要留全# -map 每轮结束算一次 mAP便于观察泛化-gpus 指定显卡编号 ./darknet detector train \ cfg/hazmat.data \ cfg/yolov3-hazmat.cfg \ weights/darknet53.conv.74 \ -map -gpus 0,1 \ 21 | tee logs/train_$(date %Y%m%d_%H%M).logdarknet53.conv.74是骨干网络的预训练权重从它开始训比从零开始收敛快很多一万张图的量级千万别从零训。-map打开之后每轮会额外跑一遍验证集慢一些但值得因为训练 loss 好看而验证 mAP 不动的情况太常见了。日志用tee同时落盘后面调参对比全靠它。参数取值作用与调整建议动量0.9抑制小批量梯度抖动batch 越大可适当降低权重衰减0.0005控制过拟合验证 loss 抬头时优先加大训练周期300 轮样本量翻倍时可适当增加到 400 轮学习率衰减点70%、90%与总批次强相关改 batch size 必须重算输入分辨率416×416小目标漏检严重时可提到 608代价是耗时翻倍4.4 推理后处理从 84 维输出到一条结构化记录网络吐出来的是一堆带置信度的候选框要变成监控中心能用的记录中间还有几步。先按置信度阈值过滤再做非极大值抑制去掉重叠框然后把归一化坐标还原到原图尺寸最后组装成 JSON。import numpy as np def nms(boxes, scores, iou_thr0.45): boxes: [N,4] 格式 x1,y1,x2,y2scores: [N] order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) if order.size 1: break xx1 np.maximum(boxes[i, 0], boxes[order[1:], 0]) yy1 np.maximum(boxes[i, 1], boxes[order[1:], 1]) xx2 np.minimum(boxes[i, 2], boxes[order[1:], 2]) yy2 np.minimum(boxes[i, 3], boxes[order[1:], 3]) inter np.maximum(0., xx2 - xx1) * np.maximum(0., yy2 - yy1) area_i (boxes[i, 2] - boxes[i, 0]) * (boxes[i, 3] - boxes[i, 1]) area_o (boxes[order[1:], 2] - boxes[order[1:], 0]) * \ (boxes[order[1:], 3] - boxes[order[1:], 1]) iou inter / (area_i area_o - inter 1e-9) order order[1:][iou iou_thr] return keep def to_record(pred, img_w, img_h, conf_thr0.35): pred: [N, 41C]前 4 为归一化 xywh第 5 为置信度其后为各类别分数 out [] conf pred[:, 4] idx np.where(conf conf_thr)[0] if idx.size 0: return out xywh pred[idx, :4] # 归一化中心点宽高 - 原图左上右下 x1 (xywh[:, 0] - xywh[:, 2] / 2) * img_w y1 (xywh[:, 1] - xywh[:, 3] / 2) * img_h x2 (xywh[:, 0] xywh[:, 2] / 2) * img_w y2 (xywh[:, 1] xywh[:, 3] / 2) * img_h boxes np.stack([x1, y1, x2, y2], axis1) for k in nms(boxes, conf[idx]): cls_scores pred[idx[k], 5:] # 双层体系属性层取前 5 维细分层取后 18 维各自独立取最大 attr int(np.argmax(cls_scores[:5])) item int(np.argmax(cls_scores[5:])) out.append({ bbox: [round(float(v), 1) for v in boxes[k]], score: round(float(conf[idx[k]]), 3), attr: attr, attr_score: round(float(cls_scores[attr]), 3), item: item, item_score: round(float(cls_scores[5 item]), 3), }) return out置信度阈值 0.35 是个经验起点不是标准答案。这个值调低召回上去但误检变多调高干净但漏检增加。在危化品场景里漏检的代价远大于误检——多报一次人工看一眼就排除了漏报一次可能就是救援时拿错方案。所以我一般会把业务阈值压到 0.3 左右然后用后端的规则再筛一遍。NMS 的 IoU 阈值设 0.45主要是因为同一辆车可能挂多块标志牌阈值太低会把相邻的两块牌压成一块。这一点跟通用目标检测的默认配置不太一样是这类场景特有的。属性层和细分层分开取最大值是双层标签体系的直接体现。两层的置信度分别记录前端可以做降级展示细分层分数低的时候只显示属性层结论而不是硬给一个可能错的项别。5. 避坑与排查五类最容易在验收现场翻车的问题5.1 采集与标注环节的三个坑夜间标志牌过曝模型把反光当目标。现象是白天指标正常夜间 mAP 掉一大截可视化出来框住的是整片高亮区域而不是标志牌轮廓。原因在补光——红外闪光灯直射反光膜标志牌上的图案被冲掉只剩一个亮斑模型学到的是亮的东西就是标志牌。解决办法分两步硬件上调整补光灯角度和功率让光斑偏一点、柔一点数据上专门补采夜间过曝样本标注时按可见外沿画框同时把这类图在训练集里的比例提上去。只改硬件不改数据夜间样本还是学不会。同一块牌被标成两个类标注一致性崩了。现象是训练 loss 一直降不下去或者验证集上同一个位置反复出现类别摇摆。原因通常是标注规范没写死不同人对这块牌到底算属性层还是细分层理解不一致。解决方式是在标注文档里给每个类配一张样图明确什么情况标、什么情况不标并且安排一个人做交叉复核抽检比例不低于 10%。已经标完的数据不用全推翻用脚本扫一遍同名同坐标但类别不同的 object人工裁决就行。数据集被连续帧污染指标虚高。现象是验证集 mAP 高得离谱一上路就大面积漏检。原因是划分数据时按图片随机分同一辆车的相邻帧同时进了训练集和验证集模型相当于背过答案。解决办法是按车辆或抓拍事件为单位划分同一辆车的所有帧只能落在同一侧如果做不到至少在划分前按时间窗口做一次聚类。这个坑非常隐蔽血泪经验是只要验证指标好得不像话第一反应就该去查数据泄漏。5.2 训练与评估环节的两个坑改了 batch size 忘了重算衰减点模型不收敛。现象是训练到中后期 loss 突然发散或者长时间横盘。原因是steps是按迭代次数写的换了 batch size 之后每一轮对应的迭代数变了原本打算在 70% 处衰减实际可能拖到了 85% 甚至更晚学习率在高位停留太久。解决办法是把轮数到迭代数的换算写成脚本每次改 batch size 自动重算steps和max_batches不要手填。只看 mAP 验收忽略了漏检分布。现象是验收报告上 mAP 有 0.8 多看起来不错但实际跑一周发现某几个项别几乎没检出过。原因是 mAP 是所有类的平均值少数类拉不动整体分数被多数类掩盖了。解决办法是验收时必须出分类别的召回率表并且单独盯住样本量最少的几个类对这几个类做定向补采和过采样必要时把它们的置信度阈值单独调低。这一条在答辩时特别加分因为它说明你想过模型出错的时候业务会怎样。6. 验收与答辩用一组能自证的指标把这套识别讲清楚验收这一步很多人栽在只会报一个 mAP 上。mAP 是平均值它能说明整体水平但说明不了这套系统在隧道口、在雨夜、在标志牌被泥糊了一半的时候还灵不灵。我的做法是把验收拆成三层每层都有能自证的数。第一层是模型指标。除了 mAP0.5还要出分类别的精确率和召回率尤其是样本量最少的那几个项别。表格里把支持数该类的验证框数量一起列出来支持数太少的类指标本身就不稳定要标注出来。验收项指标口径参考线说明整体检测精度mAP0.5≥0.80全部 23 类平均属性层召回5 类属性各自召回≥0.85业务的兜底结论不能低细分层召回18 项各自召回≥0.70少数类单独看支持数误检率单帧误检框数≤0.5平均每帧不超过半个误检单帧耗时含预处理与后处理≤40 ms边缘盒实测不是服务器端到端延迟抓拍至结果入库≤1 s含网络与队列第二层是场景矩阵。拿一批独立测试集按光照、天气、位置切成若干格每格单独算召回。雨天、夜间、逆光、隧道进出口这几格是最容易掉分的把数摆出来比藏着强——答辩时评委问的往往就是这几格。第三层是业务可用性。抽一批真实过车记录让业务侧的人看识别结果和抓拍图统计结论正确且能支撑处置的比例。这一层的主观性更强但它回答的是这套东西能不能用而前两层回答的是模型好不好。两个问题不是一回事。答辩技巧上我一般建议准备一张错检样例墙把典型的漏检、误检、过曝、遮挡案例拼在一张图上每张标注原因和已经采取的改进措施。这比再讲十遍网络结构有用因为它证明你知道模型在哪儿不行。评委最喜欢问的三个问题是数据从哪来、类别怎么定、漏检了怎么办。前两个在方案里有答案第三个要提前想清楚降级路径——比如细分层判不出时退回属性层属性层也判不出时按未知危险货物走最保守的处置流程。最后说个习惯。从那以后我每次做这类检测项目都会在训练之前先把验收指标和测试集划分写进文档锁死之后再开训绝不边训边改评估口径。模型指标从来不是玄学口径飘了才是。希望这套链路能帮到你少走几段弯路。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?