mattritchey commited on
Commit
1e74a9c
1 Parent(s): cc5b5d9

Update pages/videostream.py

Browse files
Files changed (1) hide show
  1. pages/videostream.py +21 -106
pages/videostream.py CHANGED
@@ -1,116 +1,31 @@
1
- """The VideoStreamInterface provides an easy way to apply transforms to a video stream"""
2
- import numpy as np
3
  import panel as pn
4
- import param
5
- import skimage
6
- from PIL import Image, ImageFilter
7
- from skimage import data, filters
8
- from skimage.color.adapt_rgb import adapt_rgb, each_channel
9
- from skimage.draw import rectangle
10
- from skimage.exposure import rescale_intensity
11
- from skimage.feature import Cascade
12
- from videostream_utils import PILImageTransform, NumpyImageTransform, VideoStreamInterface
13
 
14
- pn.extension("terminal", sizing_mode="stretch_width")
 
15
 
16
- ACCENT = "#fef3c7"
17
 
 
 
 
 
18
 
19
- class GaussianBlur(PILImageTransform):
20
- """Gaussian Blur
21
-
22
- https://pillow.readthedocs.io/en/stable/reference/ImageFilter.html#PIL.ImageFilter.GaussianBlur
23
- """
24
-
25
- radius = param.Integer(default=2, bounds=(0, 10))
26
-
27
- def transform(self, image: Image):
28
- return image.filter(ImageFilter.GaussianBlur(radius=self.radius))
29
-
30
-
31
- class GrayscaleTransform(NumpyImageTransform):
32
- """GrayScale transform
33
-
34
- https://scikit-image.org/docs/0.15.x/auto_examples/color_exposure/plot_rgb_to_gray.html
35
- """
36
-
37
- def transform(self, image: np.ndarray):
38
- grayscale = skimage.color.rgb2gray(image[:, :, :3])
39
- return skimage.color.gray2rgb(grayscale)
40
-
41
-
42
- class SobelTransform(NumpyImageTransform):
43
- """Sobel Transform
44
-
45
- https://scikit-image.org/docs/0.15.x/auto_examples/color_exposure/plot_adapt_rgb.html
46
- """
47
-
48
- def transform(self, image):
49
- @adapt_rgb(each_channel)
50
- def sobel_each(image):
51
- return filters.sobel(image)
52
-
53
- return rescale_intensity(1 - sobel_each(image))
54
-
55
-
56
- @pn.cache()
57
- def get_detector():
58
- """Returns the Cascade detector"""
59
- trained_file = data.lbp_frontal_face_cascade_filename()
60
- return Cascade(trained_file)
61
-
62
- class FaceDetectionTransform(NumpyImageTransform):
63
- """Face detection using a cascade classifier.
64
-
65
- https://scikit-image.org/docs/0.15.x/auto_examples/applications/plot_face_detection.html
66
- """
67
-
68
- scale_factor = param.Number(1.4, bounds=(1.0, 2.0), step=0.1)
69
- step_ratio = param.Integer(1, bounds=(1, 10))
70
- size_x = param.Range(default=(60, 322), bounds=(10, 500))
71
- size_y = param.Range(default=(60, 322), bounds=(10, 500))
72
-
73
- def transform(self, image):
74
- detector = get_detector()
75
- detected = detector.detect_multi_scale(
76
- img=image,
77
- scale_factor=self.scale_factor,
78
- step_ratio=self.step_ratio,
79
- min_size=(self.size_x[0], self.size_y[0]),
80
- max_size=(self.size_x[1], self.size_y[1]),
81
- )
82
-
83
- for patch in detected:
84
- rrr, ccc = rectangle(
85
- start=(patch["r"], patch["c"]),
86
- extent=(patch["height"], patch["width"]),
87
- shape=image.shape[:2],
88
- )
89
- image[rrr, ccc, 0] = 200
90
-
91
- return image
92
 
 
93
 
94
- component = VideoStreamInterface(
95
- transforms=[
96
- GaussianBlur,
97
- GrayscaleTransform,
98
- SobelTransform,
99
- FaceDetectionTransform,
100
- ]
101
- )
102
 
103
- component.video_stream.timeout=1000
104
- component.video_stream.param.timeout.bounds=(250, 2000)
105
 
106
  pn.template.FastListTemplate(
107
- site="Awesome Panel 🤗",
108
- title="VideoStream with transforms",
109
- sidebar=[component.settings],
110
- main=[
111
- """Try a much, much faster version <a href="https://sharing.awesome-panel.org/MarcSkovMadsen/videostream-interface/app.html" target="_blank">here</a> powered by Webassembly.""",
112
- component],
113
- favicon="https://sharing.awesome-panel.org/favicon.ico",
114
- accent=ACCENT,
115
- header_color="#4b5563"
116
- ).servable()
 
1
+ import hvplot.pandas
2
+ import holoviews as hv
3
  import panel as pn
4
+ from bokeh.sampledata.iris import flowers
 
 
 
 
 
 
 
 
5
 
6
+ pn.extension(sizing_mode="stretch_width")
7
+ hv.extension("bokeh")
8
 
9
+ accent_color = "#ff286e"
10
 
11
+ scatter = flowers.hvplot.scatter(
12
+ x="sepal_length", y="sepal_width", c=accent_color, responsive=True, height=350
13
+ )
14
+ hist = flowers.hvplot.hist("petal_width", c=accent_color, responsive=True, height=350)
15
 
16
+ scatter.opts(size=10)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
+ selection_linker = hv.selection.link_selections.instance()
19
 
20
+ scatter = selection_linker(scatter)
21
+ hist = selection_linker(hist)
 
 
 
 
 
 
22
 
23
+ scatter.opts(tools=["hover"], active_tools=["box_select"])
24
+ hist.opts(tools=["hover"], active_tools=["box_select"])
25
 
26
  pn.template.FastListTemplate(
27
+ site="Awesome Panel and HoloViews",
28
+ title="Cross Filtering/ Linked Brushing",
29
+ header_background=accent_color,
30
+ main=[scatter, hist],
31
+ ).servable()