Функция, загруженная за пределами функции Flask, дает ошибку при использовании внутри функции - PullRequest
0 голосов
/ 12 июля 2020

У меня есть библиотека imagedup, загруженная в python, и инициализация ее функции CNN() занимает довольно много времени, поэтому я подумал, что инициализирую ее глобально. Однако, когда я пытаюсь использовать предварительно загруженный модуль внутри функции flask, он выдает ошибку.

from imagededup.methods import CNN
from flask import jsonify
cnn_encoder = CNN()

encodings = {}


def encode(image_directory, picture, module):
    if picture not in encodings.keys():
        encoding = cnn_encoder.encode_image(image_file=image_directory + "\\" + picture)[0]
        encodings[picture] = encoding
        return jsonify({"status": "S",
                        "message": "[+] Encoded Image: " + picture,
                        "data": {}})
    else:
        return jsonify({"status": "S",
                        "message": "[*] " + picture + " is already encoded.",
                        "data": {}})

После запуска encode() из запроса POST я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\Aniru\Desktop\Photo Sorting App\main.py", line 34, in parser_process
    return detect_similarities.encode(params["filepath"], params["picture"], params["module"])
  File "C:\Users\Aniru\Desktop\Photo Sorting App\library\modules\detect_similarities.py", line 50, in encode
    encoding = cnn_encoder.encode_image(image_file=image_directory + "\\" + picture)[0]
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\imagededup-0.2.2-py3.7-win-amd64.egg\imagededup\methods\cnn.py", line 151, in encode_image
    if isinstance(image_pp, np.ndarray)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\imagededup-0.2.2-py3.7-win-amd64.egg\imagededup\methods\cnn.py", line 76, in _get_cnn_features_single
    return self.model.predict(image_pp)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1113, in predict
    self, x, batch_size=batch_size, verbose=verbose, steps=steps)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 195, in model_iteration
    f = _make_execution_function(model, mode)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 122, in _make_execution_function
    return model._make_execution_function(mode)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1989, in _make_execution_function
    self._make_predict_function()
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1979, in _make_predict_function
    **kwargs)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 3201, in function
    return GraphExecutionFunction(inputs, outputs, updates=updates, **kwargs)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 2939, in __init__
    with ops.control_dependencies(self.outputs):
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\ops.py", line 5028, in control_dependencies
    return get_default_graph().control_dependencies(control_inputs)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\ops.py", line 4528, in control_dependencies
    c = self.as_graph_element(c)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\ops.py", line 3478, in as_graph_element
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
  File "C:\Users\Aniru\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\ops.py", line 3557, in _as_graph_element_locked
    raise ValueError("Tensor %s is not an element of this graph." % obj)
ValueError: Tensor Tensor("global_average_pooling2d/Mean:0", shape=(?, 1024), dtype=float32) is not an element of this graph.

Однако после помещения cnn_encoder = CNN() внутри encode() код работает нормально, но выполнение занимает очень много времени. Как я могу загрузить модуль CNN() перед запуском функции кодирования?

Еще один вопрос, который у меня был, заключался в том, будут ли значения внутри encodings постоянными при каждом запросе, который я делаю к flask?

...