This commit is contained in:
matteo porta 2022-07-06 21:37:08 +02:00
parent 75abe24c54
commit 02cf4797eb
4 changed files with 45 additions and 35 deletions

Binary file not shown.

View File

@ -14,15 +14,16 @@ export QT_NO_WARNING_OUTPUT=0
# export QT_QPA_PLATFORM=${XDG_SESSION_TYPE}
python -B -u "./src/main.py" \
--auto-login-admin \
--auto-select \
--no-autotest \
--no-edgetpu \
--no-gpu \
--sim-camera \
--sim-modbus \
--sim-os-label-printer \
--sim-serial-neo-pixels \
--style windows \
$* 2> >(sed $'s/.*/\e[31m&\e[m/' >&2) # &
# --auto-select \
# --about \
# --archive \
# --auto-login-user \

View File

@ -5,12 +5,11 @@ from configparser import ConfigParser
from pathlib import Path
import cv2
import numpy
import numpy as np
import tensorflow as tf
from lib.helpers.object_detection.utils import label_map_util
from PyQt5.QtCore import (QFileSystemWatcher, QLineF, QMutex, QPointF, QRectF,
Qt, QThread, QTimer, pyqtSignal)
Qt, QThread, pyqtSignal)
from PyQt5.QtGui import (QBrush, QColor, QFont, QImage, QPainter, QPainterPath,
QPen, QPixmap)
@ -20,27 +19,26 @@ from .consumer import Consumer
if "--no-edgetpu" not in sys.argv:
try:
from pycoral.utils.edgetpu import make_interpreter
except (ImportError, ModuleNotFoundError) as e:
except (ImportError, ModuleNotFoundError):
def make_interpreter(*args, **kwargs):
raise ValueError(f"{e!r}")
raise ValueError("the 'pycoral' module is not available")
else:
def make_interpreter(*args, **kwargs):
raise ValueError("\"--no-edgetpu\" in sys.argv")
if "--no-tflite" not in sys.argv:
try:
from pycoral.adapters import detect
from tflite_runtime.interpreter import Interpreter
except (ImportError, ModuleNotFoundError) as e:
except (ImportError, ModuleNotFoundError):
def Interpreter(*args, **kwargs):
raise ValueError(f"{e!r}")
raise ValueError("the 'tflite-runtime' module is not available")
else:
def Interpreter(*args, **kwargs):
raise ValueError("\"--no-tflite\" in sys.argv")
if "--no-gpu" in sys.argv:
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
# os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
#
# # Patch the location of gfile
# tf.gfile = tf.io.gfile
@ -94,14 +92,14 @@ class Vision(Component):
self.models_dir = Path(self.config[self.name].get("models_dir", "./data/neural_networks"))
self.allowed_modes = dict.fromkeys([
"edgetpu",
"tflite_cpu",
"tflite",
"normal",
])
if "--no-edgetpu" in sys.argv:
self.allowed_modes.pop("edgetpu", None)
if "--no-tflite" in sys.argv:
self.allowed_modes.pop("edgetpu", None)
self.allowed_modes.pop("tflite_cpu", None)
self.allowed_modes.pop("tflite", None)
self.load_model(self.config[self.name].get("neural_network", None))
# LOAD LABELS
label_map = label_map_util.load_labelmap("./config/vision/labels/labels.pbtxt")
@ -284,11 +282,11 @@ class Vision(Component):
tf_mode = "edgetpu"
except Exception:
self.log.exception(traceback.format_exc())
if tf_mode is None and "tflite_cpu" in self.allowed_modes:
if tf_mode is None and "tflite" in self.allowed_modes:
try:
# create tflite cpu interpreter
interpreter = Interpreter(str(self.models_dir / model_name / f"{model_name}.tflite"))
tf_mode = "tflite_cpu"
tf_mode = "tflite"
except Exception:
self.log.exception(traceback.format_exc())
# reset tensorflow variables
@ -306,19 +304,9 @@ class Vision(Component):
self.tf_mode = tf_mode
self.model_name = model_name
if interpreter is not None:
# if there is a new tflite interpreter initialize it and the related values
self.tflite_input_details = interpreter.get_input_details()
self.tflite_output_details = interpreter.get_output_details()
self.inf_index = self.tflite_input_details[0]["index"]
self.inf_shape = self.tflite_input_details[0]["shape"]
# interpreter.resize_tensor_input(self.inf_index, self.inf_shape)
# if there is a new tflite interpreter initialize it
interpreter.allocate_tensors()
interpreter.invoke() # warmup
else:
self.tflite_input_details = None
self.tflite_output_details = None
self.inf_index = None
self.inf_shape = None
self.interpreter = interpreter
# if there is a new model to be used, remove previous model if present
if model is not None and self.model is not None:
@ -336,26 +324,46 @@ class Vision(Component):
# "center": self.get_center(test_box),
# "size": self.get_size(test_box),
# }]
if self.inf_shape is not None and frame.shape != self.inf_shape[1:3]:
tensor = np.expand_dims(cv2.resize(frame, self.inf_shape[1:3], interpolation=cv2.INTER_LINEAR), axis=0)
if self.interpreter is not None and frame.shape != self.interpreter.get_input_details()[0]["shape"][1:3]:
tensor = np.expand_dims(cv2.resize(frame, self.interpreter.get_input_details()[0]["shape"][1:3], interpolation=cv2.INTER_LINEAR), axis=0)
else:
tensor = np.expand_dims(frame, axis=0)
# Run inference
if lock:
self.lock.lock()
if self.tf_mode in {"edgetpu", "tflite_cpu"}:
self.interpreter.set_tensor(self.inf_index, tensor)
if self.tf_mode in {"edgetpu", "tflite"}:
i_d = self.interpreter.get_input_details()
# print(i_d)
o_d = self.interpreter.get_output_details()
# print(o_d)
self.interpreter.set_tensor(i_d[0]["index"], tensor)
self.interpreter.invoke()
objs = detect.get_objects(self.interpreter, self.detection_threshold, (1, 1))
# PARSE TFLITE DETECTIONS
# signature_list = self.interpreter._get_full_signature_list()
# if signature_list:
# if len(signature_list) > 1:
# raise ValueError("Only support model with one signature.")
# signature = signature_list[next(iter(signature_list))]
# # count = int(self.interpreter.get_tensor(signature["outputs"]["output_0"])[0])
# scores = self.interpreter.get_tensor(signature["outputs"]["output_1"])[0]
# class_ids = self.interpreter.get_tensor(signature["outputs"]["output_2"])[0]
# boxes = self.interpreter.get_tensor(signature["outputs"]["output_3"])[0]
if self.interpreter.get_tensor(o_d[3]["index"]).size == 1:
boxes = self.interpreter.get_tensor(o_d[0]["index"])[0]
class_ids = self.interpreter.get_tensor(o_d[1]["index"])[0]
scores = self.interpreter.get_tensor(o_d[2]["index"])[0]
# count = int(self.interpreter.get_tensor(o_d[3]["index"])[0])
else:
scores = self.interpreter.get_tensor(o_d[0]["index"])[0]
boxes = self.interpreter.get_tensor(o_d[1]["index"])[0]
# count = int(self.interpreter.get_tensor(o_d[2]["index"])[0])
class_ids = self.interpreter.get_tensor(o_d[3]["index"])[0]
if lock:
self.lock.unlock()
boxes = [(obj.bbox.ymin / self.inf_shape[1], obj.bbox.xmin / self.inf_shape[2], obj.bbox.ymax / self.inf_shape[1], obj.bbox.xmax / self.inf_shape[2]) for obj in objs]
classes = [obj.id + 1 for obj in objs]
scores = [obj.score for obj in objs]
detections = {
"detection_boxes": [boxes],
"detection_classes": [classes],
"detection_scores": [scores],
"detection_boxes": [boxes],
"detection_classes": [map(lambda class_id: class_id + 1, class_ids)],
}
else:
detections = self.model(tensor)

View File

@ -13,4 +13,5 @@ pyqt5
pyserial
requests
tensorflow
tflite-runtime
zebra