st-ten-1/src/ui/test_vision/test_vision.py

224 lines
9.6 KiB
Python
Raw Normal View History

2022-06-22 15:18:29 +00:00
import sys
2022-07-12 08:48:04 +00:00
from PyQt5.QtCore import pyqtSignal
2022-08-02 16:15:30 +00:00
from PyQt5.QtGui import QColor, QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QHeaderView, QProgressBar, QTableWidgetItem
from ui.helpers import calc_foreground_color
2022-07-12 08:48:04 +00:00
from ui.test_test import Test_Test
2022-06-22 15:18:29 +00:00
2022-07-12 08:48:04 +00:00
class Test_Vision(Test_Test):
2022-06-22 15:18:29 +00:00
request_frame = pyqtSignal()
2022-09-06 13:15:01 +00:00
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=True):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
2022-06-22 15:18:29 +00:00
if "--sim-camera" not in sys.argv:
2022-07-12 08:48:04 +00:00
self.ok_counter_limit = 2
2022-06-22 15:18:29 +00:00
else:
2022-07-12 08:48:04 +00:00
self.ok_counter_limit = 1
2022-08-02 16:15:30 +00:00
# DETECTIONS TABLE
self.results_table_headers = {
"class": "RILEVATO",
"expected": "ATTESO",
"score": "PUNTEGGIO",
}
self.results_tw.setColumnCount(len(self.results_table_headers))
self.results_tw.setHorizontalHeaderLabels(self.results_table_headers.values())
self.results_tw.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.results_tw.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
2022-06-22 15:18:29 +00:00
2022-07-19 09:59:00 +00:00
def start(self, recipe=None, step=None):
super().start(recipe=recipe, step=step)
2022-08-24 10:59:16 +00:00
if self.run_once is True and self.done is True and self.done_ok is True:
return
2022-06-22 15:18:29 +00:00
# setup camera-vision loop
self.components["galaxy_camera"].set_period(period=None) # only get frame on request
self.components["galaxy_camera"].add_sources({"test_vision": self.request_frame})
self.request_frame_connection = self.components["vision"].out.connect(self.request_frame) # request new frame as soon as vision finishes
2022-07-12 08:48:04 +00:00
self.get_connection = self.components["vision"].out.connect(self.get)
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#ffffff")
2022-07-27 12:54:19 +00:00
self.components["vision"].set_recipe(self.step.spec.get("recipe", None))
2022-06-22 15:18:29 +00:00
self.components["vision"].resume()
2022-10-11 13:30:53 +00:00
if "uvc_camera" in self.components:
self.components["uvc_camera"].resume()
elif "galaxy_camera" in self.components:
self.components["galaxy_camera"].resume()
2022-06-22 15:18:29 +00:00
self.request_frame.emit() # request first frame
2022-08-02 16:15:30 +00:00
# DETECTIONS TABLE
# hide previous results
self.results_tw.setRowCount(0)
2022-06-22 15:18:29 +00:00
def stop(self):
# disable camera-vision loop
self.components["galaxy_camera"].pause()
self.components["vision"].pause()
2022-07-12 08:48:04 +00:00
self.disconnect(self.get_connection)
2022-06-22 15:18:29 +00:00
self.disconnect(self.request_frame_connection)
2022-06-28 10:31:27 +00:00
self.components["galaxy_camera"].remove_sources(["test_vision", ])
2022-07-12 08:48:04 +00:00
super().stop()
2022-06-22 15:18:29 +00:00
2022-08-24 10:59:16 +00:00
# def reset(self):
# super().reset()
2022-07-12 08:48:04 +00:00
def get(self, data=None, override=False):
2022-07-27 12:54:19 +00:00
if self.done: # avoid proccessing if completed
2022-06-22 15:18:29 +00:00
return
2022-07-12 08:48:04 +00:00
if data is None or data[-1] is None:
super().get(None, override=override)
return
2022-06-22 15:18:29 +00:00
data = data[-1]
2022-07-12 08:48:04 +00:00
super().get([{
"time": data.get("time", None),
"frame": data["vision"].get("frame", None),
"detections": data["vision"].get("detections", None),
"results": data["vision"].get("results", None),
"render": data["vision"].get("render", None),
}], override=override)
2022-08-02 16:15:30 +00:00
@staticmethod
def tr(text):
translations = {
"no_detection": "non_rilevato",
"_": " ",
"big": "grande",
"black": "nero",
"blue": "blu",
"brown": "marrone",
"empty": "vuoto",
"green": "verde",
"ko": "ko",
"ok": "ok",
"orange": "arancione",
"red": "rosso",
"small": "piccolo",
"white": "bianco",
"yellow": "giallo",
}
for s, t in translations.items():
text = text.replace(s, t)
return text
2022-07-12 08:48:04 +00:00
def visualize(self, data=None):
if data is None:
data = {}
overridden = data.get("overridden", False)
2022-06-22 15:18:29 +00:00
frame = data.get("frame", None)
2022-06-28 10:31:27 +00:00
render = data.get("render", None)
2022-08-02 16:15:30 +00:00
results = data.get("results", {}).get("results", None)
2022-06-22 15:18:29 +00:00
if overridden:
2022-07-12 08:48:04 +00:00
img = self.status_imgs_full["warning"]
2022-06-28 10:31:27 +00:00
elif render is not None:
2022-07-12 08:48:04 +00:00
img = render
2022-06-22 15:18:29 +00:00
elif frame is not None:
2022-07-12 08:48:04 +00:00
img = QPixmap.fromImage(QImage(
2022-06-22 15:18:29 +00:00
frame.data,
frame.shape[1], # width
frame.shape[0], # height
frame.shape[2] * frame.shape[1], # width * channels
QImage.Format_RGB888
))
else:
2022-07-12 08:48:04 +00:00
img = self.status_imgs_full[None]
2022-07-27 12:54:19 +00:00
if self.done:
if data.get("overridden", False):
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#ffff00")
2022-07-27 12:54:19 +00:00
elif self.ok_counter >= self.ok_counter_limit:
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#00ff00")
2022-07-27 12:54:19 +00:00
else:
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#ff0000")
2022-07-27 12:54:19 +00:00
else:
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#ffffff")
2022-08-02 16:15:30 +00:00
# DETECTIONS TABLE
if results is not None:
self.results_tw.setRowCount(len(results))
self.results_tw.setVerticalHeaderLabels(list(results))
for r, [zone_name, result] in enumerate(results.items()):
for c, header in enumerate(self.results_table_headers):
if header == "class":
i = self.results_tw.item(r, c)
if i is None:
i = QTableWidgetItem()
self.results_tw.setItem(r, c, i)
detection = result.get("detection", None)
if detection is not None:
text = self.tr(detection["class"]["name"])
color = QColor(detection["class"]["color"])
else:
text = ""
color = QColor("#ffffff")
i.setText(text)
i.setBackground(color)
i.setForeground(calc_foreground_color(color))
elif header == "expected":
i = self.results_tw.item(r, c)
if i is None:
i = QTableWidgetItem()
self.results_tw.setItem(r, c, i)
expected = result.get("expected", None)
if expected is not None:
text = self.tr(expected["name"])
color = QColor(expected["color"])
else:
text = ""
color = QColor("#ffffff")
i.setText(text)
i.setBackground(color)
i.setForeground(calc_foreground_color(color))
elif header == "score":
w = self.results_tw.cellWidget(r, c)
if w is None:
w = QProgressBar()
w.setRange(0, 100)
self.results_tw.setCellWidget(r, c, w)
score = result.get("detection", {}).get("score", None)
ok = result.get("ok", None)
if score is not None:
value = int(score * 100)
else:
value = 0
w.setValue(value)
if ok is not None:
if ok:
if score is not None:
color = QColor(int(255 - max(score - 0.5, 0) / 0.5 * 255), 255, 0)
else:
color = QColor("#00ff00")
else:
color = QColor("#ff0000")
else:
color = QColor("#0000ff")
p = QPalette()
p.setColor(QPalette.Highlight, color)
w.setPalette(p)
else:
raise NotImplementedError()
else:
self.results_tw.setRowCount(0)
2022-07-12 08:48:04 +00:00
super().visualize(data, img=img)
2022-06-22 15:18:29 +00:00
2022-07-12 08:48:04 +00:00
def save_last(self):
if self.last is None:
2022-06-22 15:18:29 +00:00
return
2022-08-02 16:15:30 +00:00
self.components["vision_saver"].save(
save_time=self.last.get("time", None),
frame=self.last.get("frame", None),
vision=self.last.get("detections", None),
suffix="manual_save",
resize=[256, 256],
)
2022-06-22 15:18:29 +00:00
def emit_ok(self):
2022-07-27 12:54:19 +00:00
super().emit_ok()
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#000000")
2022-07-27 12:54:19 +00:00
def emit_ko(self):
super().emit_ko()
2022-10-05 14:18:03 +00:00
if "neo_pixels" in self.components and self.components["neo_pixels"].ready:
2022-08-23 14:00:04 +00:00
self.components["neo_pixels"].set_all_pixel_color("#000000")