1.mmdetectionԴ??
2.mmdetection源码阅读笔记:ResNet
3.MMDetection3D之DETR3D源码解析:整体流程篇
4.DETR3D模型源码导读 & MMDetection3D构建流程
5.使用mmdeploy部署rtmdet ins做实例分割
6.mmdetection框架和工程实践
mmdetectionԴ??
Single Path One Shot(SPOS)算法是一种高效、低成本的神经网络结构搜索方法,相较于传统的基于强化学习、进化算法等方法,SPOS算法显著降低了搜索成本。MMRazor是带图片留言源码一个深度学习模型压缩算法库,支持包括网络结构搜索、剪枝、蒸馏在内的主流技术方向,为OpenMMLab其他算法库提供即插即用、可自由组合的模型压缩算法,使得模型轻量化更为简便快捷。本文将对SPOS算法原理、搜索空间、MMRazor以及在MMRazor中的实现进行详细的解读,内容干货满满。1. SPOS算法介绍
1.1 原理介绍 SPOS算法在ECCV年提出,针对传统NAS算法中网络权重耦合度过高的问题,SPOS提出将网络权重的训练与网络结构的搜索进行解耦。首先训练超网络的权重,然后从超网络中搜索最优的子网络架构,最后对最优子网进行从头开始的训练。整个运行过程分为三个步骤:超网权重训练:使用单路径候选网络构成的超网络,通过优化每层的选择会构建一条单路径子网络。通过优化整个超网的权重完成整个优化过程。
网络结构搜索:从训练好的超网中通过进化算法找到最优的子网络。
重训练子网:在找到最优子网络后,从头开始训练。
1.2 搜索空间介绍 SPOS论文中提到的搜索空间丰富,包括choiceblock搜索、通道搜索和混合精度量化搜索。当前官方源码中仅提供了choiceblock搜索部分。SPOS的搜索空间结构如下表所示,CB代表choiceblock,共包含个CB。CB内部操作主要受ShuffleNetv2启发,提供了四种操作。2. MMRazor简介
MMRazor是一个深度学习模型压缩算法库,支持网络结构搜索、gse源码剪枝、蒸馏等主流技术方向,为OpenMMLab其他算法库提供即插即用、可自由组合的模型压缩算法,实现模型轻量化更为简便快捷。MMRazor的整体设计思想与OpenMMLab保持一致,支持多种算法库。其组织架构分为组件层、算法层和应用层。3. MMRazor中超网的构建方式
神经网络结构搜索算法中,超网的实现至关重要。算法框架至少需要具备以下功能:搜索对象是可变化的,如SPOS中的不同候选操作;搜索算法能够指定选择某个候选操作的功能。MMRazor通过引入Mutable和Mutator对象实现上述功能:通过PlaceHolder提供占位符功能,用户定义的可变位置,在调用Mutator中的convert方法后转化为Mutable对象。通过这种方式使超网变成可搜索对象Mutable,后续与Mutator进一步完成NAS任务。4. SPOS在MMRazor中的实现
4.1 环境安装
安装教程请参考:[MMRazor文档链接]。以cuda.1、pytorch1.9为例,首先安装cuda、torch、mmcv包,其中mmcv-full表示采用预编译包的安装方式,还需注意对应cuda以及torch的版本。mmcv安装详细方式以及cuda、torch、mmcv版本对应关系可见:[mmcv文档链接]。以torch1.9为例进行环境安装。 安装MMRazor推荐使用MIM安装或直接使用pip安装:pip install MMRazor。也可以通过源码安装。4.2 Config介绍
由于训练SPOS分为三个阶段,对应三个config: 以spos_supernet_shufflenetv2_8xb_in1k.py为例,config中主要有model、algorithm、mutator三个对象,其中algorithm中包含architecture对象,李逵源码architecture对象中则包含model。在初始化algorithm的过程中,algorithm会初始化architecture,并根据是否传入mutator、pruner、distiller来决定是否初始化这三个对象。4.3 超网权重训练(Pre-training)
完成以上准备工作后,进行第一个阶段训练:超网权重训练。这个过程需要不断地从超网中采样子网,迭代优化子网参数,最终得到优化后的超网。训练命令如下所示,SPOS中超网训练通过随机采样的方式优化网络,每次前向训练一个batch的过程中会随机采样一个子网络。4.4 网络结构搜索(Evolution search)
此过程初始化候选池,从预训练好的SuperNet中得到Subnet在测试集上的结果,根据得分更新候选池的Topk并执行Mutation和CrossOver操作,得到最优子网的网络结构。训练命令如下所示,这里需要用到上一步超网权重的路径$STEP1_CKPT。具体Searcher选择的是EvolutionSearcher。4.5 重训练子网(Retrain)
在上一步通过进化算法得到最优子网结构后,将其对应的子网络从头进行训练,得到最终的可用网络模型。训练命令如下所示,需要将algorithm.mutable_cfg参数传入,该参数为上一步得到的yaml文件位置。训练过程与训练普通分类网络完全一致。5. 总结
本文详细解读了经典的网络结构搜索算法SPOS及其在MMRazor中的实现流程。SPOS算法能够与各类代码库搭配使用,如与MMDetection库的配合,实现便捷的DetNAS算法。MMRazor不仅包含NAS相关算法,还有蒸馏和剪枝等功能。欢迎体验,如对您有帮助,欢迎点个star。更多内容可查看[相关链接]。-75源码mmdetection源码阅读笔记:ResNet
ResNet,作为mmdetection中backbone的基石,其重要性不言而喻,它是人工智能领域引用最频繁的论文之一,微软亚洲研究院的杰作。自年提出以来,ResNet一直是目标检测领域最流行的backbone之一,其核心是通过残差结构实现更深的网络,解决深度网络退化的问题。
ResNet的基本原理是利用残差结构,通过1×1、3×3和1×1的卷积单元,如BasicBlock和BottleneckBlock,来构建不同版本的网络,如resnet-到resnet-,它们在基本单元和层数上有所区别。在mmdetection的实现中,从conv2到conv5主要由res_layer构成,其中下采样策略是关键,不同版本的网络在layer1之后的下采样位置有所不同。
ResLayer的构造函数是理解mmdetection中ResNet的关键,它涉及内存优化技术,如torch.utils.checkpoint,通过控制函数的运行方式来节省内存,但可能增加反向传播计算时间。此外,对norm层的处理也体现了与torchvision预训练模型的兼容性。
最后,ResNet的make_stage_plugins方法允许在核心结构中插入拓展组件,这增加了模型的灵活性。总的来说,ResNet的源码阅读揭示了其设计的巧妙和灵活性,是理解深度学习模型架构的重要一步。
MMDetection3D之DETR3D源码解析:整体流程篇
关于torch.distributed.launch的更多细节: blog.csdn.net/magic_ll/...
设置config file和work dir,work dir保存最终config,log等信息,work dir默认为path/to/user/work_dir/
作者将自定义的部分放在 'projects/mmdet3d_plugin/' 文件夹下,通过registry类注册模块,源码快照这里利用importlib导入模块并初始化自定义的类。
这里设置模型的输出信息保存路径、gpus等模型的运行时环境参数
这里初始化模型,初始化train_dataset和val_dataset
这部分完成了DataLoader的初始化,runner和hooks的初始化,并且按照workflow运行runner。
DETR3D模型源码导读 & MMDetection3D构建流程
本文主要梳理了学习理解DETR3D模型源码与MMDetection3D构建流程的过程。首先,介绍model dict的配置与模型参数设置,指出在模型部分按照backbone、neck、head顺序定义,体现模型结构。
MMDetection3D在模型构建中利用类之间的包含关系递归实例化组件。在构建模型后,借助于registry机制实例化每一个组件,展现其层次性与模块化设计。
在初始化流程中,首先在train.py的build_model开始,通过调用build方法逐级初始化各子结构,直至最底层结构,遵循初始化顺序:Detr3D -> backbone -> neck -> head -> head_transformer -> head_transformer_decoder -> 最终组件。其中,许多类继承自官方提供的框架结构,通过super()调用在父类中实现子结构初始化。
关于DETR3D的组件,backbone、neck、head分别负责特征提取、融合、和目标检测的关键阶段。Detr3DHead继承自mmdet3d的DetrHead类,是模型的头部组件,实现特定检测任务。
DETR3DTransformer位于模型底层,是实现论文创新点的关键部分。其通过传感器转换矩阵预测reference points,并将投影到特征图,结合Bilinear Interpolation抓取固定区域特征,通过object queries refinement改善queries,用于目标预测。这一部分负责查询、特征捕捉与优化。
Decoder是DETR3D的核心,专注于实现object queries refinement。这一过程在论文中被详细探讨,并在代码中得到具体实现。值得注意的是,F.grid_sample()在特征处理过程中扮演着关键角色,展示其在变换与映射任务中的应用。
使用mmdeploy部署rtmdet ins做实例分割
在尝试使用mmdeploy部署rtmdet ins进行实例分割时,发现网上资源较少,github的问题也有不少未解决,只得自己动手,留作档案。
构建时需严格遵循源代码构建流程,从下载到构建,避免第三方库问题。
ppl.cv不支持cuda,构建时需在cuda.cmake中设置与自己显卡对应的flag。
使用了最新版的tensorrt和cudnn,版本对运行结果影响不大,但确保环境变量已正确设置。
安装mmcv时需注意版本,应使用大于2.0.0、小于2.2.0的版本,直接按照教程安装易导致版本2.3.0,mmdet会报错,我选择安装2.1.0版本。
在使用中需注意cuda版本,选择.x版本最为合适。
因为mmdeploy需要nvcc进行编译,所以本地的cuda toolkit也应安装。我忽视了这一点,nvcc编译可以正常通过,但在运行时在trt nms处出现错误。
在修改permuteData.cu文件后,发现问题是由于sm_不兼容(我的显卡是,查看主机cuda版本是否支持)。吐槽的是,即使卸载过cuda导致nvcc版本为.1,编译也能通过!
如果你的cuda版本高于.x,请修改zsh/bash指定版本,先执行,再添加到环境变量。
在模型转换时,需要将mmdetection的_base_文件夹导入到mmdeploy的_base_中,将mmdetection的/config/rtmdet导入到mmdeploy的/config中,否则会找不到type。
mmdetection框架和工程实践
MMDetection框架详解与工程实践
1. 引入与安装
MMDetection是一个模块化的目标检测框架,通过组合不同组件构建自定义模型,支持多种算法和模型,具有高效和性能优势。它基于COCO 目标检测竞赛冠军团队的代码库,适用于Linux系统,Windows支持有限。
2. 框架结构与设计
框架采用模块化编程,便于重复使用和模块化搭建。__init__.py文件的使用和管理,如定义__all__属性,有助于代码复用和维护。设计模式如构造者模式和注册器模式,分别用于分离构建过程和简化对象创建过程,实现代码扩展性。
3. 配置与模型构建
配置文件详细描述了模型的参数设置,如Cascade RCNN的RPN和Fast R-CNN结构。mmdetection将模型细分为多个模块,如Backbone、Neck等,每个模块负责特定任务。配置文件的分析显示,不同IOU阈值在训练和推理阶段可能导致性能不匹配,Cascade RCNN通过多阶段结构解决此问题。
4. 推理与训练源码解析
测试代码如test.py展示了单GPU和多GPU测试过程,以及如何通过配置文件和模型进行检测。训练代码train.py则涉及模型构建、数据集注册和训练步骤。自定义数据集的构建包括数据读取、图像增强和COCO/VOC格式转换。
5. 实践技巧
如使用Kmeans聚类优化边界框,热力图绘制用于特征可视化,以及利用Visdom和Hook进行训练过程可视化。工程应用方面,C++与Python和TorchScript的交互提供了一种灵活的插件解决方案。
总结:
MMDetection框架通过模块化设计、丰富的算法支持和高效的执行,为用户提供了强大的目标检测工具。框架结构、配置管理和源码解析展示了如何构建、调整和优化模型。实践技巧部分提供了与C++交互和模型优化的实用方法,方便开发者在实际工程中灵活应用。
FCOS:论文与源码解读
FCOS:全称为全卷积单阶段目标检测,它在锚框自由领域中占有重要地位,与RetinaNet在锚框基础领域中地位相似。它沿用ResNet+FPN架构,通过实验证明,在相同backbone和neck层下,锚框自由方法可以取得比锚框基础方法更好的效果。 FCOS借鉴了语义分割的思想,成功地去除了锚框先验,实现了逐点的目标检测,是全卷积网在目标检测领域的延伸。代码比锚框基础类简单,非常适合入门。1. 动机
锚框基础类目标检测方法存在多处缺点,FCOS通过去除锚框,提出了简单、温柔且有力的目标检测模型。2. 创新点
FCOS借鉴了语义分割的思想,实现了去除锚框、逐点的目标检测。以年提出的全卷积网(FCN)为例,FCOS借鉴了FCN的思想,将其应用于目标检测,主要步骤包括生成先验、分配正负样本和设计bbox assigner。3. 模型整体结构与流程
训练时,包括生成先验和正负样本分配。FCOS的先验是将特征图上的每一点映射回原始图像,形成逐点对应关系。分配正负样本时,正样本表示预测目标,负样本表示背景。3.1 训练时
在训练阶段,先通过prior generate生成先验,然后进行bbox assign。在分配过程中,FCOS利用了FPN层解决ambigous点的问题,通过多尺度特征融合和逐层分配目标来解决。3.1.1 prior generate
FCOS通过映射特征图上的每一点回原始图像,形成点对点对应关系,生成先验。通过公式计算映射关系,其中s表示步长。3.1.2 bbox assigne
分配正负样本时,FCOS借鉴了anchor base方法的正负样本分配机制,通过设计bbox assigner解决ambigous点问题。分配流程包括计算输出值、对输出进行exp操作和引入可学习参数scale,以及使用FPN层分而治之,进一步解决ambigous问题。3.1.3 centerness
FCOS额外预测了centerness分支,以过滤远离目标中心的点,提高检测质量。centerness值范围为0~1,越靠近中心,值越大。测试时,最终score=cls_score*centerness。3.1.4 loss
损失函数包括focal loss、IoU loss和交叉熵损失,用于训练分类、定位和centerness分支。3.2 模型结构
模型继续沿用ResNet和FPN层,进行公平比较。FPN输出的特征层与RetinaNet类似,但FCOS在FPN输出的最后一层特征层上进行额外卷积,与RetinaNet在输入特征层上进行额外卷积不同。在推理阶段,注意centerness与分类分数的乘积作为最终得分,且需要进行NMS操作。4. 总结与未来方向
FCOS是一个简单、温柔、有力量的锚框自由方法,地位重要,思想借鉴于语义分割,流程类似传统目标检测,包括生成先验、正负样本匹配、bbox编码和NMS等,额外加入centerness分支以提升检测质量。 未来,FCOS的研究方向可能包括更深入的理论分析、模型优化和跨领域应用探索。5. 源码
mmdetection提供了FCOS的配置文件和代码实现,包括多个版本和改进。了解这些细节有助于深入理解FCOS的实现和优化策略。