最近有个学弟问了我两个问题:1、计算机视觉算法工程师应该具备哪些基础;2、工作这半年以来似乎就是拉开源项目,在自有数据上训练一下,感觉成长有限。

为此,我准备做一系列总结,既是对这个学弟的回复,也是自己接触计算机视觉五年来的一个回顾。

这个系列第一篇讲一下目标检测的精进路径,不过方法可以推广到其他任务,比如图像分类、语意分割、文字识别、文字检测等等。

1、知其然

1.1、首先找一篇经典的目标检测模型,比如Faster RCNN或者YOLO。

1.2、仔细研读论文,弄清楚论文解决了什么问题、为什么要解决这个问题、这个问题怎么解决的。然后在不参考开源代码的情况下,想自己要复现的话,该怎么实现,写出复现的伪代码,对于没想明白怎么实现的部分,做好标记。

1.3、然后看源代码,尽量看有大公司或者大实验室背书的源代码,他们的复现较大概率能保证跟原论文一致,github上很多所谓的复现(即使star很多)都不能复现原始论文的结果,而且大公司或者大实验室背书的代码质量大概率比较高,能提高自己的代码品味。

1.4、比照源代码,看看自己想不到如何实现的部分,源代码里如何实现的;看看自己的复现伪代码思路哪些地方跟源代码不一样,为什么不一样,孰优孰劣;看看源代码中是否有一些细节,论文里没有提及。

1.5、接着重复1.2到1.4,直到自己能准确无误地写出论文的伪代码。这个过程比较枯燥乏味,可能会循环往复十几次甚至几十次。但是量变最后会导致质变。

1.6、到了这里,我们对这篇论文非常熟悉了,以此为蓝图,我们也对目标检测的骨架有了一个基本的认识。

2、知其所以然

2.1、针对这篇论文里每个模块(比如数据增强、anchor、FPN、smooth L1 loss等等),问自己几个问题。为什么需要这个模块?这个模块对数据分布有什么样的假设?其他论文里这个模块是如何设计的(可以分为纵向和横向,纵向就是看历史上的论文是怎么设计的,横向就是看同年代的论文是怎么设计的)?我会怎么设计这个模块?

这个过程可能需要大量翻阅论文,甚至自己动手做一些实验来回答这些问题。

2.2、针对这篇论文里每个模块里的每一个超参,问自己几个问题。每个超参代表什么含义?这里为什么要设定为当前这个值?能否有更优的超参值?

这个过程也需要翻阅一些论文,或者自己动手做一些实验看看。

3、What I cannot create, I do not understand

3.1、写代码完整复现一篇经典目标检测论文。通过上述1和2,我们似乎对目标检测已经很熟了,但是不要飘飘然,动手实现一下吧,你会发现你以为的熟不是真的熟。这个过程可能不太容易,但是完成之后,你会对目标检测有更深的理解。

4、持续跟进学术界动态,每看一篇新论文,问自己几个为什么。这篇论文解决了什么问题?这个问题是否有价值?这个问题是怎么解决的?有没有论文解决过类似问题?我会怎么解决?

总结一下,其实就是多看多想多动手,the devil is in the details。