写在前面的话
万物·炼器 | 从零打造工业级旋转目标检测网络 —— 借鉴 YOLO11 OBB 的设计之道
一个面向卷积神经网络与目标检测初学者的“从零手搓”系列。
不满足于会调用YOLO,而是希望把一个现代目标检测模型真正拆开、看懂、写出来,并最终学会根据自己的任务需要去修改它。
YOLO11 OBB 是本系列后期用于深入理解目标检测的一张参考蓝图,但这个系列并不是只为“旋转目标检测”而写。
《万物·炼器》 是一个围绕 卷积神经网络与目标检测 展开的系列学习项目。
项目包含:
- 系列技术文章;
- 与文章同步的实验代码;
- 从简单网络到完整检测器的逐步实现;
- 对 YOLO11 OBB 关键结构与设计思想的分析;
- 从普通目标检测进一步走向 OBB 旋转目标检测的完整扩展过程;
- 学习过程中形成的实验、验证与调试记录。
旋转目标检测(OBB)会在后面的内容中占据重要位置,但它更像是这个系列最终选择的一条“进阶实战路线”,而不是整个系列唯一的主题。
系列文章中的卷积、反向传播、Backbone、FPN、多尺度特征、检测头、标签分配、Loss 等内容,本质上都属于通用的卷积神经网络与目标检测知识。
这个系列不会一上来就告诉你:
model = YOLO(...)
model.train(...)
然后模型就跑起来了。
我们更希望把这些看似“黑盒”的东西一层一层拆开。
例如:
- 一层卷积到底做了什么?
- 卷积核里的参数是怎么学出来的?
- Loss 为什么能够让几十层之前的参数发生变化?
- Backbone、Neck、Head 分别负责什么?
- 为什么目标检测需要多尺度特征?
- FPN 为什么要做上采样和特征融合?
- 为什么成熟网络不是简单地不断堆叠
Conv2d? - Bottleneck、C2f、C3k2、SPPF 为什么这样设计?
- DFL 到底在预测什么?
- TAL 为什么能够决定哪些预测点应该成为正样本?
- ProbIoU 为什么适合旋转框?
- 普通目标检测又是怎样一步一步变成 OBB 旋转目标检测的?
最终,希望我们不仅能够“使用一个 YOLO 模型”,而是真正知道:
一个现代目标检测网络究竟是怎样炼成的。
1. 为什么会有这个系列?
最初写这些文章,其实并不是为了写教程,而是为了学习。
在学习卷积神经网络和目标检测的过程中,我经常遇到一个问题:
很多东西看资料的时候似乎“看懂了”。
但是如果合上资料,重新问自己:
为什么要这样设计?
或者:
如果不用现成框架,让我自己写出来,我会不会?
很多时候就抓瞎了。于是我开始尝试费曼学习法:
把自己当成老师,把文章写给一个几乎不了解人工智能的人看。
如果一个知识点不能用简单、清楚的话解释出来,那么很可能还没有真正理解它。
所以这个系列有一个很朴素的目标:
尽量把目标检测中的复杂概念,写成一个有 Python 基础、但几乎没有人工智能背景的人,也能够一步一步看懂的内容。
某种意义上,这些文章首先是写给我自己的学习笔记。
如果它们也能够帮助其他正在学习目标检测的人少走一些弯路,那就更有意义了。
2. 这个系列有什么特点?
(1) 尽可能从零开始
默认读者:
- 会一些 Python;
- 知道什么是类和函数;
- 能看懂基本 PyTorch 代码;
但不要求已经系统学习过深度学习。一些经常被教程一笔带过的内容,也会尽量重新解释。例如:
- Tensor 到底是什么;
- 卷积层的参数从哪里来;
- 一个神经元怎样计算;
- 特征图是什么;
- 通道是什么;
- 下采样是什么;
- 计算图是什么;
- 梯度是什么;
loss.backward()到底发生了什么。
(2) 不满足于“会调用”
很多教程最终会变成:
model = YOLO(...)
model.train(...)
这样当然方便。但这个系列更感兴趣的是:
这些代码背后到底发生了什么?以及我想要改代码的话该怎么改?
因此会自己实现大量核心模块,并通过:
- Tensor Shape;
- Forward;
- Backward;
- 梯度;
- Loss;
- 中间输出;
- 实验结果;
去验证自己的理解。
(3) 尽量说人话
数学公式无法完全避免。但如果能够先用直觉解释清楚,就不会急着堆公式。
一个公式真正出现之前,我们会尽量先回答:
它到底想干什么?
然后再去理解公式里的符号。
(4) 文章和代码一起推进
这里的代码不是单独准备的一堆 Demo,文章讲到哪里,代码就尽量实现到哪里。
整个项目更像是一个模型不断升级的过程:
能跑
↓
能检测
↓
能多尺度检测
↓
结构更加稳定
↓
更加接近成熟检测器
↓
支持 OBB
↓
能够训练和推理
↓
能够针对实际任务继续修改
3. 适合哪些读者?
这个系列主要写给:
- 会一些 Python,但刚开始学习人工智能的人;
- 正在学习 PyTorch 的同学;
- 第一次接触目标检测的读者;
- 会使用 YOLO,但不知道 YOLO 内部发生了什么的人;
- 会训练 YOLO,但不知道如何修改网络的人;
- 看过很多目标检测教程,却始终觉得知识比较零散的人;
- 想系统理解 Backbone、Neck、Head、Loss 等模块的人;
- 想系统学习目标检测的人;
- 想学习如何阅读深度学习框架源码的人;
- 想根据自己的实际任务修改 YOLO 的工程人员或学生。
如果你已经能够熟练实现检测器、阅读大型深度学习框架源码,那么前面的内容可能会比较基础。 不过后面的 OBB、DFL、TAL、ProbIoU、Loss 和完整检测流程,仍然可以作为一套系统化的实现笔记。
4. 关于 AI
这个项目是在 AI 辅助下完成的。
AI 参与了包括但不限于:
- 技术资料整理;
- 源码辅助分析;
- 概念讨论;
- 文章结构优化;
- 表达方式修改;
- 代码检查;
- 实验思路讨论;
- Bug 排查;
- 技术问题交叉验证。
但这里并不是简单地让 AI:
“生成一篇目标检测教程。”
AI 更像一个随时可以讨论问题的:
学习伙伴 + 代码审阅助手 + 技术讨论对象。
5. License
本项目中的原创文章、代码、图片、示意图及其他原创内容,其著作权归作者所有。
公开访问并不代表授予复制、转载、修改、分发或使用许可。
在未获得作者明确授权的情况下,不得以任何形式:
- 转载、复制或大段摘录本项目中的文章;
- 修改、整理后再次发布本项目内容;
- 将本项目文章、代码、图片或其他内容用于其他网站、公众号、课程、出版物或知识付费内容;
- 将本项目代码全部或部分用于其他项目、产品或商业应用;
- 对本项目内容进行二次分发、二次开发或重新包装发布;
- 以其他方式使用本项目中的原创内容。
如需转载、引用、修改、二次开发、项目使用或商业使用,请提前联系作者并取得明确授权。
个人可以在线阅读本项目内容,用于个人学习和研究;正常的少量引用应注明出处及本项目来源。
未经授权,请勿转载、复制、修改、分发或用于其他项目。