1. 目标定位
目标检测是计算机视觉领域中的一个新兴的应用方向,在构建目标检测之前,我们首先了解一下object localization目标定位。
前面说过的图片分类任务就是算法遍历图片,判断其中的对象是不是汽车,主要是图片分类
这里所说的目标定位指的是我们不仅要用算法判断图片中是不是一辆汽车,还要在图片中标记出它的位置,用边框或红色方框把目标 标注圈起来,这就是定位分类问题。其中定位的意思是 判断目标在图片中的具体位置。在目标检测问题中,图片可以包含有多个目标,甚至单张图片中会有多个不同分类的目标,因此图片分类的思路可以帮助学习分类定位,而目标定位的思路又有助于学习目标检测。
一般的图片分类问题,我们输入一张图片到多层卷积神经网络中,它会输出一个特征向量,并反馈给softmax单元来预测图片类型。如果我们想定位图片中的目标具体的位置,我们可以让神经网络多输出几个单元,具体来说就是让神经网络再多输出4个数字标记为bx、by、bh、bw。这四个数字是被检测对象的边界框的参数化表示。
(bx,by)表示为目标边界框的中心点坐标
bh表示为边界框的高度
bw表示为边界框的宽度
因此,训练集不仅要包含神经网络要预测的对象分类标签,还要包含表示边界框的这四个数字。接着采用监督学习算法,输出一个分类标签,还有这四个参数值,从而给出被检测对象的边界框位置。
2. 目标对象标签Y的定义
如何为监督学习任务定义目标标签y?
这里有四个分类,神经网络输出的是这四个数字和一个分类标签或分类标签出现的概率。
目标标签Y的定义如下:
它是一个向量,第一个组件Pc表示是否含有对象,如果对象属于前三类,则Pc=1,如果是background或者其他,则Pc=0,即图片中没有我们指定的对象。若我们检测到对象,则接下来会输出目标边界框的四个参数bx、by、bw、bh。如果存在某个目标对象,则除了输出Pc=1,边界框的四个参数,同时还会输出C1、C2、C3,表示该对象属于1~3中的哪一类,属于哪一类其对应的Cx就为1,其余为C为0。如果输入图片中没有以上的3中对象或者说只有背景时,那么Pc=0,那么标签Y中的其他参数将变得毫无意义,不要考虑边框坐标以及Cx的值。
所以针对给定的被标记的训练样本,不论输入图片是否含有定位对象, 构建输入图片X和分类标签Y的具体过程都是如此,这些数据最终定义了训练集。
训练神经网络的损失函数
其参数为类别Y和网络输出
,损失函数可以表示为
,如果采用平方误差策略,则
注意,这里的Y含有8个元素,损失值等于每个元素相应差值的平方和。
如果图片中存在定位对象,则
,损失值就是各个元素的平方和。另一种情况是
,也就是
,那么损失值是。因为对于此种情况,我们不用考虑其他元素,只需关注神经网络输出
的准确度。 为了了解目标定位的细节,这里用平方误差简化了描述过程。实际应用中,你可以不用对C1、C2、C3和softmax激活函数应用 对数损失函数并输出其中一个元素值,通常做法是对边界框坐标应用平方误差或类似方法,对
应用逻辑回归函数,甚至采用平方预测误差也是可以的。
3. 特征点检测
我们可以采集人脸中的64个特征点并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。具体做法是:准备一个卷积网络和一些特征点的数据集,将人脸输入卷积网络,输出0或1,输出1表示有人脸,然后输出
共64个特征点的坐标值,共129个输出单元,由此实现了对图片的人脸检测和定位;0表示无人脸,那么特征点坐标值数据便不再考虑了。这就是一个识别脸部表情的基本构造模块。
为了构建这样的网络,我们首先需要准备一个标签的训练集,也就是图片X和标签Y的集合,这些特征点都是人为花费大量时间手工标注的。
同样,如果我们做人体姿态检测,我们还可以在人体四肢各部位定义一些关键特征点,然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。当然,要实现这个功能,你需要设定这些关键特征点,从胸部中心点
一直到
共32个姿态特征点。