dlib中的人脸识别原理

这里的原理是我根据代码进行的理解,但不一定正确

这里讨论的是人脸识别,不是人脸检测,因为人脸检测的原理我大致了解,即使不用dlib,使用各种RCNN都可以实现,所以不过多深究

dlib中是先检测都人脸,然后把人脸通过Resnet生成一个128维的向量,Resnet有几种不同深度的结构(图片来自https://raw.githubusercontent.com/raghakot/keras-resnet/master/images/architecture.png)

dlib使用的是34层的网络,参考http://dlib.net/dnn_imagenet_train_ex.cpp.html,里面提到resnet34

而且下面的代码,看起来也和34层网络一致(其实是我C++不好,没怎么看懂,看着像而已)

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维的向量了

完毕

猜你喜欢

转载自blog.csdn.net/zhqh100/article/details/85072275