CV《物体识别与检测2 - 多目标识别基本算法》

本文是根据Andrew Ng的深度学习视频学习,自己总结的。这一系列先只学习关键技术和设计,具体的实例等下一期进行。

一:多object的识别与检测
现在我们来个复杂一些的,在一副图像中我们存在多个不同的检测目标体,比如在自动驾驶中,在一幅图像中存在行人,汽车,摩托车各个若干,如下图所示。
在这里插入图片描述
在这里插入图片描述

这时候,单object检测的算法就失去了作用,必须得做出一些改变出来。

二:基于滑动窗口的检测技术
一个比较朴素的思路就是,我们上一文章中,既然已经训练好了单个图像识别的模型,何不充分利用整个思路呢。

思路如下:我们通过一大堆的的样本训练出一个分类模型ConvNet,这些样本都是仅仅包含单个物体的图像,且都是紧密裁剪的图像,也就是整个图像都尽量是物体的轮廓,用此数据集训练出对物体分类的模型出来,假设我们需要预测N个类别的数据,模型只会输出一个1X1XN的张量,代表各个分类的softmax值。
在这里插入图片描述

然后利用一个固定长度的滑动窗口,在图像上从上到下,从左到右,不断地滑动(注意这里涉及步长),每次滑动都取整个窗口内的像素进行ConvNet前向计算,每次都会得到一个结果,然后直到所有图像遍历结束。再换一个大一些窗口(记住要resize)继续检测,重复这一步,再换一个继续检测。

看样子似乎想法很简单,将多目标识别的问题直接转换为了多次的分类问题。
但是这算法最大的缺陷就是太慢了,每次都是盲目的滑动多次探测多次计算,同时存在很多重复的计算,而且对边界框的精确度不是很高,因为边界依赖于于滑动窗口的滑动,因此窗口滑动的精细程度决定了输出的边框范围。计算量大,运行慢,一直是滑动窗口的缺点。

有一个加速的办法就是将模型中的FC层全部换成是卷积层,也就是卷计划改造的滑动窗口。
具体的方式我们可以学习下,用一个例子举个例子:
Turning FC layers into Convolutional layers.
如下图举例:
在这里插入图片描述

这幅图展示了可以利用合适的卷积或者是1X1的卷积,将FC层全部代替,这样代替有什么作用呢?
截图来自吴恩达的深度学习视频,
在这里插入图片描述
在这里插入图片描述

假设我们有4个分类,输入给模型的是14X14X3的图像,测试图像是16X16X3的图像,我们利用步长是2的滑动窗口,可以得到四个结果,但是这四次计算很多都是重复计算,大大的降低了效率,因此卷积化改造的模型,直接将整个图像输入到模型,最后输出一个2X2XN大小的张量,只关注2X2,恰好是4个。四次计算合并到一次计算,每一个输出的位置恰好对应于前面的一个滑动窗口位置,因此,一整个图像一次性计算,可以做到计算共享,大大提升效率。

假设测试图像是28X28X3的图像,最后输出了8X8XN的张量也是将81次滑动窗口的计算合并成了一次的卷积操作。大大提升计算效率。

因此卷积化的滑动窗口可以提升一些计算效率。

最后提一下有一个候选区域的概念,在滑动窗口运行之前先对图像做一定的处理,找到可能存在物体的潜在区域,仅仅对潜在的区域进行滑动探测,这样也能大大减少图片中一些不必要区域的计算,也是提高运算效率的方式,这种思路称为R-CNN,后续又发展出了Fast R-CNN,以及Faster R-CNN。
在这里插入图片描述

对于很多区域的检测都是在浪费时间,比如图中的1和2 区域。
R-CNN 的算法是带区域的卷积网络,或者说带区域的 CNN。这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,所以这里不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。篇幅有限,不展开讨论。

但是滑动窗口也有优点,就是精度要高一些,毕竟是采用了密集的遍历,每一步骤都是,准确度要比通过end-to-end一次性训练的算法YOLO精确一些,虽然时间上慢一些。

三:YOLO算法(you only look once)
第二小节讲解的基于滑动窗口的方法,存在运行慢,一般无法运行于高实时性要求的系统,且边界的精确度不高的问题,虽然有很多的优化算法,但是总归呢,还是相比于YOLO还是慢一些的,但是滑动窗口的话,精度上确实要高一些。

YOLO就是一个 end-to-end的算法,希望图像只被模型计算一次,不需要什么滑动窗口多次探测,只看一次,正如名字所示,只看一次,就得出图像中所有的分类的所有物体,以及每个物体的坐标和轮廓信息,这个边框要比滑动窗口要精确,且大大带来了时间上的提升,适合于实时检测系统的应用,下面我们来看看如何实现的。

我们先来给出一些数据和标签的定义,借鉴于但物体识别的内容。
将图像划分为M X M个区域,每个区域内都是一个一个1X1X(1+4+N)的张量,所以整个图像的标签为M X M X (1+4+N)的张量,(1+4+N)这里不再展开解释(就是一个置信概率度,4个跟坐标位置和边框大小有关的量,其他的都是N分类的one-shot向量)。
在这里插入图片描述

对于每一个区域,给一个想对应位置的张量,张量的内容和单体检测的一致。这么一来,一个图像最多能检测出M X M个物体,因为划分区域的目的就是希望每个区域最多有一个物体,这样就能做到多个物体的检测了。所以,如果希望能检测的物体越多,M就稍微设置大一些。
在这里插入图片描述

如上图,图像被划分了四个区域,最多能检测到四个物体,输出到2X2X(1+4+N)的张量上,分别对应于前面划分的某个区域。

也就是说,每一个区域内只能检测有一个物体,起码我留了一个检测到物体后的输出信息的位置,即便是没有物体,那么这个区域输出的也是输出pc=0,其他维度忽略。在每一个区域,只能包含一个物体的中心点Bx与By,这俩值小于1大于0,不管轮廓跨越了几个区域,物体的中心点始终是落在某一个区域内,只关心物体的中心点的位置,至于轮廓Bh和Bw,这俩值可能大于1,因为轮廓可能跨越区域。

因此我们要对每一个样本数据的图片,进行子区域划分,对每个子区域进行检查,中心点落在哪个区域就归属哪个区域,至于轮廓的高度和宽度,也是人为打上标签,此时是按照子区域的长度和宽度进行归一化的,不是整个图像的长度和宽度进行归一化,最后形成M X M X (1+4+N)的张量标签,也是整个模型的输出张量。

说到这里,突然发现之前说的那个单物体检测的,其实也是最简单的多物体检测了,因为它可以看做是把整个图像当成了区域,去检测一个物体,划分的区域就是1X1。

至此这个问题在YOLO下又转变成了一个监督学习的问题。
损失函数可以参考单物体检测的损失函数,只不多多了一些区域罢了,要求所有子区域的代价函数求和。

最后,如果多个物体的中点点落在一个区域怎么处理?两种办法,一种就是增大区域划分,降低这种事情的概率,实在无法避免的话,下一篇文章会学到一个Anchor box的办法来解决。最好是希望不要发生这样的情况,我们最好是希望物体比较分散。

数据怎么来,又是认为训练打标签得来的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值