《深度学习工程师-吴恩达》03卷积神经网络—目标检测 学习笔记
作者:jliang
《深度学习工程师-吴恩达》03卷积神经网络—目标检测 学习笔记
1.重点归纳
1)目标定位
(1)只是检测图像类型时,只需要使用softmax输出每种类型的概率即可。当需要检测图像类型并且其在图像中的位置时,还需要输出被检测对象的边界框参数bounding box。
(2)输出label定义(图像中只有一个对象的情况)
- 第一个值是pc,表示是否包含对象,如果包含行人/汽车/摩托车任意一种对象时,pc=1;否则如果只有背景时,pc=0。
- bx, by, bh, bw为边界参数bounding box,分别是对象的中心位置x和y坐标,对象的高和宽。图像的左上角为坐标零点。
- c1、c2、c3为三种类别的概率。
- 如果图像中没有对象时,pc=0,此时我们不关注bx, by, bh, bw, c1, c2, c3的结果。
(3)损失函数
- y1-y8为上面提及的输出(pc, bx, by, bh, bw, c1, c2, c3)
- 公式中所有输出值都使用平方误差函数,实际应用中,不太可能对c1, c2, c3和softmax激活函数应用对数损失函数并输出一个元素值。通常做法是对边界坐标bx, by, bh, bw应用平方误差类似的方法,对pc应用逻辑回归函数。
2)特征点检测(Landmark detection)
(1)输出特征改成多输出,第一个值代表是否包含目标,第2至n个输出值为需要检测的目标周围的坐标。
(2)例子:眼睛检测(眼角4个特征点,共1+2*4=9个输出值)、人脸部轮廓检测(64个特征点)、头部检测、人体姿势检测等
3)基于滑窗的目标检测
(1)训练:把图片中的目标对象剪切处理,然后输入网络训练。
(2)预测:使用上面训练模型的输入大小作为窗口,以某步幅在输入图片中进行滑动,滑动的小图像输入卷积网络进行预测,即判断红色框(窗口内)有没有目标对象(汽车)
(3)缺点,就是计算成本太大
- 滑窗移动剪切出太多小方块,卷积网络要一个一个地处理
- 使用小步幅可以精确定位对象,但是检测次数很大;使用大步幅可以减少待检测小图片数量,但是可能会影响性能。
4)使用卷积网络实现滑动窗口以减少检测次数
(1)把FC(全连接层)转化成卷积层,它和全连接层时一样的,因为卷积后输出的n个节点中的每一个节点都有一个5*5*16(池化层输出大小)维度的过滤器,每个值都是上一层这些5*5*16激活值经过某个任意线性函数的输出结果。
(2)通过卷积实现滑动窗口对象检测算法
- 输入为14*14*3,测试集图片为16*16*3,神经网络在测试集图片上进行滑动(此处步长为2),滑窗大小就是神经网络的大小14*14*3
- 上面使用的滑动窗口检测对象,需要对图片进行4次卷积检测,实际上这4次卷积操作中有很多计算是重复的。滑动窗口的卷积应用,使得卷积网络在这4次操作过程中共享已经进行过的计算
- 最终输出的4个子方块中(图中第二行),蓝色的是图像左上角部分14*14的输出,其它3个分别是滑窗滑过时其它三个卷积输入的输出
(3)算法的缺点就是边界框的位置可能不够准确
5) Bounding Box
(1)YOLO算法:使用卷积网络实现滑动窗口加上上面的目标定位方法来解决边界框不准确的问题,对于每一个滑窗小图像指定一个标签y,y是8维向量,最终的输出数量是3*3*8。
(2)YOLO算法可以输出精确的边界框并且运行速度非常快(可以到达实时识别)。
(3)bounding box位置信息:约定每个滑窗(不是整个图片)的左上角为零点(0,0),滑窗的右下角是(1,1),所以bounding box的信息是相对格子尺度的比例。bx, by值必须在0-1之间,但是bh和bw可以大于1(但目标跨度多个格子时大于1)。
6)交并比
(1)交并比(IOU)计算两个边界框(同时检测到目标的边界框)交集和并集之比,按照约定,如果IOU大于或等于0.5时,就是检测正确。IOU更高则边界框精确更高,所以这是衡量定位精确度的一种方式。
(2)定义IOU是为了评价你的对象定位算法是否精准,IOU衡量了两个边界框重叠的相对大小,所以这个可以判断两个边界框是否相似。
7)非极大值抑制
(1)非最大值抑制可以确保你的算法对每个对象只检测一次。
(2)实践中当你跑对象分类和定位算法时,很多个格子(上面的绿/黄框)都可能检测出汽车,不同格子可能会对同一个对象做出多次检测,非最大值抑制就是清理这些检测的结果,这样就可以让每个对象只被检测一次。
(3)非最大值抑制算法
- 首先检测每个格子输出的报告的概率pc值,先看概率最大的那个,上图中是0.9,这是最可靠的检测
- 接下来非最大值抑制就会逐一审视剩下的矩形,所有和这个最大边界框有很高交并比、高度重叠的其他边界框都会被抑制,去掉其他IOU值很高的矩形
- 非最大抑制意味着只输出概率最大的分类结果,抑制很接近但是不是最大的其他预测结果
8)Anchor box
(1)如果你想一个格子检测出多个对象,可以使用anchor box这个概念
- anchor box的做法就是预先定义两个/多个(5个甚至更多)不同形状的anchor box
- 把预测结果和这两个anchor box关联起来,输出值中包含多个anchor box的bounding box值,此处2个anchor box共16个输出值。第一个是行人的anchor box,第二个是汽车的anchor box
(2)对训练集图像中的每个对象都根据对象中心位置分配到对应的格子中
(3)Anchor box还可以让你的学习算法更有针对性,可以更好的处理对象的不同形状(如高瘦的行人和很宽的汽车)。一般手工指定anchor box形状,可以选择5-10个anchor box形状,覆盖到多种不同的形状,涵盖想要检测的对象的各种形状。也可以对目标对象使用聚类方法来自动选择k个anchor box的形状图
9)YOLO算法就是把所有上面提到的零件组装在一起构成YOLO对象检测算法
(1)训练
- 遍历每个格子,每个格子都输出2个anchor box
- 没有检测到对象时pc=0;有检测到对象时,交并比较高的anchor box的pc=1,另外一个为0
(2)预测
- 每个格子都有对应的输出向量(2个anchor box)
- 使用非极大值抑制排除无效边框
- 每个格子都有2个边框(因为定义了2个anchor box) 抛弃概率低的预测
- 对每个类别(行人、汽车、摩托车)单独运行非最大值抑制处理预测结果是哪个类别的边界框
(3)YOLO算法时最有效的对象检测算法之一
2. 目标定位
1)位置和对象检测
(1)构建神经网络的另一个问题是定位分类问题(Classification with localization):不仅要用算法判断图片中是不是一辆汽车,还要再图片中标记出它的位置。
(2)对象检测问题:图像中可以含有多个对象,并且单张图片中包含多种类型的对象,都需要检测并标识出来。
2)定位分类问题:假设要识别图像中的行人、汽车、摩托车或背景(图像中不包含行人、汽车和摩托车时输出类型为背景)
(1)只是检测图像类型时,只需要使用softmax输出每种类型的概率即可。
(2)当需要检测图像类型并且其在图像中的位置时,还需要输出被检测对象的边界框参数bounding box。
3)输出label定义(图像中只有一个对象的情况)
(1)第一个值是pc,表示是否包含对象,如果包含行人/汽车/摩托车任意一种对象时,pc=1;否则如果只有背景时,pc=0。
(2)bx, by, bh, bw为边界参数bounding box,分别是对象的中心位置x和y坐标,对象的高和宽。图像的左上角为坐标零点。
(3)c1、c2、c3为三种类别的概率。
(4)如果图像中没有对象时,pc=0,此时我们不关注bx, by, bh, bw, c1, c2, c3的结果。
4)损失函数
(1)公式
(2)y1-y8为上面提及的输出(pc, bx, by, bh, bw, c1, c2, c3)
(3)当图片中有目标对象时(y1=1),损失函数中需要计算每个输出值的损失;当图片中没有目标对象时,损失函数只关心y1值。
(4)公式中所有输出值都使用平方误差函数,实际应用中,不太可能对c1, c2, c3和softmax激活函数应用对数损失函数并输出一个元素值。通常做法是对边界坐标bx, by, bh, bw应用平方误差类似的方法,对pc应用逻辑回归函数。
3. 特征点检测
1)输出特征改成多输出,第一个值代表是否包含目标,第2至n个输出值为需要检测的目标周围的坐标。
(1)批量添加输出单元,用以输出要识别的各个特征点的(x,y)坐标值。
(2)标签在所有图片中的位置顺序必须保持一致。
2)例子1:检测眼睛,输出5个值,第一个为是否包含眼睛,第2-5值分别为眼角的2个坐标(每个坐标的x,y)。
3)例子2:人脸部轮廓检测,输出是否包含脸部以及脸部的64个特征点坐标,共129个输出。
4)例子3:娱乐APP在头上画皇冠,检测脸部特征是里面的一个关键构造模块。
5)例子4:人体姿势检测,定义一些关键特征点,如胸部的中点、左肩、左肘、腰等,然后通过神经网络标注任务姿态的关键特征点,然后再输出这些标注的特征点,相当于输出了人物的姿态动作。
4. 目标检测
1)基于滑动窗口的目标检测算法
(1)首先创建一个标签训练集X和Y,表示适当剪切的汽车(目标)图片样本。一开始可以使用适当剪切的图片,就是整张图片X几乎都被汽车占据,把图片中汽车以外的部分都裁剪掉,使汽车居于中心位置。
(2)输入上面剪切过的图像进行训练,输出Y值,0代表没有,1代表有。
(3)训练完这个卷积网络后,就可以用它来实现滑动窗口目标检测。
2)滑动窗口目标检测法
(1)选定一个特定大小的窗口。
(2)使用该窗口在输入图像中以某步幅进行滑动,滑动过的小图像输入卷积网络进行预测,即判断红色框(窗口内)有没有汽车(目标对象)。
(3)根据卷积网络对输入大小的要求调整窗口大小,然后再重复上面的流程。
3)无论目标在哪个位置,总有一个窗口可以检测到它。
4)滑动窗口目标检测算法有明显的缺点,就是计算成本太大。
(1)原因:滑窗移动剪切出太多小方块,卷积网络要一个一个地处理。
(2)如果选用的步幅很大,可以减少待检测图片的数量,但是可能会影响性能;否则使用小步幅,待检测小图片特别多。只能使用小粒度和小幅度,否则无法准确定位图片中的对象。
5. 卷积的滑动窗口实现
1)把FC(全连接层)转化成卷积层
(1)原始模型中池化层输出连接到FC,现在改成使用卷积层来替代FC层。
- 过滤器大小等于池化层输出大大小(例子中是5*5*16),所以经过卷积层后变成1*1的大小
- 使用的过滤器数量等于原FC的神经元数量,所以最终经过卷积层后输出大小为1*1*n(n为FC的神经元数量,例子中为400)
- 从数学角度看,它和全连接层时一样的,因为卷积后输出的n个节点中的每一个节点都有一个5*5*16(池化层输出大小)维度的过滤器,每个值都是上一层这些5*5*16激活值经过某个任意线性函数的输出结果。
(2)原始模型中FC连接到另一个FC,现在改成使用卷积层来代替FC。
- 过滤器大小等于上一层卷积层输出大小(例子中是1*1*400),所以经过卷积层后依然为1*1的大小
- 使用的过滤器数量等于原FC的神经元数量,所以最终经过卷积层后输出大小为1*1*n(n为FC的神经元数量,例子中为400)
(3)最后经由1*1过滤器的处理,得到一个softmax激活值,再次经过1*1*400*4的卷积网络后最终得到1*1*4的输出层。这4个输出值与原始网络经过softmax后输出的4个值不是同一个东西。
2)通过卷积实现滑动窗口对象检测算法
(1)神经网络的输入为14*14*3,测试集图片为16*16*3,神经网络在测试集图片上进行滑动(此处步长为2),滑窗大小就是神经网络的大小14*14*3。
(2)上面使用的滑动窗口检测对象,需要对图片进行4次卷积检测,实际上这4次卷积操作中有很多计算是重复的。滑动窗口的卷积应用,使得卷积网络在这4次操作过程中共享已经进行过的计算。
(3)最终输出的4个子方块中(图中第二行),蓝色的是图像左上角部分14*14的输出,其它3个分别是滑窗滑过时其它三个卷积输入的输出。
(4)该卷积操作的原理是,我们不需要把输入图片分割成4个子集,分别执行向前传播,而是把它们作为一张图片输出给卷积网络进行计算,其中公有区域可以共享很多计算。
3)以上算法的缺点就是边界框的位置可能不够准确。
6. Bounding Box预测
1)使用卷积在滑动窗口的实现,滑窗很难刚好与目标完美重合,找到的边界不准确。其中一种能够得到更精准的边界是算法是YOLO算法,YOLO意思是只看一次。
(1)基本思路是,在每一个滑窗图像中采用图像分类和定位算法
(2)对于滑窗图像(上图中的9个格子)的每一个指定一个标签y,y是8维向量(前面例子中的类别和位置信息),最终的输出数量是3*3*8(3*3是上面例子的滑窗数),将任意输入x映射到这类输出向量y。
2)这个算法的优点就是可以输出精确的边界框。
3)只要每个格子中对象数目没有超过1,这个算法是没有问题的。实践中会用更精细的网格,例如输出19*19*8。这样的网格精细得多,多个对象分配到同一个格子的概率就变得小得多。
4)把对象分配到一个格子的过程是,把目标对象分配到目标对象中点所在的格子,所以即使对象横跨多个格子,对象也只会被分配到其中一个格子。在更精细的网格(如上面输出为19*19)中,两个对象的中心处于同一个格子的概率就更小了。
5)YOLO算法有一个好处(它受欢迎的原因),它由一个卷积实现,它的运行速度非常快,可以到达实时识别。
6)bounding box位置信息:约定每个滑窗(不是整个图片)的左上角为零点(0,0),滑窗的右下角是(1,1),所以bounding box的信息是相对格子尺度的比例。bx, by值必须在0-1之间,但是bh和bw可以大于1(但目标跨度多个格子时大于1)。
7)YOLO论文是相对难度较高的论文之一,吴恩达第一次读论文的时候也很难搞清楚到底是怎么实现的,他的一些比较好的研究员朋友也很难理解这篇论文的一些细节。实际上,资深的研究员也有读不懂研究论文的时候,必需去读源代码或者联系作者之类的。
7. 交并比
1)交并函数可以用来评价对象检测算法,交并比(IOU,Intersession over union)函数是计算两个边界框(同时检测到目标的边界框)交集和并集之比。
(1)图片中的绿色部分为并集,黄色部分为交集,IOU=交集面积并集面积。
(2)按照约定,如果IOU大于或等于0.5时,就是检测正确。如果检测器和实际边界框完美重叠时,IOU等于1。如果你要更严格的话(如0.6、0.7),可以将IOU定得更高。IOU更高则边界框精确更高,所以这是衡量定位精确度的一种方式。
(3)定义IOU是为了评价你的对象定位算法是否精准,IOU衡量了两个边界框重叠的相对大小,所以这个可以判断两个边界框是否相似。
8. 非极大值抑制
1)目前对象检测的一个问题是算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次。非最大值抑制可以确保你的算法对每个对象只检测一次。
(1)如下图,19*19的网格,这两辆车只有一个中点,理论上只属于其中一个格子,理论上应该只有一个格子检测出车子。
(2)实践中当你跑对象分类和定位算法时,很多个格子(上面的绿/黄框)都可能检测出汽车,不同格子可能会对同一个对象做出多次检测
(3)非最大值抑制就是清理这些检测的结果,这样就可以让每个对象只被检测一次
2)非最大值抑制算法
(1)首先检测每个格子输出的报告的概率pc值,先看概率最大的那个,上图中是0.9,这是最可靠的检测。
(2)接下来非最大值抑制就会逐一审视剩下的矩形,所有和这个最大边界框有很高交并比、高度重叠的其他边界框都会被抑制,去掉其他IOU值很高的矩形。
(3)非最大抑制意味着只输出概率最大的分类结果,抑制很接近但是不是最大的其他预测结果。
9. Anchor Boxes
1)对象检测中存在的另一个问题是每个格子只能检测出一个对象,如果你想一个格子检测出多个对象,可以使用anchor box这个概念。
(1)anchor box的做法就是预先定义两个/多个(5个甚至更多)不同形状的anchor box。
(2)把预测结果和这两个anchor box关联起来,输出值中包含多个anchor box的bounding box值,此处2个anchor box共16个输出值。第一个是行人的anchor box,第二个是汽车的anchor box。
2)对训练集图像中的每个对象都根据对象中心位置分配到对应的格子中,上面例子中输出y值时3*3*16。
3)它还分配到一个anchor box,分配到一个格子和一个和对象形状交并比最高的anchor box,这里两个anchor box和实际边界框的交并比更高,这个对象不只分配到一个格子,而是分配到一对anchor box中。
4)Anchor box是为了处理多个对象出现在同一个格子的情况,特别是使用更细个网格(如19*19)而不是3*3的网格时,实践中这种情况很少发生一个格子同时出现多个对象。
5)Anchor box还可以让你的学习算法更有针对性,可以更好的处理对象的不同形状(如高瘦的行人和很宽的汽车)。一般手工指定anchor box形状,可以选择5-10个anchor box形状,覆盖到多种不同的形状,涵盖想要检测的对象的各种形状。也可以对目标对象使用聚类方法来自动选择k个anchor box的形状图。
10. YOLO算法
1)YOLO算法就是把所有上面提到的零件组装在一起构成YOLO对象检测算法。
2)训练
(1)使用3*3网格检测行人、汽车、摩托车,使用2个anchor box,那么输出y是3*3*2*8。
(2)要构造训练集,需要遍历9个格子,然后输出对应的y,最终输出尺寸是3*3*16。
- 先看第一个格子,里面没有有价值的东西,两个anchor box的pc都为0
- …
- 第8个格子有目标,目标对象与anchor box2的交并比更高,那么车子就和输出向量的下半部分相关,第二个anchor box的pc=1。
3)预测
(1)输入图像神经网络输出尺寸是3*3*16,对于9个格子都有对应的向量
(2)非极大值抑制
- 每个格子都有2个边界框,有些边框可以超出格子的高度和宽度
- 然后抛弃概率低的预测
- 对于每个类别(行人、汽车、摩托车)单独运行非最大值抑制处理预测结果是哪个类别的边界框 运行三次非最大值抑制得到最终的预测结果
- 算法最终输出最好能够检测出图像里所有的车子和所有的行人
4)YOLO算法时最有效的对象检测算法之一
11. RPN网络
1)候选区域在计算机视觉领域是非常有影响力的概念,这部分算法使用频率相对没有这么高,但工作用依然可能会遇到。候选区域的概念在计算机视觉领域影响力相当大。
2)一种叫R-CNN的算法,是带区域的卷积网络,这个算法尝试选出一个区域,在这些区域上运行卷积网络分类器比对每个滑动窗运行检测算法更有意义。
(1)选出候选区域的方法是运行图像分割算法,分割结果是右边的图像
(2)为了找出可能存在对象的区域,在图像中寻找所有色块(可能会存在2000个色块),然后再这所有色块上放置边界框,然后对所有边框运行分类算法,看是否存在东西。这样做可以减少卷积网络分类器运行时间,比在图像所有位置跑一遍分类器要快。
3)R-CNN算法运行依然慢,所以有一系列的研究工作改进这个算法
(1)R-CNN:使用某算法求出候选区域,然后对每个候选区跑分类器,每个区域都会输出一个标签和边界框,这样就能在确实存在对象的区域得到一个精确的边界框(R-CNN算法不会直接信任输入的边界框,所以它会输出一个边界框)。
(2)Fast R-CNN:它是R-CNN算法的基础上,用卷积实现了滑动窗法,最初算法时逐一对区域分类,这显著提升了R-CNN的速度。存在的问题是得到候选区域的聚类步骤依然非常缓慢。
(3)Faster R-CNN:使用卷积神经网络而不是传统的分割算法求出候选区域色块,比Fast R-CNN算法快得多。
4)大多数Faster R-CNN实现比YOLO算法慢很多。
- 吴恩达深度学习笔记四:卷积神经网络 基础和目标检测部分
- 《深度学习工程师-吴恩达》03卷积神经网络—特殊应用:人脸识别和神经风格转换 学习笔记
- 吴恩达深度学习笔记之卷积神经网络(目标检测)
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(4-3)-- 目标检测
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(4-3)-- 目标检测
- 吴恩达深度学习笔记 course4 week3 目标检测
- 吴恩达深度学习笔记 course4 week3 目标检测
- Coursera吴恩达《卷积神经网络》课程笔记(3)-- 目标检测
- 卷积神经网络—目标检测 学习笔记(上)
- 吴恩达【深度学习工程师】学习笔记(七)
- 吴恩达(Andrew Ng)深度学习工程师笔记 - 第一门课-神经网络和深度学习-第一周深度学习概论-第六节:课程资源
- 深度学习:目标检测-RCNN学习笔记:SSD:Single Shot MultiBox Detector
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR
- 吴恩达【深度学习工程师】学习笔记(二)
- 吴恩达【深度学习工程师】学习笔记(六)
- 深度学习笔记之使用Faster-Rcnn进行目标检测 (实践篇)
- 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)
- 吴恩达【深度学习工程师】学习笔记(五)
- 吴恩达深度学习笔记五:卷积神经网络 人脸识别和风格迁移部分
- 深度学习笔记之使用Faster-Rcnn进行目标检测 (实践篇)