最近在做一个人脸识别,使用的开源框架openface。

官网地址(openface):http://cmusatyalab.github.io/openface/

这篇文章主要是向大家资讯一个问题,是目前我还没有解决的问题。

第一:人脸识别的时间有1.7-2.0秒的时间,公司老板希望时间控制在1秒以内,最好0.3秒。

该测试数据是在本地虚拟机中,照片为80kb左右的识别结果

人脸识别的基本流程中有一个步骤是提取人脸,

也就是吧这种照片提取人脸,变成这种照片

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 获取图片的rep标识,供人脸识别和活体检测使用(训练&识别)
# authour:weichaojie
import cv2
import openface
import logging
import ds_config
import ds_errCode
import time
class util_getRep( object):
'''
图片预处理类
'''
def getRep( self, imgPath, multiple= False, imgDim= 96, cuda= False):
'''
获取人脸图片的特征向量
input:
imgPath:图片地址
output:
图片bgr表示和裁剪后的图片
或者false
'''
res = {}
try:
# 从图中抠人脸工具
align = openface.AlignDlib(ds_config.get( 'dlib_face_predictor')) #该行代码用时约1.3秒
bgrImg = cv2.imread(imgPath)
if bgrImg is None:
raise ds_errCode.IMG_UNDEFINED
rgbImg = cv2.cvtColor(bgrImg, cv2.COLOR_BGR2RGB)
if multiple:
bbs = align.getAllFaceBoundingBoxes(rgbImg)
else:
bb1 = align.getLargestFaceBoundingBox(rgbImg)
bbs = [bb1]
if len(bbs) == 0 or ( not multiple and bb1 is None):
raise ds_errCode.FACE_NOT_FOUND
landmarks=ds_config.get( 'landmark')
landmarkMap = {
'outerEyesAndNose': openface.AlignDlib.OUTER_EYES_AND_NOSE,
'innerEyesAndBottomLip': openface.AlignDlib.INNER_EYES_AND_BOTTOM_LIP
}
if landmarks not in landmarkMap:
raise ds_errCode.LANDMARK_UNKNOW
landmarkIndices = landmarkMap[landmarks]
# 获得人脸特征值网络
reps = []
for bb in bbs:
alignedFace = align.align(imgDim, rgbImg, bb, landmarkIndices=landmarkIndices)
t3 = time.time()
if alignedFace is None:
raise ds_errCode.FACE_NOT_FOUND
res[ 'bb'] = bb
res[ 'alignedFace'] = alignedFace
except Exception as e:
logging.exception(e)
return False
return res

这句话

align = openface.AlignDlib(ds_config.get( 'dlib_face_predictor')) #该行代码用时约1.3秒
ds_config.get( 'dlib_face_predictor' )#这是获取一个人脸提取的文件。为.bat文件

执行时间有1.3秒,也就是实例化一个人脸提取器,占据整个人脸识别时间的90%。

再往里面看

openface/align_dlib.py文件

def __init__( self, facePredictor):
"""
Instantiate an 'AlignDlib' object.

:param facePredictor: The path to dlib's
:type facePredictor: str
"""
assert facePredictor is not None

self.detector = dlib.get_frontal_face_detector()
self.predictor = dlib.shape_predictor(facePredictor)

这是使用了一个dlib方法。于是我又继续找着两个方法那个用时比较长。

同是我也感觉,走到这里,应可以确定不是自己的代码问题导致时间长。如果要是想解决问题,恐怕要了解dlib库的修改

。后面我发现,修改__init__构造方法,代码执行不受影响,感觉很是奇怪。

目录结构如下:


,到这里,我就排查不下去了。目前也就定位到这里:

align = openface.AlignDlib(ds_config.get( 'dlib_face_predictor')) #该行代码用时约1.3秒
希望有高手可以告诉我怎么增加这句话的执行速度也就是,人脸提取类的实例化速度。

第一次写博文。写的不好望见谅

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐