CNN----RCNN---FastRCNN

定义网络架构(CNN)

要在 PyTorch 中定义神经网络,你将创建并命名一个新的神经网络类,在函数 init 中定义网络层级,并定义在函数 forward 中利用这些初始化层级的网络前馈行为,forward 会接受输入图像张量 x。下面显示了叫做 Net 的此类的结构。

注意:在训练期间,PyTorch 将通过跟踪网络的前馈行为并使用 autograd 计算网络权重更新幅度,对网络进行反向传播。

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):

    def __init__(self, n_classes):
        super(Net, self).__init__()

        # 1 input image channel (grayscale), 32 output channels/feature maps
        # 5x5 square convolution kernel
        self.conv1 = nn.Conv2d(1, 32, 5)

        # maxpool layer
        # pool with kernel_size=2, stride=2
        self.pool = nn.MaxPool2d(2, 2)

        # fully-connected layer
        # 32*4 input size to account for the downsampled image size after pooling
        # num_classes outputs (for n_classes of image data)
        self.fc1 = nn.Linear(32*4, n_classes)

    # define the feedforward behavior
    def forward(self, x):
        # one conv/relu + pool layers
        x = self.pool(F.relu(self.conv1(x)))

        # prep for linear layer by flattening the feature maps into feature vectors
        x = x.view(x.size(0), -1)
        # linear layer 
        x = F.relu(self.fc1(x))

        # final output
        return x

# instantiate and print your Net
n_classes = 20 # example number of classes
net = Net(n_classes)
print(net)

卷积层
self.conv1 = nn.Conv2d(input_channels, output_channels, kernal_size)
池化层
self.pool = nn.MaxPool2d(kernal_size, stride)
全连接层
self.fc1 = nn.Linear(input_size, n_classes)

class ToTensor(object):
    """Convert ndarrays in sample to Tensors."""

    def __call__(self, sample):
        image, key_pts = sample['image'], sample['keypoints']
         
        # if image has no grayscale color channel, add one
        if(len(image.shape) == 2):
            # add that third color dim
            image = image.reshape(image.shape[0], image.shape[1], 1)
            
        # swap color axis because
        # numpy image: H x W x C
        # torch image: C X H X W
        image = image.transpose((2, 0, 1))
        
        return {'image': torch.from_numpy(image),
                'keypoints': torch.from_numpy(key_pts)}

RCNN

在这里插入图片描述
相同的输出特征向量之后,相连两个输出路径,一个用来给图像中的对象分类,一个用来生成该对象的边界框坐标,使用分类和回归损失函数的组合weights训练网络

损失函数

分类:交叉熵函数(概率分布在(0,1)之间的模型)CrossEntropyLoss
bounding box:回归(中心点坐标(x,y),width,hight):
L1 Loss(可能忽视小的误差值) ,
MSE Loss(对较大但不常见的误差敏感即outliers),
Smooth L1 Loss(对很大的误差使用L1Loss,对(x,y)的误差小于1时用MSE)
在这里插入图片描述
通过KMeans或其他聚类方法(blob连通域分析等),划分背景和对象,把具有相似纹理和相同边界的区域放在一起
或加入一个层级,识别是否含有对象,产生一组可能找到对象的Region Proposals,使我们能快速查看图像,
将ROI传入CNN分类

FAST R-CNN

将ROI投射到更小的特征图层级上,而不是裁剪原始图像,然后从特征图选择对应区域并挨个送到一个全连接层中为每个区域分类。
我们需要处理这些不同大小的区域,因为网络中更深的层级要求输入是固定大小的。我们采用ROI pooling将这些区域调整为固定大小,然后传送到全连接层中

ROI pooling

要将感兴趣区域调整为相同的尺寸,以便进一步分析,某些网络会使用 RoI 池化。RoI 池化是网络中的额外层级,它会接受任何尺寸的矩形区域,并对该区域进行最大池化运算,使输出是固定的形状。下面是一个区域示例,其中的像素值被拆分为多个部分,并应用池化运算;具有以下值的部分:

[[0.85, 0.34, 0.76],
[0.32, 0.74, 0.21]]
在池化之后将变成单个最大值:0.85
在这里插入图片描述

Faster RCNN

与fast Rcnn不同之处在于将特征图送入一个单独的(RPN)region proposal network,用网络生成的特征来预测自己的region,如果特征图的某个区域检测到了大量边缘或其他特征,则被识别为ROI,然后网络会快速进行二分类,对每个ROI检测是否包含对象,网络的剩余部分和fast rcnn一样。

RPN 会查看最后卷积层的输出(一个特征图),并用滑动窗口方法进行潜在对象检测。它在特征图上滑动一个小的窗口(通常是 3x3),然后对于每个窗口,RPN:

  1. 使用一组定义好的锚点框生成多个可能的 RoI,每个 RoI 都被视为区域建议。锚点框是宽高比固定的方框,例如宽矮或高瘦方框。
  2. 对于每个建议,该网络都生成一个概率 Pc,将该区域分类为对象(或非对象)区域,并包含该对象的一组边界框坐标。
  3. 对象概率很低的区域(例如 Pc < 0.5)被丢弃。
    训练RPN
    因为在此示例中,没有真实区域,如何训练区域建议网络?

原理是对于任何区域,可以检查它是否与任何真实对象重叠。即对于某个区域,如果我们要将此区域分类为对象或非对象区域,它属于哪个类别?对于重叠一部分对象的区域建议,我们应该表示该区域里有对象的概率很高,应保留该区域;如果其中有对象的概率很低,则丢弃该区域。

YOLO(you only look once)

将输出的分类结果和bounding box的坐标以及高宽,结合成一个输出向量
在这里插入图片描述

Sliding Windows

确定窗口大小,从图像开始位置,将窗口所包含的图像对应区域输入网络,pc表示窗口是否包含对象,pc=0则不继续分类该图像区域;

如果将第一个窗口对应的图像区域传入这个新的 CNN 中,看到的结果是最后层级的左上角(请参阅上图)。同样,如果将第二个窗口对应的图像区域传入这个新的 CNN 中,我们会在最后层级中看到相应的结果:
在这里插入图片描述
实际上,如果我们将所有窗口对应的区域传入 CNN,我们看到所有 16 个窗口包含在新 CNN 的最后层级中。因此,单独将 16 个窗口传入旧 CNN 和将整个图像仅传入此新 CNN 一次的结果完全一样。

这是用 CNN 应用滑动窗口的方式。此技巧使整个流程高效得多。但是,此技巧有个不足之处:边界框的位置不太准确。原因是给定尺寸的窗口和步长能够完美匹配图像中对象的可能性太低。为了提高边界框的准确率,YOLO 利用网格,而不是滑动窗口,此外还会用到另外两个技巧,称为交并比和非最大值抑制。

bounding box

给每个网络单元分配输出向量,使每个单元格都具有相关向量,包含以下信息:

  1. 是否包含对象
  2. 对象的种类
  3. 该对象的预测边界框

    这样就可以训练CNN为每个网格单元训练输出向量gn。
    在网格单元上使用网络训练,需要特殊的训练数据,输出预测的类别得分和边界框向量。
    将每幅图片划分为网格单元后,手动为每个网格单元分配一个正确的标注,并设计一个相应的CNN进行训练
    在这里插入图片描述
    每个bounding box仅分配给一个网格单元(包含每个对象中点的网格单元),x,y确定的是边界框相对于网格单元的中心坐标,w,h确定的是边界框相对于整个图像的宽和高,
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    采用非最大值抑制的方法,同一个对象只保留iou最大的bounding box

anchor box

具有固定宽高比,识别某种具有这个宽高比的特定对象
在这里插入图片描述
一个锚点框对应一个对象,如果bounding box内有两个重叠的同类对象,则会把这两个对象划分为两类,如果有三个重叠的不同类对象,也只能识别出其中两个

RNN

将图像作为输入,并输出描述该图像的单词序列。图像说明用于创建易于读懂的内容并用于各种需要阅读图像内容的情形中。这个模型将包含一个在输入图像中查找空间规律的 CNN 组件和一个负责生成描述性文本的 RNN 组件!

RNN 有时候还用于分析图像序列。可以用于视频字幕以及视频分类、手势识别和对象跟踪等。所有这些任务都将输入看做图像帧的序列。

LSTM(Long short-term memory)

和反向传播算法类似,导数连乘来计算梯度,导致梯度消失,因此很少能取到超过8个steps之前的数据,即信息的贡献度随时间呈指数级消失。
LSTM将一些信号(状态变量)存储在Gates中,在未来的某些时间可以取出来用

Elman net

前馈神经网络和循环神经网络之间存在两个主要区别。循环神经网络使用:

序列作为训练阶段的输入,且记忆要素
存储是隐藏层神经元的输出,在接下来训练步骤中将作为网络的额外输入

三层基本神经网络的反馈作为存储输入,叫做Elman网络,如下图所示:
在这里插入图片描述

反向传播

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值