3-2 特征点检测
特征点检测(Landmark detection)
假设你正在构建一个人脸识别应用,出于某种原因,你希望算法可以给出眼角的具体位置。
眼角坐标为(x,y) ,你可以让神经网络的最后一层多输出两个数字${l_x}$,${l_y}$,作为眼角的坐标值。如果你想知道两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点来表示这四个眼角。对神经网络稍做些修改,输出第一个特征点$({l_{1x}},{l_{1y}})$,
第二个特征点$({l_{2x}},{l_{2y}})$,依此类推,这四个脸部特征点的位置就可以通过神经网络输出了。
也许除了这四个特征点,你还想得到更多的特征点输出值。你还可以根据嘴部的关键点输出值来确定嘴的形状,从而判断人物是在微笑还是皱眉,也可以提取鼻子周围的关键特征点。为了便于说明,你可以设定特征点的个数,假设脸部有 64 个特征点,有些点甚至可以帮助你定义脸部轮廓或下颌轮廓。选定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。
具体做法是,准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出 1 或 0,1 表示有人脸, 0 表示没有人脸,然后输出$({l_{1x}},{l_{1y}})$……直到$({l_{64x}},{l_{64y}})$这里有 129 个输出单元,其中 1 表示图片中有人脸,因为有 64 个特征, 64×2=128,所以最终输出 128+1=129 个单元,由此实现对图片的人脸检测和定位。
如果你对人体姿态检测感兴趣,你还可以定义一些关键特征点,如胸部的中点,左肩, 左肘,腰等等。然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。
一旦了解如何用二维坐标系定义人物姿态,操作起来就相当简单了,批量添加输出单元,用以输出要识别的各个特征点的(x, y)坐标值。要明确一点,特征点的特性在所有图片中必须保持一致,就好比,特征点 1 始终是右眼的外眼角,特征点 2 是右眼的内眼角,特征点3 是左眼内眼角,特征点 4 是左眼外眼角等等。所以标签在所有图片中必须保持一致。