2020-9-3 吴恩达DL学习-C4 卷积神经网络-第三周 目标检测(3.3 目标检测-滑动窗口目标检测)

tech2022-09-07  92

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c 2.详细笔记网站(中文):http://www.ai-start.com/dl2017/ 3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

3.3 目标检测 Object detection

学过了对象定位和特征点检测,今天我们来构建一个对象检测算法。这节课,我们将学习如何通过CNN进行对象检测,采用的是基于滑动窗口的目标检测算法。

如上图,假如你想构建一个汽车检测算法。步骤是,首先创建一个标签训练集,也就是 x x x y y y表示适当剪切的汽车图片样本。

上图这张图片 x x x是一个正样本,因为它是一辆汽车图片。

上图这几张图片也有汽车。

但上图这两没有汽车。

出于我们对这个训练集的期望,你一开始可以使用适当剪切的图片,就是整张图片 x x x几乎都被汽车占据,你可以照张照片,然后剪切,剪掉汽车以外的部分,使汽车居于中间位置,并基本占据整张图片。有了这个标签训练集,你就可以开始训练CNN了。

输入这些适当剪切过的图片(如上图),CNN输出,0或1表示图片中有汽车或没有汽车。训练完这个CNN,就可以用它来实现滑动窗口目标检测,具体步骤如下。

假设这是一张测试图片,首先选定一个特定大小的窗口,比如图片下方这个窗口。

如上图,将这个红色小方块输入CNN,CNN开始进行预测,即判断红色方框内有没有汽车。

滑动窗口目标检测算法接下来会继续处理第二个图像(如上图),即红色方框稍向右滑动之后的区域,并输入给CNN,因此输入给CNN的只有红色方框内的区域,再次运行CNN。

然后处理第三个图像(如上图),依次重复操作,直到这个窗口滑过图像的每一个角落(如下图)。

为了滑动得更快,我这里选用的步幅比较大,思路是以固定步幅移动窗口,遍历图像的每个区域,把剪切后的小图像输入CNN,对每个位置按0或1进行分类,这就是所谓的图像滑动窗口操作。

重复上述操作,不过这次我们选择一个更大的窗口,截取更大的区域,并输入给CNN处理,你可以根据CNN对输入大小调整这个区域,然后输入给CNN,输出0或1。

再以某个固定步幅滑动窗口,重复以上操作,遍历整个图像,输出结果。

然后第三次重复操作,这次选用更大的窗口。

如果你这样做,不论汽车在图片的什么位置,总有一个窗口可以检测到它。

比如上图,将这个窗口输入CNN,希望CNN对该输入区域的输出结果为1,说明网络检测到图上有辆车。

这种算法叫作滑动窗口目标检测,因为我们以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。

滑动窗口目标检测算法也有很明显的缺点,就是计算成本,因为你在图片中剪切出太多小方块,卷积网络要一个个地处理。如果你选用的步幅很大,显然会减少输入CNN的窗口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给CNN的小窗口会特别多,这意味着超高的计算成本。

所以在NN兴起之前,人们通常采用更简单的分类器进行对象检测,比如通过采用手工处理工程特征的简单的线性分类器来执行对象检测。

至于误差,因为每个分类器的计算成本都很低,它只是一个线性函数,所以滑动窗口目标检测算法表现良好,是个不错的算法。然而,CNN运行单个分类人物的成本却高得多,像这样滑动窗口太慢。除非采用超细粒度或极小步幅,否则无法准确定位图片中的对象。

不过,庆幸的是,计算成本问题已经有了很好的解决方案,大大提高了卷积层上应用滑动窗口目标检测器的效率,关于它的具体实现,我们下节课再讲。

最新回复(0)