目录
目标检测与 YOLO
YOLO网络结构
YOLO v1划分的7×7个区域,YOLO v1预测49个目标,20类。
核心思想:将整张图片作为网络的输入(类似于Faster-RCNN),直接在输出层对BBox的位置和类别进行回归。
网络结构包含24个卷积层和2个全连接层;其中前20个卷积层用来做预训练,后面4个是随机初始化的卷积层,和 2 个全连接层。
网络输入
YOLO v1在PASCAL VOC数据集上进行的训练,因此输入图片为
448×448×3。实际中如为其它尺寸,需要resize或切割成要求尺寸。
模型处理
将图片分割为
s
2
{{s}^{2}}
s2个grid(𝑆=7),每个grid cell的大小都是相等的,如果某个object的中心落在这个网格中,则这个网格就负责预测这个object;
每个格子都可以检测是否包含目标;
YOLO v1中,每个格子只能检测一种物体(但可以不同大小)。
网络输出
输出是一个7×7×30的张量。对应7×7个cell;
每个cell对应2个包围框(bounding box, bb),预测不同大小和宽高比对应检测不同目标。每个bb有5个分量,分别是物体的中心位置(𝑥,𝑦)和它的高(ℎ)和宽(𝑤),以及这次预测的置信度。
包围框与置信度
YOLO的包围框
我们有
s
2
{{s}^{2}}
s2个框,每个框的bb个数为𝐵,分类器可以识别出𝐶种不同的物体,那么所有整个ground truth的长度为𝑆×𝑆×(𝐵×5+𝐶);
YOLO v1中,这个数量是30;
YOLO v2和以后版本使用了自聚类的anchor box为bb, v2版本为𝐵=5, v3中𝐵=9
处理细节-归一化
四个关于位置的值,分别是𝑥,𝑦,ℎ和𝑤,均为整数,实际预测中收敛慢,因此,需要对数据进行归一化,在0~1之间。
置信度
每个网络需要预测B个bb的位置信息和置信度信息,一个bb对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息。
置信度计算公式:
C
=
Pr
(
o
b
j
)
∗
I
O
U
t
r
u
t
h
p
r
e
d
C=\Pr \left( obj \right)*IOU_{truth}^{pred}
C=Pr(obj)∗IOUtruthpred
Pr(𝑜𝑏𝑗 )是一个grid有物体的概率;
IOU是预测的bb和真实的物体位置的交并比。
其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的ground truth之间的IOU值。
损失函数
前2行计算前景的geo_loss,即边界框中心点、宽度、高度损失。
1
i
j
o
b
j
1_{ij}^{obj}
1ijobj代表这个grid里有无物体,有则
1
i
j
o
b
j
1_{ij}^{obj}
1ijobj为1,否则为0。第2项开根号是为了让误差更显著,保证回归精度。
第3行计算前景的confidence_loss。
第4行计算背景的confidence_loss。
第5行计算分类损失class_loss。
λ
\lambda
λ取值
λ
c
o
o
r
d
{{\lambda }_{coord}}
λcoord和
λ
n
o
o
b
j
{{\lambda }_{noobj}}
λnoobj都应该取怎样的值,为什么这样设计?
论文中给出的答案是
λ
c
o
o
r
d
{{\lambda }_{coord}}
λcoord=5和
λ
n
o
o
b
j
{{\lambda }_{noobj}}
λnoobj=0.5也就是放大第一项和第二项的损失函数,缩小第四项的损失函数。
这样做的原因是让梯度更稳定,如果grid中不含有物体,它对1,2,3,5项没有影响,如果调节第四项,会让含有物体的grid的confidence发生改变,这可能使其他项的梯度剧烈变化,从而带来模型上的不稳定。因此,我们放大第一项和第二项,缩小第四项。
训练与NMS
预训练与训练
保留了这么多边界框,预测中一个物体可能被多个边界框包围;实际物体只对应一个边界框,如何解决个问题呢? NMS
NMS 核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
NMS算法要点
- 首先丢弃概率小于预定 IOU 阈值(例如0.5)的所有边界框;对
于剩余的边界框; - 选择具有最高概率的边界框并将其作为输出预测;
- 计算 “作为输出预测的边界框”,与其他边界框的相关联 IoU值;舍去 IoU 大于阈值的边界框;其实就是舍弃与“作为输出预测的边界框” 很相近的框框。
- 重复步骤2,直到所有边界框都被视为输出预测或被舍弃
数据集训练
YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测
训练中采用了drop out和数据增强来防止过拟合。
YOLO的最后一层采用线性激活函数(因为要回归bb位置),其它
层都是采用Leaky ReLU激活函数:
ϕ
(
x
)
=
{
x
,
i
f
x
>
0
0.1
x
,
o
t
h
e
r
w
i
s
e
\phi \left( x \right)=\left\{ \begin{matrix} x,ifx>0 \\ 0.1x,otherwise \\ \end{matrix} \right.
ϕ(x)={x,ifx>00.1x,otherwise
语义分割与 FCN
语义分割问题
语义分割:找到同一画面中的不同类型目标区域
语义分割问题和其他问题的区别:
实例分割:同一类型目标要分出来具体实例(谁是谁)
目标检测:标出来外包围矩形
语义分割基本思想
语义分割目标:对图中每一个像素进行分类,得到对应标签
基本思想:滑动窗口
缺点:滑动次数太多,计算太慢,重复计算太多
FCN网络结构
网络结构分为两个部分:全卷积部分和反卷积部分。全卷积部分借用了一些经典的 CNN 网络,并把最后的全连接层换成卷积,用于提取特征,形成热点图;反卷积部分则是将小尺寸的热点图上采样得到原尺寸的语义分割图像。
上采样(Upsample)
在应用在计算机视觉的深度学习领域,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算,这个采用扩大图像尺寸,实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample)。
反卷积与反池化
上池化(unpooling),或称为反池化
一种上采样方法,与pooling相反,用来增加图像的resolution。
- Nearest Neighbor:把相同的数据复制3个放在相邻的位置上。
- Bed of Nails:把数据放在左上角,其他位置置零。
- Max Unpooling:对于一些模型来说,上采样和下采样的结构往往是对称的,可以在下采样的Max Pooling时记录最大值的位置,在unpooling的时候把数据还原到最大值的位置,其余位置置零。
FCN具体实现
FCN网络结构:卷积部分
FCN中第6、7、8层都是通过1×1卷积得到的,第6层的输出是 4096×7×7,第7层的输出是4096×7×7,第8层的输出是1000×7×7,即 1000个大小是7×7的特征图(称为heatmap)
输出的特征图(称为heatmap),颜色越贴近红色表示对应数值越大。
反卷积部分:跳级结构
FCN评价指标与标注工具
常见语义分割评价指标
Pixel Accuracy (PA):分类正确的像素点数和所有的像素点数的比例
Mean Pixel Accuracy (MPA):计算每一类分类正确的像素点数和该类的所有像素点数的比例然后求平均
Mean Intersection over Union (MIoU):计算每一类的IoU然后求平均
语义分割的评价指标通常有5种,分别为:accuracy、precision、recall、F1score、IOU(交并比)
accuracy: 表示网络的预测结果的整体准确性,也就是说网络预测的正确的像素点个数占总像素个数的比例。
precision表示网络对这类数据预测结果的可信度。
recall叫查全率,recall越高,代表网络预测为这一类的结果中包含更多的真实值为该类的数据。
IOU:交并比(Intersection-over-Union,IoU),也是对于某一类数据而言的,预测结果中为该类的像素点与真实标签为该类的像素点的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1
常见标注工具:Labelme、EISeg
风格迁移
风格迁移:使用卷积神经网络自动将某图像中的样式应用在另一图像之上。
两张输入图像,一张是内容图像,另一张是样式图像,使用神经网络修改内容图像使其在样式上接近样式图像。
方法
首先,我们初始化合成图像,例如将其初始化成内容图像。该合成图像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模型参数。
然后,我们选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽取图像的特征。我们可以选择其中某些层的输出作为内容特征或样式特征。
样式迁移常用的损失函数由3部分组成:
- 内容损失(content loss)使合成图像与内容图像在内容特征上接近
- 样式损失(style loss)令合成图像与样式图像在样式特征上接近
- 总变差损失(total variation loss)则有助于减少合成图像中的噪点。
最后,当模型训练结束时,我们输出样式迁移的模型参数,即得到最终的合成图像。
定义代价函数
内容代价函数
定义内容代价函数
选定隐藏层l,用
a
[
l
]
[
C
]
{{a}^{\left[ l \right]\left[ C \right]}}
a[l][C]表示图片C在第l层的激活项输出,
a
[
l
]
[
G
]
{{a}^{\left[ l \right]\left[ G \right]}}
a[l][G]表示图片G在第l层的激活项输出,则定义内容代价函数如下:
风格代价函数
量化风格差异:相关性的计算,两通道对应元素乘积取和
风格矩阵(Style Matrix):两两通道间计算出的所有相关性,按一定顺序排列,称为风格矩阵。
总体代价函数
总结:
- 样式迁移常用的损失函数由3部分组成:内容损失使合成图像与内容图像在内容特征上接近,样式损失令合成图像与样式图像在样式特征上接近,而总变差损失则有助于减少合成图像中的噪点。
- 可以通过预训练的卷积神经网络来抽取图像的特征,并通过最小化损失函数来不断更新合成图像。
- 用格拉姆矩阵表达样式层输出的样式。
人脸识别
人脸验证(Face verification):一对一
人脸识别(Face recognition):一对多
for i in 数据库中的所有照片
调用人脸验证检测输入与数据库中照片i上的是否为同一人
人脸验证
构建神经网络
相似度函数:对于输入图片X1,X2,定义相似度函数d(X1,X2),并设定阈值t,若d(X1, X2)小于t,X1和X2上的是同一人,若d(X1, X2)大于t,X1和X2上的不是同一人。
Siamese网络:双输入结构,对输入图片进行编码
相似度函数的具体定义:
训练神经网络
面部验证与二分类
训练目的
通过训练神经网络,我们希望同一人的两张照片间的相似度函数值尽可能小,不同人的两张片间的相似度函数值尽可能大,以此为目标制作训练集、定义Loss函数。
定义代价函数
符号规定:A-待测照片,P-同一人照片,N-不同人照片
A与P的差距永远不超过A与N,定义Loss函数如下:
将所有样本的loss函数累加得到cost函数如下:
运行神经网络
利用人脸验证实现人脸识别
对于训练完毕的神经网络,输入照片,通过简单的for循环语句遍历数据库中存储的所有照片,依次通过相似度函数进行计算,记录遍历过程中相似程度最大的值,在遍历结束后与预先设定的阈值进行比较,得出预测结果,完成人脸识别。
视觉应用展望
生成对抗网络(GANs, generative adversarial networks)
模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。
一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。
生成对抗网络的初始原理十分容易理解,即构造两个神经网络,一个生成器,一个鉴别器,二者互相竞争训练,最后达到一种平衡。
- 生成模型G捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声z生成一个类似真实训练数据的样本,追求效果是越像真实样本越好。
- 判别模型D是一个二分类器,估计一个样本来自于训练数据(而非生成数据)的概率,如果样本来自于真实的训练数据,D输出大概率,否则,D输出小概率。
循环神经网络与NLP
数据处理基础
特征编码
数值特征与类别特征
数值特征不适合表示类别,因此一般使用独热编码
文本处理
第一步:文本切分(tokenization)
给定文本片段,将文本切分为单词序列
第二步:统计词频
创建一个字典(实际中经常使用Hash表)进行词频统计,初始字典为空
遍历文本,并按如下更新字典:
如果单词不再字典中,加入该单词(𝑤,1),否则将其词频加1
直到完成整个遍历
按照词频降序进行排序
将词频索引化,如果词汇太多,则只保留排序在前的k个单词,如取𝑘=10000
将每一个词映射到索引号上,需要时,将索引转换为独热编码
词典上没有的词(低频词或拼写错误,直接忽略,或编码为0)
文本处理与词嵌入
文本预处理
一篇文章可以被简单地看作一串单词序列,甚至是一串字符序列。我们将解析文本的常见预处理步骤。 这些步骤通常包括:
- 将文本作为字符串加载到内存中。
- 将字符串切分为词元(如单词和字符)。
- 建立一个字典,将拆分的词元映射到数字索引。
- 将文本转换为数字索引序列,方便模型操作。
第一步:读取数据集
以H.G.Well的时光机器为例,从中加载文本。这是一个相当小的语料库,只有30000多个单词 而现实中的文档集合可能会包含数十亿个单词 。 如Chatgpt包含65T数据。
第二步:词汇切分
将原始文本以文本行为单位进行切分
第三步:构建词索引表
打印前几个高频词及索引,将每一条文本行转换成一个数字索引列表
词嵌入(word embedding)
如何将词映射成向量?使用之前所述的独热向量维数过高
解决方法:将独热向量映射为低维向量
原始向量:𝑣维;映射后:𝑑维,𝑑≪𝑣
映射矩阵:𝑑×𝑣根据训练数据学习得到
词嵌入训练效果:准确率74%(测试集),不好不差
RNN模型
循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。
如何建模序列数据?
图像分类中使用:1对1模型,输入和输出维度:固定
文本处理中:输入维度不定(可能一直有单词输入);输出维度不定或者是1(直接最终理解结果)
用RNN建模序列数据
RNN问题
随着输入的增加,会产生“遗忘”问题
LSTM模型
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
LSTM网络模型
LSTM:“传送带”
从长期状态中丢弃某些信息
将当前时间步的新信息记忆在长期状态中
计算得到输出隐藏状态信息