V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Huelse
V2EX  ›  Python

请教,在 flask 等 web 服务下,怎么把 facenet 的 load_model 常驻或者全局化

  •  
  •   Huelse · 2019-06-01 12:43:32 +08:00 · 1964 次点击
    这是一个创建于 2000 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最新在学习人脸识别模型,

    我想尝试将其应用在 web 服务上,

    其中用到了 facenet 在 facenet 中有一个load_model()方法。 Link

    经过确认,这里面的saver.restore等是最耗时的,

    每次加载都会消耗大约 14 秒,这明显是不能接受的,我不能每次请求都要等这么久。

    所以我想将让其只在开启时加载一次,不知这个想法可行?

    我搜集了资料 比较贴近的有这么几个

    link0 link1 link2

    我按照上面的文章多次测试,要么 RuntimError,要么 graph is None,或者其他更可怕的错误

    主要的运行原代码

    # compare.py
    origin_data_path = ''
    img_path = ''
    args = parse_arguments(['./face/src/20180408-102900', img_path])
    images = load_and_align_data(args.image_files, args.image_size, args.margin, args.gpu_memory_fraction)
    with tf.Graph().as_default():
        with tf.Session() as sess:
            # 加载模型 这里耗时是最多的
            facenet.load_model(args.model)
            images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
            embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
            phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
            # 获取特征向量
            feed_dict = {images_placeholder: images, phase_train_placeholder: False}
            emb = sess.run(embeddings, feed_dict=feed_dict)
            # 保存到本地
            np.savetxt('', emb[0])
    

    我需要将其改写,小白初次接触,提前谢谢各位了!~

    6 条回复    2019-06-01 20:41:40 +08:00
    tankeco
        1
    tankeco  
       2019-06-01 12:49:34 +08:00
    糙快猛的话你就把 facenet 改成全局变量呗…好好搞的话 compare.py 做成 service
    askfermi
        2
    askfermi  
       2019-06-01 12:56:34 +08:00
    可以的,我是写成了类的成员。可供参考: https://github.com/cvmodel/Face_Utility/blob/master/face_utility/solver.py ,如果写成类似的格式,直接通过 cvpm 就可以调用- - 当然写成 flask 的也可以
    Huelse
        3
    Huelse  
    OP
       2019-06-01 18:43:28 +08:00
    通过不断地测试,总算找到比较合适的方法了,最后时间基本在 1 秒内,还是感谢二位了
    Huelse
        4
    Huelse  
    OP
       2019-06-01 18:44:21 +08:00
    不知道为啥,我不能 @了,说是注册时间不满 360 天,其实这是我小号。。。
    pyteam
        5
    pyteam  
       2019-06-01 18:59:52 +08:00
    @Huelse 什么方法?
    Huelse
        6
    Huelse  
    OP
       2019-06-01 20:41:40 +08:00
    @pyteam #5 就是把 saver 和 session 预先加载,后面用的时候注意用 as_default 等参数就行了,避免 with 上下文管理器释放资源
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3869 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:14 · PVG 12:14 · LAX 20:14 · JFK 23:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.