2025年10月24日

程序员节到了,聊聊我这几年和目标检测打交道的经历。没有惊天动地,也没有一鸣惊人,就是一步步学、一点点调,慢慢走过来的。

深度学习必看论文:
  • 《Deep Residual Learning for Image Recognition》(ResNet)

  • 《Generative Adversarial Networks》(GAN)

  • 《Very Deep Convolutional Networks for Large-Scale Image Recognition》(VGG)

  • 《Densely Connected Convolutional Networks》(DenseNet)

  • 《U-Net: Convolutional Networks for Biomedical Image Segmentation》

  • 《Attention Is All You Need》

  • 《Faster R-CNN: Towards Real-Time Object Detection》

一、初识:先打基础,再谈目标检测

我最早并不是直接上手目标检测的。那时候连 Python 都写不利索,for 循环和列表推导式还分不清,更别说用 PyTorch 写模型了。对神经网络的理解也停留在“多层感知机”这种概念层面,只知道前向传播和反向传播是“算损失、调参数”,但具体怎么实现,完全没概念。

所以第一步,我决定老老实实补基础。没有跳过任何一步,就是照着路线图一步步来。

1. Python 和工具链:从“能跑”到“会用”

我花了大概两个月时间系统地学 Python,重点不是语法本身,而是工程化使用

  • 把 NumPy 的数组操作练熟,比如 reshapetranspose、广播机制,因为后续处理图像数据全靠它;
  • 学 OpenCV,掌握 cv2.imreadcv2.resize、BGR 转 RGB 这些基本操作,顺便理解图像的 HWC 格式;
  • 搭建 PyTorch 环境,从 torch.Tensor 创建张量,到 autograd 自动求导,再到 nn.Module 定义网络层,一步步动手实现。

我还特意找了一些小项目练手,比如用 OpenCV 做边缘检测,用 PyTorch 实现线性回归。这些看似简单,但让我对“代码如何与数学公式对应”有了直观感受。

2. 理论学习:从“听懂”到“理解”

光会写代码不够,还得懂原理。我系统看了吴恩达在 Coursera 上的《深度学习》课程,特别是 CNN 这几讲。
重点搞清楚了几个核心概念:

  • 卷积核是怎么滑动提取特征的;
  • 池化层如何降低分辨率、保留主要信息;
  • 反向传播中梯度是如何通过链式法则回传的;
  • 激活函数(ReLU、Sigmoid)的作用和选择。

看视频的同时,我会在纸上画网络结构图,标注每一层的输入输出尺寸。比如 VGG16,从 224x224x3 输入开始,经过多个卷积+池化,最终变成 7x7x512 的特征图。这个过程让我对“特征提取”有了空间上的理解。

3. 简单项目实践:猫狗识别

理论看完了,真正让我把知识串起来的,是一个简单的项目:猫狗识别

教程从零开始,教你怎么:

  • 下载 Kaggle 上的经典数据集(Dogs vs Cats);
  • 用 torchvision.datasets.ImageFolder 加载数据;
  • 使用 torchvision.transforms 做图像预处理(缩放、归一化);
  • 搭一个简单的 CNN 网络,或者用 torchvision.models.resnet18 做迁移学习;
  • 用 DataLoader 分批读取数据,写训练循环,计算准确率。

一开始,环境就出了问题:CUDA 版本不匹配,torch.cuda.is_available() 返回 False。我折腾了一整天,重装了 cudatoolkit 才解决。

训练过程中也遇到各种 bug:

  • 图像路径写错,报 FileNotFoundError
  • 输入维度不对,提示 “expected 3x224x224 got 1x224x224”,才发现灰度图没处理;
  • 训练 loss 不下降,后来发现是学习率设成了 0.1,太大了,改成 0.001 才正常。

但这些问题一个个解决后,当模型在验证集上准确率达到 92% 时,那种“我自己跑通了一个AI项目”的感觉,是真的踏实。

更重要的是,这个项目让我熟悉了完整的训练流程:

数据加载 → 预处理 → 模型定义 → 训练循环 → 验证评估

这套流程后来做目标检测时完全用得上,只是换了个框架和任务而已。

4. 正式接触目标检测

真正开始接触目标检测,我是从读论文入手的。我知道光看教程和代码不够,如果不理解背后的思路演进,很容易停留在“会调包”但“不懂为什么”的层面。

所以我列了个阅读计划,把计算机视觉和深度学习领域几篇关键论文都过了一遍,边读边做笔记,用 Markdown 记录核心思想、网络结构、创新点和我的疑问。

我重点读了以下几篇:
  • 《Deep Residual Learning for Image Recognition》(ResNet)

  • 《Generative Adversarial Networks》(GAN)

  • 《Very Deep Convolutional Networks for Large-Scale Image Recognition》(VGG)

  • 《Densely Connected Convolutional Networks》(DenseNet)

  • 《U-Net: Convolutional Networks for Biomedical Image Segmentation》

  • 《Attention Is All You Need》

  • 《Faster R-CNN: Towards Real-Time Object Detection》

阅读方法:

我的读论文流程是这样的:

  • 先看摘要和引言,搞清楚这篇论文到底想解决什么问题;
  • 然后盯着网络结构图,对照文中的公式,一行行琢磨每个模块是干啥的;
  • 最后去 GitHub 找开源实现,看看别人是怎么用代码把论文“落地”的。

但说实话,刚开始的时候,这个过程特别慢
第一篇 ResNet 我看了快一个月,很多地方根本看不懂:

  • 什么是“梯度消失”?
  • 为什么加个跳接就能解决深层网络退化?
  • 论文里写的“batch normalization”到底在代码里放哪?

当时一头雾水,也不敢问人,就只能靠自己。
不懂就去搜——CSDN、上面有很多人得讲解。
看别人写的解读博客,看视频讲解,有时候一个概念,要对比好几篇文章才能明白。

比如“RoI Pooling”这个操作,论文里一句话带过,但我就是想不通怎么把不同大小的区域变成固定尺寸。
后来在 CSDN 上看到一篇图文并茂的解析,画了网格划分的过程,我才恍然大悟。

慢慢地,随着读的论文多了,理解速度也快了起来。
从最开始一篇要一个月,到现在三四天能吃透一篇核心内容。
虽然还是会有卡住的地方,但已经知道怎么查、怎么拆解问题了。

每读完一篇,就感觉“脑子里的拼图又完整了一块”。
这种一点点把知识拼起来的过程,其实比直接跑个 demo 更有成就感。

二、初识:实战入门——从跑通项目到理解细节

1. 复现成功论文开源代码:水下目标检测

真正让我觉得“能动手做点事”的,是第一次成功复现一个开源的目标检测项目。
项目方向是:水下目标检测,任务是识别海底的鱼类、海参、海胆等生物。
代码来自一个 GitHub 开源项目,基于 CNN实现。光是环境配置,就花了我整整两个月。

(1)环境依赖:版本不匹配的“噩梦”
ModuleNotFoundError: No module named 'torchvision.models.resnet'

刚开始被这个问题可以说是搞到崩溃。

(2)数据准备与预处理:细节处处是坑
  • 图像命名不统一,有的是 .jpg,有的是 .JPG,Linux 下大小写敏感,导致读取失败;
  • 标注文件中的类别名是中文(如“海参”),而代码里写的是英文(sea_cucumber),对不上;
  • 部分图像分辨率太大(4000x3000),直接加载内存爆掉。
(3)推理与可视化:看到结果的那一刻

最让我有成就感的,是运行 test.py 时,看到一张张水下图像上出现了彩色的 bounding box。
虽然有些漏检,也有误判(把石头当成海参),但整体已经“看得懂”图像了。

我还用 OpenCV 写了个小脚本,把检测结果保存成带框的图片,并统计每帧的推理时间。在 CPU 上大概 1.2 秒/帧,太慢了,但至少功能是完整的。

代码不会骗人,你付出多少努力,它就回报你多少理解。而每一次“终于跑通了”的瞬间,都是对坚持最好的奖励。

更多推荐