人脸关键点通常是基层的CNN然后连接FCN进行回归,这里计划将FCN改为全局加权平均池化来处理,意思说是卷积核的尺寸与输入map的尺寸相同,即K=H=W,则输出map为C∗1∗1即长度为CC的向量,此时称之为Global Depthwise Convolution(GDC),见MobileFaceNet,可以看成是全局加权池化,与 Global Average Pooling(GAP) 的不同之处在于,GDC 给每个位置赋予了可学习的权重(对于已对齐的图像这很有效,比如人脸,中心位置和边界位置的权重自然应该不同),而GAP每个位置的权重相同,全局取个平均,如图:
https://www.pianshen.com/article/76591199542/
替代FCN的好处:
全连接层的缺点
全连接层有一个非常致命的弱点就是参数量过大,特别是与最后一个卷积层相连的全连接层。一方面增加了Training以及testing的计算量,降低了速度;另外一方面参数量过大容易过拟合。虽然使用了类似dropout等手段去处理,但是毕竟dropout是hyper-parameter, 不够优美也不好实践。
GAP(Global Average Pooling)可以取代全连接层
我们要明确以下,全连接层将卷积层展开成向量之后不还是要针对每个feature map进行分类吗,GAP的思路就是将上述两个过程合二为一,一起做了。如图所示:
上面操作不禁让我想到采用深度可分离卷积来进行处理, 这篇文章居然已经用了该思路!https://blog.csdn.net/u011995719/article/details/79435615
大致在回想下深度可分离卷积原理:用单层卷积核分别和通道特征图分别卷积,如果卷积核尺寸和特征图尺寸相同,则每个通道生成一个值,这个值作为关键点的一个座标即可;
下图是常规CNN和深度可分类CNN示意图:https://blog.csdn.net/tintinetmilou/article/details/81607721
本次采用keras框架进行处理,我们看下keras的深度可分离卷积DepthwiseConv2D:
https://blog.csdn.net/c_chuxin/article/details/88581411
keras.layers.DepthwiseConv2D(kernel_size, strides=(1, 1), padding='valid', depth_multiplier=1, data_format=None, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, bias_constraint=None)
理论思考完毕;实践马上到来: