人脸特征点检测(三)基于神经网络的方法:VGG,Mobilenet-v2尝试

本篇主要尝试着用CNN做特征点检测。主要尝试VGG, MobilenetV2的结构。
代码https://github.com/goodluckcwl/Face-alignment-mobilenet-v2

VGG尝试

VGG的结构包含两个卷积加一个ReLU。

网络结构设计

网络输入大小确定为 70×60 70 × 60 ,这个大小的输入设计几个卷积层就足够了。设计的网络结构如下:

Input Operator channels stride pad kernel size
70×60×3 70 × 60 × 3 Conv2d 64 1 1 3×3 3 × 3
70×60×64 70 × 60 × 64 Conv2d 64 1 1 3×3 3 × 3
70×60×64 70 × 60 × 64 Pooling - 2 - 2×2 2 × 2
35×30×64 35 × 30 × 64 Conv2d 128 1 1 3×3 3 × 3
35×30×128 35 × 30 × 128 Conv2d 128 1 1 3×3 3 × 3
35×30×128 35 × 30 × 128 Pooling - 2 - 2×2 2 × 2
18×15×128 18 × 15 × 128 Conv2d 192 1 1 3×3 3 × 3
18×15×192 18 × 15 × 192 Conv2d 192 1 1 3×3 3 × 3
18×15×192 18 × 15 × 192 Pooling - 2 - 2×2 2 × 2
9×8×192 9 × 8 × 192 Conv2d 256 1 0 3×3 3 × 3
8×7×256 8 × 7 × 256 Inner Product 256 - - -
256 256 Dropout - - - -
256 256 Inner Product 136 - - -

Dropout比率设置

分别尝试了0~1之间的dropout比率,最佳值为0.3。

目标函数

用相对于瞳距归一化的欧式距离损失函数,可以收敛。主要的trick是图片要扩增,以及学习率要调整。

最终示例图片如下:
人脸特征点检测(三)基于神经网络的方法:VGG,Mobilenet-v2尝试_第1张图片
这个结果其实不是特别好,有比较多的改进的地方。

MobileNetv2尝试

MobileNetv2构造了一个线性嵌入层的逆残差模块:首先把低维表达映射到高维表达,用depthwise卷积来提取特征,最后再把特征通过一个线性的卷积层投影回低维表达。通过这种方式减少了参数。

网络结构设计

决定采用MobileNetv2,具体的结构设计经过实验,结合输入的图片的大小(采用64*64的输入),采用如下的结构:

Input Operator t channels n stride
642×3 64 2 × 3 conv2d - 16 1 2
322×16 32 2 × 16 bottleneck 6 24 1 2
162×24 16 2 × 24 conv2d 6 24 1 1
162×24 16 2 × 24 conv2d 6 32 1 2
82×32 8 2 × 32 conv2d 6 32 1 1
82×32 8 2 × 32 conv2d 6 64 1 2
42×64 4 2 × 64 conv2d 6 64 1 1
42×64 4 2 × 64 inner product - 200 1 -
200 200 inner product - 200 1 -
200 200 inner product - 50 1 -
50 50 inner product - 136 1 -

其中,每个卷积模块由下面几部分组成:

  • Conv层
  • BatchNorm层
  • Scale层
  • LeakyReLU层
    最后的全连接层映射到低维嵌入(50),再映射回landmark空间。

损失函数

损失函数采用标准的欧几里得损失函数,或者以瞳距归一化的欧几里得函数。

训练数据

  • 300W
  • Menpo

数据扩增

  • 随机镜像。
  • 随机旋转。从-30~30随机采样旋转的角度。
  • 随机平移。
  • 随机缩放。
  • 添加高斯噪声。

本文的代码已在github上,就不多说了。

你可能感兴趣的:(计算机视觉,人脸识别)