人脸识别算法测试
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__的单位向量,通过比较两个向量的相似性即可得到两张人脸的相似性对量
其中,因为两个__Feature__都是单位向量,即A和B的模都是1,所以最终,两个图像的特征值的相似度可以用两个图像的特征值的点乘表示
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错误,也是出于这个原因
之后就是自己测试了。
后期会补上代码