目标检测 two-stage

复习

目标检测

什么是目标检测,核心问题是什么

目标检测就是从图像中找到目标,确定其类别和位置。
难点:各类目标外观,形状,姿态差异,成像时光照,遮挡因素干扰。
核心问题:
1.目标可能出现在图像的任何位置。
2.目标有各种不同的大小。
3.目标可能有不同的形状。

应用:人脸检测,行人检测,车辆检测,飞机航拍,卫星图像中的道路检测,车载摄像机图像中的障碍物检测,医学图像的病灶检测。安防中的安全帽,安全带等动态检测,移动侦测,区域入侵检测,物品看护等。

Two-stage 目标检测算法

步骤:先进行区域生成(region proposal)可能包含检测物体的预选框,再通过网络进行分类。
常见的two-stage算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。

(1)R-CNN

该系列第一代算法,将“深度学习”和传统的“计算机视觉”的知识相结合
实现流程:

特征提取/深度学习:
1. 预训练模型;选择一个预训练 (pre-trained)神经网络(如AlexNet、VGG)
2. 重新训练全连接层;使用需要检测的目标重新训练(re-train)最后全连接层(connected layer)。
区域生成/机器学习:
提取 proposals并计算CNN 特征。利用选择性搜索(Selective Search)算法提取所有proposals(大约2000幅images)
调整(resize/warp)它们成固定大小,以满足CNN输入要求(因为全连接层的限制),然后将feature map 保存到本地磁盘。
分类/机器学习:
训练SVM。利用feature map 训练SVM来对目标和背景进行分类(每个类一个二进制SVM)
回归
边界框回归(Bounding boxes Regression)。训练将输出一些校正因子的线性回归分类器

R-CNN实验结果
R-CNN在VOC 2007测试集上mAP达到58.5%,打败当时所有的目标检测算法。

(2) Fast-RCNN

在这里插入图片描述
Fast R-CNN是基于R-CNN和SPPnets进行的改进。
输入不需要放缩到指定大小,解决了CNN输入任意大小图片的问题

SPPnets原理,首先对输入图片进行一次卷积获得整张图的特征,然后对2000个候选区域进行空间金字塔池化
(设计方法:特征图尺寸axa,nxn块的金字塔级,卷积核:尺寸size=上取整[a/n],步幅stride=上取整[a/n],
padding=下取整[(k*n-h+1)/2])
最后对每个类型训练线性分类器SVM。
import math
import torch
import torch.nn.functional as F
class SPPLayer(torch.nn.Module):
    def __init__(self, num_levels, pool_type='max_pool'):
        super(SPPLayer, self).__init__()
        self.num_levels=num_levels
        self.pool_type=pool_type
    def forward(self,x):
        num,c,h,w=x.size()
        print(x.size())
        for i in range(self.num_levels):
            level=i+1
            kernel_size=(math.ceil(h/level),math.ceil((w/level)))
            # print("kernel_size:",kernel_size,end=" ")
            stride=(math.ceil(h/level),math.ceil((w/level)))
            # print("stride:",stride,end=" ")
            padding=(math.floor((kernel_size[0]*level-h+1)/2),math.floor((kernel_size[1]*level-w+1)/2))
            # print("padding:",padding)
            #选择池化方式
            if self.pool_type=="max_pool":
                tensor=F.max_pool2d(x,kernel_size=kernel_size,stride=stride,padding=padding).view(num,-1)
                # print(F.max_pool2d(x,kernel_size=kernel_size,stride=stride,padding=padding).shape)
                # print(tensor.shape)
            if self.pool_type=="avg_pool":
                tensor=F.avg_pool2d(x,kernel_size=kernel_size,stride=stride,padding=padding).view(num,-1)
            #展开,拼接
            if (i==0):
                SPP=tensor.view(num,-1)

            else:
                SPP=torch.cat((SPP,tensor.view(num,-1)),1)
        return SPP
if __name__ == '__main__':
    data=torch.randn(2,3,224,224)
    data1=torch.randn(2,3,180,180)
    SPPNET=SPPLayer(6,)
    OUT=SPPNET(data)
    OUT1=SPPNET(data1)
    print("1:",OUT.shape)
    print(OUT1.shape)

实现流程:

特征提取:
只对整幅图像进行一次特征提取,避免R-CNN中的冗余特征提取
区域生成:
根据object proposal在shared feature map上映射到对应的feature vector(就是不用重复计算feature map了)。
将候选区域直接应用于特征图,并使用ROI池化将其转化为固定大小的特征图块。
分类
Fast-RCNN网络末尾采用并行的不同的全连接层,可同时输出分类结果和窗口回归结果
(3) Faster-RCNN

在这里插入图片描述
Faster R-CNN的流程图与Fast R-CNN相同,采用外部候选区域方法代替了内部深层网络。

Fast R-CNN依赖于外部候选区域方法,如选择性搜索。但这些算法在CPU上运行且速度很慢。
在测试中,Fast R-CNN需要2.3秒来进行预测,其中2秒用于生成2000个ROI。
Faster R-CNN采用与Fast R-CNN相同的设计,只是它用内部深层网络代替了候选区域方法。
新的候选区域网络(RPN)在生成ROI时效率更高,并且以每幅图像10毫秒的速度运行。	

实现流程:

特征提取:
候选区域网络(RPN)将第一个卷积网络的输出特征图作为输入。
它在特征图上滑动一个3×3的卷积核,以使用卷积网络(如下所示的ZF网络)构建与类别无关的候选区域。
其他深度网络(如VGG或ResNet)可用于更全面的特征提取,但这需要以速度为代价。
ZF网络最后会输出256个值,它们将馈送到两个独立的全连接层,以预测边界框和两个objectness分数,
这两个objectness分数度量了边界框是否包含目标。我们其实可以使用回归器计算单个objectness分数,
但为简洁起见,Faster R-CNN使用只有两个类别的分类器:即带有目标的类别和不带有目标的类别。

在这里插入图片描述

trick:锚框
这些锚点是精心挑选的,因此它们是多样的,且覆盖具有不同比例和宽高比的现实目标。
这使得我们可以用更好的猜想来指导初始训练,并允许每个预测专门用于特定的形状。
该策略使早期训练更加稳定和简便。

在这里插入图片描述

实验结果:

在VOC2007数据集上,用Resnet101,map最高达到75.2

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值