Andrew Ng's deeplearning Course4Week3 Object detection(目标检测)

一、目标定位与特征点检测

1.目标定位


由上图可知,之前我们学习的是图片分类的问题,而图片分类的定位问题就是建立在图片分类的基础上的,而目标的检测又是在图片分类定位问题的基础上实现的。


目标的定位的输入就是图片,经过一系列CONV,pool池化后最后输出一个形似如下的softmax,包含有4个值,包括目标的中心坐标(bx,by),目标的边界大小bh,bw。


该如何定义输出变量y呢?y0也就是Pc的值为0~1,代表是否有目标的概率,y1~y4为bx,by,bh,bw,详细的含义上面已阐述过。最后的y5~y7代表c1,c2,c3,分别为0或1,代表是否是行人,汽车,摩托车等等。

2.特征点检测


特征点的检测的输出的y的表现形式与上面类似,检测的特征点是以坐标的形式表现的,因此我们将这些坐标点保存在y1,y2,y3……有一点需要特别注意的是,假如有一堆标记了脸的各个特征点的训练集,特征点x必须在所有图片中保持一致,比如说特征1代表右眼角,特征2代表左眼角等等。

二、基于滑动窗口的目标检测

1.目标检测


训练集就是一张纸图片,而输出的y代表的就是有目标或者无目标。


上图所示的就是滑动窗口检测的一个过程,我们首先用一个比较小的窗口去遍历图片,紧接着再用稍微大一点的窗口去遍历图片,以此类推,直到检测出目标。

但是这种滑动窗口的检测有一个缺点就是计算成本会特别高。如果选用的步幅很大,会减少输入卷积网络的窗口个数,这样可能会影响性能。如果选用的步幅很小,那么传递给卷积网络的小窗口数就会特别多,这样就会导致超高的计算成本。

2.滑动窗口的卷积实现

上述所述的检测算法效率不是很高,那么我们如何在卷积层上应用这个算法,提高效率呢。


我们首先需要做的一步就是将FC层转化为CONV层。如上图所示,根据实际情况去添加过滤器,上图所用的就分别是5*5和1*1的过滤器。


假设初始的滑动窗口是14*14*3,经过一系列卷积加池化后变为1*1*4,然后去检测16*16*3的图片(stride为2),我们就可以看到最终会有4个区域,这4个区域就分别代表了原先图片的不同部分。

该卷积操作的原理是,我们不需要像前面一样把输入图片分割成4个子集传给卷积网络,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公有区域可以共享很多计算,因此能大大提高效率。但是这样做也会有一个缺点,那就是边界框的位置可能不够准确。


上图就是一个实例,假设图片是28*28*3的,我们拿14*14*3的窗口去滑动检测,最终会在某一个窗口检测到目标(假如有目标的话)。

三、YOLO算法

该如何使边界框的位置更加准确呢?有一个算法能很好的做到这点,YOLO算法(you only look once)。

1.Bounding Box预测


假设目标图像分成了3*3,我们取目标的中心点,然后将对象分配给中心点所在的格子。这就是YOLO算法。一个格子对应一个输出y。那么最终图像的输出维度就是3*3*8。

当一个格子中没有多个对象的时候,神经网络可以输出精确的边界框。运行速度非常快,基本可以达到实时识别。


我们以格子的左上角为(0,0),右下角为(1,1)其中输出y的bx,by在0-1之间,代表的就是目标中心点的坐标,而bh,bw是目标占格子的长宽的比例,可能会大于1,因为1个目标可能会占据2-3个格子。完整的输出向量y的结构如上图所示。

将任意输入x映射到这类输出向量y,再经过足够训练后,神经网络可以输出精确的边界框。

它显示地输出边界框坐标,这能让神经网络输出边界具有任意宽高比,并且输出更精确的坐标,不会受到滑动窗口的步长大小限制。

2.交并比函数


交并比函数(Intersection over Union)是一个评价对象检测准确度的算法。假设上图的红框是实际的边界,紫框是对象检测出来的边界。那么我们取这2者之间的交集和并集,做商,得到一个比率,这就是交并比函数。如果结果大于0.5(这个没有理论依据,0.6,0.65都行,取决于自己的要求),那么我们就认为对象检测的比较好。

3.非极大值抑制


如上图所示,因为算法可能对同一个对象做出多次检测,我们用非极大值抑制来保证对同一个对象只检测一次。

具体的做法就是抑制那些概率低的检测框,保留下概率最高的检测框。

下面将阐述一下详细的步骤:

假设我们的图像是19*19,并且只检测汽车,那么输出的预测就如上图右上角所示,首先:

1.去除那些概率小于0.6的边界框。

2.对于每一个目标对象,当有剩余其他边界框的时候,不断的做如下的循环

选择最大pc的边界框,去除那些剩余的边界框与最大pc边界框的交并比大于0.5的框,因为这代表2者很相似,检测的是同一个对象。

4.Anchor Boxes

但是有一种情况是一个格子可能检测出多个对象。那么,有一个应对的方法就是Anchor Boxes。(不过当使用2个anchor boxes时,对同一个格子中的2个对象形状类似或者同一个格子中有超过2个对象时效果通常不好,需要引入一些额外方法,但Andrew Ng木有详细说明,可能是多个anchor boxes或者其他)


举个例子如上图所示,同一个格子中出现了车和行人,一个是长窄型,一个是矮胖型,那么我们预先定义2个Anchor box,1是长窄型,2是矮胖型。然后分别去匹配。因此输出向量y的维度由原先的8变成了16。


原先我们训练图像中的目标被归为到包含目标中心点的那个格子中。而在Anchor Boxes的算法中,还要再加一点,就是和预先设定的anchor box的交并比函数最高的那一格。


还是上图中的那个例子,最终输出的y维度为16,前8个代表的就是Anchor box 1,也即是匹配度最高的行人;后8个就是Anchor box2,即是交并比最高的车。

5.总结

第一步是定义好训练集的输出y的格式。


训练集中y的维度和选择的anchors boxes的个数,窗口的大小,要检测的不同类别的数量等有关。如上图所示的3*3*2*8,其中的2就是anchors boxes的数量,8去掉前5个参数代表要检测3种不同类别。

因此我们也可以改成19*19*2*8,将窗口的大小变小一点。或者改成19*19*5*8,将anchors boxed的数量增加一点。

我们常常手工指定5-10个Anchor Boxes的形状,这样可以覆盖到不同的形状,因此可以涵盖想要检测的对象的各种形状。


第二步即是做预测,得到输出的y。


第三步:对于每一个单元格,可能会有2个预测的边界。去除掉那些概率低的预测。对于每一个类别,单独使用非极大值抑制来产生最终的预测边界。

四、RPN网络


RPN为候选区域网络(region proposal network),主要起到的作用是在一张图片中选出候选区域,因为由上图可知,一张图片中有很多区域都是没什么用的。

选出候选区域所采用的算法就是图像分割算法,分割完后再对候选区域去识别检测。这里要注意的一点是候选区域给出的边界并不就是最终的边界,最终的边界还是由神经网络计算给出。


现在主要有3种R-CNN算法,第一种是基础版本,一次处理一个候选区域。第二种是快一点的R-CNN,使用了卷积网络去实现窗口滑动。第三种是更快一点的R-CNN,使用了卷积网络去挑选候选区域。

相比于YOLO算法,R-CNN算法的思想很有意思,但实际来看效率还是没有YOLO算法的效率高。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值