深度学习第四周--第三课目标检测理论


在这里插入图片描述

前言

本文结构:

  • 目标定位
  • 特征点检测
  • 目标检测
  • 滑动窗口的卷积实现
  • bounding box预测
  • 交并比
  • 非极大值抑制
  • anchor boxes
  • yolo算法
  • 候选区域

目标定位

定义:分类+定位
一个cnn网络可以用softmax输出检测的可能的结果,若想定位图片中某个物体的位置,可以让神经网络多输出几个单元,即一个边界框。具体就是让神经网络再多输出4个数字,标记为bx,by,bh,bwb_x,b_y,b_h,b_w,这四个数字是被检测对象的边界框的参数化表示。
目标标签y的定义如下:在这里插入图片描述
这是一个向量,第一个组件pcp_c表示是否含有对象,如果对象属于前三类(行人,汽车,摩托车),则pcp_c=1,且c1,c2,c3,c4c_1,c_2,c_3,c_4表示该对象属于1-3类中的哪一类,且输出被检测对象的边框界参数bx,by,bh,bwb_x,b_y,b_h,b_w。如果是背景,则图片中没有要检测的对象,则pcp_c=0,。

特征点检测

可以通过输出图片上特征点的(x,y)座标。
举个例子,假设正在构建一个人脸识别应用,希望算法可以给出眼角的具体位置,眼角座标为(x,y),可以让神经网络的最后一层多输出两个数字l1x,l2xl_{1x},l_{2x},作为眼角的座标值。如果希望算法给出两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点来表示这四个眼角,对神经网络稍做修改,输出第一个特征点l1x,l1y(l_{1x},l_{1y}),第二个特征点l2x,l2y(l_{2x},l_{2y}),依此类推,这四个脸部特征点的位置就可以通过神经网络输出。

目标检测

**内容:**首先用样本集训练cnn网络,再在测试图片上,选择大小事宜的窗口,合适的步行长度,从左到右、从上到下滑动。每个窗口区域都送入之前训练好的cnn进行识别判断。
举个例子:构建一个汽车检测算法,首先是标签训练集x和y来训练cnn网络,输出y,0或1表示图片中有汽车或没有汽车,然后在测试图片上选择大小事宜的窗口,合适的步行长度,从左到右、从上到下滑动,对每个窗口区域送入之前训练好的cnn来进行识别判断。以此来实现滑动窗口目标检测。如下图所示:
在这里插入图片描述
假设这是一张测试图片,首先选定一个特定大小的窗口,比如图片下方这个窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。
重复上述操作,不过这次选择一个更大的窗口,截取更大的区域,并输入给卷积神经网络处理,你可以根据卷积网络对输入大小调整这个区域,然后输入给卷积网络,输出0或1。
再以某个固定步幅滑动窗口,重复以上操作,遍历整个图像,输出结果。
然后第三次重复操作,这次选用更大的窗口。
这种算法就是滑动窗口目标检测,因为我们以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分裂,判断里面有没有汽车。
缺点:
1、计算成本大,不灵活:因为在图片中剪切出太多小方块,卷积网络要一个个地处理。如果选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能,反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。

滑动窗口的卷积实现

为了构建滑动窗口的卷积应用,
步骤:
1、将全连接层转变为卷积层;
- 与上层尺寸一致的滤波算子进行卷积运算
2、使用该网络参数与结构进行运算;
举个例子:假设卷积网络经过池化层后得到一个5x5x16的图像,然后得到400个单元的全连接层,再添加一个全连接层,最后通过softmax单元输出y。对5x5x16的图像,用5x5x16的过滤器来进行卷积,输出1x1x16,假设应用400个这样的5x5x16的过滤器,则得到1x1x400的输出。
再添加另外一个卷积层,用的是400个1x1的过滤器,输出1x1x400,最后经由1x1x4过滤器处理,得到一个softmax激活值,通过卷积网络,最终得到1x1x4的输出层。
优点:
不管原始图片多大,只需要进行一次cnn正向计算,因为共享了很多重复计算,节约运算成本。

bounding box预测

有时滑动窗口不能完全涵盖目标,为了得到更精准的边界框。
目标标签y的定义如下:
在这里插入图片描述
解决办法:yolo算法,取两个对象的中点,然后将这个对象分配给包含对象中点的格子,所以左边的汽车就分配到这个格子上(编号4),这辆condor中点在这里,分配给这个格子(编号6)。对于这里9个格子中任何一个,你都会得到一个8维输出向量,所以目标输出尺寸是3x3x8。
在这里插入图片描述
yolo算法步骤:
1、首先将原始图片分割成nxn网格
2、然后利用卷积形式实现滑动窗口算法的思想,对该原始图片构建cnn网络
3、如果目标中心座标不在当前网格内,则当前网格pc=0,否则pc=1。

交并比

为了评价对象检测算法的准确性。
交并比函数做的是计算两个边界框交集和并集之比。
在这里插入图片描述
一般约定0.5是阈值,用来判断预测的边界框是否正确。

非极大值抑制

为了确保你的算法对每个对象只检测一次。
这个算法这样做,首先看看每次报告每个检测结果相关的概率pcp_c,首先看概率最大的那个,这个例子中是0.9,然后就说这是最可靠的检测,用高亮标记,就说这里找到了一辆格子,之后,非极大值抑制就会逐一审视剩下的矩形,所有和这个最大的边框有很高交并比,高度重叠的其他边界框,输出就会被抑制。
步骤:
1、剔除pc值小于阈值的所有网格
2、选取pc值最大的网格,利用iou,摒弃与该网格交叠较大的网格
3、对剩下的网格,重复步骤2

anchor boxes

为了一个格子检测出多个对象。
在这里插入图片描述
假设有这样一张图片,行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中,anchor box思路是,预先定义两个不同形状的anchor box或者anchor box形状,预测结果和这两个anchor box关联起来,可能会用更多的anchor box,要5个甚至更多。所以要用的向量是重复两次的:y=[pcbxbybhbwc1c2c3pcbxbybhbwc1c2c3]Ty=[p_c b_x b_y b_h b_w c_1 c_2 c_3 p_c b_x b_y b_h b_w c_1 c_2 c_3]^T

yolo算法

对上诉算法的整合,网格结构如下:
1、对于每个网格,得到2个预测边界框
2、剔除小概率预测网格
3、对于每个物体,使用非极大值抑制生成最终预测框

例子:训练一个算法去检测三种对象,行人、汽车、摩托车,需要显示指定完整的背景类别,这里有3个类别标签,如果要用两个anchor box,那么输出y就是3x3x2x8,其中3x3表示3x3个网络,2是anchor box数量,8是向量维度,8实际上先是5(pcbxbybhbw)(p_c b_x b_y b_h b_w),再加上类别的数量(c1c2c3)(c_1 c_2 c_3)。要构造训练集,需要遍历9个格子,然后构成对应的目标向量y。
在这里插入图片描述
遍历9个格子,遍历3x3网格的所有位置,得到这样一个向量,得到一个16维向量,最终输出尺寸是3x3x2x8。先遍历9个格子,遍历3x3网格的所有位置,再对每个类别单独运行非极大值抑制。

候选区域

purpose:避免对无用区域的扫描。
做法:先对原始图片进行分割算法处理,然后只对分割后的图片中的块进行目标检测。【候选区域+softmax分类】
如何选出候选区?运行图像分割算法,分为了找出可能存在对象的区域,运用分割算法得到一个色块,选择这样的边界框然后在这个色块上运行分类器,看看有没有东西。
在这里插入图片描述
R-CNN算法:滑动窗的形式,一次只对单个区域块进行目标检测,运算速度慢。
Fast R-CNN算法:利用卷积实现滑动窗算法,得到候选区域,再将候选区域输入到训练好的网络中,得到分类结果。
Faster R-CNN算法:用卷积对图像进行分割来获得候选区域色块,进一步提高运行速度。

注:大多数Faster R-CNN算法实现还是比yolo算法慢很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章