学习神经网络的另一个问题,即定位分类问题,我们不仅要判断图中是不是一辆车,还要标记出它的位置。
如果你在构建汽车自动驾驶系统,那么对象可能包括:行人、汽车、摩托车和背景,这四个分类就是softmax函数可能输出的结果。
如果我们还想定位图片中汽车的位置,我们可以让神经元多输出几个单元,输出一个边界框,可以是四个数字
,这四个数字是被检测对象的边界框的参数化表示。
我们约定图片左上角为(0,0),右下角(1,1),要确定边框,需要指定红色方框的中心点
,边框的高度
和宽度
以下图为例,
的理想值为0.5,大约处于图片水平方向的中间;
大约是0.7,表示汽车处于垂直的
的位置;
约为0.3,因为红色方框的高度是图片高度的0.3倍;
约为0.4,红色边框的宽度约为图片宽度的0.4倍。
y为一个向量,
表示是否还有对象,如果属于前3类,则为1,是背景则为0。若果检测到对象,就输出被检测对象的4个边界框参数,同时输出
,表示该对象属于哪一类对象。这里我们假设只含有一个对象。
关于下面两张图片的具体表示,可以看到,当不存在对象时,以问好表示。
神经网络可以通过输出图片上特征点的
坐标来实现对目标特征的识别。
如果你正在构建一个人脸识别应用,你希望算法给出眼角的具体位置,可以让神经网络的最后一层多输出两个数字
,如果你想知道四个眼角的具体位置,那么从左到右可以输出两个特征点
,如果你还想获取更多特征点输出值,都可以以坐标的形式加入
这样就构建了64个特征,来实现图片的人脸检测。当然你也可以定义人体姿态检测的关键特征点,头部、胸部、手肘等等
学过了对象定位和特征点检测,我们来构建一个对象检测算法。通过卷积网络进行对象检测,采用基于滑动窗口的目标检测算法。
假如构建一个汽车检测算法,首先创建一个标签训练集,我们可以裁剪掉汽车以外的部分,使汽车居于中间并占据整张图片,然后开始训练神经网络,训练完这个卷积网络,就可以用它来实现滑动窗口目标检测
首先选定一个特定大小的窗口,将这个红色小块输入卷积神经网络,检测并输出0或1,然后以固定步幅活动窗口,遍历整个图像;第二次增大红框,重复上述检测步骤;第三次重复操作,选用更大的窗口,这样,不论汽车在图片的哪个位置,总有一个窗口可以检测到它。
这样滑动窗口太慢,计算成本很大
将神经网络的全连接层转化为卷积层,用卷积层层代替全连接层
下图,图二为检测,在最初的滑动我们会预测分类0或1,然后与图一相同的变换到最后得到的2x2x4。很多计算时重复的,可以共享参数
滑动窗口法的卷积实现效率很高,有个缺点,无法输出最精准的边界框。
YOLO算法,比较难,后续专门研究分享一下
计算两个边框的交集和并集之比(loU),当交并比大于等于0.5,认为检测正确
非极大值意味着只输出概率最大的分类结果,但抑制很接近(loU较高)但不是最大的其他预测结果。
如下图,首先抛弃
然后while循环操作:
如果你想让一个格子检测多个对象,可以使用anchor box
如上图,当行人和汽车的中点几乎在同一个地方,我们需要在两个检测结果选一个(其实我认为我们可以输出连个类别,但是这里还需要输入边界框,所以只能输出一个类别),我们定义如下的anchor box,相当于将上述anchor box重复了一遍
R-CNN、Fast R-CNN先选出带区域的卷积网络,不再对每个滑动窗运行检测算法。