Closed vieyahn2017 closed 10 months ago
https://www.jianshu.com/p/818e1cb535e0
Detectron是Facebook AI研究院(FAIR)于2018年初公开的目标检测平台,包含了大量业内最具代表性的目标检测、图像分割、关键点检测算法。该框架主要基于python和caffe2实现,部分底层代码由c++实现,另外部分算法如group normal(GN)则是基于pytorch框架。由于本人平时的工作主要与目标检测相关,后面主要一起学习下detectron框架下的一系列目标检测算法及源码。本文为第一篇博客,主要介绍下detectron的安装以及目录结构、主要算法,后续文章会深入研讨下源码、算法细节、及本人学习过程中的一些心得。
1.detectron框架的安装及详细信息
detectron框架目前只支持linux系统以及NVIDIA GPU硬件,在安装detectron之前需具备的环境为python2,caffe2及相关的依赖库、cuda等。另外,如果用coco数据集形式的数据,还需安装coco API。废话不多说,以下为各组件安装地址。
cuda下载地址:https://developer.nvidia.com/cuda-downloads
cuda安装教程:https://blog.csdn.net/sinat_24143931/article/details/78690059
caffe2安装地址:https://caffe2.ai/docs/getting-started.html?platform=windows&configuration=compile
detectron安装地址:https://github.com/facebookresearch/Detectron/blob/master/INSTALL.md
coco API安装地址:https://github.com/cocodataset/cocoapi
了解更详细更全面的信息可参考detectron官方的github:https://github.c om/facebookresearch/Detectron
安装的过程会可能会遇到各种问题,大家根据报错的提示信息在github或google上搜索,一般都能解决。少数仍然解决不了的,可以在Facebookresearch/Detectron的github官网提问。
正确安装detectron后,在detectron目录下一般会有如下几个比较重要的目录:configs、detectron(lib)、tools。
其中configs目录下全部存放的是模型训练的各种yaml配置文件。在detectron框架中进行训练及测试时,不同的配置文件决定了不同的算法模型结构及训练、测试参数。官方给出了大量的示例yaml配置,这些配置在公开数据集上跑出的效果优异。一般,我们可以针对自己实际情况进行修改。
tools目录下主要存放detectron中的一些拓展功能脚本,如train_net.py为训练过程的启动文件,test_net.py为测试过程的启动文件,infer_simple.py允许根据yaml配置文件及训练好的模型对图片进行推断,pickle_caffe_blobs.py文件可以根据caffe的模型文件及caffe的网络定义prototxt文件将caffe的模型转换为满足detectron格式要求的.pkl文件。
detectron(lib)目录为整个工程的核心目录,其子目录有core、datasets、modeling、opt、roi_data、tests、utils。core目录中主要有config.py文件及生成rpn的rpn_generator.py及部分测试核心代码(test.py,test_engine.py,test_retinanet.py),对于入门者大致研究明白包含所有配置参数的config.py文件对于学习detectron已十分难得。datasets目录顾名思义主要就是存放数据集以及与数据集读取、定义相关的文件。这里主要支持coco数据集,在datasets/data/coco目录下,一般分Annotations以及coco_train/coco_val/coco_test几个文件目录。Annotations存放json格式的训练/验证/测试数据的图片名、ground truth、图片高宽等信息,而coco_train/coco_val/coco_test中存放相应图片。modeling目录下主要存放模型定义的组成脚本,如model_builder.py主要定义了算法的基本形式,这里主要有三种faster_rcnn、rfcn以及retinanet。FPN.py、resnet.py、vgg16.py、vgg_cnn_M_1024.py等文件定义了检测算法中特征提取网络部分,我们也可以根据需要自己添加或修改特征提取网络部分。fast_rcnn_heads.py 、mask_rcnn_heads.py 、retinanet_head.py、rfcn_heads.py定义了各种头部。roi_data目录中的文件主要定义detectron中数据的加载及处理细节,其中loader.py定义了数据加载方式,minibatch.py定义数据进入网络前的增强及过滤方式,我们也可以根据需要修改源码加入想要的图片预处理。utils目录下文件包含较广泛,lr_policy.py定义了训练中的优化策略,net.py主要定义了以权重文件初始化网络及在各gpu中broadcast各层网络参数、及从内存中将权重文件保存到硬盘的细节。detectron(lib)目录下还有其他比较重要的文件,部分文件笔者尚未完全弄明白,这里就不做讲解了。
3.detectron中包含的主要算法
开源框架detectron中包含的目标检测相关的算法有不同特征提取网络及头部的二阶段检测算法faster rcnn、一阶段检测算法中性能比较不错的retinate,以及rpn网络 ,其中在detectron/modeling下又包含VGG16、VGG_CNN_1024、Resnet50、Resnet101、ResXnet系列、FPN等。此外,框架中还引用了一些其他提升性能的算法如Batch Normal 、Group Normal 、warm up策略、多尺度训练/测试、数据增广、focal loss、soft NMS、boundingbox voting等。比较遗憾的是,并没有包含SSD以及YOLO算法。另外,由于是基于深度学习框架caffe2,一些比较好的基于tensorflow及pytorch的算法也不易植入detectron中。不过对于一般目标检测项目而言,如果能用detectron做一些实际任务已经足够了。
https://www.jianshu.com/p/9c9e47fc2561
Detectron结构解析 Detectron是Facebook AI Research 的开源项目。主要是faster RCNN系列的大神们,将Mask RCNN,RetinaNet,Faster RCNN,RPN等算法集合到了一个框架下,方便研究人员使用。 科研人员除了科研能力,如果能具备优秀的工程能力,将是非常棒的。本文记录了detectron pytorch版本的代码结构笔记,一起来学习一下大神优美的工程架构。 detection pytorch link: https://github.com/roytseng-tw/Detectron.pytorch
Detectron: 主要包含以下五个文件夹。
1、configs: 2、data 3、lib 4、tools 5、Outputs
—————————————————————————————————————————————— 下边继续介绍这些文件夹
configs 这个文件夹目录下全部存放的是模型训练的各种yaml配置文件,你想要选什么样的模型组合,可在这里挑选,并且可以修改其中的一些参数。 包含三个文件夹:baselines、getting_started、gn_baselines 一般选baselines里边的模型就行了。
tools 这个文件夹放一些自己添加的常用的工具脚本文件,比较重要的两个文件有train_net.py 和 test_net.py,这两个文件分别是训练和测试的初始加载文件。
Outputs 这个文件夹中保存的是训练的模型已经测试的结果 模型保存在 ckpt中 测试结果在 test中,可视化结果在test中的vis里。
data 这是存放数据集的地方,可以按照VOC的形式存放。
VOC形式 [2] ——————————————————————————————————————————————
注意,最最最关键的核心代码都在这里! lib lib 包含 datasets、core、model、modeling、nn、roi_data
下边继续逐个介绍这些文件夹以及里边的文件
1、datasets dataset_catalog.py:跟所读取的数据相关的路径参数的配置代码。 roidb.py、json_dataset.py:读取数据构建数据结构roidb的代码。 voc_dataset_evaluator.py和voc_eval.py:测试与结果评估涉及的代码。
在目标检测类任务中, 有一个很重要的数据结构roidb, 它将作为基本的数据结构在数据队列中存在, Detection 的数据载入类 RoIDdataLoader 也是将该数据结构作为成员变量使用的。
roidb [1] 2、core 这个文件夹中主要包含一下几个文件: config.py: 配置一些超参数的地方。 test_engine.py:调用tools/test_net.py后就会调用到这个文件,然后去调用datasets 里边的 roidb.py、json_dataset.py读取数据构建roidb,然后再通过模型推断出预测的结果,最后进行结果的评估。 test.py: 测试的过程需要用到的一些函数封装好在这个文件中。
3、model 3.1、nms:非极大抑制算法,应用相当广泛,其主要目的是消除多余的框,找到最佳的物体检测位置。 3.2、roi_align: ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性 [3]。 3.3 roi_crop:传统的CNN限制了输入必须固定大小(比如AlexNet是224x224),所以需要进行裁剪,在实际使用中往往需要对原图片进行crop或者warp的操作 [4]。
crop:截取原图片的一个固定大小的patch warp:将原图片的ROI缩放到一个固定大小的patch crop和warp都无法保证在不失真的情况下将图片传入到CNN当中:
crop:物体可能会产生截断,尤其是长宽比大的图片. warp:物体被拉伸,失去“原形”,尤其是长宽比大的图片 3.4 roi_pooling:为了解决 crop和warp带来的问题(截断、失去“原形”)而提出的。 3.5 utils: 里边就包含一个文件net_utils.py, 该文件中封装了一些跟网络本身有关的函数,比如权重初始化。
4、modeling 这个文件夹中存放的是一些网络结构的文件,比如resnet、fpn、fast_rcnn_heads等等,接下来我将一一介绍。
5、nn 5.1 modules: 包含(normalization.py 和 upsample.py) 5.2 parallel:用于并行计算的文件
6、roi_data 包含生成roi相关的文件。
7、utils 工具文件存放的文件夹
参考文献 1、https://hellozhaozheng.github.io/z_post/Caffe2-Detectron1-roidb%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/ 2、https://blog.csdn.net/mr_health/article/details/80676799 3、https://blog.csdn.net/wfei101/article/details/79618567 4、https://blog.csdn.net/weixin_43872578/article/details/87897857
https://github.com/facebookresearch/Detectron