Кэширование загруженных моделей в модуле OpenCV DNN

#python #opencv

#python #opencv

Вопрос:

В OpenCV я загружаю сетевую модель Caffe:

 net = cv2.dnn.readNetFromCaffe("proto_file", "model_file")
 

Далее в моем коде я загружаю модель с изображениями:

 blob = cv2.dnn.blobFromImage(image)
net.setInput(blob)
 

Это работает просто отлично. Тем не менее, я хотел бы кэшировать загруженную сеть с шага 1 и избегать загрузки файлов с диска для каждого отдельного запроса к моему приложению. В идеале у меня было бы что-то вроде этого:

 import cv2

net = cv2.dnn.readNetFromCaffe("proto_file", "model_file")

def awesomeFn(image):
    blob = cv2.dnn.blobFromImage(image)
    net.setInput(blob)
 

Таким образом, я могу вызывать my awesomeFn столько раз, сколько захочу, не загружая сеть с диска. На моей машине шаг 1 (загрузка файлов моделей с диска) занимает от 6 мс до 12 мс.

Проблема, которую я вижу, net.setInput(blob) заключается в том, что у нас уже есть кэшированная и глобально объявленная сеть, которую мы передаем с данными. Если мое приложение обрабатывает пользовательские файлы, скажем, со скоростью 100 запросов в секунду, есть вероятность, что некоторые пользователи будут получать данные другого пользователя в ответе.

Есть ли какой-либо способ кэшировать сеть с шага 1 и загружать в нее только свежие данные каждый раз, когда поступает запрос? Я бы хотел любой ценой избежать загрузки модели с диска для каждого запроса.

Комментарии:

1. Будет ли приложение развернуто в Интернете? Если это так, я бы попытался найти другой, чтобы убедиться, что каждый пользователь получает правильный ответ. Если он выполняется локально, и вы просто имеете в виду, что к нему обращаются разные функции, он все равно будет вычислен в правильном порядке…

2. Да, он будет развернут в Интернете, поэтому мои опасения описаны в вопросе выше

3. Тогда я думаю, что это вопрос вашего (REST) дизайна API.

4. На самом деле, нет. Речь идет о повторном использовании уже загруженного DNN без необходимости загружать файлы с диска для каждого последующего запроса. Дизайн API / REST здесь не имеет значения.

5. ну, я думал, вы боитесь, что, если один пользователь отправляет запрос через 10 мс после другого, но он получает ответ быстрее, он получает неправильную классификацию. это, с моей точки зрения, предотвращается при правильной постановке в очередь?