本篇主要尝试着用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是图片要扩增,以及学习率要调整。
最终示例图片如下:
这个结果其实不是特别好,有比较多的改进的地方。
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上,就不多说了。