程序员

YOLO算法

2019-03-09  本文已影响15人  带刺的小花_ea97
上周最后一课

你已经学了对象检测算法的大部分零件了,接下来,我们把所有的零件组合到一起,构成YOLO检测算法。

首先:构建训练集
创建一个y向量3x3x2x8,要构造训练集,你需要遍历九个格子,然后构成对应的目标向量y,当然实际中,你可能使用的是19x19x5x8的向量集。

构成训练集以后,你训练一个卷积网络,输入图片,可能是100x100x3,然后你的卷积神经网络最后输出尺寸是3x3x16,接下来你的算法应该做出预测:

最后你要跑一下非最大值抑制:

如果你使用两个anchor box,那么对于9个格子中任何一个都会有两个预测的边界框,其中一个格子的概率pc非常低,但是9个格子中,每个都有两个预测的边界框,注意有些边界框可以超出所在格子的高度和宽度。

接下来你抛弃概率低的预测。

最后如果你有三个对象检测类别,行人,摩托,汽车,那么你要做的是对于每个类别,单独运行非最大值抑制,处理那个预测结果是哪个类别的边界框,用非最大值抑制来处理行人类别,再用非最大值抑制处理车子类别,然后对摩托车类实行非最大值抑制,运行三次来得到最终的预测结果。

所以算法的输出最后能够检测出图像中的所有的车子,所有的行人,这就是YOLO对象检测算法。

这实际上是最有效的图像检测算法之一,包含了整个计算机视觉对象检测领域文献中很多精妙的思路。

可选课:RPN 网络

如果阅读对象检测的文献,可能看到一组概念,所谓的候选区域,这在计算机视觉领域是非常有影响力的概念。

可选是因为用的不多,但是这个RPN 网络是非常有影响力的。

当你使用滑动搜索框或者卷积网络算法时,算法有一个缺点就是:
它在没有任何对象的区域浪费时间。

所以R-CNN算法被提出,意思是带区域的卷积网络,或者说带区域的CNN,这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是没有意义的。所以不再针对每个滑动窗口跑检测算法,而是只选择一些窗口,在这些少数窗口上运行卷积网络分类器。

选出候选区域的方法是:
运行图像分割算法,分割出结果后,为了找出可能存在对象的区域,在分割的色块上跑分类器,所以这个细节就是所谓的分割算法。

你先找出所谓的2000个色块,然后在这2000个色块上放置边界框,然后运行分类器,这样需要处理的位置可能要少得多,可以减少卷积网络分类器的运行时间,比在图像的所有位置跑一遍分类器更快。

以上就是R-CNN和区域CNN的特色概念。

现在看来R-CNN算法的运行速度还是很慢的,所以有一系列的研究工作去改进这个算法。

基本的R-CNN算法是使用某种算法求出候选区域,然后对每个候选区跑一下分类器,每个区域会输出一个标签,并输出一个边界框,这样你就可以确定存在对象的区域得到一个精确的边界框。

澄清一下:
R-CNN算法不会直接信任输入的边界框,它也会输出一个边界框,bx,by,bh和bw,这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好,你可以得到相当精确的边界框。

R-CNN算法的缺点是:太慢了

Fast-CNN:用卷积实现滑动窗口
最初的算法是逐一对区域分类,快速CNN则是用滑动窗口的一个卷积实现,这会显著提升CNN的速度。
事实证明:快速CNN算法的一个问题是:得到候选区域的聚类步骤仍然十分缓慢。

另一个研究组提出了更快的CNN算法,使用的是卷积神经网络,而不是传统的分割算法来获得候选区域色块。

不过我认为大多数更快的R-CNN算法的实现还是比YOLO算法慢很多。

候选区域的概念在计算机视觉领域影响力相当大,所以需要了解,候选区域算法是一个有趣的想法,但是这个方法需要两步,首先要得到候选区域,然后再分类,相比之下,能够一步做完,类似于YOLO或者你只看一次的算法,在我看来,是长远而言更有希望的方向。

上一篇下一篇

猜你喜欢

热点阅读