文章目录
目标检测与yolo
包围框与置信度
- 包围框
我们有 s 2 s^2 s2个框,每个框的bb个数为𝐵,分类器可以识别出𝐶种不同的物体,
那么所有整个ground truth的长度为𝑆 × 𝑆 × (𝐵 × 5 + 𝐶)
YOLO v1中,这个数量是30
YOLO v2和以后版本使用了自聚类的anchor box为bb, v2版本为𝐵 = 5, v3中𝐵 =9 - 置信度
置信度计算公式: C = P r ( o b j ) ∗ I O U t r u t h p r e d C=Pr(obj)*IOU^{pred}_{truth} C=Pr(obj)∗IOUtruthpred
Pr(obj)是一个grid有物体的概率
IOU是预测的bb和真实的物体位置的交并比,交并比概念如下图:
- 归一化
四个关于位置的值,分别是𝑥, 𝑦, ℎ和𝑤,均为整数,实际预测中收敛慢因此,需要对数据进行归一化,在0-1之间。
如下图为归一化的例子:例子是一个448448的图片,有33的grid,每个cell是149。目标中心点是(220,190) - 训练值(ground truth)
- 训练数据与网络输出
损失函数
- 总的损失函数
- 第一项第二项相关细节
第二项开根号是为了使得误差更加显著,保证回归精度。 - 第三四五项相关细节
对于 λ c o o r d \lambda_{coord} λcoord、 λ n o b j \lambda_{nobj} λnobj取值的问题,论文中给出的答案是 λ c o o r d = 5 \lambda_{coord}=5 λcoord=5、 λ n o b j = 0.5 \lambda_{nobj}=0.5 λnobj=0.5,也就是放大第一项和第二项的损失函数,缩小第四项的损失函数。
这样做的原因是让梯度更稳定,如果gid中不含有物体,它对1,2,3,5项没有影响,如果调节第四项,会让含有物体的grid的confidence发生改变,这可能使其他项的梯度剧烈变化,从而带来模型上的不稳定。
因此,我们放大第一项和第二项,缩小第四项。
训练与NMS
非极大值抑制(NMS)
- 预训练与训练
保留了这么多边界框,预测中一个物体可能被多个边界框包围;实际物体只对应一个边界框,可以采用NMS。
NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。 - NMS算法要点:
- 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对于剩余的边界框:
- 选择具有最高概率的边界框并将其作为输出预测;
- 计算 “作为输出预测的边界框”,与其他边界框的相关联IoU值;舍去IoU大于阈值的边界框;其实就是舍弃与“作为输出预测的边界框” 很相近的框框。
- 重复步骤2,直到所有边界框都被视为输出预测或被舍弃。
数据集训练
- YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCALVOC数据集上进行对象识别和定位的训练和预测。
- 训练中采用了drop out和数据增强来防止过拟合。
- YOLO的最后一层采用线性激活函数(因为要回归bb位置),其它层都是采用Leaky ReLU激活函数:
yolov3 模型效果
语义分割与FCN
语义分割问题:
语义分割关注如何将图像分割成属于不同语义类别的区域。值得一提的是,这些语义区域的标注和预测都是像素级的。下图展示了语义分割中图像有关狗、猫和背景的标签。可以看到,与目标检测相比,语义分割标注的像素级的边框显然更加精细。
计算机视觉领域还有2个与语义分割相似的重要问题,即图像分割和实例分割。我们在这里将它们与语义分割简单区分一下。
- 图像分割将图像分割成若干组成区域。这类问题的方法通常利用图像中像素之间的相关性。它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。
- 实例分割又叫同时检测并分割。它研究如何识别图像中各个目标实例的像素级区域。与语义分割有所不同。
- 以上一张ppt中的两只狗为例,图像分割可能将狗分割成两个区域:一个覆盖以黑色为主的嘴巴和眼睛,而另一个覆盖以黄色为主的其余部分身体。而实例分割不仅需要区分语义,还要区分不同的目标实例。如果图像中有两只狗,实例分割需要区分像素属于这两只狗中的哪一只。
- 定义:
予以分割:找到同一画面中的不同类型目标区域
实例分割:同一类型目标要分出来具体实例(谁是谁)
目标检测:标出来外包围矩
深度学习图像分割算法发展:
语义分割基本思想
目标
语义分割的目标是对图中每一个像素进行分类,得到对应标签。
基本思想:滑动窗口、FCN网络结构
单纯滑动窗口滑动次数太多,计算太慢,重复计算太多。
FCN网络结构:
网络结构分为两个部分:全卷积部分和反卷积部分。全卷积部分借用了一些经典的CNN网络,并把最后的全连接层换成卷积,用于提取特征,形成热点图;反卷积部分则是将小尺寸的热点图上采样得到原尺寸的语义分割图像。
反卷积与反池化
基本概念
- 1x1卷积
- 上池化(unpooling),或称为反池化
FCN具体实现
卷积部分
FCN中第6、7、8层都是通过1 × 1卷积得到的,第6层的输出是4096 × 7 × 7,第7层的输出是4096 × 7 × 7 ,第8层的输出是1000 × 7 × 7,即1000个大小是7 × 7的特征图(称为heatmap)
反卷积部分
跳级结构
FCN训练结果
FCN训练结果与其他网络对比
FCN评价指标与标注工具
- 评价指标
- 常用语义分割标注工具
Labelme、EISeg
风格迁移
风格迁移问题简介
- 风格迁移问题:这里我们需要两张输入图像,一张是内容图像,另一张是样式图像,我们将使用神经网络修改内容图像使其在样式上接近样式图像。
- 方法: 首先,我们初始化合成图像,例如将其初始化成内容图像。该合成图像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模型参数。然后,我们选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽取图像的特征。我们可以选择其中某些层的输出作为内容特征或样式特征。
- 简介:以之前放的图像为例,这里选取的预训练的神经网络含有3个卷积层,其中第二层输出图像的内容特征,而第一层和第三层的输出被作为图像的样式特征。
接下来,我们通过正向传播(实线箭头方向)计算样式迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。
风格迁移问题代价函数
样式迁移常用的损失函数由3部分组成:
- 内容损失(content loss)使合成图像与内容图像在内容特征上接近
- 样式损失(style loss)令合成图像与样式图像在样式特征上接近
- 总变差损失(total variation loss)则有助于减少合成图像中的噪点。最后,当模型训练结束时,我们输出样式迁移的模型参数,即得到最终的合成图像。
代价函数如下:
- 预处理与后处理图像
预处理函数preprocess对先对更改输入图像的尺寸,然后再将PIL图片转成卷积神经网络接受的输入格式再在RGB三个通道分别做标准化。由于预训练模型是在均值为[0.485, 0.456, 0.406]的图片数据上预训练的,所以我们要将图片标准化保持相同的均值和标准差。
后处理函数postprocess则将输出图像中的像素值还原回标准化之前的值。由于图像每个像素的浮点数值在0到1之间,我们使用clamp函数对小于0和大于1的值分别取0和1。 - 抽取特征
为了抽取图像的内容特征和样式特征,我们可以选择VGG网络中某些层的输出。一般来说,越靠近输入层的输出越容易抽取图像的细节信息,反之则越容易抽取图像的全局信息。
为了避免合成图像过多保留内容图像的细节,我们选择VGG较靠近输出的层,也称内容层,来输出图像的内容特征。
我们还从VGG中选择不同层的输出来匹配局部和全局的样式,这些层也叫样式层。
人脸识别
人脸验证与人脸识别
人脸验证:一对一
人脸识别:一对多
人脸验证->人脸识别:
for i in 数据库中的所有照片:
调用人脸验证检测输入与数据库中照片i上的是否为同一人
人脸验证
1.旧思路:转化为分类问题
这种思路的局限性在于是one-shot learning
2. 新思路:利用相似度函数
siamese网络
相似度函数:
对于预存的人脸可以预先知道网络输出,从而节省识别计算量。
对于符号规定:
A—待测照片 P—同一人照片 N—不同人照片
我们希望A与P的差距永远不超过A与N,即:
并如上定义损失函数。
将所有样本的loss函数累加得到cost函数如下:
视觉应用展望
生成对抗网络(GANs, generative adversarial networks)是由Ian Goodfellow等人在2014年的Generative Adversarial Networks一文中提出。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。
原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。
生成对抗网络(GAN)的初始原理十分容易理解,即构造两个神经网络,一个生成器,一个鉴别器,二者互相竞争训练,最后达到一种平衡(纳什平衡)。
GAN 启发自博弈论中的二人零和博弈(two-player game),GAN 模型中的两位博弈方分别由生成式模型(generativemodel,G)和判别式模型(discriminative model,D)充当。
-
生成模型 G 捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声 z 生成一个类似真实训练数据的样本,追求效果是越像真实样本越好。
-
判别模型 D 是一个二分类器,估计一个样本来自于训练数据(而非生成数据)的概率,如果样本来自于真实的训练数据,D 输出大概率,否则,D 输出小概率。
循环神经网络与NLP
数据处理基础
特征编码
在循环神经网络中,特征编码是指将输入序列转换为一系列向量的过程。这些向量可以捕捉输入序列的关键特征,使得网络可以更好地理解输入序列并进行下一步的处理。
常见的循环神经网络特征编码方法包括以下几种:
One-Hot编码:将每个词映射为一个唯一的向量,向量中只有一个元素为1,其余元素为0。这种编码方式简单直观,但向量维度较高,难以处理大规模词汇。
词嵌入(Word Embedding):将每个词映射为一个低维向量,使得相似的词在向量空间中距离较近。这种编码方式可以更好地处理大规模词汇,同时可以保留词与词之间的语义关系。
双向循环神经网络(Bidirectional RNN)编码:利用前向和后向循环神经网络分别编码输入序列,将它们的输出拼接起来作为最终的特征表示。这种编码方式可以更好地捕捉输入序列中的长期依赖关系,提高模型的准确性。
注意力机制(Attention Mechanism)编码:利用注意力机制对输入序列的每个位置进行加权,以更好地捕捉序列中的关键信息。这种编码方式可以提高模型的灵活性和准确性,特别是在处理长序列数据时表现优异。
这些编码方式可以根据具体的任务和数据特征进行选择和组合,以获得更好的性能和效果。
文本处理
第一步:文本切分
第二步:统计词频
第三步:独热编码
文本预处理与词嵌入
文本预处理
一篇文章可以被简单地看作一串单词序列,甚至是一串字符序列。 我们将解析文本的常见预处理步骤。 这些步骤通常包括:
- 将文本作为字符串加载到内存中。
- 将字符串切分为词元(如单词和字符)。
- 建立一个字典,将拆分的词元映射到数字索引。
- 将文本转换为数字索引序列,方便模型操作。
- 第一步:读取数据集:以H.G.Well的时光机器为例,从中加载文本。
这是一个相当小的语料库,只有30000多个单词,而现实中的文档集合可能会包含数十亿个单词。如Chatgpt包含65T数据。 - 第二步:词汇切分:将原始文本以文本行为单位进行切分
- 第三步:构建词索引表:打印前几个高频词及索引,将每一条文本行转换成一个数字索引列表
文本嵌入
使用之前所述的独热向量直接将词映射成向量,存在维数过高的问题,所以需要采用词嵌入将独热向量映射为低维向量:
原始向量:v维;映射后:d维,d<<v;
映射向量:d x v,根据训练数据学习得到。
词嵌入训练效果: 准确率74%,不好不差
RNN模型
RNN概要
文本处理中:输入维度不定(可能一直有单词输入)输出维度不定或者是1(直接最终理解结果)。
用RNN建模序列数据:
RNN模型:
当使用RNN最后的输出
h
t
h_t
ht计算
s
i
g
m
o
i
d
(
v
T
h
t
)
sigmoid(v^Th_t)
sigmoid(vTht)作为神将网络输出时,拿它来惊醒IMDB评论处理,训练的结果之前的结果好一点。
当使用全部h综合后,如图:
得出结果和只用一个好像比好一点,但差不多(84.4%与84.7%)
RNN存在的问题
随着输入的增加,会产生遗忘的问题