'value': 'Start' }, { 'type': 'checkbox', 'name': 'Checkbox', 'value': True }, { 'type': 'select', 'name': 'Select', 'value': 1, 'values': ['Red', 'Green', 'Blue'] }, ] properties_window = viz.properties(properties) def properties_callback(event): if event['event_type'] == 'PropertyUpdate': prop_id = event['propertyId'] value = event['value'] if prop_id == 0: new_value = value + '_updated' elif prop_id == 1: new_value = value + '0' elif prop_id == 2: new_value = 'Stop' if properties[prop_id][ 'value'] == 'Start' else 'Start' else: new_value = value properties[prop_id]['value'] = new_value
class AMFVisdom: DEFAULT_CONFIG = {"bounding_box_threshold": 200} def __init__(self, video): self.viz = Visdom(port=8090) self.viz_config = self.DEFAULT_CONFIG self.ctl = None self.frame_list, video_meta = extract_video(video) self.frame_fps = video_meta["fps"] self.amf = AdvancedMotionFilter( ssc_model="model/scene_knn_model", frame_width=video_meta["width"], frame_height=video_meta["height"], ) def init_control_panel(self): def update(name): return self.viz.properties( [ { "type": "number", "name": "Bounding Box Threshold", "value": self.viz_config.get("bounding_box_threshold", 200), }, { "type": "checkbox", "name": "History Variance", "value": self.amf.amf_history_variance, }, { "type": "number", "name": "History Variance Threshold", "value": self.amf.amf_variance_threshold, }, { "type": "number", "name": "History Variance Sample Amount", "value": self.amf.amf_variance_sample_amount, }, { "type": "checkbox", "name": "Large Background Movement", "value": self.amf.amf_drop_large_bg_motion, }, { "type": "checkbox", "name": "Dynamic Bounding Box", "value": self.amf.amf_dynamic_bbx, }, ], win=name, env="amf_stream", ) def trigger(context): if context["event_type"] != "PropertyUpdate": return if context["target"] != self.ctl.panel: return property_name = (context.get("pane_data").get("content")[ context.get("propertyId")].get("name")) if property_name == "Bounding Box Threshold": self.viz_config["bounding_box_threshold"] = int( context.get("value")) elif property_name == "History Variance": self.amf.amf_history_variance = context.get("value") elif property_name == "History Variance Threshold": self.amf.amf_variance_threshold = int(context.get("value")) elif property_name == "History Variance Sample Amount": self.amf.amf_variance_sample_amount = int(context.get("value")) elif property_name == "Large Background Movement": self.amf.amf_drop_large_bg_motion = context.get("value") elif property_name == "Dynamic Bounding Box": self.amf.amf_dynamic_bbx = context.get("value") self.ctl.panel = update("Control Panel") self.ctl = VisdomControlPanel(self.viz, update, trigger, "Control Panel") def motion_detection(self, frame): mask = self.amf.apply(frame.copy()) display_frame = frame.copy() motion_bbxes = self.amf.detect_motion( mask, self.viz_config.get("bounding_box_threshold", 200)) for bbx in motion_bbxes: box = BoundingBox(*bbx) self.amf.draw_detection_box(box, display_frame) self.viz.image( mask, win="mask_window", opts=dict( width=320, height=250, ), env="amf_stream", ) return display_frame def predict_frame_scene(self, frame): mask = self.amf.apply(frame) mask_metadata = self.amf.calculate_mask_metadata(mask) frame_scene = self.amf.ssc.predict( mask_metadata.avg, mask_metadata.std, self.amf.frame_width, self.amf.frame_height, ) return frame_scene def show_ssc_graph(self): print("Show SSC Graph") ssc_prediction = [] for frame in self.frame_list: resized_frame = frame_resize(frame.copy()) frame_scene = self.predict_frame_scene(resized_frame) ssc_prediction.append(frame_scene) n = len(self.frame_list) x = np.linspace(0, n - 1, num=n) scene_y = np.array(ssc_prediction) self.viz.line( X=x, Y=scene_y, opts=dict(title="ssc prediction graph", showlegend=True), env="amf_ssc", win="ssc_prediction_graph", ) def stream_video(self): for frame in self.frame_list: resized_frame = frame_resize(frame.copy()) display_frame = self.motion_detection(resized_frame) disp_image = frame_convert(display_frame) self.viz.image( disp_image, win="video_window", opts=dict( width=320, height=250, ), env="amf_stream", ) time.sleep(1.0 / self.frame_fps) def start(self): print("Visdom Playground Activating") self.viz.close(env="amf_stream") self.init_control_panel() while True: self.stream_video()
}, { 'type': 'checkbox', 'name': 'Checkbox', 'value': True }, { 'type': 'select', 'name': 'Select', 'value': 1, 'values': ['Red', 'Green', 'Blue'] }, ] # 新建属性窗口, 并返回窗口 id properties_window_id = viz.properties(properties, win='win03', opts={'title': 'prop-demo'}) def properties_callback(event): if event['event_type'] == 'PropertyUpdate': # 属性更新事件 prop_id = event[ 'propertyId'] # 属性 id, 为定义窗口时传入的 properties 列表中相应属性的 idx value = event['value'] # 新的属性值 if prop_id in [0, 1]: # 字符属性 和 数字属性 无需在本地字典中更新, 更新也不会影响显示 new_value = value + '_updated' # 可以什么也不干 new_value = value + '0' elif prop_id == 2: # Button属性 名称可以在本地字典修改 new_value = 'Stop' if properties[prop_id][ 'value'] == 'Start' else 'Start' else: # 3 checkbox, 4 select属性, 需要本地修改, 并重新写入 new_value = value
elif len(event['key']) == 1: curr_txt += event['key'] viz.text(curr_txt, win=callback_text_window) viz.register_event_handler(type_callback, callback_text_window) # Properties window properties = [ {'type': 'text', 'name': 'Text input', 'value': 'initial'}, {'type': 'number', 'name': 'Number input', 'value': '12'}, {'type': 'button', 'name': 'Button', 'value': 'Start'}, {'type': 'checkbox', 'name': 'Checkbox', 'value': True}, {'type': 'select', 'name': 'Select', 'value': 1, 'values': ['Red', 'Green', 'Blue']}, ] properties_window = viz.properties(properties) def properties_callback(event): if event['event_type'] == 'PropertyUpdate': prop_id = event['propertyId'] value = event['value'] if prop_id == 0: new_value = value + '_updated' elif prop_id == 1: new_value = value + '0' elif prop_id == 2: new_value = 'Stop' if properties[prop_id]['value'] == 'Start' else 'Start' else: new_value = value properties[prop_id]['value'] = new_value viz.properties(properties, win=properties_window)