yolo-yolov3补充和yoluv4/v5

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| TL;DR(一句话总结) 这一课围绕"跑通一个目标检测训练流程"展开,四件事串成一条线:用数据增强给模型制造难题 (马赛克 + 随机遮挡)→ 把 JSON 标注转成 YOLO 格式的 TXT → 改配置文件适配自己的类别数 → 配好参数开跑 。理解了这条线,你就具备了自己训练一个检测模型的能力。 |

读完你能明白:马赛克增强和随机遮挡到底在解决什么问题、打标的 JSON 怎么变成 YOLO 能读的 TXT、以及第一次训练该怎么配置参数。

一、先聊聊背景:YOLO 后来由谁来维护?

YOLO 系列最有意思的一点是------它的后续版本不是原作者做的 。

原作者在发布 YOLOv3 后宣布停止相关研究,公开表达过不愿让这项技术被滥用于军事用途的立场。此后,YOLOv4、v5 由第三方机构与团队(如美团、清华大学等)沿着原始思想继续开发。

关于 v4 和 v5 的关系,记住一句就够:原理完全一致,只是代码实现不同 。所以学懂一个,另一个直接迁移。

那 v4 强在哪?对比一下就清楚了:

|--------------|-------------|-----------------|
| 模型 | 精度(mAP) | 速度 |
| YOLOv3 | 中等 | 快 |
| YOLOv4 | 更高 | 依然保持高帧率 |
| EfficientNet | 也高 | 慢,与 YOLO 不在同一量级 |

简单说,YOLOv4 在"又快又准"这件事上做到了更好的平衡 。

二、数据增强:为什么要给模型"制造麻烦"?

数据增强的本质是:用有限的数据,造出更多样的训练样本,逼模型学到更全面的特征 。

(一)老版本做得太少了

YOLOv1 到 v3 的数据增强代码极少,基本只有一个动作------用 OpenCV 的 flip 函数做镜像翻转 (左右翻转一下)。就这一招,显然不够。

(二)马赛克增强:四张图拼成一张

这是重点。它的演进过程很有意思,是一条"逐步加码"的路线:

  1. 早期尝试 :把两张图片加权融合,或遮挡图片局部 ------ 指标提升了一部分
  2. 随机贴图 :在狗的图片上随机贴一张猫的图片 ------ 各项指标都涨了
  3. 四图拼接 :最终演变成把四张图拼成一张 ------ 场景更复杂,效果最好

为什么随机贴图有效?因为模型原来太"偷懒"了------它只看动物头部 就能判断是猫还是狗,根本不看尾巴和爪子。你随机贴一只猫上去,头部特征被干扰,模型被迫去学尾巴、爪子、身体轮廓这些其他部位的特征 ,学到的东西自然更全面。

四图拼接是同样的思路再加强:一次性塞进四个场景,物体的对比度和上下文复杂度都上去了。

|----------------------------------------------|
| 一句话理解马赛克 让模型在一张图里同时见到更多场景,逼它别只盯着一个特征下结论。 |

(三)随机遮挡:把关键部位"糊掉"

另一招是随机遮挡 :用随机值,或者训练集的平均像素值,把图像里的某块区域替换掉。

目的很明确------防止模型死盯着一个位置 。比如识别飞机,如果模型只认机翼,那把机翼遮住它就不认识了。

做法是:遮机翼 → 逼它去学机身;遮机身 → 逼它去学机翼和尾翼。来回遮挡几轮,模型对每个部位都有印象,特征就学全面了 。

三、标注转换:JSON 怎么变成 YOLO 的 TXT?

用 Labelme 打完标,得到的是 JSON 文件。但 YOLO 要的是 TXT。这一步靠 json_to_yolo.py 脚本自动完成。

(一)五步走完整个流程

第一步:建立标签映射。 先在脚本里定好"名字 → ID"的映射字典,比如狗 = 0、猫 = 1 。这个 ID 必须和后面训练时的顺序一致,否则类别就对不上了。

第二步:读取 JSON。 用 os.listdir 遍历目录下的所有 JSON 文件,再用 json.load 把内容读进内存。

第三步:提取框和图片尺寸。 从 JSON 的 shape 字段里取出矩形框的两个对角坐标点 (左上角、右下角),同时拿到图片的原始宽度和高度------后面归一化要用。

第四步:算中心点 + 归一化。 这一步是核心,也是新手最容易迷糊的地方。YOLO 格式记录的不是"左上角 + 右下角",而是中心点 + 宽高 。所以要换算:

|------------------------------------------------------------------------------------------|
| 中心点 X = (左上角 X + 右下角 X) / 2中心点 Y = (左上角 Y + 右下角 Y) / 2宽 = 右下角 X - 左上角 X高 = 右下角 Y - 左上角 Y |

拿到像素值后,还要归一化 成 0 到 1 之间的相对值:

|---------------------------------------------------------|
| 宽方向比例 = 1 / 图片原始宽度高方向比例 = 1 / 图片原始高度归一化后的值 = 像素值 × 对应比例 |

这么做的意义是:不管你的图是 800×600 还是 1920×1080,模型看到的都是统一的相对坐标 ,训练才稳定。

第五步:写入 TXT。 创建一个和 JSON 同名的 TXT 文件,但存到独立的 labels 目录 下(不要和原图混放)。写入格式很简单,空格分隔:

|--------------------|
| 类别ID 中心点X 中心点Y 宽 高 |

例如 0 0.512 0.483 0.240 0.365。一张图里有多个物体,就一行一个。

(二)两个必须注意的坑

|-----------------------|-------------------|
| 坑 | 后果 |
| 英文单词拼错(如 dog 拼成 doge) | 全班标签匹配不上,直接训练失败 |
| 图片文件名重复 | 图片和 JSON 对不上,标签错乱 |

所以要组织检查两件事:拼写必须绝对准确 、文件名必须唯一 (重复的就重命名或弃用)。

四、开跑训练:参数怎么配?

数据备好了,接下来就是把模型和参数调到能跑起来的状态。这一步分准备、改配置、设参数、加载权重四小段。

(一)准备工作

确保图片和标签都已转成 YOLO 标准格式:训练集图片 + 验证集图片 + 对应的 TXT 标签,数量要够。然后改 json_to_yolo.py 里的输入路径,跑一下就生成 labels 文件夹了。

环境方面,框架代码结构庞大(models、utils 等模块),建议自己理一理导入关系。缺库就装,比如 torch。

(二)改配置文件(两处必改)

第一处:模型配置。 复制 yolo_v3.cfg,重命名成自己的 custom 版本,然后把三个位置 的 classes 从默认的 80 改成实际类别数(比如猫狗就是 2 )。

|----------------------------|
| 容易漏 是三个位置都要改,改漏一个就会报错。 |

第二处:数据配置。 新建一个自定义 yaml 文件,模仿 COCO 的格式,严格写这四行:

|---------|-----------------------------|
| 字段 | 填什么 |
| classes | 实际分类数(如 2) |
| train | 训练集图片路径汇总 txt 的总目录 |
| valid | 验证集图片路径汇总 txt 的总目录 |
| names | 按打标顺序填类别名(如 dog, cat),顺序不能乱 |

(三)常用训练参数

参数通过 argparse 传递,可以在 IDE 的运行配置里改,也可以直接在命令行加。核心参数一览:

|----------------------|----------|----------------------------------|
| 参数 | 含义 | 建议 |
| Epoch | 训练轮数 | 默认 10,按需调整 |
| Batch size | 每批次图片数 | 默认 2;内存溢出就调到 1 |
| Gpu acquisition | 梯度累计次数 | 用于加速,较少使用 |
| Image size | 输入尺寸 | 默认 416×416,可选 320~608 之间 32 的倍数 |
| Checkpoint interval | 权重保存频率 | 每隔多少轮保存一次 .pt |
| Evaluate interval | 验证频率 | 每隔多少轮在验证集上评估 |
| Compute map | 是否计算 mAP | 设为 true 则每 10 个批次算一次 |
| Multi-scale training | 多尺度训练 | 通常设为 true |

显存不够的典型症状是报内存溢出(OOM),第一反应就是把 Batch size 调到 1 。

(四)加载权重开跑

在 train.py 里加载 Darknet53 预训练权重 作为初始参数,可以指定 CPU 线程数处理数据打包(默认 0 即自动)。

最后给新手一颗定心丸:第一次用小规模数据集训练时,损失值震荡甚至出现无穷大,都是正常现象 。这一阶段的重点是跑通整个流程 ,为后面上手 YOLOv5 打基础,不用死磕指标。

五、总结

这堂课的完整链路,可以浓缩成四步:

  1. 数据增强 :马赛克四图拼接 + 随机遮挡,逼模型学全面特征;
  2. 格式转换 :JSON → 归一化 → 中心点坐标 → TXT,注意拼写和文件名;
  3. 配置适配 :cfg 改三处 classes,yaml 写四行配置;
  4. 参数开跑 :按需设 Epoch / Batch size / Image size,加载预训练权重。

一句话记住:数据增强让模型"见多识广",格式转换让模型"读得懂",参数配置让模型"跑得动"。

相关推荐
听风吹等浪起2 小时前
第24章:基于 YOLOv5 的肺癌 / 肺结节 / 肺腺癌多目标识别与 10 种网络改进方案深度解析
yolo
燧机科技SuiJi11 小时前
山体坍塌落石滑坡泥石流监测系统 落石泥石流监控摄像机
大数据·人工智能·深度学习·yolo
磁场转动100万匹21 小时前
YOLOv3 原理详解:从 Darknet-53 到三尺度检测头
yolo
zx_741484811 天前
YOLOv3 核心原理详解:Darknet-53 架构、多尺度预测与 FPN 特征融合
算法·yolo·目标检测·yolov3
广州灵眸科技有限公司1 天前
瑞芯微(EASY EAI)RV1126B DeepSeek R1部署教程
linux·数据库·yolo
词却1 天前
计算机视觉:YOLO 目标检测
yolo·目标检测·计算机视觉
凌晨1681 天前
YOLO系列学习笔记:从YOLOv1到YOLOv3的演进之路
笔记·yolo·目标跟踪
FL16238631292 天前
塔吊下方站人检测数据集VOC+YOLO格式1049张1类别
人工智能·深度学习·yolo
晨间晓3 天前
单目视频测速不准?我给 YOLO + ByteTrack 加了透视标定和鸟瞰图测速
yolo·音视频