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

 

 

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

532

社区成员

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

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