神经网络与深度学习课程总结三
深度学习课程总结三
前言
本系列文章为神经网络深度学习课程的课程总结。
6. 深度学习视觉应用
该部分包括以下内容:
- 评价指标
- 目标检测与Yolo网络
- 目标检测实现
- 语义分割
- 风格迁移
- 视觉应用展望
数据集与评价指标
1.4.1 算法评估相关概念
TP: 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数;
FP: 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数;
FN:被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数;
TN: 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。
P(精确率): 𝑇𝑃/(𝑇𝑃 + 𝐹𝑃),标识“挑剔”的程度;
R(召回率): 𝑇𝑃/(𝑇𝑃 + 𝐹𝑁)。召回率越高,准确度越低,标识“通过”的程度;
精度(Accuracy): (𝑇𝑃 + 𝑇𝑁)/(𝑇𝑃 + 𝐹𝑃 + 𝑇𝑁 + 𝐹𝑁)。
P-R曲线
P-R的关系曲线图,表示了召回率和准确率之间的关系。精度(准确率)越高,召回率越低。
假设一个测试集,其中图片只由大雁和飞机两种图片组成,则:
➢ True positives : 飞机的图片被正确的识别成了飞机。
➢ False positives: 大雁的图片被错误地识别成了飞机。
➢ False negatives: 飞机的图片没有被识别出来,系统错误地认
为它们是大雁。
➢ True negatives: 大雁的图片没有被识别出来,系统正确地认
为它们是大雁。
置信度与准确率
➢ 调整阈值可改变准确率或召回值
可以通过改变阈值(也可以看作上下移动蓝色的虚线),来选择让系统识别能出多少个图片,当然阈值的变化会导致Precision与Recall值发生变化。比如,把蓝色虚线放到第一张图片下面,也就是说让系统只识别出最上面的那张飞机图片,那么Precision的值就是100%,而Recall的值则是20%。如果把蓝色虚线放到第二张图片下面,也就是说让系统只识别出最上面的前两张图片,那么Precision的值还是100%,而Recall的值则增长到是40%。
1.4.2 AP计算
➢ mAP:均值平均准确率
其中𝑁代表测试集中所有图片的个数,𝑃(𝑘)表示在能识别出𝑘个图片的时候Precision的值,而 Δ𝑟(𝑘)则表示识别图片个数从𝑘 − 1变化到𝑘时(通过调整阈值)Recall值的变化情况。
目标检测与YOLO
YOLO是一个集大成的方法,不了解之前的方法,很难掌握YOLO的思路。
我们从以下方面来学习:
- 目标检测要做什么?
- YOLO基本思想与发展历程
- YOLO网络结构
- 包围框与置信度
- 损失函数
- 训练与NMS
目标检测问题
目标检测是在给定的图片中精确找到物体所在位置,并标注出物体的类别。物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,并且物体还可以是多个类别。
目标检测基本思想
- 基本的滑动窗口:拖动一个窗口来搜寻目标。
滑动窗口的问题1
➢ 滑动次数太多,计算太慢
假设图片为𝑤宽,ℎ高,识别一幅图片需要𝑇时间,则需要:𝑤 ∗ ℎ ∗ 𝑇的总时间。
例如:图片大小448 × 448,识别一个目标需要0.05s,则:总时间= 448 ∗ 448 ∗ 0.05 ≈ 10000𝑠,约3小时!
滑动窗口的问题2
➢ 目标大小不同,每一个滑动位置需要用很多框
图片宽度和高度都不相同,比例也不相同,因此需要取很多框。
例如:标准框10050大小,
• 取5050,5025,20050,200*100等不同大小,在面积和宽高比变化
• 假设面积变化3类(0.5,1,2), 宽高比3类(0.5,1,2),则共有9种。
总时间是原来的9倍:
总时间= 10000 × 9 = 90000𝑠,约1天3小时!
滑动窗口的改进
➢ 一般图片中,大多数位置都不存在目标。
➢ 可以确定那些更有可能出现目标的位置,再有针对性的用CNN进行检测——两步法(Region Proposal)
➢ 两步法依然很费时!
➢ 进一步减少出现目标的位置,而且将目标分类检测和定位问题合在一个网络里——一步法(YOLO)
一步法基本思想:简化的二分类问题:只检测一类;分类问题扩展为回归+分类问题。
YOLO网络结构
YOLO官方的模型结构图的网络结构包含24个卷积层和2个全连接层;其中前20个卷积层用来做预训练,后面4个是随机初始化的卷积层,和2个全连接层。
YOLO网络输入
➢ YOLO v1在PASCAL VOC数据集上进行的训练,因此输入图片为448 × 448 × 3。实际中如为其它尺寸,需要resize或切割成要求尺寸。
包围框与置信度
处理细节——归一化
四个关于位置的值,分别是𝑥, 𝑦, ℎ和𝑤,均为整数,实际预测中收敛慢,因此,需要对数据进行归一化,在0-1之间。
处理细节——置信度
➢ Pr(𝑜𝑏𝑗)是一个grid有物体的概率
➢IOU是预测的bb和真实的物体位置的交并比。
处理细节——训练值(ground truth)
Pr(𝑜𝑏𝑗)的ground truth:三个目标中点对应格子为1,其它为0
损失函数
训练与NMS
➢ NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
NMS算法要点
- 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对于剩余的边界框:
- 选择具有最高概率的边界框并将其作为输出预测;
- 计算 “作为输出预测的边界框”,与其他边界框的相关联IoU值;舍去IoU大于阈值的边界框;其实就是舍弃与“作为输出预测的边界框” 很相近的框框。
- 重复步骤2,直到所有边界框都被视为输出预测或被舍弃。
预训练与训练
➢ YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定
位的训练和预测。
➢ 训练中采用了drop out和数据增强来防止过拟合。
➢ YOLO的最后一层采用线性激活函数(因为要回归bb位置),其它层都是采用Leaky ReLU激活函数:
语义分割
FCN是目前广泛使用的基本语义分割网络。
- 语义分割要做什么?
- 语义分割基本思想
- 反卷积与反池化
- FCN网络结构
语义分割要做什么
语义分割问题
语义分割:找到同一画面中的不同类型目标区域。
语义分割基本思想:对图中每一个像素进行分类,得到对应标签。
基本思想:滑动窗口
➢ 滑动次数太多,计算太慢,重复计算太多
FCN网络结构分为两个部分:全卷积部分和反卷积部分。全卷积部分借用了一些经典的CNN网络,并把最后的全连接层换成卷积,用于提取特征,形成热点图;反卷积部分则是将小尺寸的热点图上采样得到原尺寸的语义分割图像。
反卷积与反池化
包括𝟏 × 𝟏卷积,转置卷积,上池化。
FCN具体实现
FCN网络结构:卷积部分:传统卷积神经网络。注意最后的全连接层。
FCN中第6、7、8层都是通过1 × 1卷积得到的,第6层的输出通道是4096,第7层的输出通道是4096 ,第8层的输出是1000(类),即1000个特征图(称为heatmap)。
风格迁移
在本节中,我们将介绍如何使用卷积神经网络自动将某图像中的样式应用在另一图像之上,即风格迁移。
➢ 方法
- 首先,我们初始化合成图像,例如将其初始化成内容图像。该合成图像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模型参数。
- 然后,我们选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽取图像的特征。我们可以选择其中某些层的输出作为内容特征或样式特征。
样式迁移常用的损失函数由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。