来源:Coursera吴恩达深度学习课程
熟悉了目标定位(Object localization)和特征点检测(Landmark detection),可以尝试构建一个目标检测算法。这篇文章将学习如何通过卷积网络进行目标检测,采用的是基于滑动窗口的目标检测算法(the sliding windows detection algorithm)。让我们往下看吧。
如上图所示,假如在构建一个汽车检测算法(car detection algorithm),(1)首先创建一个标签训练集(a label training set),也就是x和y表示适当剪切的汽车图片样本(closely cropped examples of cars),前三张图片是正样本(positive example),因为它们是汽车图片。(2)然后可以训练卷积网络,输入为这些适当裁剪过的图片,输出为y(0或1表示图片中有汽车或没有汽车)。(3)训练完这个卷积网络,就可以用它来实现滑动窗口目标检测(sliding windows detection),具体步骤如下。
上图是一张测试图片(test image),①首先选定一个特定大小的窗口(pick a certain window sizes),将这个红色小方块(a small rectangular region)输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。②接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络;③然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。
为了滑动得更快,这里选用的步幅比较大,思路是以固定步幅移动窗口,遍历图像的每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类,这就是所谓的图像滑动窗口操作。
重复上述操作,不过这次我们选择一个更大的窗口,截取更大的区域(take a slightly larger region),如下图:
然后第三次重复操作,这次选用更大的窗口(using even larger windows)。如下图:
第三次更大的窗口使得不论汽车在图片的什么位置,总有一个窗口可以检测到它。
这种算法叫作滑动窗口目标检测(sliding windows detection),因为以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。
滑动窗口目标检测算法也有很明显的缺点,就是计算成本(computational cost),因为你在图片中剪切出太多小方块,卷积网络要一个个地处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。
所以在神经网络兴起之前,人们通常采用更简单的分类器进行目标检测,比如通过采用手工处理工程特征的简单的线性分类器(a simple linear classifier)来执行目标检测。至于误差(error),因为每个分类器的计算成本都很低,它只是一个线性函数。然而,卷积网络运行单个分类任务的成本却高得多,像这样滑动窗口太慢。除非采用超细粒度(a very fine granularity)或极小步幅(a very small stride),否则无法准确定位图片中的对象。
不过,庆幸的是,计算成本问题已经有了很好的解决方案,大大提高了卷积层上应用滑动窗口目标检测器的效率,关于它的具体实现,可以看下一篇文章或者自行查阅相关资料。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。