神经网络与深度学习-目标检测与YOLO
1. 目标检测要做什么
1.1. 目标检测问题
目标检测问题:
目标检测是在给定的图片中精确找到物体所在位置,并标注出物体的类别。
物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,并且物体还可以是多个类别
1.2. 分类问题与目标检测
数据集输出表达:
目标检测实例:实际图像中有多个目标:
1.3. 目标检测技术发展
解决方案:
YOLO家族发展:
一步法(two-stage):
无需候选框,直接出最终结果。
突出优点:快
YOLO V7性能:
2. 目标检测基本思想
2.1. 滑动窗口
基本的滑动窗口:
- 原理示意
滑动窗口的问题1:
动次数太多,计算太慢
假设图片为𝑤宽,ℎ高,识别一幅图片需要𝑇时间,则需要:
𝑤 ∗ ℎ ∗ 𝑇的总时间。
例如:图片大小448 × 448,识别一个目标需要0.05s,则:
总时间= 448 ∗ 448 ∗ 0.05 ≈ 10000𝑠,约3小时
滑动窗口的问题2:
目标大小不同,每一个滑动位置需要用很多框
图片宽度和高度都不相同,比例也不相同,因此需要取很多框。
例如:标准框100*50大小,
-
取5050,5025,20050,200100等不同大小,在面积和宽高比变化
-
假设面积变化3类(0.5,1,2), 宽高比3类(0.5,1,2),则共有9种。
总时间是原来的9倍:
总时间= 10000 × 9 = 90000𝑠,约1天3小时
2.2. 基本思路
滑动窗口的改进:
- 一般图片中,大多数位置都不存在目标。
- 可以确定那些更有可能出现目标的位置,再有针对性的用CNN进
行检测——两步法(Region Proposal) - 两步法依然很费时!
- 进一步减少出现目标的位置,而且将目标分类检测和定位问题合在一个网络里——一步法(YOLO)
2.3. 一步法基本思想
简化的二分类问题:只检测一类(葫芦娃脸):
- 分成互补重叠的cell
- 产生问题:目标的大小和位
置
分类问题扩展为回归+分类问题:
- 问题1:有一个框里有多个,有个多个框里有一个,怎么办
多个框里有一个目标,取目标中心点所在框
一个框里有多个,暂不能解决
问题2:多类目标怎么办
使用独热编码扩展类别数
问题3:小目标怎么办
使用单独网络拟合小目标,即设置多个bounding box
3. YOLO网络结构
3.1. YOLO网络结构
YOLO网络结构概略图:
YOLO官方的模型结构图:
网络结构包含24个卷积层和2个全连接层;其中前20个卷积层用来做预训练,后面4个是随机初始化的卷积层,和2个全连接层
YOLO网络结构概略图:
3.2. YOLO模型处理
YOLO网络输入:
- YOLO v1在PASCAL VOC数据集上进行的训练,因此输入图片为448 × 448 × 3。实际中如为其它尺寸,需要resize或切割成要求尺寸
YOLO模型处理:𝟕 × 𝟕网格划分:
- 将图片分割为 𝑆2个grid(𝑆 = 7),每个grid cell的大小都是相等的
- 每个格子都可以检测是否包含目标
- YOLO v1中,每个格子只能检测一种物体(但可以不同大小)。
YOLO网络输出:
- 输出是一个7 × 7 × 30的张量。对应7 × 7个cell
- 每个cell对应2个包围框(bounding box, bb),预测不同大小和宽高比,对应检测不同目标。每个bb有5个分量,分别是物体的中心位置(𝑥, 𝑦)和它的高(ℎ) 和宽 (𝑤) ,以及这次预测的置信度
在右图中,每个框代表1个预测的bb,粗细代表不同的置信度,越粗得越高
3.3. YOLO基本思想
YOLO模型输出:
在上面的例子中,图片被分成了49个框,每个框预测2个bb,因此上面的图中有98个bb
4. 包围框与置信度
4.1. YOLO包围框
YOLO的包围框:
我们有 𝑠2个框,每个框的bb个数为𝐵,分类器可以识别出𝐶种不同的物体,那么所有整个ground truth的长度为𝑆 × 𝑆 × (𝐵 × 5 + 𝐶)
YOLO v1中,这个数量是30
YOLO v2和以后版本使用了自聚类的anchor box为bb, v2版本为𝐵 = 5, v3中𝐵 =9
处理细节——归一化:
四个关于位置的值,分别是𝑥, 𝑦, ℎ和𝑤,均为整数,实际预测中收敛慢
因此,需要对数据进行归一化,在0-1之间。
例子是一个448448的图片,有33的grid,每个cell是149。
目标中心点是(220,190)
4.2. YOLO置信度
处理细节——置信度:
置信度计算公式: C = P r ( o b j ) ∗ 10 U t r u t h p r e C = Pr(obj) ∗ 10U_{truth}^{pre} C=Pr(obj)∗10Utruthpre
- Pr(obj)是一个grid有物体的概率
- IOU是预测的bb和真实的物体位置的交并比
𝐼𝑂𝑈:图中绿框为真实标注,其余五个颜色框为预测值,可计算对应𝐼𝑂U
4.3. 训练值与预测值
处理细节——训练值(ground truth):
Pr 𝑜𝑏𝑗 的ground truth:三个目标中点对应格子为1,其它为0
处理细节——训练数据与网络输出:
训练数据与网络输出
5. 损失函数
5.1. YOLO损失函数
YOLO损失函数(一共五项):
YOLO损失函数——边界框对应损失项:
为什么第2项要开根号?让误差更显著,保证回归精度
YOLO损失函数——𝝀取值:
6. 训练与NMS
6.1. 非极大值抑制
预训练与训练:
- 保留了这么多边界框,预测中一个物体可能被多个边界框包围;实际物体只对应一个边界框,如何解决个问题呢?
- NMS- NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完
NMS算法要点:
- 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对
于剩余的边界框: - 选择具有最高概率的边界框并将其作为输出预测;
- 计算 “作为输出预测的边界框”,与其他边界框的相关联IoU
值;舍去IoU大于阈值的边界框;其实就是舍弃与“作为输出预
测的边界框” 很相近的框框。 - 重复步骤2,直到所有边界框都被视为输出预测或被舍弃
NMS算法示例:
汽车不止一次被检测
- 它首先查看与每次检测相关的概率并取最大的概率。图中选概率为0.9的方框;
- 进一步查看图像中的所有其他框。与当前边界框较高的IoU的边界框将被抑制。因此图中0.6和0.7概率的边界框将被抑制。(此时面包车已经只剩一个边界框)
- 从概率最高的所有边界框中选择下一个,在例子中为0.8的边界框;
- 再次计算与该边界框相连边界框的IoU,去掉较高IoU值的边界框。
- 重复这些步骤,得到最后的边界框
6.2. 数据集训练
预训练与训练:
- YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然
后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定
位的训练和预测 - 训练中采用了drop out和数据增强来防止过拟合。
- YOLO的最后一层采用线性激活函数(因为要回归bb位置),其它
层都是采用Leaky ReLU激活函数
YOLO v1模型效果:
YOLO v3模型效果: