Python Flask / OpenCV: как кэшировать произвольный (OpenCV) объект между запросами? - PullRequest
0 голосов
/ 02 апреля 2019

В следующем фрагменте у меня есть обычное приложение Flask, вызывающее функцию из другого модуля python (также ниже).

Я бы хотел, чтобы (медленная / дорогая / произвольная) функция кэшировалась в памяти с помощью (скажем) Flask-Cache, так что его данные доступны между запросами.Я думал, что сами данные были статическими, но я думаю, что тот факт, что они являются объектами-детекторами ключевых точек OpenCV (например, SIFT, SURF, ORB и т. Д.), Означает, что их адреса меняются между запросами - и именно эти объекты создают проблемы длякеширование.

main.py:

# Run as
# python main.py

from flask import Flask, jsonify
from flask_cache import Cache
import backer
app = Flask(__name__)

@app.route('/get-result')
def get_result():
    cached_results = backer.do_some_work()
    return jsonify({'response': cached_results})

if __name__ == "__main__":
    app.run(host='localhost', port=8080, debug=True, threaded=True)

В backer.py У меня есть:

import time

from flask import Flask
from flask_cache import Cache

app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

import cv2
import numpy as np

@cache.cached(timeout=300, key_prefix='all_comments')
def get_all_comments():
    comments = range(10000)
    time.sleep(2)  # do_serious_dbio()
    print 'cache complete'

    if not cache.get('detector'):
        detector = cv2.ORB_create()
        cache.set('detector',detector)
    else:
        detector = cache.get('detector')

    return comments, detector

def do_some_work():
    cached, detector = get_all_comments()

    work_done = [2.0 * c for c in cached]

    print detector

    image = np.random.randint(255, size=(128, 128, 3), dtype=np.uint8)
    kp, des = detector.detectAndCompute(image, None)

    return work_done

По первому запросу все хорошо:

curl http://localhost:8080/get-result

По второму запросу я получаю:

    kp, des = detector.detectAndCompute(image, None)
TypeError: Incorrect type of self (must be 'Feature2D' or its derivative)

Обратите внимание, что detector меняет свой адрес между запросами, например,

<ORB 0x121976070>
<ORB 0x10fc74fb0>

(i) Это два взаимосвязанных?

(ii) Есть ли у Flask способ кэшировать произвольный объект, такой как экземпляр OpenCV ORB (правильный адрес и все)?или

(iii) Должен ли я каким-то образом сериализовать / выделить ключевые точки, дескрипторы и другие атрибуты объектов ORB?или

(iv) Есть ли другой способ, см. например, Сохранение объекта OpenCV в памяти на python ?

Как всегда

...