🐳 多尺度目标检测
type
status
date
slug
summary
tags
category
icon
password
Property
 
以输入图像的每个像素为中心,生成多个锚框,这些锚框代表了图像不同区域的样本。 然而,如果为每个像素都生成的锚框,最终可能会得到太多需要计算的锚框。 一个561×728的输入图像,如果以每个像素为中心生成五个形状不同的锚框,就需要在图像上标记和预测超过200万个锚框(561×728×5)
减少图像上的锚框数量并不困难。 比如,可以在输入图像中均匀采样一小部分像素,并以它们为中心生成锚框。 此外,在不同尺度下,可以生成不同数量和不同大小的锚框。 直观地说,比起较大的目标,较小的目标在图像上出现的可能性更多样。 例如,1×1、1×2和2×2的目标可以分别以4、2和1种可能的方式出现在2×2图像上。 因此,当使用较小的锚框检测较小的物体时,可以采样更多的区域,而对于较大的物体可以采样较少的区域。
 
卷积图层的二维数组输出称为特征图, 通过定义特征图的形状可以确定任何图像上均匀采样锚框的中心
display_anchors函数定义如下。 在特征图(fmap)上生成锚框(anchors),每个单位(像素)作为锚框的中心。 由于锚框中的轴坐标值(anchors)已经被除以特征图(fmap)的宽度和高度,因此这些值介于0和1之间,表示特征图中锚框的相对位置。
由于锚框(anchors)的中心分布于特征图(fmap)上的所有单位,因此这些中心必须根据其相对空间位置在任何输入图像上均匀分布。 更具体地说,给定特征图的宽度和高度fmap_wfmap_h,以下函数将均匀地对任何输入图像中fmap_h行和fmap_w列中的像素进行采样。 以这些均匀采样的像素为中心,将会生成大小为s(假设列表s的长度为1)且宽高比(ratios)不同的锚框。
 
首先考虑探测小目标。 为了在显示时更容易分辨,在这里具有不同中心的锚框不会重叠: 锚框的尺度设置为0.15,特征图的高度和宽度设置为4。可以看到,图像上4行和4列的锚框的中心是均匀分布的
notion image
🐳 目标检测数据集
type
status
date
slug
summary
tags
category
icon
password
Property
 
1000张不同角度和大小的香蕉图像,在一些背景图片的随机位置上放一张香蕉的图像,在图片上为这些香蕉标记了边界框
notion image
 
🐳 单发多框检测 SDD
type
status
date
slug
summary
tags
category
icon
password
Property
 

模型

 
notion image
模型主要由基础网络组成,其后是几个多尺度特征块。
基本网络用于从输入图像中提取特征,因此它可以使用深度卷积神经网络(单发多框检测论文中选用了在分类层之前截断的VGG,现在也常用ResNet替代)。 我们可以设计基础网络,使它输出的高和宽较大。 这样一来,基于该特征图生成的锚框数量较多,可以用来检测尺寸较小的目标。 接下来的每个多尺度特征块将上一层提供的特征图的高和宽缩小(如减半),并使特征图中每个单元在输入图像上的感受野变得更广阔。
由于接近顶部的多尺度特征图较小,但具有较大的感受野,它们适合检测较少但较大的物体。 简而言之,通过多尺度特征块,单发多框检测生成不同大小的锚框,并通过预测边界框的类别和偏移量来检测大小不同的目标,因此这是一个多尺度目标检测模型。

类别预测层

设目标类别的数量为。这样一来,锚框有个类别,其中0类是背景。 在某个尺度下,设特征图的高和宽分别为。如果以其中每个单元为中心生成 个锚框,那么需要对个锚框进行分类。 如果使用全连接层作为输出,很容易导致模型参数过多。单发多框检测采用了使用卷积层的通道来输出类别预测的方法来降低模型复杂度。
具体来说,类别预测层使用一个保持输入高和宽的卷积层。 这样一来,输出和输入在特征图宽和高上的空间坐标一一对应。 考虑输出和输入同一空间坐标:输出特征图上坐标的通道里包含了以输入特征图坐标为中心生成的所有锚框的类别预测。 因此输出通道数为,其中索引为的通道代表了索引为的锚框有关类别索引为的预测
定义了一个类别预测层,通过参数num_anchorsnum_classes分别指定了a和q。 该图层使用填充为1的3×3的卷积层。此卷积层的输入和输出的宽度和高度保持不变。
🐳 区域卷积神经网络
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
 

R-CNN

R-CNN首先对图像选取若干提议区域(如锚框也是一种选取方法)并标注它们的类别和边界框(如偏移量)。然后,用卷积神经网络对每个提议区域做前向计算抽取特征。之后,用每个提议区域的特征预测类别和边界框。
                                                                         R-CNN模型
R-CNN模型
具体来说,R-CNN主要由以下4步构成:
  1. 对输入图像使用选择性搜索(selective search)来选取多个高质量的提议区域。这些提议区域通常是在多个尺度下选取的,并具有不同的形状和大小。每个提议区域将被标注类别和真实边界框。
  1. 选取一个预训练的卷积神经网络,并将其在输出层之前截断。将每个提议区域变形为网络需要的输入尺寸,并通过前向计算输出抽取的提议区域特征。
  1. 将每个提议区域的特征连同其标注的类别作为一个样本,训练多个支持向量机对目标分类。其中每个支持向量机用来判断样本是否属于某一个类别。
🐳 语义分割和数据集
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 

图像分割和实例分割

  • 图像分割将图像分割成若干组成区域。这类问题的方法通常利用图像中像素之间的相关性。它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。以下图为输入,图像分割可能将狗分割成两个区域:一个覆盖以黑色为主的嘴巴和眼睛,而另一个覆盖以黄色为主的其余部分身体。
  • 实例分割又叫同时检测并分割(simultaneous detection and segmentation)。它研究如何识别图像中各个目标实例的像素级区域。与语义分割有所不同,实例分割不仅需要区分语义,还要区分不同的目标实例。如果图像中有两只狗,实例分割需要区分像素属于这两只狗中的哪一只
notion image

Pascal VOC2012语义分割数据集

语义分割的一个重要数据集叫作Pascal VOC2012数据集
notion image
🐳 全连接神经网络(FCN)
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换。 与之前在图像分类或目标检测部分介绍的卷积神经网络不同,全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸:这是通过在转置卷积(transposed convolution)实现的。 因此,输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。

构造模型

全卷积网络先使用卷积神经网络抽取图像特征,然后通过卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。模型输出与输入图像的高和宽相同,并在空间位置上一一对应:最终输出的通道包含了该空间位置像素的类别预测。
notion image
下面我们使用一个基于ImageNet数据集预训练的ResNet-18模型来抽取图像特征,并将该网络实例记为pretrained_net。可以看到,ResNet-18模型的最后几层包括全局平均汇聚层和全连接层,然而全卷积网络中不需要它们。
 
 

初始化转置卷积层

🐳 样式迁移
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
notion image
 

方法

首先初始化合成图像,例如将其初始化为内容图像。 该合成图像是风格迁移过程中唯一需要更新的变量,即风格迁移所需迭代的模型参数。 然后,选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。 这个深度卷积神经网络凭借多个层逐级抽取图像的特征,可以选择其中某些层的输出作为内容特征或风格特征。 以下图为例,这里选取的预训练的神经网络含有3个卷积层,其中第二层输出内容特征,第一层和第三层输出风格特征。
notion image
接下来,通过前向传播(实线箭头方向)计算风格迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型数,即不断更新合成图像。 风格迁移常用的损失函数由3部分组成:
  • 内容损失使合成图像与内容图像在内容特征上接近;
  • 风格损失使合成图像与风格图像在风格特征上接近;
  • 全变分损失则有助于减少合成图像中的噪点。
最后,当模型训练结束时输出风格迁移的模型参数,即得到最终的合成图像。
🐬 序列模型
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
对于图像数据,有专门的卷积神经网络架构来为这类特殊的数据结构建模。 如果拥有一张图像,需要有效地利用其像素位置, 假若对图像中的像素位置进行重排,就会对图像中内容的推断造成极大的困难。
我们之前默认数据都来自于某种分布, 并且所有样本都是独立同分布的。 然而,大多数的数据并非如此。 例如,文章中的单词是按顺序写的,如果顺序被随机地重排,就很难理解文章原始的意思。 同样,视频中的图像帧、对话中的音频信号以及网站上的浏览行为都是有顺序的。 因此,针对此类数据而设计特定模型,可能效果会更好。
另一个问题来自这样一个事实: 我们不仅仅可以接收一个序列作为输入,而是还可能期望继续猜测这个序列的后续。 例如,一个任务可以是继续预测2,4,6,8,10,…。 这在时间序列分析中是相当常见的,可以用来预测股市的波动、 患者的体温曲线或者赛车所需的加速度。 同理,需要能够处理这些数据的特定模型。
如果说卷积神经网络可以有效地处理空间信息, 那么循环神经网络则可以更好地处理序列信息。 循环神经网络通过引入状态变量存储过去的信息和当前的输入,从而可以确定当前的输出。
 
以股票价格(富时100指数)为例:
🐬 文本预处理
type
status
date
slug
summary
tags
category
icon
password
Property
 

读取数据集

从H.G.Well的时光机器中加载文本。 这是一个相当小的语料库,只有30000多个单词。 下面的函数将数据集读取到由多条文本行组成的列表中,其中每条文本行都是一个字符串。 为简单起见,这里忽略了标点符号和字母大写
 

词元化

下面的tokenize函数将文本行列表(lines)作为输入, 列表中的每个元素是一个文本序列(如一条文本行)。 每个文本序列又被拆分成一个词元列表,词元(token)是文本的基本单位。 最后,返回一个由词元列表组成的列表,其中的每个词元都是一个字符串(string)
 

词表

词元的类型是字符串,而模型需要的输入是数字,因此这种类型不方便模型使用。
构建一个字典,通常也叫做词表(vocabulary), 用来将字符串类型的词元映射到从0开始的数字索引中。
🐬 语言模型和数据集
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
假设长度为的文本序列中的词元依次为。于是, 可以被认为是文本序列在时间步处的观测或标签。 在给定这样的文本序列时,语言模型(language model)的目标是估计序列的联合概率:
例如,只需要一次抽取一个词元, 一个理想的语言模型就能够基于模型本身生成自然文本。 与猴子使用打字机完全不同的是,从这样的模型中提取的文本都将作为自然语言(例如,英语文本)来传递。 只需要基于前面的对话片断中的文本, 就足以生成一个有意义的对话。 显然,我们离设计出这样的系统还很遥远, 因为它需要“理解”文本,而不仅仅是生成语法合理的内容。
尽管如此,语言模型依然是非常有用的。 例如,短语“to recognize speech”和“to wreck a nice beach”读音上听起来非常相似。 这种相似性会导致语音识别中的歧义,但是这很容易通过语言模型来解决, 因为第二句的语义很奇怪。 同样,在文档摘要生成算法中, “狗咬人”比“人咬狗”出现的频率要高得多。

学习语言模型

假设在单词级别对文本数据进行词元化, 我们可以对序列模型的分析。 从基本概率规则开始:
例如,包含了四个单词的一个文本序列的概率是:
🐬 RNN模型
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
元语法模型,单词在时间步的条件概率仅取决于前面个单词。 对于时间步之前的单词, 如果想将其可能产生的影响合并到上, 需要增加,然而模型参数的数量也会随之呈指数增长, 因为词表需要存储个数字, 因此与其将模型化, 不如使用隐变量模型:
其中是隐状态(hidden state),也称为隐藏变量(hidden variable),存储了到时间步的序列信息。
通常可以基于当前输入和先前隐状态来计算时间步处的任何时间的隐状态:
对于函数,隐变量模型不是近似值。 毕竟是可以仅仅存储到目前为止观察到的所有数据, 然而这样的操作可能会使计算和存储的代价都变得昂贵。
🐬 RNN的实现
type
status
date
slug
summary
tags
category
icon
password
Property

 

从零开始实现

读取数据集

 

独热编码

train_iter中,每个词元都表示为一个数字索引, 将这些索引直接输入神经网络可能会使学习变得困难。 通常将每个词元表示为更具表现力的特征向量,最简单的表示为独热编码(one-hot encoding)将每个索引映射为相互不同的单位向量: 假设词表中不同词元的数目为 (即len(vocab)), 词元索引的范围为。 如果词元的索引是整数, 那么创建一个长度为的全向量, 并将第处的元素设置为。 此向量是原始词元的一个独热向量。 索引为的独热向量如下所示: