最近在做人臉識識別,使用的是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的註解,直接把介面的實現物件給取出,大家都知道,介面...