深度学习必看论文:以 1024 之名,写下我与目标检测的「双向奔赴」
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 的数组操作练熟,比如
reshape、transpose、广播机制,因为后续处理图像数据全靠它; - 学 OpenCV,掌握
cv2.imread、cv2.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 秒/帧,太慢了,但至少功能是完整的。
代码不会骗人,你付出多少努力,它就回报你多少理解。而每一次“终于跑通了”的瞬间,都是对坚持最好的奖励。
更多推荐
所有评论(0)