MMDetection代码课

交大-小郭 2023-06-09 23:11:00

Github:https://github.com/open-mmlab/mmdetection/tree/tutorials

一、基本概念

1.什么是目标检测

目标检测是计算机视觉领域的核心问题之一,其任务就是找出图像中所有感兴趣的目标,确定他们的类别和位置。由于各类不同物体有不同的外观,姿态,以及不同程度的遮挡,加上成像是光照等因素的干扰,目标检测一直以来是一个很有挑战性的问题。

目标检测任务主要可以分为四个小任务:

(1)分类classification:给定一张图像,要知道里面包含什么类别的目标。

(2)定位location:给定这个目标在图像中的位置。

(3)检测detection:定位出目标的位置并判断这个目标的类别。

(4)分割segmentation:确定每个像素属于哪个目标或者场景。

综上所述,目标检测是一个分类、回归问题的叠加。

2.目标检测的核心问题

(1)分类问题:图片(或者某个区域)属于哪个类别。

(2)定位问题:目标在图像中出现的位置。

(3)大小问题:目标在图像中的大小。

(4)形状问题:目标在图像中的姿态是什么样的。

3.目标检测算法分类

 

目标检测的发展可以划分为两个周期:

(1)传统目标检测算法(1998-2014):传统目标检测算法主要基于手工提取特征,具体步骤可概括为:选取感兴趣区域->对可能包含物体的区域进行特征分类->对提取的特征进行检测。虽然传统目标检测算法经过了十余年的发展,但是其识别效果并没有较大改善且运算量大,此处不再详细介绍。

(2)基于深度学习的目标检测算法(2014-):该方法主要分为Anchor-based的Two Stage和One Stage和Anchor-free两种思路

a)Two Stage:先预设一个区域,该区域称为Region Proposal,即一个可能包含待检测物体的预选框(简称RP),再通过卷积神经网络进行样本分类计算。该算法的流程是:特征提取 -> 生成RP -> 分类/回归定位。常见的Two Stage算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN、R-FCN等,其特点是检测精度高,但是检测速度不如One Stage方法高。

b)One Stage:直接在网络中提取特征值来分类目标和定位。该算法的流程是:特征提取 -> 分类/回归定位。常见的One Stage算法有:OverFeat、YOLOv1、YOLOv2、YOLOv3、YOLOv5、SSD、RetinaNet等,其特点是检测速度快,但是精度没有Two Stage方法高。

c)Anchor-free:该方法通过确定关键点的方式来完成检测,大大减少了网络超参数的数量。

4.目标检测的应用

(1)人脸检测:智能门控、人脸支付

(2)行人检测:智能辅助驾驶、智能监控

(3)车辆检测:自动驾驶、交通违章查询

(4)遥感检测:天气预测、军事目标检测

安装

 

 数据集可视化

 

 RTMDet_structure_v1.3

 

在调研了当前 YOLO 系列的诸多改进模型后,MMDetection 核心开发者针对这些设计以及训练方式进行了经验性的总结,并进行了优化,推出了高精度、低延时的单阶段目标检测器 RTMDet, Real-time Models for Object Detection (Release tManufacture)

RTMDet 由 tiny/s/m/l/x 一系列不同大小的模型组成,为不同的应用场景提供了不同的选择。 其中,RTMDet-x 在 52.6 mAP 的精度下达到了 300+ FPS 的推理速度。

RTMDet_精度图

 配置文件

 

 

抽象 BaseBackbone 的好处包括:

  1. 子类不需要关心 forward 过程,只要类似建造者模式一样构建模型即可。

  2. 可以通过配置实现定制插件功能,用户可以很方便的插入一些类似注意力模块。

  3. 所有子类自动支持 frozen 某些 stage 和 frozen bn 功能。

抽象 BaseYOLONeck 也有同样好处。

BaseBackbone

不同算法的主干网络继承 BaseBackbone,用户可以通过实现内部的 build_xx 方法,使用自定义的基础模块来构建每一层的内部结构。

可视化一切

 

特征图绘制

你可以调用 demo/featmap_vis_demo.py 来简单快捷地得到可视化结果,为了方便理解,将其主要参数的功能梳理如下:

  • img:选择要用于特征图可视化的图片,支持单张图片或者图片路径列表。

  • config:选择算法的配置文件。

  • checkpoint:选择对应算法的权重文件。

  • --out-file:将得到的特征图保存到本地,并指定路径和文件名。

  • --device:指定用于推理图片的硬件,--device cuda:0 表示使用第 1 张 GPU 推理,--device cpu 表示用 CPU 推理。

  • --score-thr:设置检测框的置信度阈值,只有置信度高于这个值的框才会显示。

  • --preview-model:可以预览模型,方便用户理解模型的特征层结构。

  • --target-layers:对指定层获取可视化的特征图。

    • 可以单独输出某个层的特征图,例如: --target-layers backbone , --target-layers neck , --target-layers backbone.stage4 等。

    • 参数为列表时,也可以同时输出多个层的特征图,例如: --target-layers backbone.stage4 neck 表示同时输出 backbone 的 stage4 层和 neck 的三层一共四层特征图。

  • --channel-reduction:输入的 Tensor 一般是包括多个通道的,channel_reduction 参数可以将多个通道压缩为单通道,然后和图片进行叠加显示,有以下三个参数可以设置:

    • squeeze_mean:将输入的 C 维度采用 mean 函数压缩为一个通道,输出维度变成 (1, H, W)。

    • select_max:将输入先在空间维度 sum,维度变成 (C, ),然后选择值最大的通道。

    • None:表示不需要压缩,此时可以通过 topk 参数可选择激活度最高的 topk 个特征图显示。

  • --topk:只有在 channel_reduction 参数为 None 的情况下, topk 参数才会生效,其会按照激活度排序选择 topk 个通道,然后和图片进行叠加显示,并且此时会通过 --arrangement 参数指定显示的布局,该参数表示为一个数组,两个数字需要以空格分开,例如: --topk 5 --arrangement 2 3 表示以 2行 3列 显示激活度排序最高的 5 张特征图, --topk 7 --arrangement 3 3 表示以 3行 3列 显示激活度排序最高的 7 张特征图。

    • 如果 topk 不是 -1,则会按照激活度排序选择 topk 个通道显示。

    • 如果 topk = -1,此时通道 C 必须是 1 或者 3 表示输入数据是图片,否则报错提示用户应该设置 channel_reduction 来压缩通道。

  • 考虑到输入的特征图通常非常小,函数默认将特征图进行上采样后方便进行可视化。

注意:当图片和特征图尺度不一样时候,draw_featmap 函数会自动进行上采样对齐。如果你的图片在推理过程中前处理存在类似 Pad 的操作此时得到的特征图也是 Pad 过的,那么直接上采样就可能会出现不对齐问题。

 

新趋势

 

可以看看这篇文章:F-VLM: Open-vocabulary object detection upon frozen vision and language models

 

 

...全文
113 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

534

社区成员

发帖
与我相关
我的任务
社区描述
构建国际领先的计算机视觉开源算法平台
社区管理员
  • OpenMMLab
  • jason_0615
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧