OpenMMLab 目标检测

YOLOv5与目标检测算法详解
文章详细介绍了目标检测的基础知识,包括边界框、交并比、置信度、非极大值抑制等,并深入探讨了YOLOv5的网络结构、匹配策略、损失函数和训练过程。还提到了MMDetection框架中的配置文件和数据集处理,以及COCO数据集的标注格式。此外,文章还讨论了目标检测模型的评估方法,如平均精度AP和PR曲线。

OpenMMLab 目标检测

1. 目标检测简介

  • ETA: Estimate Time of Arrival (估计剩余时间)
  • 两阶段AP不如一阶段AP的原因:样本的类别不均衡导致的
    • 样本不均衡导致的问题:
      • 训练低效,因为大多数位置都是易学负样本,没有提供有用的学习信号
      • 由易学负样本主导整个训练,使得模型的优化方向并不是我们所希望的那样
  • 正负样本匹配策略或者称为标签匹配策略 Label Assignment 是目标检测模型训练中最核心的问题之一, 更好的标签匹配策略往往能够使得网络更好学习到物体的特征以提高检测能力
  • Backbone + Neck:生成多尺度特征图
  • Head:输出检测框/检测框偏移量、置信度
  • 模型配置文件名:retinanet_r50_fpn_1x_coco.py
    • retinanet:表示算法名称
    • r50:等表示骨架网络名
    • caffe: 和 PyTorch 是指 Bottleneck 模块的区别,省略情况下表示是 PyTorch。Bottleneck 是标准的 1x1-3x3-1x1 结构,考虑 stride=2 下采样的场景,caffe 模式下,stride 参数放置在第一个 1x1 卷积上,而 Pyorch 模式下,stride 放在第二个 3x3 卷积上
    • fpn:表示 Neck 模块采用了 FPN 结构
    • mstrain:表示多尺度训练,一般对应的是 pipeline 中 Resize 类
    • 1x: 表示 1 倍数的 epoch 训练即 12 个 epoch,2x 则表示 24 个 epcoh
    • coco:表示在 COCO 数据集上训练
if self.style == 'pytorch':
        self.conv1_stride = 1
        self.conv2_stride = stride
    else:
        self.conv1_stride = stride
        self.conv2_stride = 1

1.0 常用工具

1.0.1 实用工具

python tools/analysis_tools/browse_coco_json.py --data-root ./data/cat   --img-dir images --ann-file annotations/annotations_all.json --disp-all
# 或
python tools/analysis_tools/browse_coco_json.py --img-dir ./data/cat/images  --ann-file ./data/cat/annotations/annotations_all.json
python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py --phase train --out-dir temp --mode pipeline
mim run mmdet print_config configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py --save-path ./temp/whole.py
python tools/analysis_tools/dataset_analysis.py  configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py
  • 优化锚框尺寸

  • 提取 COCO 子集

  • 可视化优化器参数策略

  • 数据集转换

  • 数据集下载

  • 日志分析

  • 模型转换

1.0.2 MMYOLO 自定义数据集从标注到部署

  • 详细使用说明链接
  • 数据集准备:tools/misc/download_dataset.py
  • 使用 labelme 和算法进行辅助标注:demo/image_demo.py + labelme
# 1.  推理生成labelme标注文件
python demo/image_demo.py ./data/cat/images  ./work/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py  ./work/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth  --out-dir ./data/cat/labels --class-name cat   --to-labelme
# 安装 labelme
conda create -n labelme python=3.8
conda activate labelme
pip install labelme==5.1.1
# 2. 启动 labelme
#labelme ${图片文件夹路径(即上一步的图片文件夹)} \
        --output ${label文件所处的文件夹路径(即上一步的 --out-dir)} \
        --autosave \
        --nodata
##--output:labelme 标注文件保存路径,如果该路径下已经存在部分图片的标注文件,则会进行加载;
##--autosave:标注文件自动保存,会略去一些繁琐的保存步骤;
##--nodata:每张图片的标注文件中不保存图片的 base64 编码,设置了这个 flag 会大大减少标注文件的大小。
labelme ./data/cat/images --output ./data/cat/labels --autosave --nodata
  • 使用脚本转换成 COCO 数据集格式:tools/dataset_converters/labelme2coco.py
# 将 labelme 的 label 转换为 COCO label
python tools/dataset_converters/labelme2coco.py --img-dir ./data/cat/images --labels-dir  ./data/cat/labels --out  ./data/cat/annotations/annotations_all.json  --class-id-txt ./data/cat/class_with_id.txt
  • 数据集划分为训练集、验证集和测试集:tools/misc/coco_split.py
python tools/misc/coco_split.py --json ./data/cat/annotations/annotations_all.json --out-dir ./data/cat/annotations --ratios 0.8 0.2  --shuffle  --seed 10
  • 构建 config 文件
_base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'

max_epochs = 100  # 训练的最大 epoch
data_root = './data/cat/'  # 数据集目录的绝对路径
# data_root = '/root/workspace/mmyolo/data/cat/'  # Docker 容器里面数据集目录的绝对路径

# 结果保存的路径,可以省略,省略保存的文件名位于 work_dirs 下 config 同名的文件夹中
# 如果某个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方
work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat'

# load_from 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径
# 因为本教程是在 cat 数据集上微调,故这里需要使用 `load_from` 来加载 MMYOLO 中的预训练模型,这样可以在加快收敛速度的同时保证精度
load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa

# 根据自己的 GPU 情况,修改 batch size,YOLOv5-s 默认为 8卡 x 16bs
train_batch_size_per_gpu = 32
train_num_workers = 4  # 推荐使用 train_num_workers = nGPU x 4

save_epoch_intervals = 2  # 每 interval 轮迭代进行一次保存一次权重

# 根据自己的 GPU 情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs)
base_lr = _base_.base_lr / 4

anchors = [  # 此处已经根据数据集特点更新了 anchor,关于 anchor 的生成,后面小节会讲解
    [(68, 69), (154, 91), (143, 162)],  # P3/8
    [(242, 160), (189, 287), (391, 207)],  # P4/16
    [(353, 337), (539, 341), (443, 432)]  # P5/32
]

class_name = ('cat', )  # 根据 class_with_id.txt 类别信息,设置 class_name
num_classes = len(class_name)
metainfo = dict(
    classes=class_name,
    palette=[(220, 20, 60)]  # 画图时候的颜色,随便设置即可
)

train_cfg = dict(
    max_epochs=max_epochs,
    val_begin=20,  # 第几个 epoch 后验证,这里设置 20 是因为前 20 个 epoch 精度不高,测试意义不大,故跳过
    val_interval=save_epoch_intervals  # 每 val_interval 轮迭代进行一次测试评估
)

model = dict(
    bbox_head=dict(
        head_module=dict(num_classes=num_classes),
        prior_generator=dict(base_sizes=anchors),

        # loss_cls 会根据 num_classes 动态调整,但是 num_classes = 1 的时候,loss_cls 恒为 0
        loss_cls=dict(loss_weight=0.5 *
                      (num_classes / 80 * 3 / _base_.num_det_layers))))

train_dataloader = dict(
    batch_size=train_batch_size_per_gpu,
    num_workers=train_num_workers,
    dataset=dict(
        _delete_=True,
        type='RepeatDataset',
        # 数据量太少的话,可以使用 RepeatDataset ,在每个 epoch 内重复当前数据集 n 次,这里设置 5 是重复 5 次
        times=5,
        dataset=dict(
            type=_base_.dataset_type,
            data_root=data_root,
            metainfo=metainfo,
            ann_file='annotations/trainval.json',
            data_prefix=dict(img='images/'),
            filter_cfg=dict(filter_empty_gt=False, min_size=32),
            pipeline=_base_.train_pipeline)))

val_dataloader = dict(
    dataset=dict(
        metainfo=metainfo,
        data_root=data_root,
        ann_file='annotations/trainval.json',
        data_prefix=dict(img='images/')))

test_dataloader = val_dataloader

val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
test_evaluator = val_evaluator

optim_wrapper = dict(optimizer=dict(lr=base_lr))

default_hooks = dict(
    # 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐)
    checkpoint=dict(
        type='CheckpointHook',
        interval=save_epoch_intervals,
        max_keep_ckpts=5,
        save_best='auto'),
    param_scheduler=dict(max_epochs=max_epochs),
    # logger 输出的间隔
    logger=dict(type='LoggerHook', interval=10))

  • 数据集可视化分析:tools/analysis_tools/dataset_analysis.py
# 查看训练集数据分布情况:
python tools/analysis_tools/dataset_analysis.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py    --out-dir work_dirs/dataset_analysis_cat/train_dataset

# 查看验证集数据分布情况:
python tools/analysis_tools/dataset_analysis.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py    --out-dir work_dirs/dataset_analysis_cat/val_dataset    --val-dataset
  • 优化 anchor 尺寸:tools/analysis_tools/optimize_anchors.py
python tools/analysis_tools/optimize_anchors.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py  --algorithm v5-k-means  --input-shape 640 640  --prior-match-thr 4.0 --out-dir work_dirs/dataset_analysis_cat
  • 可视化数据处理部分:tools/analysis_tools/browse_dataset.py
# 直接窗口可视化 config 配置中数据处理部分
python tools/analysis_tools/browse_dataset.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py  --show-interval 3
  • 启动训练:tools/train.py
# 1. 训练可视化
## 1.1 WandB
## WandB 可视化需要在官网注册,并在 https://wandb.ai/settings 获取到 WandB 的 API Keys
pip install wandb
wandb login 
## 在我们刚刚新建的 config 文件 configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py 的最后添加 WandB 配置:
visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
## 1.2 TensorBoard
pip install tensorboard
## 在我们刚刚新建的 config 文件 configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py 中添加 tensorboard 配置
visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])
## 运行训练命令后,Tensorboard 文件会生成在可视化文件夹 work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/${TIMESTAMP}/vis_data 下, 运行下面的命令便可以在网页链接使用 Tensorboard 查看 loss、学习率和 coco/bbox_mAP 等可视化数据了:
  
tensorboard --logdir=work_dirs/yolov5_s-v61_syncbn_fast_1xb16-100e_cat

# 2. 执行训练
python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py

# 使用编号为0的GPU卡
CUDA_VISIBLE_DEVICES=0 python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py
# 使用编号为0和2的GPU卡
CUDA_VISIBLE_DEVICES=0,2 python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py
  • 模型推理:demo/image_demo.py
python demo/image_demo.py ./data/cat/images  ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb16-100e_cat.py    ./work_dirs/yolov5_s-v61_syncbn_fast_1xb16-100e_cat/best_coco/bbox_mAP_epoch_84.pth --out-dir ./data/cat/pred_images
  • 模型部署

1.0.3 配置文件名称含义

  • 我们遵循以下样式来命名配置文件
{
   
   algorithm name}_{
   
   model component names [component1]_[component2]_[...]}-[version id]_[norm setting]_
[data preprocessor type]_{
   
   training settings}_{
   
   training dataset information}_
{
   
   testing dataset information}.py
  • 文件名分为 8 个部分,其中 4 个必填部分、4 个可选部分。 每个部分用 _ 连接,每个部分内的单词应该用 - 连接。{} 表示必填部分,[] 表示选填部分。
  • {algorithm name}: 算法的名称。 它可以是检测器名称,例如 yolov5, yolov6, yolox 等。
  • {component names}: 算法中使用的组件名称,如 backbone、neck 等。
  • [version_id] (可选): 由于 YOLO 系列算法迭代速度远快于传统目标检测算法,因此采用 version id 来区分不同子版本之间的差异。
  • [norm_setting] (可选):
    • bn 表示 Batch Normalization
    • syncbn 表示 Synchronized Batch Normalization。
  • [data preprocessor type] (可选): 数据预处理类型
  • {training settings}: 训练设置的信息,例如 batch 大小、数据增强、损失、参数调度方式和训练最大轮次/迭代。
  • {gpu x batch_per_gpu}: GPU 数和每个 GPU 的样本数。bN 表示每个 GPU 上的 batch 大小为 N。例如 4xb8 是 4 个 GPU 每个 GPU 8 张图的缩写。如果没有注明,默认为 8 卡每卡 2 张图。
  • {schedule}: 训练方案。
  • {training dataset information}: 训练数据集,例如 coco, cityscapes, voc-0712, wider-face, balloon。
  • [testing dataset information] (可选): 测试数据集,用于训练和测试在不同数据集上的模型配置。 如果没有注明,则表示训练和测试的数据集类型相同
  • 例子
 yolov5_s-v61_syncbn_8xb16-300e_coco.py
  • 上述例子的详细说明:
    • yolov5_s
      • deepen_factor=0.33
      • widen_factor=0.5,
      • 通过deepen_factor和widen_factor来控制模型的大小
    • yolov5_m
      • deepen_factor = 0.67
      • widen_factor = 0.75
    • yolov5_l
      • deepen_factor = 1.0
      • widen_factor = 1.0
    • v61:YOLOv5 的 6.0 以后的版本采用 6x6 Conv 层作为第一个下采样层,而 3.0 版本采用 Focus 层作为第一个下采样层
    • 8xb16:表示使用 8 个 gpu 每个 gpu 16 张图,并训练 300 个 epoch
    • fast:不标 fast 默认使用 mmdet.DetDataPreprocessor,而 fast 表示调用 YOLOv5DetDataPreprocessor 并配合 yolov5_collate 进行数据预处理,训练速度较快(不慢于yolov5官方),但是对多任务处理的灵活性较低
    • 300e: 表示训练 300 个 epoch
    • coco: 表示 COCO2017 目标检测数据集。

1.1 目标检测与图像分类的区别

  • 一个目标框至少6个参数(矩形框<4>、类别<1>、置信度<1>)
  • 两阶段目标检测的开山之作: Faster R-CNN (也是目标检测任务中的一个开山之作)
  • 单阶段目标检测算法的代表作:YOLO<推荐使用V5>、SSD
    在这里插入图片描述

1.2 目标检测汇总 (2022)

在这里插入图片描述

1.3 网络结构

在这里插入图片描述

网络部件 功能 详细描述
主干网络 产生多级特征图 空间分辨率会越来越小,通道数通常会越来越大,信息会越来越集中,通常就集中到channel上,channel就会越来越多
颈部 融合不同级的特征 越靠近输入的级,其细节更好,但语义信息比较弱,输出多尺度(多种分辨率)的特征图。不同分辨率的特征图通常用于检测不同大小的物体
检测头 通常是由一个或多个卷积构成的模块,只要在这个特征图上扫一下, 在对应位置如果有物体就可以给一个输出

1.4 滑窗

  • 工作原理
    在这里插入图片描述
    在这里插入图片描述

  • 不足之外 (效率太代、计算量太大)
    在这里插入图片描述

  • 改进思路 1:区域提议

    • 依赖外部算法,Selective Search不是神经网络的一部分,不可训练,不符合学习的理念。
      在这里插入图片描述
  • 改进思路 2:分析滑窗中的重复计算
    在这里插入图片描述

  • 消除滑窗中的重复计算
    在这里插入图片描述

  • 在特征图上进行密集预测
    在这里插入图片描述

  • 目标检测技术的演进
    在这里插入图片描述在这里插入图片描述

1.5 损失的种类(分类、回归、Objectness)

  • 一般的检测算法:
    • 回归损失只有正样本有
    • 分类损失的标签直接就非1即0,正样本的标签是1,负样本的标签是0(可以把背景作为一种类别一起算),这些标签根据anchor和GT框的比较就可以直接得到。比如标签是[0,1,0,0],代表当前样本属于背景或其他三种类别的标签。
  • YOLOV5中 :
    • 回归损失只有正样本有
    • 分类损失分为两种:
      • 一种是正样本的分类损失(不包括背景的onehot标签,比如[1,0,0])。
      • 另一种是正负样本的前景背景预测的分类损失,这里叫Objectness loss,比起以往算法前景背景损失的标签非1即0,这里采用预测框和GT框的IOU作为Objectness的标签,也就是说预测框和GT框重合度越高,当前样本属于前景的可能性就越大。一般算法对于不同的anchor接近GT框的程度不同,标签都是非1即0,统一对待。另外注意这里的Objectness loss的标签在得到预测值之前是不知道的,也就是说根据预测框的结果才实时的计算出来的,这种方法直观上来讲更合适些。

1.6 正负样本匹配策略

  • 静态标签匹配策略(基于先验)
    • FCOS
    • RetinaNet (Anchor与GT的最在IoU)
    • YOLOv5(Anchor与GT的宽高比)
  • 动态标签匹配策略
    • OTA
    • SimOTA (YOLOX)

1.7 单阶段、双阶段、anchor-based、anchor-free之间的关系

1.7.1 划分依据

  • 单阶段、双阶段、anchor-based、anchor-free 4者的联系应该分成两个并行维度来讲
  • 单阶段和双阶段的划分
    • 划分依据是是否存在显式的 ROI 特征提取过程
    • 典型的双阶段算法是 Faster R-CNN,其包括 RPN 和 R-CNN 两个模块,RPN 模块负责提取 ROI,然后通过 ROI-Pool或者 ROI-Align 进行 ROI 特征切割提取,最后在输入到 R-CNN 中进行识别和定位
    • 如果没有显式 ROI 提取过程则认为是单阶段算法,例如典型的 YOLO、RetinaNet 等等。
    • 一般而言,双阶段算法精度高但是速度慢一些,单阶段精度稍微低一点但是速度容易优化到比较快
  • Anchor-Based、Anchor-Free
    • 划分依据:是否需要显式定义先验 anchor 角度区分,如果需要定义 anchor 那么就是 anchor-base
    • 目前主流算法大部分都是这个类型,例如 Faster R-CNN、RetinaNet和YOLOv5 等等
    • 而 anchor-free 是从 2019 年开始慢慢流行,其最大优势是不需要设置麻烦且有重大影响的 anchor,输出是对每个输出特征图上点进行分类和定位建模,参数稍微少一些,更加容易理解,典型算法是FCOS、ATSS 和 SABL 等等

1.7.2 四者的联系

  • 四者的联系是Label>的编码方式。也就是一张图中若干个Label,(x0, y0, x1, y1,c)的GT检测框,是如何变为一张(1,C,H,W)的Feature Map的
  • 先从Anchor Free方法讲起。这类方法通过一些自定义的,简单的映射关系,将一个检测框的坐标直接映射到Feature Map中,比如CenterNet大致的思路是:
    • 求出GT框的中心,然后将这个中心编码成一个Heat Map对应坐标的一个点(一般这个点附近带有高斯分布)
    • 将这个GT框的宽高编码成对应wh Map对应坐标的一个点
    • 从而形成Heatmap + wh map,简单来说,检测器通过heatmap学习对目标的分类,wh map学习对目标宽高的回归(实际过程中会加上offset,但这里为了简化问题不做详细讨论,详见CenterNet论文)
    • 可以看到,在Anchor Free方法的Label编码过程中,始终是利用了目标本身的性质(图像坐标、属性),没有引入额外的信息
  • Anchor Based方法是在Anchor Free的基础上,为目标的宽高引入了若干个先验值
    • 对于Heatmap Label Feature Map中的一个点,只有当以这个点为中心,先验值的宽高所组成的“假设框"与真值很相近(比如IoU足够大),才会将检测框编码到这个点上
    • 对于wh Map中的一个点,则在编码的过程中加入anchor的宽高信息,例如Raster R-CNN在RPN中,对应的wh map值是GT框的宽高除以anchor宽高,再取对数 (编码值)
  • Two Stage方法大多使用Anchor Based这种Label 编码方式,并且将GT框的类别和坐标的编码分离。以Faster R-CNN为例,将GT框的坐标框单独编码,在RPN中做对其做回归+一个简单的正负样本的二分类;而具体的类别则在R-CNN部分对RPN中得到的bbox candidate进行分类
  • One Stage方法和Two Stage方法的不同,本质是没有分离坐标和类别属性,可以理解为就是一个加入多类别属性分类的RPN。显然,不管是One Stage还是Two Stage方法,可以用Anchor Based也可以用Anchor Free对坐标进行编码
  • 不同的编码方式,决定了模型真正学习的目标(Label Feature Map)的样本数值分布,决定了任务的难易程度,也赋予了不同检测方式的“某种天赋“。比如Anchor Based方法在不同大小的目标下具有更好的鲁棒性,Anchor Free计算量更少,等等。

1.8 MMLab配置文件名的含义

  • yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py
    • yolov5:算法名
    • l/m/n/s:网络大小
    • v61:版本号,6.1版本
    • 8xb16:训练时采用的是8卡,每张卡的Batch Size是16
    • 300e:表示训练300个epoch
    • coco:表示COCO2017目标检测数据集

1.9 主干网络Backbone

1.9.1 MMDetection实现的Backbone

  • VGG (ICLR’2015)
  • ResNet (CVPR’2016)
  • ResNeXt (CVPR’2017)
  • MobileNetV2 (CVPR’ 2018)
  • HRNet (CVPR’2019)
  • Generalized Attention (ICCV’2019)
  • GCNet (ICCVW’2019)
  • Res2Net (TPAMI’2020)
  • RegNet (CVPR’2 2020)
  • ResNeSt (ArXiv’2020)
  • PVT (ICCV’2021)
  • SwinTransformer (CVPR’2021)
  • PVTv2 (ArXiv’2021)
  • ResNet Strikes back (ArXiv’2021)
  • EfficientNet (ArXiv’2021)
  • ConvNeXt (CVPR’2022)

1.9.2 MMYOLO实现的Backbone

  • YOLOv5CSPDarknet
  • PPYOLOECSPResNet
  • CSPNeXt
  • YOLOv6EfficientRep
  • YOLOv7Backbone

1.9.3 MMClassification实现的Backbone

2. 基础知识

  • Anchor(锚框):以特征图上的位置在原图上对应的位置为中心设定不同大小、不同长宽比,同时又重合的基准框。

2.1 边界框(Bounding Box)

在这里插入图片描述
在这里插入图片描述

2.2 交并比 Intersection Over Union

在这里插入图片描述

2.3 置信度 Confidence Score

在这里插入图片描述

2.4 非极大值抑制 Non-Maximum Suppression

在这里插入图片描述

2.5 边界框回归 Bounding Box Regression

在这里插入图片描述

2.6 边界框编码 Bbox Coding

在这里插入图片描述
{ b x = p x + p w ∗ t x b y = p y + p h ∗ t y b w = p w ∗ e x p ( t w ) b h = p h ∗ e x p ( t h ) \left\{ \begin{array}{ll} b_x = p_x + p_w * t_x \\ b_y = p_y + p_h * t_y \\ b_w = p_w * exp(t_w) \\ b_h = p_h * exp(t_h) \end{array} \right. bx=px+pwtxby=py+phtybw=pwexp(tw)bh=phexp(th)

3. 两阶段目标检测算法

3.1 两阶段算法概述

在这里插入图片描述

3.2 Region-based CNN (2013)

在这里插入图片描述

3.2.1 R-CNN的训练

在这里插入图片描述

3.2.2 R-CNN相比于传统方法(如DPM)的提升

在这里插入图片描述

3.2.3 R-CNN的不足(重复卷积)

在这里插入图片描述

3.3 Fast R-CNN (2014)

在这里插入图片描述

3.3.1 RoI Pooling

在这里插入图片描述

3.3.2 RoI Align

在这里插入图片描述

3.3.3 Fast R-CNN的训练

在这里插入图片描述

3.3.4 Fast R-CNN 的速度提升

在这里插入图片描述

3.3.5 Fast R-CNN 的精度提升

在这里插入图片描述

3.3.6 Fast R-CNN 的速度瓶颈(产生提议框)

在这里插入图片描述

3.3.7 降低区域提议的计算成本

在这里插入图片描述

3.3.8 朴素方法的局限

在这里插入图片描述

3.3.9 锚框 Anchor

在这里插入图片描述

3.4 Faster R-CNN (2015)

在这里插入图片描述

3.4.1 Faster R-CNN 的训练

在这里插入图片描述

3.5 两阶段方法的发展与演进 (2013~2017)

在这里插入图片描述
在这里插入图片描述

3.6 多尺度检测技术

3.6.1 多尺度检测必要性

在这里插入图片描述

  • 单级特征图不擅长检测:
    • 大物体
    • 小物体

3.6.2 图像金字塔 Image Pyramid

在这里插入图片描述

3.6.3 层次化特征

在这里插入图片描述

3.6.4 特征金字塔网络 Feature Pyramid Network (2016)

在这里插入图片描述

3.6.5 在 Faster R-CNN 模型中使用 FPN

在这里插入图片描述

4. 单阶段目标检测算法

4.1 两阶段与单阶段的比较

  • 两阶段
    在这里插入图片描述
  • 单阶段
    在这里插入图片描述

4.2 单阶段检测算法概述

在这里插入图片描述

4.3 YOLO: You Only Look Once (2015)

在这里插入图片描述

4.3.1 YOLO 的分类和回归目标

在这里插入图片描述

4.3.2 YOLO 的损失函数

在这里插入图片描述

4.3.3 YOLO 的优点和缺点

在这里插入图片描述

4.4 SSD: Single Shot MultiBox Detetor (2016)

在这里插入图片描述

4.4.1 SSD 的损失函数

在这里插入图片描述

4.5 正负样本不均衡问题

在这里插入图片描述

在这里插入图片描述

4.5.1 解决样本不均衡问题

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值