示例#1
0
            '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
示例#2
0
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()
示例#3
0
        },
        {
            '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
示例#4
0
            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)