机器之心 原创
参与:路、思
一个基于PyTorch的目标检测工具箱,商汤联合港中文开源mmdetection
近日,商汤和港中文联合开源了 mmdetection,这是一个基于 PyTorch 的开源目标检测工具包,属于香港中文大学多媒体实验室 open-mmlab 项目的一部分。该工具包支持 Mask RCNN 等多种流行的检测框架,读者可在 PyTorch 环境下测试不同的预训练模型及训练新的检测分割模型。
项目地址:https://github.com/open-mmlab/mmdetection
根据 GitHub 项目所述,mmdetection 的主要特征可以总结为以下几个方面:
-
模块化设计:你可以通过连接不同组件轻松构建自定义目标检测框架。
-
支持多个框架,开箱即用:该工具包直接支持多种流行的检测框架,如 Faster RCNN、Mask RCNN、RetinaNet 等。
-
高效:所有基础边界框和掩码运算都在 GPU 上运行。不同模型的训练速度大约比 FAIR 的 Detectron 快 5% ~ 20%。
-
当前最优:这是 MMDet 团队的代码库,该团队赢得了 2018 COCO 检测挑战赛的冠军。
除了 mmdetection,研究者们还开源了用于计算机视觉研究的 mmcv 库,mmdetection 很多算法的实现都依赖于 mmcv 库。
此次项目的参与者之一,香港中文大学陈恺博士介绍说:「mmcv 和 mmdetection 同属于 open-mmlab 项目,这个项目会将我们 lab 的一些 research project 有计划、系统性地开源。mmcv 是一个基础库,主要分为两个部分,一部分是和 deep learning framework 无关的一些工具函数,比如 IO/Image/Video 相关的一些操作,另一部分是为 PyTorch 写的一套训练工具,可以大大减少用户需要写的代码量,同时让整个流程的定制变得容易。」
对比 Detection
据陈恺博士介绍,10 月 12 日商汤正式开源了两个项目,即 mmcv 和 mmdetection:
mmdetection 是基于 MMDet 队伍 COCO 比赛(Detection 2018 winner)时的 codebase重构,先放一张 test-dev 的结果。
mmdetection 原计划九月底 release,由于某些不可抗力(比如拖延症)延迟到了现在,感觉如释重负。第一个版本中实现了 RPN、Fast R-CNN、Faster R-CNN、Mask R-CNN,近期还计划放出 RetinaNet 和 Cascade R-CNN。(如果由于赶 CVPR 跳票了,请不要介意,介意也不会 release 的。)
先简单介绍一下和 Detectron 的对比
-
performance 稍高
-
训练速度稍快
-
所需显存稍小
但更重要的是,基于 PyTorch 和基于 Caffe2 的 code 相比,易用性是有代差的。成功安装 Detectron 的时间,大概可以装好一打的 mmdetection 吧。
当然 Detectron 有些优势也很明显,作为第一个全面的 detection codebase,加上 FAIR 的金字招牌,关注人数和用户很多(虽然吐槽也比较多),release 的模型也比较全面。我们也在努力扩充 model zoo,奈何人力和算力还是有很大差距,所以还需要时间。
具体说说上面提到的三个方面吧。首先是 performance,由于 PyTorch 官方 model zoo 里面的 ResNet 结构和 Detectron 所用的 ResNet 有细微差别(mmdetection 中可以通过 backbone 的 style参数指定),导致模型收敛速度不一样,所以我们用两种结构都跑了实验,一般来说在 1x 的 lr schedule 下 Detectron 的会高,但 2x 的结果 PyTorch 的结构会比较高。
速度方面Mask R-CNN差距比较大,其余的很小。采用相同的 setting,Detectron 每个iteration需要 0.89s,而 mmdetection 只需要 0.69s。Fast R-CNN 比较例外,比 Detectron 的速度稍慢。另外在我们的服务器上跑 Detectron 会比官方 report 的速度慢 20% 左右,猜测是 FB 的 Big Basin 服务器性能比我们好?
显存方面优势比较明显,会小 30% 左右。但这个和框架有关,不完全是 codebase 优化的功劳。一个让我们比较意外的结果是现在的 codebase 版本跑 ResNet-50 的Mask R-CNN,每张卡(12 G)可以放 4 张图,比我们比赛时候小了不少。
除了陈恺博士在知乎上的回答,mmdetection 的 GitHub 项目页面上还有很多实现性能与对比数据:
1. 性能
开发者报告了使用使用 caffe-style 和 pytorch-style ResNet 骨干网络的结果,前者的权重来自 Detectron 中 MODEL ZOO 的预训练模型,后者的权重来自官方 model zoo。
2. 训练速度
训练速度的单位是 s/iter,数值越低代表速度越高。
3. 推断测试
推断速度的单位是 fps (img/s),数值越高代表效果越好。
测试与训练
首先安装 mmdetection 需要以下环境:
-
Linux (tested on Ubuntu 16.04 and CentOS 7.2)
-
Python 3.4+
-
PyTorch 0.4.1 and torchvision
-
Cython
-
mmcv
使用预训练模型进行推断
1. 测试数据集
开发者允许在一块 GPU 上运行一或多个进程,如在 8 块 GPU 运行 8 个进程或 16 个进程。当单个进程的 GPU 工作负载并不是很大时,运行多个进程将加速测试,这由参数--proc_per_gpu <PROCESS_NUM> 指定。
测试和保存结果:
python tools/test.py <CONFIG_FILE> <CHECKPOINT_FILE> --gpus <GPU_NUM> --out <OUT_FILE>
要想执行测试后的评估,你需要添加 --eval <EVAL_TYPES>。支持类型包括:
-
proposal_fast:使用 mmdetection 的代码求 proposal 的召回率。(应该可以得到和官方估计同样的结果。)
-
proposal:使用 COCO 提供的官方代码求 proposal 的召回率。
-
bbox:使用 COCO 提供的官方代码求 box AP 值。
-
segm:使用 COCO 提供的官方代码求 mask AP 值。
-
keypoints:使用 COCO 提供的官方代码求 keypoint AP 值。
例如,估计使用 8 个 GPU 的Mask R-CNN,并将结果保存为 results.pkl:
python tools/test.py configs/mask_rcnn_r50_fpn_1x.py <CHECKPOINT_FILE> --gpus 8 --out results.pkl --eval bbox segm
在测试过程中可视化结果同样很方便,只需添加一个参数--show:
python tools/test.py <CONFIG_FILE> <CHECKPOINT_FILE> --show
2. 测试图像
开发者提供了一些高级 api 来测试图像:
import mmcv from mmcv.runner import load_checkpoint from mmdet.models import build_detector from mmdet.apis import inference_detector, show_result cfg = mmcv.Config.fromfile('configs/faster_rcnn_r50_fpn_1x.py') cfg.model.pretrained = None # construct the model and load checkpoint model = build_detector(cfg.model, test_cfg=cfg.test_cfg) _ = load_checkpoint(model, 'https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/faster_rcnn_r50_fpn_1x_20181010-3d1b3351.pth') # test a single image img = mmcv.imread('test.jpg') result = inference_detector(model, img, cfg) show_result(img, result) # test a list of images imgs = ['test1.jpg', 'test2.jpg'] for i, result in enumerate(inference_detector(model, imgs, cfg, device='cuda:0')): print(i, imgs[i]) show_result(imgs[i], result)
训练模型
mmdetection 使用 MMDistributedDataParallel 和 MMDataParallel 分别实现分布式训练和非分布式训练。
开发者建议在单个机器上也要使用分布式训练,因为它速度更快,而非分布式训练可以用于 debug 或其他目的。
1. 分布式训练
mmdetection 潜在支持多种 launch 方法,如 PyTorch 的内置 launch utility、 slurm 和 MPI。
开发者使用 PyTorch 内置的 launch utility 提供训练脚本:
./tools/dist_train.sh <CONFIG_FILE> <GPU_NUM> [optional arguments]
支持的参数有:
-
--validate:训练过程中每 k(默认值为 1)个 epoch 执行估计。
-
--work_dir <WORK_DIR>:如果指定,配置文件中的路径将被重写。
2. 非分布式训练
python tools/train.py <CONFIG_FILE> --gpus <GPU_NUM> --work_dir <WORK_DIR> --validate
知乎问答参考链接:https://www.zhihu.com/question/294578141
工程 目标检测 语义分割 计算机视觉
相关数据
Convergence
在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。
Computer Vision
计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。
来源:机器之心
Mask R-CNN
Mask R-CNN是一个概念上简单,灵活和通用的对象实例分割框架。 该方法能够高效地检测图像中的对象,同时为每个实例生成高质量的分割蒙版。 这种方法通过添加一个用于预测对象蒙版的分支来扩展R-CNN使之更快,该分支与现有的用于边界框识别的分支并行。
Weight
线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。
来源:Google AI Glossary
Refactoring
代码重构(英语:Code refactoring)指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方。在极限编程的方法学中,重构需要单元测试来支持。
来源: 维基百科
机器之心是国内领先的前沿科技媒体和产业服务平台,关注人工智能、机器人和神经认知科学,坚持为从业者提供高质量内容和多项产业服务。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- GitHub 教师工具箱
- 【译】Go 的工具箱综述
- SteamTools 2.4.1 发布,包含多种 Steam 工具功能的工具箱
- 2020年,11种应该加入工具箱的顶级VueJS开发员工具
- 时间序列分析工具箱——tibbletime
- 成为“黑客”前,必拥有的”黑客工具箱“
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
机器学习系统设计
[德] Willi Richert、Luis Pedro Coelho / 刘峰 / 人民邮电出版社 / 2014-7-1 / CNY 49.00
如今,机器学习正在互联网上下掀起热潮,而Python则是非常适合开发机器学习系统的一门优秀语言。作为动态语言,它支持快速探索和实验,并且针对Python的机器学习算法库的数量也与日俱增。本书最大的特色,就是结合实例分析教会读者如何通过机器学习解决实际问题。 本书将向读者展示如何从原始数据中发现模式,首先从Python与机器学习的关系讲起,再介绍一些库,然后就开始基于数据集进行比较正式的项目开......一起来看看 《机器学习系统设计》 这本书的介绍吧!