项目地址:https://github.com/TuSimple/simpledet
SimpleDet 是一套简单通用的目标检测与物体识别的框架。整套框架基于 MXNet 的原生 API 完成。这篇文章不仅仅想介绍一下这样一个新的框架有什么与众不同的 feature,更想去介绍一下我们为什么决定做这么一件事情以及我们的初衷是什么。
为什么还要再造一次锤子?
这个问题其实也是我们在开始这个项目之前自问了很多次的问题。如果大家有心留意下的话,Ross 在产出 RCNN 和 Fast RCNN 的那两三年,每年都会去参加一下 ImageNet 比赛。其实当初很不解,为什么要去这么做,尤其是基本都是很裸的方法,一定不可能拿到好的名次。后来有机会去抓住 Kaiming 问了一下这个问题,Kaiming 给我的答案是,Ross 其实并不关系这个名次,Ross 关心的是借这个机会宣传他更好用的锤子给大家。
其实不同于很多人认为的那样,模型 fancy,结果好才是一个好工作的体现。恰恰相反,简单可靠,越多的 paper 愿意以这个方法作为 baseline,就越说明这个方法的经典。其实对我自己而言,我从读 PhD 开始就一直愿意去做这样的 baseline 和这样的锤子。从当年用 HOG+LR 超越绝大多数 paper 的 Tracking 到参与 MXNet 项目再到后来用 5 行代码做 domain adaptation 的 AdaBN。虽然开始的时候都遭受了很多人包括 reviewer 的质疑,但是时间都证明了这些工作的价值。
对于目标检测和识别领域,今天我们发现了同样的问题。虽有很多开源的代码和框架,但是目前看下来仍有很大进步的空间。一方面现有的开源框架虽有各种冠军头衔加持,但因为各种各样的原因,复现出真正 SOTA 的结果仍然不是一件轻松的事情;另一方面,一些性能还不错的开源代码(如 SNIP 和 SNIPER)却难以拓展和维护。所导致的结果就是目前仍然有很多论文仍然在一个很低的 baseline 上进行改进,就算取得了性能的提升也很难说明方法的有效性。我们建立 SimpleDet 就是为了对于 Instance Recognition 这一系列问题提供一个更好的 baseline 和更好的锤子。
如果去问一个同学你需要一个什么样的目标检测和识别框架,我相信性能好,速度快,好用这三个关键词可以覆盖 99% 的需求,下面我们一一展开来看看 SimpleDet 在这些方面的优势和与其他开源框架的区别。
什么叫性能好?
在 SimpleDet 中,最值得关注的一个算法是我们的 TridentNet(不知道 TridentNet 的同学欢迎猛戳:Naiyan Wang:TridentNet:处理目标检测中尺度变化新思路)。我们公布了在各个 setting 下的模型和训练代码。这也是目前已知的 COCO 上单模型最高的算法。除了一个干净的模型(testdev mAP=42.7)之外,我们还提供了一个加上了全部大礼包的 setting(testdev mAP=48.4),包括 Sync BN,multi-scale training/testing,deformable conv 和 softer NMS。虽然这些都是在很多 paper 和比赛中大家已经常用的技术了,但是仍然很难把所有的方法都直接正确打开。
我们在 SimpleDet 中提供了一套开箱即用的方案,希望借此降低复现 SOTA 的门槛,从而提升下整个领域中 baseline 的水平。除此之外,为了方便大家进一步拓展,我们还提供了一些经典模型和算法,例如 Mask(Faster) RCNN,FPN,RetinaNet,CascadeRCNN 等。这个算法的结果都已经经过验证,能达到论文中和已有开源代码的结果。我们后续还会进一步补充一些经典和重要的工作,也欢迎大家积极贡献。
什么叫速度快?
首先针对速度这个问题,我们一个独特的 feature 是 FP16 training,FP16 不仅可以节省一半的显存,在最新支持 TensorCore 的 Volta 和 Turing 系列 GPU 上还可以有一倍甚至更多的速度提升。如下左图,从 1080Ti 的 30img/s 可以提升到 75img/s,展现了非常显著的提升。其次,对有不同资源的同学来说,对于速度的需求也是不同的。我们着重考虑了三种典型的用户:
入门用户:这类用户可能由于实验室资源限制,或者单纯是因为个人兴趣,只能负担起小于 4 块 GPU。针对这类用户,能够尽量复现出更多资源下的结果是第一优先级。核心的问题在于使用大的 batchsize 和 BN batchsize。在这样的 setting 下,SimpleDet 提供了 Inplace ABN[1] (To be announced),结合上 MXNet 本身提供的 memonger 功能,再加上 FP16,极限状态下训练的单卡 batchsize 可以达到 8 到 16。虽然损失了一定的速度,但是在两到四卡上就能达到正常八卡训练的 batchsize。
普通用户:这类用户应该占据绝大多数,可以独占一台 8 卡机器进行训练。这类用户对于速度会有着更高的需求,可以在入门用户的基础上关掉 memonger 这种对速度有一些影响的组件,以得到更好的训练速度。
土豪用户:手里有多台 8 卡机器,希望充分利用机器快速迭代模型。针对这部分用户,依托于 MXNet 优秀的分布式设计以及阿里云更进一步优化的 Perseus 通信框架,如下右图所示,我们在 4 机 32 卡的情况下可以做到线性加速(没有资源进行更大的测试了,更强大的土豪可以赞助点机器。。。)。这对于打比赛或者对模型迭代速度有很高要求的应用来说,无疑是个福音。
我们希望每一类用户都能各取所需,在 SimpleDet 中找到最适合自己资源的 setting,极大化产出。
什么叫做好用?
虽然每个用户心里都会有一个好用的定义(心疼产品经理 1s...),除了前面的性能和速度之外,我们认为是否容易拓展和方便清晰调参也会是两个重要的因素。我们针对一些常见需求,进行了高度模块化的设计,一个核心思想便是尽量抽象和隔离核心操作,使各种不同算法尽量复用,在这些核心操作之上拓展而无需修改。例如,我们抽象出了一整套干净通用的配置系统,除了可以配置所有常见参数之外,还将常用的预处理和数据扩充操作也都抽象出来。针对这些常见的变更,用户不需要修改核心代码即可完成调优。
再比如,修改一个 detection 算法可能会遇到最复杂的逻辑就是在于 data loader 和 pre-process,但是往往一个欠佳的实现会导致 loader 的效率大幅度下降,从而成为整个训练中的瓶颈,使得 GPU 利用率降低。在 SimpleDet 中,我们提取出了一个通用的多线程 loader 框架,并抽象出了在预处理中常见的操作。后续新算法的拓展可以很容易在这些通用工具的基础上同时保持简洁性和效率。更多的设计欢迎大家直接阅读源码,我们也给出了一个简单的对 Faster RCNN 和 TridentNet 代码结构的分析供大家参考。
以上便是 SimpleDet 的一个简要介绍,欢迎大家积极试用,提出宝贵意见。也欢迎大家一起来捉 bug,贡献新的算法和 feature,共同把 SimpleDet 打造成一套目标检测与物体识别的前沿试验平台。
最后,例行保留项目。开源出来的项目只是我们在进行的 Deep Learning 项目中的冰山一角,Deep Learning 也只是我们进行的无人驾驶卡车全技术栈中的一环,在图森有着大量有趣而又有挑战的项目有待开展。想不想试试用自己的代码驱动一辆 40 吨的大卡车在高速上以 80km/h 的速度飞奔?想不想试试用自己的代码控制一辆近 20 米长的卡车以 5cm 的精度停在吊车下呢?欢迎加入图森未来!
[1] Rota Bulò, Samuel, Lorenzo Porzi, and Peter Kontschieder. "In-place activated batchnorm for memory-optimized training of dnns." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
知乎专栏地址:https://zhuanlan.zhihu.com/p/55972055