人脸识别算法测试

人脸识别算法测试

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__的单位向量,通过比较两个向量的相似性即可得到两张人脸的相似性对量
c o s θ = A B ∣ ∣ A ∣ ∣ ∗ ∣ ∣ B ∣ ∣ cos\theta=\frac{AB}{||A||*||B||} cosθ=ABAB
其中,因为两个__Feature__都是单位向量,即A和B的模都是1,所以最终,两个图像的特征值的相似度可以用两个图像的特征值的点乘表示
c o s θ = A B cos\theta=AB cosθ=AB

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 ToolkitLinux x86_64 Driver VersionWindows 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错误,也是出于这个原因

之后就是自己测试了。

后期会补上代码

1. 数据集介绍 ORL数据集是一个经典的人脸识别数据集,包含400张灰度人脸图像,每张图像的大小为92×112像素,共有40个人,每个人有10张不同姿态的照片。该数据集主要用于人脸识别算法的评估和比较。 2. LBPH算法介绍 Local Binary Pattern Histogram(LBPH)是一种基于局部二值模式的人脸识别算法,它主要通过计算图像中每个像素点周围像素点的灰度值来提取特征。LBPH算法简单易实现,具有较高的识别率和鲁棒性,在人脸识别领域得到了广泛应用。 3. 实验步骤 (1)数据集的预处理: 将ORL数据集中的400张人脸图像分为训练集和测试集,其中训练集包含每个人的前8张照片,测试集包含每个人的后2张照片。 (2)特征提取: 使用LBPH算法对训练集中的人脸图像进行特征提取,提取得到的特征向量作为训练数据。 (3)模型训练: 将训练集中的特征向量输入到支持向量机(SVM)分器中进行训练。 (4)测试: 使用测试集中的人脸图像进行测试,将测试集中的人脸图像输入到LBPH算法中进行特征提取,将提取得到的特征向量输入到训练好的SVM分器中进行分,得到分结果。 (5)性能评估: 将测试集中的人脸图像分结果与其真实标签进行比对,计算分准确率、召回率和F1值等性能指标。 4. 实验结果 使用上述方法对ORL数据集进行测试,得到的分结果如下所示: 准确率:97.5% 召回率:97.5% F1值:97.5% 可以看出,LBPH算法在ORL数据集上取得了很好的识别效果,证明了其在人脸识别领域的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值