predict: fix bug where memory can leak if detection fails

tf: request restart if detection fails
This commit is contained in:
Koushik Dutta
2023-03-06 09:34:04 -08:00
parent fa89a5ad24
commit fbaa8a31cf
4 changed files with 24 additions and 13 deletions

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/tensorflow-lite",
"version": "0.0.108",
"version": "0.0.109",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/tensorflow-lite",
"version": "0.0.108",
"version": "0.0.109",
"devDependencies": {
"@scrypted/sdk": "file:../../sdk"
}

View File

@@ -44,5 +44,5 @@
"devDependencies": {
"@scrypted/sdk": "file:../../sdk"
},
"version": "0.0.108"
"version": "0.0.109"
}

View File

@@ -13,6 +13,7 @@ from detect import DetectionSession, DetectPlugin
from .sort_oh import tracker
import numpy as np
import traceback
try:
from gi.repository import Gst
@@ -492,7 +493,12 @@ class PredictPlugin(DetectPlugin, scrypted_sdk.BufferConverter, scrypted_sdk.Set
finally:
gst_buffer.unmap(info)
return self.run_detection_image(detection_session, image, settings, src_size, convert_to_src_size)
try:
return self.run_detection_image(detection_session, image, settings, src_size, convert_to_src_size)
except:
image.close()
traceback.print_exc()
raise
def create_detection_session(self):
return PredictSession(start_time=time.time())

View File

@@ -92,15 +92,20 @@ class TensorFlowLitePlugin(PredictPlugin, scrypted_sdk.BufferConverter, scrypted
return input_size(self.interpreter)
def detect_once(self, input: Image.Image, settings: Any, src_size, cvss):
with self.mutex:
common.set_input(
self.interpreter, input)
scale = (1, 1)
# _, scale = common.set_resized_input(
# self.interpreter, cropped.size, lambda size: cropped.resize(size, Image.ANTIALIAS))
self.interpreter.invoke()
objs = detect.get_objects(
self.interpreter, score_threshold=.2, image_scale=scale)
try:
with self.mutex:
common.set_input(
self.interpreter, input)
scale = (1, 1)
# _, scale = common.set_resized_input(
# self.interpreter, cropped.size, lambda size: cropped.resize(size, Image.ANTIALIAS))
self.interpreter.invoke()
objs = detect.get_objects(
self.interpreter, score_threshold=.2, image_scale=scale)
except:
print('tensorflow-lite encountered an error while detecting. requesting plugin restart.')
self.requestRestart()
raise e
allowList = settings.get('allowList', None) if settings else None
ret = self.create_detection_result(objs, src_size, allowList, cvss)