公司需要在项目中使用人脸识别SDK,并且对信息安全的要求非常高,在详细了解市场上几个主流人脸识别SDK后,综合来看虹软的Arcface SDK比较符合我们的需求,它提供了免费版本,并且可以在离线环境下使用,这一点非常符合我们对安全性的要求。但有个遗憾的事情,我们的项目主要使用了Python语言,虹软官方并没有提供Python版本的SDK,因此我自己使用Python封装了Arcface C++ SDK,便于在项目中使用,这里将主要过程写出来供大家探讨下。
Python资源共享群:626017123
1.环境说明
a.注意Win64环境的Python必须使用ArcFace C++(Win64) SDK,如果平台不一致, 否则可能会出现以下错误。
OSError: [WinError 193] %1 不是有效的 Win32 应用程序
b.由于SDK中涉及到内存操作,本文使用了ctypes包和cdll包提供的以下几种方式
c_ubyte_p = POINTER(c_ubyte) memcpy = cdll.msvcrt.memcpy malloc = cdll.msvcrt.malloc malloc.restype = c_void_p free = cdll.msvcrt.free
2.Arcface SDK基本数据结构封装
在封装数据结构时,一定要注意参数类型,否则可能会导致程序出错。
class MRECT(Structure): # 人脸框 _fields_ = [(u'left', c_int32), (u'top', c_int32), (u'right', c_int32), (u'bottom', c_int32)] class ASFVersion(Structure): # 版本信息 版本号 构建日期 版权说明 _fields_ = [ ('Version', c_char_p), ('BuildDate', c_char_p), ('CopyRight', c_char_p)] class ASFSingleFaceInfo(Structure): # 单人脸信息 人脸框 人脸角度 _fields_ = [ ('faceRect', MRECT), ('faceOrient', c_int32)] class ASFMultiFaceInfo(Structure): # 多人脸信息 人脸框数组 人脸角度数组 人脸数 _fields_ = [ (u'faceRect', POINTER(MRECT)), (u'faceOrient', POINTER(c_int32)), (u'faceNum', c_int32)] class ASFFaceFeature(Structure): # 人脸特征 人脸特征 人脸特征长度 _fields_ = [ ('feature', c_void_p), ('featureSize', c_int32)] class ASFFace3DAngle(Structure): # 人脸角度信息 _fields_ = [ ('roll', c_void_p), ('yaw', c_void_p), ('pitch', c_void_p), ('status', c_void_p), ('num', c_int32)] class ASFAgeInfo(Structure): # 年龄 _fields_ = [ (u'ageArray', c_void_p), (u'num', c_int32)] class ASFGenderInfo(Structure): # 性别 _fields_ = [ (u'genderArray', c_void_p), (u'num', c_int32)] class ASFLivenessThreshold(Structure): # 活体阈值 _fields_ = [ (u'thresholdmodel_BGR', c_float), (u'thresholdmodel_IR', c_int32)] class ASFLivenessInfo(Structure): # 活体信息 _fields_ = [ (u'isLive', c_void_p), (u'num', c_int32)]
3.Arcface SDK接口封装
a.接口封装之前需要加载dll库,Arcface SDK 提供的dll都需要加载。
b.本文中图片格式使用了ASVL_PAF_RGB24_B8G8R8。
c.每个接口都需要定义返回值以及参数类型,某些参数类型依赖前文所述的基本数据结构。
from arcsoft_face_struct import * from ctypes import * from enum import Enum face_dll = CDLL("libarcsoft_face.dll") face_eng