这里讨论的是人脸识别,不是人脸检测
dlib中是先检测都人脸,然后把人脸通过Resnet生成一个128维的向量,Resnet有几种不同深度的结构(图片来自https://raw.githubusercontent.com/raghakot/keras-resnet/master/images/architecture.png)
dlib使用的是34层的网络,参考dlib C++ Library - dnn_imagenet_train_ex.cpp,里面提到resnet34
而且下面的代码,也和34层网络一致
template <typename SUBNET> using level1 = res<512,res<512,res_down<512,SUBNET>>>;
template <typename SUBNET> using level2 = res<256,res<256,res<256,res<256,res<256,res_down<256,SUBNET>>>>>>;
template <typename SUBNET> using level3 = res<128,res<128,res<128,res_down<128,SUBNET>>>>;
template <typename SUBNET> using level4 = res<64,res<64,res<64,SUBNET>>>;
如果画的再详细点,应该是下面这个图(图片来自网络)
resnet34的最后一层是fc 1000,就是1000个神经元
resnet如何生成128维的向量的呢?
很简单,在fc1000后面再加一个Dense(128)就行了
生成向量之后再求两个向量之间的距离即可判定两个人脸的相似程度
那么如何从0开始构建一个和dlib一样的人脸识别网络呢?就是应该先构建一个resnet34,后面加一个Dense(128),后面再接分类,训练完成后舍弃最后Dense(128)接分类的那一部分,只保留前面的参数,这样每输入一张图片就可以得到一个128维的向量了
完毕