目标定位:如下图,图像分类任务就是算法遍历图像,判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car,还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位,而对象定位的思路又有助于学习对象检测。如果想定位图像中car的位置,除了让神经网络输出softmax类预测分类外,还可以让神经网络多输出几个单元即输出一个边界框(bounding box),标记为bx,by,bh,bw,这四个数字是被检测对象的边界框的参数化表示。
Landmark detection:利用神经网络进行对象定位,即通过输出四个参数值bx,by,bh,bw,给出图像中对象的边界框。神经网络可以通过输出图像中特征点(landmarks)的坐标来实现对目标特征的识别。如下图,选定人脸的64个landmarks,并生成包含这些landmarks的标签训练集,然后利用神经网络输出脸部关键landmarks的位置。批量添加神经网络的输出单元,用以输出要识别的各个landmarks的坐标值。
Object detection:如下图,假设你想构建一个car检测算法,步骤是:首先是创建一个标签(label)训练集,X和Y表示适当剪切的car图像样本。在训练集上,你一开始可以使用适当剪切的图像,就是整张图像X几乎都被汽车占据。有了训练集,就可以开始训练卷积网络了。输入这些适当剪切过的图像,卷积网络输出Y,0或1表示图像中有car或没有car。
训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,如下图。具体步骤如下:假设这是一张测试图像,首先选定一个特定大小的窗口,将这个红色小方块输入卷积网络,卷积网络开始进行预测,即判断红色方框内有没有汽车,滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只是红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个位置,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类,这就是所谓的图像滑动窗口操作。也可以选择一个更大的窗口,截取更大的区域并输入给卷积网络处理。你可以根据卷积网络对输入大小的要求调整这个区域。以上是以固定步幅滑动窗口,遍历整幅图像输出结果。这样做,不论car在图像中的什么位置,总有一个窗口可以检测到它。滑动窗口目标检测算法也有明显的缺点就是计算成本,因为你在图像中剪切出太多小方块,卷积网络要一个个处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗粒度可能会影响性能,反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。
Convolutional implementation of sliding windows:为了构建滑动窗口的卷积应用,首先要知道如何将神经网络的全连接层转化成卷积层。如下图,假设对象检测算法输入一个14*14*3的图像,使用16个filter,大小为5*5,在filter处理后输出为10*10*16,然后通过2*2的最大池化(pooling)操作使图像减少到5*5*16,然后添加一个连接400个单元的全连接层,接着再添加一个全连接层,最终通过softmax输出Y,用4个数字来表示Y,这四个分类可以是人、car、背景或其它对象。如何把这些全连接层转化为卷积层?针对第一个全连接层,我们可以用5*5的filter来实现,数量是400个,输出是1*1*400。再添加另外一个卷积层,filter的大小是1*1,数量是400。最后经由1*1的filter的处理得到一个softmax**值。
通过卷积实现滑动窗口对象检测算法,如下图,假设向滑动窗口卷积网络输入14*14*3的图像。测试集图像是16*16*3,在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络,生成1或0分类,接着滑动窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1,依次将其它框输入卷积网络。我们在这个16*16*3的图像上滑动窗口,卷积网络运行了4次,于是输出了4个标签(labels)。结果发现,这4次卷积操作中的很多计算都是重复的。滑动窗口的卷积应用,使得卷积网络在这4次操作过程中很多计算都是重复的。如果直接将这个16*16*3的图像输入网络,输出是2*2*4,而不是1*1*4。所以该卷积操作的原理是我们不需要把输入图像分割成4个子集分别执行前向操作,而是把它们作为一张图像输入给卷积网络进行计算,其中的公有区域可以共享很多计算。假如对一个28*28*3的图像应用滑动窗口操作,如果以同样的方式运行前向操作(forward prop),最后得到8*8*4的结果。我们可以对大小为28*28*3的整张图像进行卷积操作,一次得到所有预测值,如果足够幸运,神经网络便可以识别出car的位置。这个算法存在一个缺点就是边界框的位置可能不够准确。
Bounding box predictions:在滑动窗口中,你取离散的位置集合,然后在它们上面跑分类器,在这种情况下,这些边界框,没有一个能完美匹配car位置。其中一个能得到更精准的边界框的算法是YOLO算法。YOLO意思是你只看一次。如下图,大体描述为:比如你的输入图像是100*100的,然后再图像上放一个网格,假如用3*3的网格,将图像分类和定位算法应用到9个格子上,需要这样定义训练标签,对于9个格子中的每一个指定一个标签y,每个格子都有一个这样的向量[pc,bx,by,bh,bw,c1,c2,c3],YOLO算法的做法是取car的中点,然后将这个car分配给包含对象中点的格子。目标输出是3*3*8,因为这里有3*3格子,然后对于每个格子,你都有一个8维向量y。把car分配到一个格子的过程是观察car的中点,然后将这个car分配到其中点所在的格子,所以即使car可以横跨多个格子,也只会被分配到9个格子其中之一。LOYO算法可以达到实时识别。
Intersection over union(交并比):如何判断对象检测算法是working well,可以通过交并比函数(intersection over union, IoU),如下图,如果实际边界框是红色框,你的算法给出的是紫色的边界框,交并比函数做的是计算两个边界框交集和并集之比。一般约定,在计算机检测任务中,如果IoU大于或等于0.5就说检测正确,一般约定0.5是阈值,但是也可以根据实际需求定义更大的阈值。
Non-max suppression(非极大值抑制):你的算法可能对同一个对象作出多次检测,非最大值抑制可以确保你的算法对每个对象只检测一次。如下图,假如是一个19*19的格子,因为要在361个格子上都跑一次图像检测和定位算法,那么很多格子有车的概率都会很高,非最大值抑制就是清理这些检测结果。这个算法做的是,首先看看每次每个检测结果的概率pc,首先找概率最大的那个,如0.9,非最大值抑制就会逐一审视剩下的矩形,即和这个最大的边界框有很高交并比,高度重叠的其它边界框,那么这些输出就会被抑制,如0.6,0.7,变暗。接下来逐一审视剩下的矩形,找出概率最高的一个0.8,我们认为,这里也检测出一辆车,然后非最大值抑制算法就会去掉其它IoU值很高的矩形。所以,现在每个矩形都会被高亮显示或者变暗,如果你直接抛弃那些变暗的矩形,那就剩下高亮显示的那些,这就是最后得到的两个检测结果。非最大值意味着你只输出概率最大的分类结果。执行过程:首先这个19*19的网格上跑一遍算法,加入只有car检测,你会得到19*19*5的输出尺寸,[ pc,bx,by,bh,bw],接下来为了应用最大值抑制算法,我们对所有的边界框进行预测,需要先去掉比如pc<0.6的边界框,即算法认为这里存在car的概率至少为0.6,否则就抛弃。这就抛弃了所有概率比较低的输出边界框。接下来剩下的边界框,一直选择概率pc最高的边界框,然后把它输出成预测结果。接下来,抛弃所有剩下的边界框和这个边界框有很高交并比的边界框。接下来重复以上操作,把没处理的边界框都处理完。
Anchor boxes:如果你想让一个格子检测出多个对象,你可以使用Anchorboxes。如下图,3*3的格子,其中行人的中点和car的中点几乎在同一个地方,两者都落入到同一个格子中。Anchor boxes思路:预先定义两个不同形状的anchor box,把预测结果和这两个anchor box关联起来。一般来说,你可能会用更多的anchor box。接下来,你需要定义cost label,不是之前的向量的8个输出,而是16个输出,即3*3*16。如果一个格子中有三个对象或者两个对象都分配到一个格子中,算法对这两种情况处理不好,需要引入一些默认手段专门处理这种情况。
YOLO算法:如下图,首先构造训练集:训练一个算法去检测三种对象,行人、car和摩托,还需要显示指定完整的背景类别(backgroundclass),有三个类别标签,用两个anchorboxes,输出y是3*3*16(或3*3*2*8),然后训练一个卷积网络,输入是图像,卷积网络最后输出尺寸是3*3*16。
给出预测后,需要运行下非最大值抑制,如下图,因为使用2个anchor boxes,那么对于9个格子中任何一个都会有2个预测的边界框,它们中的一些概率pc会很低,注意有些边界框(boundingboxes)可以超出所在格子的高度和宽度。接下来,抛弃概率低的预测,最后你希望检测行人、car和摩托,那么你要做的是对于每个类别单独运行非最大值抑制产生最终的预测结果。
Region proposals(候选区域):R-CNN(带区域的卷积网络,regionswith convolutional networks),如下图,这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,此算法不再针对每个滑动窗执行检测算法,而是只选择一些窗口。选出候选区域的方法是运行图像分割算法,先找出可能的2000多个色块,然后在这个2000多个色块上放置边界框,然后在这2000多个色块上运行分类器,这样需要处理的位置可能要比滑动窗口少的多,可以减少卷积网络分类器的运行时间。
R-CNN算法的改进:如下图,基本的R-CNN算法是使用某种算法求出候选区域,然后对每个候选区域执行一次分类器,每个区域会输出一个标签并输出一个边界框。R-CNN算法不会直接信任输入的边界框,它也会输出一个边界框,这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好。现在R-CNN的一个缺点是太慢了。近些年,有了一些对R-CNN算法的改进工作,如FastR-CNN算法,用卷积实现滑动窗法,不过得到候选区域的聚类步骤仍然非常缓慢;FasterR-CNN算法,使用的是卷积神经网络而不是更传统的分割算法来获得候选区域色块。
GitHub:https://github.com/fengbingchun/NN_Test
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:吴恩达老师深度学习视频课笔记:目标检测 - Python技术站