本文内容主要参考,吴恩达《卷积神经网络》 第三周目标检测
视频地址:https://www.bilibili.com/video/av36381900/?p=3
1. 目标定位:使用算法判断图片中是不是目标物体,如果是还要再图片中标出其位置并使用边框标记出来
在普通的图片分类网络中,对于一个图片,经过卷积层特征提取后,送入softmax层转为为对于的概率
而分类定位则是在图片分类网络的基础上加入了全连接层的输出bx,by,bh,bw和一个分类标签(c1,c2,c3...),其最后输出形式如下:
其中:
Pc:表示被检测对象某一分类的概率(即是否含有被检测的对象)。假设要检验汽车、摩托车、行人、景物。但是前三个检测对象是我们关心的,那么如果出现Pc为1,图片为景物或者其他不是我们关系的则Pc为0。
bx,by,bh,bw:bx,by为标记边框的中心位置坐标,bh,bw:为标记边框的长高。将图片归一化,设图片左上角标记为(0,0),右下角标记为(1,1),对于图中汽车中心点,其数据大概可以是 bx =0.5,by = 0.7 。对于bounding box,其 bh = 0.3,bw = 0.4
c1,c2,c3.....cn:为分类标签,n对应自己实际的分类标签个数。但是在c1,c2,c3.....cn 中只有一个为1。若分类标签次序为汽车,摩托车和行人,所以n=3,c1 = 1,其余为0
损失函数计算:
Pc为1时,即检测出了感兴趣的物体,损失值等于每个元素相应差值的平方,即输出y中的每个元素作差再求平方和
Pc为0时,即没检测出感兴趣的物体,只需关注网络输出Pc的准确性,y1即为Pc值
2. 目标检测
2.1 基于滑动窗口构目标检测算法
首先创建一个标签训练集,训练集为适当剪切过的图片样本,使检测对象位于中心位置,并且基本占据整张图片
然后开始训练神经网络,输入一张剪辑过得图像,然后网络负责输出 0/1,是不是汽车
最后就可以用滑动窗口进行检测了,先选择特定大小的窗口,遍历截取图像的每一个区域,把截取的小图片输入到上面训练过的卷积网络中,对每个位置按0或1进行分类(判断截取图片中是否存在待检测对象)。选取更大的窗口重复以上操作。
缺点:数据量大,计算时间长。
2.2 卷积的滑动窗口
2.2.1 把全连接层转化为卷积层
全连接模型:
输入一个14*14*3的图像,经过16个5*5的卷积核后,形成10*10*16的数据,再经过2*2池化层后,形成5*5*16的数据,经过一个全连接层,使输出400*1数据,再经过一个全连接层,输出400*1数据,经过一个softmax层,输出4个分类的概率
卷积层模型:
前面过程一样,从全连接成进行改变,第一个全连接层改用400个5*5*16的卷积核作卷积,形成1*1*400的数据,第二个全连接层用400个1*1的卷积核作卷积,形成1*1*400的形式,然后再用4个1*1的卷积核作卷积,形成4个输出。
2.2.2 卷积滑动窗口实现过程
与上个过程类似,设已经训练好的网络为14*14*3的大小,输入测试图像为16*16*3的大小,首先经过16个5*5的卷积核,生成12*12*16大小的数据,再经过2*2的池化层,生成6*6*16的数据,在经过400个5*5的卷积层,生成2*2*400的数据,经过400个1*1的卷积层,生成2*2*400的数据,再经过1个1*1的卷积层,生成2*2的数据,其中,左上角相当于图片左上角14*14的卷积得到的,其他的类似。
3 YOLO算法基本思想
3.1 主要思路:在图片上放置n*n的网格,并在每个网格上面进行分类和定位,相比滑动窗口会大大的减少了运算量。
YOLO进行检测前,先将图片进行网格划分,图中以3*3为例,当一个物体的中心落在某个网格中时,该网格负责预测这个物体,如图中的第4,6个网格负责预测这两辆车。最后输出的形式是一个3*3*8的矩阵
3*3是图片的分割的网格数量,8是输出图片预测和边框位置等信息,与前面提到的相同:
第一个数据,y1代表有无预测的物体,有的话标记为1,后面是bx,by即物体中心点相对于网格的偏移,以右边的汽车为例,其中心点为黄色的那个点,对应的那个网格,设左上角为(0,0),右下角为(1,1)其bx大概为0.4,by大概为0.3,其取值不会超过1(因为超过1 就取到别的网格中去了),bh,bw为bounding box的参数,其值也是相对于网格大小而言的,图中大概为,bh=0.9,bw=0.5,这两个参数取值可以超过1
3.2 交并比
计算两个边框交集和并集之比,IOU是用来衡量两个边框的重叠的大小
一般认为IOU>=0.5,但可以由不同场景可自己设置。
3.3 非最大抑制
YOLO算法在运行中存在一个问题,理论上图片上每一个对象只存在一个中心点,实践中可能会有几个网格都会认为对象的中心在自己网格中。
于是就会生成多个边框
非最大抑制的作用就是,对于每个对象只保留其Pc预测最大的值
非最大抑制用法:
首先去掉IOU没到达到阀值的边框,再选择最大得分的框,计算与其他剩余框的IOU,若IOU大于0.5,则将其置零,即将其框去掉。
3.4 Anchor Box
使用Anchor Box可以让一个网格检测出多个不同类别的对象。
Anchor Box基本思路:
1. 预先定义多个个不同形状的的Anchor Box,其形状是与预测结果关联起来的
现在每个对象都和以前一样分配到同一个格子里面,但是现在还要分配到一个Anchor Box,分配的原则是比较并选择该格子内对象与定义的Anchor Box不同形状之间的IOU交并比最高的那个。假设有两个Anchor Box,其输出如下:
前8个为第一个Anchor Box对于的信息,信息与上面相同,后8个为第二个Anchor Box对于的信息
一般手动根据对象制定Anchor Box形状,可以选择5个到10个形状,可以涵盖你想要检测对象的各种对象。
3.5 YOLO算法例子
上面讲的都是构建YOLO算法中所需要知道的一些知识,下面就通过一个例子把所有的知识点穿插起来。视频使用的例子还是在图片中检测行人、车和摩托车。
输出数据形状是3x3x16:
3x3是分的格子形状,16(=2x8)其中2是使用的Anchor Box的个数,8就是输出的参数个数(Pc,bw,bx,bh,bw,c1,c2,c3)
Anchor Box选择:
使用Anchor Box 1表示行人,Anchor Box 2表示车和摩托车。
使用卷积神经网络训练:
最后是使用非最大抑制:
没有使用非最大抑制时,由于使用了两个Another Box,每个格子都会有两个检测边界框,只是Pc概率不同而以。
需要做的是:
1、抛弃概率比较低的预测边框
2、对每一类单独运行非最大抑制,例如,对于行人Anchor Box 1的形状的概率明显高于Anchor Box 2的概率。所以去掉Anchor Box 2形状的边框。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:YOLO基础教程(五):目标检测基本原理 - Python技术站