openface中实例化AlignDlib的优化

最近在做人脸识识别,使用的是openface框架结构。开发出来之后可以使用,但是效率比较慢,时间大概在1.8s左右。这个速度根本无法满足使用需要。于是,由于工作需要便开始优化识别速度。

经过打断点等方式,成功定位到文问题所在。

openface.AlignDlib('openface/models/dlib/shape_predictor_68_face_landmarks.dat')

就是这句话使用了1.3秒左右,之后发现  shape_predictor_68_face_landmarks.dat      文件有90多兆。


由此我们点位到问题所在,解决方式有以下几种:

1,实例化  AlignDlib  时间过长,我们可以保存实例化后的结果到文件,每次从这个文件直接读取。不用再实例化这个类。

2,实例化之后,长期保存到内存中。需要使用时。直接从内存调取。

 

方案一:我们是用了python提供的cpickle模块,将生成的实例变量保存到磁盘中。代码如下

import cPickle as pickle
import openface
objFile = '/root/openface/obj_file/AlignDlib.pkl'
dlib_face_predictor = '/root/openface/shape_predictor_68_face_landmarks.dat'
align = openface.AlignDlib(dlib_face_predictor)
f1 = file(objFile, 'wb')
pickle.dump(align, f1, True)
f1.close()
保存好之后的读取

t2 = pickle.loads(objFile)

读取出来的结果可以可以直接当做实例对象使用。使用该方法,可以实例化过程时间优化为0.7秒,减少将近50%的时间。


方案二:

我的python项目是使用uwsgi和nginx搭建的,由uwsgi守护入口文件,基本思路是:在入口文件引入一个单例模式类(single_objmodel)并实例化;

single_objmodel.py 文件代码如下:

import ds_config
import openface
class single_objmodel ( object):
'''
单例模式,实例化时,保存alignDlib实例对象到类变量,方便后续调用
alignDlib:alignDlib实例对象保存位置
'''
_instance = None
alignDlib = None
def __new__( cls, * args, ** kw):
if not cls._instance:
cls._instance = super(single_objmodel, cls). __new__( cls, *args, **kw)
return cls._instance
def __init__( self):
self. __class__.alignDlib = openface.AlignDlib(' /root/openface/shape_predictor_68_face_landmarks.dat')

在入口文件实例化该类,在需要使用alignDlib的位置,引入single_objmodel,并获取类变量alignDlib即可。该方法可以将实例化的时间减少到忽略不计。第一次时间会长一点。之后的请求时,时间会大大减少。


你可能感兴趣的:(python,AI,openface)