最近在做人脸识识别,使用的是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即可。该方法可以将实例化的时间减少到忽略不计。第一次时间会长一点。之后的请求时,时间会大大减少。