openface中例項化AlignDlib的優化

2021-08-14 07:30:04 字數 1894 閱讀 7957

最近在做人臉識識別,使用的是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

notcls._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即可。該方法可以將例項化的時間減少到忽略不計。第一次時間會長一點。之後的請求時,時間會大大減少。

JavaEE Bean例項化 例項工廠例項化

還有一種例項化bean的方式是採用是例項工廠,此種方式的工廠類中不再使用靜態方法建立bean例項,而是採用直接建立bean例項的方式,同時在配置檔案中,需要例項化的bean也並不是通過ckass屬性直接指向的例項化類,而是通過factory bean屬性指向配置的例項化工廠,然後使用factory ...

Spring中Bean的例項化

spring中bean的例項化 在介紹bean的三種例項化的方式之前,我們首先需要介紹一下什麼是bean,以及bean的配置方式。如果把spring看作乙個大型工廠,那麼spring容器中的bean就是該工廠的產品。要想使用spring工廠生產和管理bean,就需要在配置檔案中指明需要哪些bean,...

mybatis中的mapper例項化

很多人用過mybatis,或者使用過springdata,那麼和傳統的jdbc相比,差別在 呢?傳統的dao層,介面需要有實現,需要連線發出sql,需要接收返回值,但是mybatis只需要實現介面,而不需要實現類,而且神奇的是,可以通過spring的註解,直接把介面的實現物件給取出,大家都知道,介面...