1.目标定位
(1)定义
目标定位就是在图片中,定位对象的位置,对于对象的位置可以用框圈住显示。如下图所示:
假设正在进行图片分类工作,那么这个汽车图片很有可能被分类为汽车类别。对于目标定位,我们不仅要判断是否是汽车类别,还要定位其在图片中的位置,当然如果图片不止有一个目标对象,就需要定位多个对象的位置。
在图片分类问题中,卷积神经网络的输出的特征向量会经过softmax单元,并最终输出类别,如果正在构建汽车自动驾驶系统的网络,那么对象可能包括以下几类:行人、汽车、摩托车和背景,这意味着图片中不含有前三种对象,也就是说图片中没有行人、汽车和摩托车,输出结果会是背景对象,这四个分类就是softmax函数可能输出的结果。
(2)标签定义
但是如果想要定位对象的位置,我们就不仅仅要给出类别的输出,还需要给出坐标输出。规定:图片的左上角建立坐标系,坐标轴方向沿图片的宽和高方向,则输出中需要包含对象的中心坐标、宽和高。下面给出目标检测任务中的目标标签y的符号定义:
其中,pc的含义是被检测对象属于某一分类的概率,bx和by表示对象的中心坐标,bw和bh表示对象的宽和高,同时输出c1、c2和c3表示该对象属于1-3类中的哪一类(假设对象有3种类别)。由于假设图片中只含有一个对象,所以针对这个分类定位问题,图片最多只会出现其中一个对象。
(3)损失函数定义
假设采用平方误差策略,则损失值等于每个元素相应差值的平方和:
如果图片中存在定位对象,那么y1=1,所以损失值就是不同元素的平方和,平方误差策略可以减少这8个元素预测值和实际输出结果之间差值的平方。
另一种情况是不存在定位对象,那么y1=0,损失值就是y1这项的差的平方,因为对于这种情况,我们不用考虑其它元素(目标的定位、宽高、分类等),只需要关注神经网络输出的准确度,即对于不含目标检测对象的图片,网络的输出是否正确。
实际应用中,可以不对分类的那部分向量(c(i))和softmax激活函数应用对数损失函数,并输出其中一个元素值,通常做法是对边界框坐标应用平方差或类似方法,对pc应用逻辑回归函数,甚至采用平方预测误差也是可以的。
2.特征点检测
有时,我们需要对图片中的一些点定位,这些点是图片的特征点,比如人脸识别中眼角的定位,嘴角的定位,如下图所示:
假设正在构建一个人脸识别的网络,我们希望算法可以给出眼角的具体位置。眼角坐标为(x,y),可以让神经网络的最后一层多输出两个数字lx和ly来作为眼角的坐标值。如果想知道两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点来表示这四个眼角。对神经网络稍做些修改,输出第一个特征点(l1x,l1y),第二个特征点(l2x,l2y),依此类推,这四个脸部特征点的位置就可以通过神经网络输出了。如果有多个特征点,就需要让网络最后一层按规定的顺序输出多个特征点的坐标。
假设需要定位眼角的四个特征点,那么网络最后一层应该包含4*2+1=9个神经元,加1表示进行目标检测的神经元,在人脸识别中就表示是否有人脸,4*2表示4个特征点需要8个神经元来输出坐标(每个特征点均有x、y两个值表示坐标)。
一旦了解如何用二维坐标系定义特征点坐标,操作起来就相当简单,批量添加输出单元,用以输出要识别的各个特征点的坐标值。
注意:特征点的特性在所有图片中必须保持一致,就好比,特征点1始终是右眼的外眼角,特征点2是右眼的内眼角,特征点3是左眼内眼角,特征点4是左眼外眼角等等。