
80 类砍到 5 类Darknet 自定义检测类别与权重调优完整指南【免费下载链接】darknetYOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )项目地址: https://gitcode.com/gh_mirrors/dar/darknet用 Darknet 训练自己的目标检测模型时绝大多数人卡在同一个地方怎么把预训练的 COCO 80 类模型改造成只识别自己场景里那几类目标的轻量模型。本文以智慧停车场监控为例只需识别 person、car、bus、truck、motorbike 5 类手把手带新人走完 Darknet 类别定制全流程从裁剪 data/coco.names、改 cfg/yolov3.cfg 中的classes与filters到编写数据配置、启动训练最后再讲一个很多教程都漏掉的原生技巧——不改一行源码就能调整类别损失权重。照着做你能带走一套可复用的多类目标检测定制方法。先搞清楚Darknet 里的类别数散落在 4 个地方这是新手最容易踩的坑。同一个数字80其实存在于 4 个不同的文件中任何一处对不上训练或推理就会报错或输出乱码。位置文件起什么作用停车场场景要改成类别名单data/coco.names每行一个类名决定输出标签和索引顺序新建parking.names只留 5 行网络结构cfg/yolov3.cfg[yolo]层的classes和前面卷积层的filtersclasses5filters30数据配置cfg/coco.dataclasses和names指向类别文件新建parking.data标注文件图片同名.txt每行第一个数是 0 起的类别 IDID 范围 0~4⚠️ 注意类别 ID 不是查出来的而是按 names 文件的行号从 0 开始数。names 里第 1 行就是 0 类顺序直接决定标注和输出的对应关系写标注前先把顺序定死。第 1 步把 coco.names 裁成 5 类停车场名单COCO 名单有 80 行而停车场只需要其中 5 个。复制 data/coco.names删掉不需要的行另存为data/parking.namesperson car bus truck motorbike 提示保持与 COCO 相同的相对顺序person car bus truck motorbike是个好习惯——万一标注工具按原 ID 生成你不用重新换算。仓库自带的一张经典样例图很适合做第一张测试图里面同时出现了 dog、bicycle、car用来验证类别索引没写错很直观第 2 步cfg 文件两步改法classes 与 filters以 cfg/yolov3.cfg 为底本复制一份cfg/yolov3-parking.cfg只需动两处① 三处[yolo]层的classesyolov3.cfg 末尾有 3 个[yolo]层约在第 607、693、780 行每一处都要改[yolo] mask 6,7,8 anchors 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes5 num9② 每个[yolo]前面紧邻的卷积层filters原值是 255来自公式(classes 5) * 3每个网格预测 3 个框mask选了 3 个 anchor每个框输出 4 个坐标 1 个置信度 classes个类别概率。换成 5 类后[convolutional] size1 stride1 pad1 filters30 # (5 5) * 3 30 activationlinear⚠️ 易错点3 个[yolo]前面共 3 个卷积层一处都不能漏。漏改一处启动训练时会直接报Error: l.outputs params.inputs, filters in the [convolutional]-layer doesnt correspond to classes这个报错看着唬人其实就是在提醒你 filters 和 classes 不匹配。第 3 步写数据配置文件 标注格式新建cfg/parking.data格式完全对齐 cfg/coco.dataclasses5 traindata/parking/train.txt validdata/parking/valid.txt namesdata/parking.names backupbackup/parking/其中train.txt/valid.txt是图片路径清单每行写一张图的绝对路径不是标签路径。标注文件与图片同名同目录后缀.txt每行一个目标# 格式class_id 中心x 中心y 宽 高 全部按图片宽高归一化到 0~1 1 0.42 0.55 0.31 0.52 # car一辆停在车位上的轿车 3 0.81 0.30 0.40 0.44 # truck远处一辆货车 验证标注是否写对中心点坐标应满足x - w/2 ≥ 0、y - h/2 ≥ 0等边界条件写反 x/y 或忘了归一化是最常见的标注事故。第 4 步一条命令开始训练准备好预训练权重darknet53.conv.74只含骨干网络、不含 yolo 头正好适配改类别的场景后./darknet detector train cfg/parking.data cfg/yolov3-parking.cfg darknet53.conv.74预期效果终端开始逐批次打印lossbackup/parking/下每隔固定迭代生成yolov3-parking_XXXX.weights。loss 从前期快速下降到后期趋于平缓即属正常。⚠️ 如果启动时出现Warning: in txt-labels class_idN classes5说明标注里的类别 ID 超出了 cfg 定义的范围去核对 names 顺序和标注文件而不是去加大 classes。类别权重调优原生参数就够了别急着改源码很多教程教你去改 src/yolo_layer.c 的损失函数再重新编译其实没必要。Darknet 的[yolo]层原生支持counters_per_class参数解析逻辑在 src/parser.c你填每个类别在训练集中的样本数量程序自动按最大类样本数 ÷ 本类样本数算出权重——样本越少的类类别损失被放得越大模型越不敢漏检它。在 3 个[yolo]层里加上假设各类样本数为 person 1000、car 800、bus 300、truck 150、motorbike 80[yolo] ... counters_per_class1000,800,300,150,80 max_delta5 # 权重上限防止小类梯度爆炸程序会打印出实际权重1.0, 1.25, 3.3, 5.0, 5.0后两项被max_delta5截断。 提示max_delta默认不限制。小类样本极少时算出的倍数可能非常大梯度会不稳建议显式设成 5~10。样本分布变化后记得同步更新这行数字。结果验证与常见问题排查训练几轮后挑一个较新的权重验证# 肉眼检查画框输出 ./darknet detector test cfg/parking.data cfg/yolov3-parking.cfg backup/parking/yolov3-parking_4000.weights -thresh 0.25 # 量化评估算 mAP ./darknet detector map cfg/parking.data backup/parking/yolov3-parking_4000.weights若某类检测效果不理想按这张表排查现象可能原因处理办法启动即报 filters 不匹配3 个卷积层有漏改全局搜filters255逐个改 30测试时一类目标全是框阈值过高-thresh降到 0.2~0.25 对比某类 mAP 明显偏低样本少 / 权重不够补样本 counters_per_class加权大小目标都漏检anchors 与场景不符用 scripts/gen_anchors.py 对停车场标注重算 anchors输出的类名和图对不上names 顺序与标注 ID 不一致以 names 行号为准重写标注全流程检查清单最后对照一遍全部打勾就可以放心交付parking.names行数 cfg 里classes data 文件里classes 53 个[yolo]前卷积层的filters全部改为(55)*3 30标注 ID 最大值为 4坐标已归一化训练用的预训练权重是.conv.74而非完整的 80 类 weights权重调优用的counters_per_class有 5 个值且与 names 顺序一致test抽查若干张 map出 mAP 双验证通过这套裁 names → 改两处 cfg → 建 data → 训练 → 权重调优 → 双验证的方法对任意自定义场景园区安防、工业质检、农业监测都直接适用换场景时只替换第一、三步的内容即可。【免费下载链接】darknetYOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )项目地址: https://gitcode.com/gh_mirrors/dar/darknet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考