目标检测相关基础恶补——2020.12.25

 

目标检测

核心是:给一个图片,检测物体的类别和位置(框出来,即坐标)

不管哪个方法,记住我们的目标 ,即 objective 

 

YOLO系列

  • 一阶段的方法,优点是速度快,整体来看就是:感觉是真正实现了,给一个图片,得到一个位置和类别。两阶段的中间还会生成一堆的预测框,无形中有很大的冗余
  • two-stage算法代表有R-CNN系列,one-stage算法代表有Yolo系列。
  • Yolo很快,因为用回归的方法,并且不用复杂的框架。
  • Yolo会基于整张图片信息进行预测,而其他滑窗式的检测框架,只能基于局部图片信息进行推理。
  • Yolo学到的图片特征更为通用。作者尝试了用自然图片数据集进行训练,用艺术画作品进行预测,Yolo的检测效果更佳

YOLO1

输入是:448*448

各种卷积+maxpool等

倒数第三层网络的时候:使用全连接层

然后reshape变成 7*7*30 中间都不管,因为没有意义,现在卷积层谁不会用亚....这都不是trick

除了最后一层的输出使用了线性激活函数,其他层全部使用Leaky Relu激活函数

关键信息:

一般大家介绍都会说的

参考一:yolo讲解

参考2:理解

补充:参考2:理解

第二点我说明一下,就是网络不管是训练还是测试都是吐出了一个值c,但是训练的时候用了pr(objcet)* iou 来纠正c的值,而训练时候就是直接得到c。

如上述原文中提及,在强行施加了格点限制以后,每个格点只能输出一个预测结果,所以该算法最大的不足,就是对一些邻近小物体的识别效果不是太好,例如成群结队的小鸟

剩下的训练loss 具体解释 和 其他的 trick 直接看这篇博客:【论文解读】Yolo三部曲解读——Yolov1 我选了好几个,这个算是最清楚的了,比知乎高赞答案都清楚很多,可能是我的能力还理解不来高赞答案吧

 

Yolov2

比v1一共改进 了 7 个地方,都不太好理解

优点:更好,更快,更强

然后我发现大家都不太详细解释.........

better:

  • Batch Normalization(批归一化)
  • High Resolution Classifier(分类网络高分辨率预训练)
  • Convolutional With Anchor Boxes(Anchor Box替换全连接层)| 这个看不懂。
  • Dimension Clusters(Anchor Box的宽高由聚类产生)
  • Direct location prediction(绝对位置预测)| 听课没听懂 T.T
  • Fine-Grained Features(细粒度特征)| 同上 + 了一个passthrough层
  • Multi-Scale Training(多尺寸训练)

这个yolo2更多的是集合了当时的深度学习各种技巧,相当于工程类的trick,由于暂时用不到,先这样吧..(太忙了

stronger:分类、检测训练集联合训练的方案

物体分类的数据集,最著名的ImageNet,物体类别有上万个,而物体检测数据集,例如coco,只有80个类别,因为物体检测、分割的打标签成本比物体分类打标签成本要高很多。

联合训练方法思路简单清晰,Yolo v2中物体矩形框生成,不依赖于物理类别预测,二者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其余部分loss为零。当然,一般的训练策略为,先在检测数据集上训练一定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,作者对coco数据集进行了上采样,使得coco数据总数和ImageNet大致相同。

参考理解:

联合分类与检测数据集,这里不同于将网络的backbone在ImageNet上进行预训练,预训练只能提高卷积核的鲁棒性,而分类检测数据集联合,可以扩充识别物体种类。例如,在检测物体数据集中,有类别人,当网络有了一定的找出人的位置的能力后,可以通过分类数据集,添加细分类别:男人、女人、小孩、成人、运动员等等。这里会遇到一个问题,类别之间并不一定是互斥关系,可能是包含(例如人与男人)、相交(运动员与男人),那么在网络中,该怎么对类别进行预测和训练呢?

  • Dataset combination with WordTree 这里没仔细看,用到再说

 

Yolov3

参考理解 参考理解2 排名不分先后..

网络结构图如下

preview

稍微梳理了参考理解的博客知识:

1.总的来说:网络先不说,先大概来了解一下:

(强调,你必须看过cnn等基础知识,必须看过yolo1等,小白跳过吧...)

输入:256 × 256 × 3 图片 —— > 

不同的输入尺寸,会得到不同大小的输出特征图 ——>

每个特征图的每个格子中,都配置3个不同的先验框 ——>

输出:8 × 8 × 3 × 85、16 × 16 × 3 × 85、32 × 32 × 3 × 85

85指的是 检测框位置(4维)、检测置信度(1维)、类别(80维,coco数据集)、3是3个先验框、N × N × 3,N × N代表了检测框的参考位置信息

最后的最后:

三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:

  1. 训练时4032个box全部送入打标签函数,进行后一步的标签以及损失函数的计算。
  2. 推理时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了。

2.然后肯定一堆不懂的概念:

  • 先验框

在Yolov1中,网络直接回归检测框的宽、高,这样效果有限。所以在Yolov2中,改为了回归基于先验框的变化值,这样网络的学习难度降低,整体精度提升不小。Yolov3沿用了Yolov2中关于先验框的技巧,并且使用k-means对数据集中的标签框进行聚类,得到类别中心点的9个框 。注:先验框只与检测框的w、h有关,与x、y无关。

  • 类别解码

使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活。

 

3.训练策略与损失函数

推荐直接去看这里 参考理解

要点解析:

正样本、负样本、无关样本

怎么得到上述三个样本的

loss函数解析

作者实验解析

其他参考

第一个 yolo3

yolo4

Faster rcnn系列

然后 两阶段的 有个博主很清晰易懂的  有个专栏

小白可以去看

人人都能懂的目标检测

第二个参考我没看但是截止目前5000+点赞..一文读懂Faster RCNN

后面应该还会继续加资料

————————————————————————1.10 更新 ————————————————————————————————-

r-cnn系列顶峰代码:Detection2

它只是个工具代码,可以基于它进行修改  op=operation操作

整体框架部分 [参考]

1. 根据参数和config文件创建模型、输入
2. 利用VisualizationDemo的run_on_image、run_on_video接口处理输入图片/视频
3. 利用opencv-python的专用函数,记录或者显示detectron处理后的图片/视频

模型部分Model [参考]

backbone:模型的CNN特征提取器,目前只支持resnet,另外一点是detectron2也把FPN作为backbone的一部分;

proposal_generator:候选框生成器,目前只支持RPN,一般用于faster R-CNN的一部分,其实RPN单拿出来也是一个简单的one-stage检测模型

roi_heads:faster R-CNN系列的detector,包括ROIPooler,box_head,mask_head等,其中ROIPooler就是指的ROIPool和ROIAlign方法;

meta_arch:定义最终的模型,不能说是一个单独的模块,应该要集成backbone,proposal_generator和roi_heads构建最终模型。

 

可拓展部分: [参考]

训练自己定义的数据集 :对于dataloader我们更关注的是数据的预处理和数据增强,detectron2在这方面支持性非常好,你只需要自定义DatasetMapper就好,然后送入build_loader的mapper字段,detectron2对image的normalize是在Model中完成的,所以mapper中只需要转成float32的Tensor就可以。(数据进行处理增强——对应知识点:特征工程)

自定义模型:必须要了解detectron2中的模型的输入和输出格式,根据模型的不同,所需要的字段也有变化,测试和训练的不同,也有变化

我们有时候需要自定义新的模型,这就要利用前面所说的detectron2注册机制。由于detectron2是模块化设计的,你也可以自定义模型的某一个模块,比如你想实现一个新的backbone

from detectron2.modeling import BACKBONE_REGISTRY, Backbone, ShapeSpec

## 注册backbone
@BACKBONE_REGISTRY.register()
class ToyBackBone(Backbone):
  def __init__(self, cfg, input_shape):
    super().__init__()
    # create your own backbone
    self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=16, padding=3)

  # 输出格式是dict,这是detectron2的约定格式,与后面的detector相适应
  def forward(self, image):
    return {"conv1": self.conv1(image)}

  # 这个方法是必须的,因为detector的head需要backbone的输出channel
  def output_shape(self):
    return {"conv1": ShapeSpec(channels=64, stride=16)}

使用这个新的backbone,只需要在配置文件中修改cfg.MODEL.BACKBONE.NAME = 'ToyBackBone',那么build_model(cfg)得到的模型将使用这个新的backbon 

然后自己定义的可以学习一下原有代码里面的模型来进行定义

自定义训练器:如果你觉得DefaultTrainer满足不了自己的训练需求,更进一步地你可以参考tools/plain_train_net.py实现自己的某些策略

你想自定义某些训练逻辑,就可以按照train_net.py那样重写DefaultTrainer的某些方法,比如你希望使用自定义的mapper进行训练,那么只需要重写build_train_loader方法:

@classmethod
def build_train_loader(cls, cfg):
    return build_detection_train_loader(cfg, mapper=your_mapper)

Faster rcnn部分RCNN结构模型 (detectron代码、基础知识) [参考]

 

  • backbone:从图片提取特征表示的卷积神经网络结构,比如说ResNet。
  • proposal_generator:从图片的特征预测“哪里可能有物体”
  • roi_head:以proposal_generator部分预测的有物体区域为基础,预测物体的类别和检测框坐标

试试用例

参考1:参考2:

工程能力代码

如果想提高工程能力的xdm,可以看看这个链接 🙋‍🙋‍

贴个这个链接的图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值