人脸识别算法测试

opencv 加载oOpenFace 人脸识别模型

//加载人脸检测模型
std::string modelConfiguration = "./deploy_lowres.prototxt";
std::string modelBinary = "./res10_300x300_ssd_iter_140000_fp16 .caffemodel";

//初始化网络
Net detectNet = readNetFromCaffe(modelConfiguration, modelBinary);


//加载识别模型
std::string recongnitionModel = "./openface.nn4.small2.v1.t7";
Net recoNet = readNetFromTorch(recongnitionModel);

cv::String dataBasePath="/FaceRegister/FaceRegister";
std::map<std::string,cv::Mat>  dataBaseF =  \
faceDatabaseFeature(dataBasePath,detectNet,recoNet);

其中,__deploy_lowres.prototxt__和__es10_300x300_ssd_iter_140000_fp16 .caffemodel__文件是用于检测检测人脸的工作,将检测到的人脸__faces__返回,接着用__openface.nn4.small2.v1.t7__模型将这个faces映射到为一个128维的向量,通过计算向量的相似度,即可得出比较结果

cv::Mat inputBlob = cv::dnn::blobFromImage(  \
face, inScaleFactor, cv::Size(inWidth, inHeight), meanVal, true,false);

net.setInput(inputBlob);
cv::Mat detection = net.forward().clone();

注:这个步骤所得的正确率非常低,应该是其中某一个部分出错,可能的问题是人脸没有对齐(alignment)的原因

根据openface计算得到的向量,可以发现根据人脸得到的向量,是__Feature∈128*1__的单位向量,通过比较两个向量的相似性即可得到两张人脸的相似性对量
海康人脸识别 架构 api 海康人脸识别算法_CUDA
其中,因为两个__Feature__都是单位向量,即A和B的模都是1,所以最终,两个图像的特征值的相似度可以用两个图像的特征值的点乘表示
海康人脸识别 架构 api 海康人脸识别算法_CUDA_02

python 测试tf_insightface 第三方模型

注意

  • 有多个文件夹的时候,如果一个文件夹要引用另外的文件夹的文件,在在这个文件夹里面需要加一个
__init__.py
  • 如果要引用当前文件夹下面的文件
from . import moduleName

requirement

face_recognition
numpy
cv2
tensorflow

安装完成之后,开始测试代码

x1_rltv = x1 / self.cam_w
x2_rltv = x2 / self.cam_w
y1_rltv = y1 / self.cam_h
y2_rltv = y2 / self.cam_h

_face_area = frame[y1:y2, x1:x2, :]
  • 在源代码中作者的代码是通过x1 , x2, y1, y2 的坐标,从原图像中获取人脸部分图像,但是作者使用的方式是
_face_area = frame[ x1:x2, y1:y2, :]

最终,这个第三方模型实现不符合预期,效果太差

python 测试insightFace

测试基于mxnet实现的insightface模型

前期准备:

  • 安装cuda
  • 安装对应的nvidia 显卡

由于mxnet 是比较早期的项目实现的,因此采用的是python2.7。建议在安装显卡和cuda前先看看nvidia官网nvidia

CUDA Toolkit

Linux x86_64 Driver Version

Windows x86_64 Driver Version

CUDA 10.2.89

>= 440.33

>= 441.22

CUDA 10.1 (10.1.105 )

>= 418.39

>= 418.96

CUDA 10.0.130

>= 410.48

>= 411.31

CUDA 9.2 (9.2.148 Update 1)

>= 396.37

>= 398.26

CUDA 9.2 (9.2.88)

>= 396.26

>= 397.44

CUDA 9.1 (9.1.85)

>= 390.46

>= 391.29

CUDA 9.0 (9.0.76)

>= 384.81

>= 385.54

CUDA 8.0 (8.0.61 GA2)

>= 375.26

>= 376.51

CUDA 8.0 (8.0.44)

>= 367.48

>= 369.30

CUDA 7.5 (7.5.16)

>= 352.31

>= 353.66

CUDA 7.0 (7.0.28)

>= 346.46

>= 347.62

安装完显卡之后

pip install mxnet-cu100

#test.py
import mxnet as mx
mx.nd.array([0], ctx = mx.gpu(0))

运行, 之前cuda和显卡装得不匹配,导致运行这段代码出现问题:

mxnet.base.MXNetError: [14:40:28] src/storage/storage.cc:119: Check failed: 
e == cudaSuccess || e == cudaErrorCudartUnloading CUDA: CUDA driver version is
 insufficient for CUDA runtime version

在github insightface官网上有人提出了simple_bind错误,也是出于这个原因

之后就是自己测试了。

后期会补上代码