目标识别和检测的算法_目标检测算法浅析

5111dfd3f39c3691c9b8a0ffb088aab8.png

写在前面,相关blog:

金良的博客 | Jinliang Blog​jinliangxx.github.io
b6f033847fd8e81a44b168d648c12701.png

1. 目标定位

我们首先研究一个简单的定位分类问题,通常只有一个较大的对象位于图片中间位置,我们对他进行定位和识别。

首先描述我们的分类问题,分类结果为行人、汽车、摩托车、背景。背景意味着不含前三类。

然后加上定位,我们可以输出红色方框的中心点、高度、宽度。

根据上述分类与定位逻辑,采用监督学习的方法,标签定义为:

3c1864b67a091ec25c1bdba49ab9e5d6.png

如上图所示,

equation?tex=p_c 表示是否有行人、汽车、摩托车,当
equation?tex=p_c%3D0 时,代表只是背景,
equation?tex=p_c%3D1 表示有三种中的一种。
equation?tex=%28b_x%2Cb_y%29 表示方框的中心点,
equation?tex=b_h 表示方框的高,
equation?tex=b_w 表示方框的宽,
equation?tex=c_1%E3%80%81c_2%E3%80%81c_3 分别代表三种类别中的一种。

equation?tex=p_c%3D0 时,其他的值毫无意义。

然后看一下损失函数:

equation?tex=y_1%3D1 时:

equation?tex=L%28%5Chat+y%2Cy%29%3D%28%5Chat+y_1+-y_1%29%5E2%2B%28%5Chat+y_2-y_2%29%5E2%2B%5Cldots%2B%28%5Chat+y_8-y_8%29%5E2+%5Ctag%7B1-1%7D+

equation?tex=y_1%3D0 时:

equation?tex=+L%28%5Chat+y%2Cy%29%3D%28%5Chat+y_1+-y_1%29%5E2+%5Ctag%7B1-2%7D+

通过公式1-1与1-2所示,我们使用了平方误差的方法表示损失函数。

以上就是使用神经网络解决目标定位与目标分类问题的过程,相当于在普通图像分类的基础上,增加了目标定位。

了解了这个过程,我们再来看更复杂的逻辑。

2. 基于滑动窗口的目标检测

首先我们需要训练出一个目标二分类网络,比如汽车,我们的网络要能够判断图像中是否有车。

其中训练数据由手动裁剪后的汽车图片所训练,就是一张图片几乎被一个汽车所占据,卷积网络输出0代表是汽车,输出1代表不是汽车。

然后通过我们训练的卷积神经网络去检测目标。

0193fe645eae65841ea0d49f95fa8391.png

方法为首先选定一个特定大小的窗口,然后根据窗口内的图像,使用卷积神经网络进行预测,即判断窗口内有没有车。窗口依次处理第二个位置的图像,直至遍历完成。

这就是图像滑动窗口操作。

如果遍历完成后,并没有发现汽车,则使用更大一点的窗口重复上述过程,直至检测到。

1f31c20c84de4164d7af61644b681a27.png

当然,上述基于滑动窗口的目标检测存在很大的缺点,就是计算成本高,卷积网络要处理一个个的小方框。

3. 滑动窗口的卷积实现

为了在卷积层上实现滑动窗口的操作,我们首先要讲网络的全连接层改造为卷积层,下面来看具体方法:

8bfef8b57b6b449363862ae3b8cba1b1.png

我们来看一下上述图片,上面一层是正常的网络,结构为:

equation?tex=CONV+%5Crightarrow+POOL+%5Crightarrow+FC+%5Crightarrow+FC+%5Crightarrow+FC ,将其转化为对应的卷积层为下面一层图所示,前面conv层与pool层不变,将后面的全连接层转换为CONV层,其中FC层中的单元数改造为CONV层中的通道数量。

上述过程就是将FC层改造为CONV层的操作,最终获得

equation?tex=1+%5Ctimes+1+%5Ctimes+4 维度的矩阵。

改造网络之后,我们看一下如何实现滑动窗口:

eaeaa8a304fbfb42ae3e9b83984438d6.png

如上图所示,上半部分为我们将FC改造为CONV之后的网络结构,最终得到

equation?tex=1+%5Ctimes+1+%5Ctimes+4 维度的结果。

实现滑动窗口的操作很简单,如下半部分所示,我们不改变网络结构,直接将完整的图像

equation?tex=16+%5Ctimes+16+%5Ctimes+3 输入当前网络中,经过每一步的处理,得到
equation?tex=2+%5Ctimes+2+%5Ctimes+4 的矩阵,通过图片,我们知道其对应着在完整的图像上实现了四次滑动窗口,相当于将每个窗口并行预测值。

所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算。

上面就是在卷积层上实现滑动窗口的内容,提高了整个算法的效率,但是有一个缺点,就是边界框的位置不够准确,因为在固定的网络下,我们的窗口大小是固定的,且是正方形,而且窗口是离散的。

4. Bounding Box预测

使用卷积层实现滑动窗口之上,边界框的位置不够准确,我们来使用更精确的边界框。

其中一个能得到更精准边界框的算法是YOLO(You only look once)算法,它的思想是将第1小节与第3小节的内容结合起来,我们来具体看一下:

yolo算法的做法是将一个原始图片分成

equation?tex=n+%5Ctimes+n 的网络,我们取
equation?tex=3+%5Ctimes+3 ,基本思想是使用图像分类与定位算法,将算法应用到9个格子上,每个格子的输出为8维的,即

505fc62a84c3d9adb58c57f24c13ee9e.png

这与第一小节中的输出一样,如果一张图有两个对象,yolo算法的做法是取两个对象的中点,然后将这个对象分配到包含对象中点的格子。

1047da1bf59317a03db70f7bc3f1704a.png

如上图所示的原图像,我们最终会得到

equation?tex=3%5Ctimes+3+%5Ctimes+8 的输出,其中两个方框中有目标。

上述过程和图像定位和分类算法非常像,但是我们同时使用卷积实现上述步骤,就像第2小节讲的那样,所有的格子并行进行计算,许多步骤都是共享的,因此这个算法的效率很高,运行速度快,能够达到实时识别。

另外在Yolo算法中,每个方框中的左上角为(0,0),右下角为(1,1),如果有目标,中点肯定在这个方框中,因此

equation?tex=b_x
equation?tex=b_y 都在(0~1)区间中,但是高和宽却有可能在区间之外。

5. 交并比&非极大值抑制&Anchor Boxes

在目标检测实现后,我们需要有个指标评价目标检测算法的好坏,它就是交并比。

交并比(IoU)函数就是计算两个边界框交集和并集之比。

IOU:

equation?tex=%28A%5Cbigcap+B%29+%2F%28A+%5Cbigcup+B%29

9fc89e00a8f145b451c7d9a89e24e759.png

一般情况下,当IOU大于0.5时,我们就说检测正确,当然这个阈值可以变。


在我们的目标检测算法中,我们的算法有可能对一个对象作出多次检测,所以一个对象有可能有好几个框。

b5e7aa2edf9aa3a6f06c9bba8f94200b.png

如上图所示,共有两个目标,由于格子很小,导致每个目标都有好几个格子认为自己是中心。非极大值抑制就是处理这个问题,使每个对象仅检测一次。

下面我们来看大致流程:

  1. 通过设置阈值排除出现目标概率比较小的方框
  2. 选择剩下方框中概率最高的
  3. 抛弃与步骤2中选择的方框IOU比较高的方框
  4. 重复处理步骤2、3
  5. 如果有多个对象,重复处理步骤2、3、4(注意,步骤2、3、4针对同一目标而言,例如汽车)

现在,我们的算法仍有缺陷,就是每个格子只能检测一个目标,如果一个格子中有多个目标,我们可以用anchor box实现。

它的方法是预定义两个不同形状的anchor box,我们需要把预测结果和这两个anchor box结合起来,当然,我们也可以使用更多的anchor box。

a963997d9b91d73f8c0d07cf87017e3d.png

原来我们每个格子的类别标签为:

1ccf7cd701cc19bfe2da3f180a308557.png

定义两个anchor box后,每个格子的类别标签为:

2bc25555f0e950cc88b502cd04e5c6f6.png

前面8个元素代表anchor box1的标签,后面8个元素代表anchor box2的标签。

因此我们的目标标签中,对于一个对象,我们存储的是(格子、anchor box)对。

我们的anchor box也会有一些缺陷:

  • 当一个格子中的目标比anchor box的数量多。
  • 两个对象分配到一个格子中,但是他们的anchor box形状一样。

当然,上述情况很少发生,特别是我们的格子比较小的时候。

关于anchor box我们可以预先设定;Yolo中有更好的做法,即使用k-means算法将两类对象形状聚类,用来来选择一组anchor box,这是自动选择anchor box的高级做法。

6. Yolo算法 & R-CNN

我们将上面的学习内容汇总在一起,就是Yolo算法的基本思想与流程,我们来具体看一下:

  1. 设定格子的数量n、anchor box的数量a和形状、需要检测对象的种类c
  2. 遍历所有格子,构造训练集以及标签
  3. 训练卷积网络,输出为
    equation?tex=n+%5Ctimes+n+%5Ctimes++a+%5Ctimes+%285%2Bc%29
  4. 使用网络进行预测

d6d8771ff4978df5c94476f21cf66403.png
  1. 对每个对象使用非极大值抑制

f195b345c43580ba3a64b7ccc8ad2732.png
  1. 输出最终的矩阵

以上就是Yolo算法的主要流程,具体内容在前5小节已详细展开。


下面来看目标检测的另外一类算法,通过候选区域来进行目标检测。

我们之前提到的滑动窗口算法,会在所有的窗口内都运行一次网络,即使某个窗口什么也没有。

所以提出了带区域的卷积网络(R-CNN),意思是先尝试选出一些区域,然后使用卷积网络进行识别。

选出候选区域的方法就是使用图像分割算法,我们通过图像分割算法找出一些色块,然后在色块上放置边界框,然后再这些位置上运行分类器,比在图像的所有位置上放置分类器要快。

当然,R-CNN不会直接信任输入的边界框,他还是会重新输出边界框,这样得到的边界框更精确。

但是由于先取出候选区域,再进行图像分类,比较慢,因此提出了Fast R-CNN,他基本上是R-CNN算法,不过使用卷积实现了滑动窗口。

但是Fast R-CNN中的第一个步骤得到候选区域仍然非常慢,因此,提出了更快的R-CNN算法(Faster R-CNN),它使用卷积网络代替传统的分割算法来获得候选区域色块。这笔Fast R-CNN快很多,但是仍然比不上YOLO的速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值