一、三个问题
1、图片分类问题是算法遍历图片,判断图片中是否又汽车。具体的过程就是一张图片输入到网络中会输出一个特征向量,将这个特征向量输入到softmax单元去预测图片的类型。
2、对象定位问题是指要在图片中说明对象的位置,现在设置对象标签,标签y=【Pc,bx,by,bh,bw,c1,c2,c3】,Pc代表图片中是否有对象,如果图片中存在目标对象那么Pc=1,如果不存在Pc=0,当Pc=0时,后面的参数就没有意义了。bx、by是目标在图片中的位置,坐标系是以图片的左上角为原点,图片的右下角坐标是(1,1)X轴是自左向右,Y轴是自上向下,bx和by的取值范围是0到1。bh、bw分别是目标占整张图片长和宽的比例,bh和bw的取值范围可以超过1,因为目标有可能超过一张图片的范围。c1、c2、c3分别代表着汽车、行人、摩托车,如果目标是汽车,这三个参数分别是1,0,0,1代表着存在,0代表不存在。因此使用标签y就可以清楚的描述图片中对象定位的问题。
3、对象检测问题(多个对象):不仅要用算法判断图片中是不是存在目标对象(比如是不是存在汽车),还要在图片中标记出目标的位置,用边框圈起来。
图片分类的思路可以帮助学习分类定位,而对象定位的思路又有助于学习对象检测。
二、基于滑动窗口的对象检测问题:
1、特征点检测:例如想要找到眼角的特征,眼角的特征是眼角在图片中的的坐标来展现的。又比如说获得嘴部的特征坐标,可以判断图片中人的表情,是在微笑还是皱眉等等。
2、如何使用卷积网络进行对象检测,采用的就是基于滑动窗口的对象检测:
假如现在在构建一个汽车的检测系统:
第一步:建立训练集,通过训练集训练卷积网络。
第二步:选定特定大小的窗口,将窗口圈住的区域输入到卷积网络中,判断输入图片中是否有汽车;接着移动滑动窗口,处理下一张图片…知道图片的最后一块区域。(图像滑动窗口操作)
滑动窗口产生的问题就是将一张图片分成若干个滑动窗口图片输入到网络中,这样增加了计算成本。
- 问题1
如何在卷积层应用滑动窗口:我们发现在一张图片中,滑动窗口截取的图片输入到网络中,很多的操作都是重复的,增加了计算的成本,卷积层应用滑动窗口就可以解决这个问题,减少计算成本。
- 在第一行的网络中,每输入14x14x3的图片就会产生一个1x1x4的向量,这也是一次滑动窗口的结果。
- 在第二行的网络中,16x16x3的图片输入产生2x2x4的向量,这2x2x4的结果就是输入16x16x3图片4次滑动窗口的结果,这样就相当于一次的输入就会产生4次的结果。我们不需要把图片分割成4个子集分别执行向前传播。在这滑动窗口分出的四块区域,有很多的公共区域可以共享很多的计算。
不过,还存在一个问题就是边界框的位置可能不准确:没有一个框子能完美的匹配汽车的位置。
- 问题2
能够得到更精准的边框算法:YOLO算法。
- 在输入图片中放入网格(图中的是3x3的网格,实际情况下网格会是19,或者更大,这样每个网格会更小)
- 对每个网格逐一采用对象定位算法,设置训练集标签如下图所示,每个网格产生一个标签。
- 存在有一个对象在两张图片中,YOLO的做法是取对象的中点,中点在哪张图片中,对象就属于哪张图片。
- 这个算法的优点就是能够输出准确的边界框。
- 问题3
如何判断对象检测算法表现良好:交并比函数(IoU)。交并比函数是两个边界框交集(即重叠区域)和两个边界框的并集区域的比值。IoU一般大于等于0.5,就认为检测是正确的,IoU的大小是人为规定的。IoU=黄色区域面积与绿色区域面积的比。
- 问题4
有的对象被检测多次,非最大值抑制就是确保算法对每个对象只执行一次。
具体做法就是查看每个对象的各个框子的相关概率,取相关概率最大值,其余所有和这个对象相关的框子输出将会被抑制。
- 问题5
现在每个格子只能检测到一个对象,尽管在网格的分割下,网格中出现多个对象的可能性很小,但是还是存在多个对象在一张图片中的情况。具体做法就是用到了Anchor Boxes的概念。将每个对象看作成一个Anchor,修改标签y。计算anchor1和人的IoU_1、anchor2和汽车的IoU2,比较IoU1和IoU2的大小,取较大值。
- 问题6
我们发现输入到卷积网络的图片不是每个都有对象,这样就造成了计算成本,因此R-CNN就是解决这个问题,只在有目标对象窗口进行卷积操作,我们称这些选出来的存在目标对象的窗口为候选区域,选出候选区域的方法是进行图像分割算法。图像分割算法首先在图片中找到色块,然后在色块上放置边界框,把边界框输入带卷积网络中。R-CNN算法的核心就是使用某种算法求出候选区域,然后在候选区域跑一下网络。