jmartinezot commited on
Commit
164569e
·
1 Parent(s): 2d1c539

Adding circular noise

Browse files
Files changed (4) hide show
  1. app.py +105 -73
  2. backup1.py +123 -0
  3. backup2.py +165 -0
  4. line_models_sampling.py +106 -76
app.py CHANGED
@@ -1,18 +1,80 @@
1
  import numpy as np
2
  import pandas as pd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
- def compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations):
 
 
 
 
 
5
  line_parameters = np.zeros((num_iterations, 2))
6
  for i in range(num_iterations):
7
- # Generate points on the line with noise
8
- x_values, y_values_with_noise = predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max)
9
-
10
- # Randomly sample two points from the line
11
- idx = np.random.choice(num_points, 2, replace=False)
12
- x1, y1 = x_values[idx[0]], y_values_with_noise[idx[0]]
13
- x2, y2 = x_values[idx[1]], y_values_with_noise[idx[1]]
14
 
15
- # Compute slope and intercept of line passing through sampled points
16
  line_slope = (y2 - y1) / (x2 - x1)
17
  line_intercept = y1 - line_slope * x1
18
 
@@ -21,88 +83,59 @@ def compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_ma
21
 
22
  return line_parameters
23
 
24
- from sklearn.cluster import KMeans
25
- # import matplotlib.pyplot as plt
26
 
27
- import gradio as gr
28
- import matplotlib.pyplot as plt
29
- import numpy as np
30
- from sklearn.cluster import KMeans
31
 
32
- def cluster_line_parameters(line_parameters, num_clusters):
33
- # Cluster line parameters using KMeans
34
  kmeans = KMeans(n_clusters=num_clusters)
35
  kmeans.fit(line_parameters)
36
  labels = kmeans.labels_
37
  centroids = kmeans.cluster_centers_
38
- # how many points are in each cluster
39
  counts = np.bincount(labels)
40
 
41
- # Create a scatter plot of the data points
42
- fig, ax = plt.subplots()
43
- ax.scatter(line_parameters[:, 0], line_parameters[:, 1], c=labels, cmap='viridis')
44
- ax.set_xlabel('Slope')
45
- ax.set_ylabel('Intercept')
46
 
47
- # Generate some lines using the centroids
48
- '''
49
- x = np.linspace(x_min, x_max, num_points)
50
- for i in range(num_clusters):
51
- slope, intercept = centroids[i]
52
- y = slope * x + intercept
53
- ax.plot(x, y, linewidth=2)
54
- '''
55
 
56
- # Convert the figure to a PNG image
57
- fig.canvas.draw()
58
- img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
59
- img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
60
-
61
- # Close the figure to free up memory
62
- plt.close(fig)
63
-
64
- # Return the labels, centroids, and image
65
- return labels, centroids, counts, img
66
-
67
- import gradio as gr
68
-
69
- def predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max):
70
- x_values = np.linspace(x_min, x_max, num_points)
71
- noise = np.random.normal(mean, std, num_points)
72
- y_values = slope * x_values + intercept + noise
73
- return x_values, y_values
74
-
75
- def cluster_line_params(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations, num_clusters):
76
- num_points = int(num_points)
77
  num_iterations = int(num_iterations)
78
  num_clusters = int(num_clusters)
79
- line_parameters = compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations)
80
- labels, centroids, counts, img = cluster_line_parameters(line_parameters, num_clusters)
81
- # return labels, centroids, img
82
- # put counts as the third column of centroids
 
83
  centroids = np.c_[centroids, counts]
84
  df = pd.DataFrame(centroids, columns=["Slope", "Intercept", "Count"])
85
- # return img, centroids, df
86
- return img, df
87
 
88
  # Define input and output components
89
  inputs = [
90
- gr.inputs.Slider(minimum=-5.0, maximum=5.0, default=1.0, label="Slope"),
91
- gr.inputs.Slider(minimum=-10.0, maximum=10.0, default=0.0, label="Intercept"),
92
- gr.inputs.Slider(minimum=0.0, maximum=5.0, default=1.0, label="Mean"),
93
- gr.inputs.Slider(minimum=0.0, maximum=5.0, default=1.0, label="Standard Deviation"),
94
- gr.inputs.Number(default=100, label="Number of Points"),
95
- gr.inputs.Number(default=-5, label="Minimum Value of x"),
96
- gr.inputs.Number(default=5, label="Maximum Value of x"),
97
- gr.inputs.Number(default=100, label="Number of Iterations"),
98
- gr.inputs.Number(default=3, label="Number of Clusters")
 
 
 
 
 
99
  ]
100
 
101
  outputs = [
102
- #image and numpy
103
- gr.outputs.Image(label="Image", type="pil"),
104
- # show the centroids and counts, which is a numpy array
105
- gr.outputs.Dataframe(label="Centroids and Counts", type="pandas")
106
  ]
107
 
108
  # Create the Gradio interface
@@ -113,11 +146,10 @@ interface = gr.Interface(
113
  outputs=outputs,
114
  title="Line Parameter Clustering",
115
  description="Cluster line parameters with Gaussian noise",
116
- allow_flagging=False
117
  )
118
 
119
  # Launch the interface
120
  interface.launch()
121
 
122
 
123
-
 
1
  import numpy as np
2
  import pandas as pd
3
+ import matplotlib.pyplot as plt
4
+ from sklearn.cluster import KMeans
5
+ import gradio as gr
6
+ from gradio.components import Slider, Number, Image, Dataframe
7
+ import matplotlib
8
+ matplotlib.use('Agg')
9
+
10
+ def generate_random_points_in_circle(center_x, center_y, radius, num_points):
11
+ angles = np.random.uniform(0, 2 * np.pi, num_points)
12
+ radii = np.sqrt(np.random.uniform(0, radius**2, num_points))
13
+ x_values = center_x + radii * np.cos(angles)
14
+ y_values = center_y + radii * np.sin(angles)
15
+ points = np.column_stack((x_values, y_values))
16
+ return points
17
+
18
+ def generate_random_points_in_line_between_bounds_and_with_noise(slope, intercept, mean, std, num_points, x_min, x_max):
19
+ x_values = np.linspace(x_min, x_max, num_points)
20
+ noise = np.random.normal(mean, std, num_points)
21
+ y_values = slope * x_values + intercept + noise
22
+ points = np.column_stack((x_values, y_values))
23
+ return points
24
+
25
+ def generate_all_points(line_num_points, circle_num_points, center_x, center_y, radius, slope, intercept, mean, std, x_min, x_max):
26
+ circle_points = generate_random_points_in_circle(center_x, center_y, radius, circle_num_points)
27
+ line_points = generate_random_points_in_line_between_bounds_and_with_noise(slope, intercept, mean, std, line_num_points, x_min, x_max)
28
+ all_points = np.concatenate((circle_points, line_points), axis=0)
29
+ return line_points, circle_points, all_points
30
+
31
+ def create_points_plot(line_points, circle_points):
32
+ fig, ax = plt.subplots()
33
+ x_values = line_points[:, 0]
34
+ y_values = line_points[:, 1]
35
+ ax.scatter(x_values, y_values, alpha=0.2, color="blue")
36
+ ax.scatter(circle_points[:, 0], circle_points[:, 1], alpha=0.2, color='red')
37
+ fig.canvas.draw()
38
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
39
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
40
+ plt.close(fig)
41
+ return img
42
+
43
+ def create_points_lines_plot(line_points, line_parameters):
44
+ fig, ax = plt.subplots()
45
+ x_values = line_points[:, 0]
46
+ y_values = line_points[:, 1]
47
+ ax.scatter(x_values, y_values, alpha=0.2)
48
+ for slope, intercept in line_parameters:
49
+ ax.plot(x_values, slope * x_values + intercept, alpha=0.5)
50
+ fig.canvas.draw()
51
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
52
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
53
+ plt.close(fig)
54
+ return img
55
+
56
+ def create_cluster_plot(line_parameters, labels, centroids):
57
+ fig, ax = plt.subplots()
58
+ ax.scatter(line_parameters[:, 0], line_parameters[:, 1], c=labels, cmap='viridis')
59
+ ax.set_xlabel('Slope')
60
+ ax.set_ylabel('Intercept')
61
+
62
+ fig.canvas.draw()
63
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
64
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
65
 
66
+ plt.close(fig)
67
+
68
+ return img
69
+
70
+ # Modify the compute_line_parameters function
71
+ def compute_line_parameters(num_iterations, all_points):
72
  line_parameters = np.zeros((num_iterations, 2))
73
  for i in range(num_iterations):
74
+ idx = np.random.choice(all_points.shape[0], 2, replace=False)
75
+ x1, y1 = all_points[idx[0], 0], all_points[idx[0], 1]
76
+ x2, y2 = all_points[idx[1], 0], all_points[idx[1], 1]
 
 
 
 
77
 
 
78
  line_slope = (y2 - y1) / (x2 - x1)
79
  line_intercept = y1 - line_slope * x1
80
 
 
83
 
84
  return line_parameters
85
 
 
 
86
 
 
 
 
 
87
 
88
+ def cluster_line_parameters(line_parameters, num_clusters, all_points, circle_points):
 
89
  kmeans = KMeans(n_clusters=num_clusters)
90
  kmeans.fit(line_parameters)
91
  labels = kmeans.labels_
92
  centroids = kmeans.cluster_centers_
 
93
  counts = np.bincount(labels)
94
 
95
+ points_img = create_points_plot(all_points, circle_points)
96
+ points_lines_img = create_points_lines_plot(all_points, line_parameters)
97
+ cluster_img = create_cluster_plot(line_parameters, labels, centroids)
 
 
98
 
99
+ return labels, centroids, counts, points_img, points_lines_img, cluster_img
 
 
 
 
 
 
 
100
 
101
+ # Update the cluster_line_params function
102
+ def cluster_line_params(slope, intercept, mean, std, line_num_points, x_min, x_max, num_iterations, num_clusters, center_x, center_y, radius, circle_num_points, random_seed):
103
+ np.random.seed(random_seed)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  num_iterations = int(num_iterations)
105
  num_clusters = int(num_clusters)
106
+
107
+ line_points, circle_points, all_points = generate_all_points(line_num_points, circle_num_points, center_x, center_y, radius, slope, intercept, mean, std, x_min, x_max)
108
+ line_parameters = compute_line_parameters(num_iterations, all_points)
109
+ labels, centroids, counts, points_img, points_lines_img, cluster_img = cluster_line_parameters(line_parameters, num_clusters, all_points, circle_points)
110
+
111
  centroids = np.c_[centroids, counts]
112
  df = pd.DataFrame(centroids, columns=["Slope", "Intercept", "Count"])
113
+
114
+ return points_img, points_lines_img, cluster_img, df
115
 
116
  # Define input and output components
117
  inputs = [
118
+ Slider(minimum=-5.0, maximum=5.0, value=1.0, label="Line Slope"),
119
+ Slider(minimum=-10.0, maximum=10.0, value=0.0, label="Line Intercept"),
120
+ Slider(minimum=0.0, maximum=5.0, value=1.0, label="Line Error Mean"),
121
+ Slider(minimum=0.0, maximum=5.0, value=1.0, label="Line Error Standard Deviation"),
122
+ Number(value=100, precision=0, label="Number of Points Sampled from the Line"),
123
+ Number(value=-5, label="Minimum Value of x for Sampling"),
124
+ Number(value=5, label="Maximum Value of x for Sampling"),
125
+ Number(value=100, label="Number of Iterations for RANSAC-like Line Parameter Estimation"),
126
+ Number(value=3, label="Number of Clusters of Line Parameters"),
127
+ Number(value=0, label="X Value Center of the Circle"),
128
+ Number(value=0, label="Y Value Center of the Circle"),
129
+ Number(value=1, label="Radius of the Circle"),
130
+ Number(value=100, precision=0, label="Number of Points Sampled from the Circle"),
131
+ Number(value=0, precision=0, label="Random Seed")
132
  ]
133
 
134
  outputs = [
135
+ Image(label="Points", type="pil"),
136
+ Image(label="Points and Lines", type="pil"),
137
+ Image(label="Clustering of the line parameters", type="pil"),
138
+ Dataframe(label="Centroids and Counts", type="pandas")
139
  ]
140
 
141
  # Create the Gradio interface
 
146
  outputs=outputs,
147
  title="Line Parameter Clustering",
148
  description="Cluster line parameters with Gaussian noise",
149
+ allow_flagging="never"
150
  )
151
 
152
  # Launch the interface
153
  interface.launch()
154
 
155
 
 
backup1.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+
4
+ def compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations):
5
+ line_parameters = np.zeros((num_iterations, 2))
6
+ for i in range(num_iterations):
7
+ # Generate points on the line with noise
8
+ x_values, y_values_with_noise = predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max)
9
+
10
+ # Randomly sample two points from the line
11
+ idx = np.random.choice(num_points, 2, replace=False)
12
+ x1, y1 = x_values[idx[0]], y_values_with_noise[idx[0]]
13
+ x2, y2 = x_values[idx[1]], y_values_with_noise[idx[1]]
14
+
15
+ # Compute slope and intercept of line passing through sampled points
16
+ line_slope = (y2 - y1) / (x2 - x1)
17
+ line_intercept = y1 - line_slope * x1
18
+
19
+ line_parameters[i, 0] = line_slope
20
+ line_parameters[i, 1] = line_intercept
21
+
22
+ return line_parameters
23
+
24
+ from sklearn.cluster import KMeans
25
+ # import matplotlib.pyplot as plt
26
+
27
+ import gradio as gr
28
+ import matplotlib.pyplot as plt
29
+ import numpy as np
30
+ from sklearn.cluster import KMeans
31
+
32
+ def cluster_line_parameters(line_parameters, num_clusters):
33
+ # Cluster line parameters using KMeans
34
+ kmeans = KMeans(n_clusters=num_clusters)
35
+ kmeans.fit(line_parameters)
36
+ labels = kmeans.labels_
37
+ centroids = kmeans.cluster_centers_
38
+ # how many points are in each cluster
39
+ counts = np.bincount(labels)
40
+
41
+ # Create a scatter plot of the data points
42
+ fig, ax = plt.subplots()
43
+ ax.scatter(line_parameters[:, 0], line_parameters[:, 1], c=labels, cmap='viridis')
44
+ ax.set_xlabel('Slope')
45
+ ax.set_ylabel('Intercept')
46
+
47
+ # Generate some lines using the centroids
48
+ '''
49
+ x = np.linspace(x_min, x_max, num_points)
50
+ for i in range(num_clusters):
51
+ slope, intercept = centroids[i]
52
+ y = slope * x + intercept
53
+ ax.plot(x, y, linewidth=2)
54
+ '''
55
+
56
+ # Convert the figure to a PNG image
57
+ fig.canvas.draw()
58
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
59
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
60
+
61
+ # Close the figure to free up memory
62
+ plt.close(fig)
63
+
64
+ # Return the labels, centroids, and image
65
+ return labels, centroids, counts, img
66
+
67
+ import gradio as gr
68
+
69
+ def predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max):
70
+ x_values = np.linspace(x_min, x_max, num_points)
71
+ noise = np.random.normal(mean, std, num_points)
72
+ y_values = slope * x_values + intercept + noise
73
+ return x_values, y_values
74
+
75
+ def cluster_line_params(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations, num_clusters):
76
+ num_points = int(num_points)
77
+ num_iterations = int(num_iterations)
78
+ num_clusters = int(num_clusters)
79
+ line_parameters = compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations)
80
+ labels, centroids, counts, img = cluster_line_parameters(line_parameters, num_clusters)
81
+ # return labels, centroids, img
82
+ # put counts as the third column of centroids
83
+ centroids = np.c_[centroids, counts]
84
+ df = pd.DataFrame(centroids, columns=["Slope", "Intercept", "Count"])
85
+ # return img, centroids, df
86
+ return img, df
87
+
88
+ # Define input and output components
89
+ inputs = [
90
+ gr.inputs.Slider(minimum=-5.0, maximum=5.0, default=1.0, label="Slope"),
91
+ gr.inputs.Slider(minimum=-10.0, maximum=10.0, default=0.0, label="Intercept"),
92
+ gr.inputs.Slider(minimum=0.0, maximum=5.0, default=1.0, label="Mean"),
93
+ gr.inputs.Slider(minimum=0.0, maximum=5.0, default=1.0, label="Standard Deviation"),
94
+ gr.inputs.Number(default=100, label="Number of Points"),
95
+ gr.inputs.Number(default=-5, label="Minimum Value of x"),
96
+ gr.inputs.Number(default=5, label="Maximum Value of x"),
97
+ gr.inputs.Number(default=100, label="Number of Iterations"),
98
+ gr.inputs.Number(default=3, label="Number of Clusters")
99
+ ]
100
+
101
+ outputs = [
102
+ #image and numpy
103
+ gr.outputs.Image(label="Image", type="pil"),
104
+ # show the centroids and counts, which is a numpy array
105
+ gr.outputs.Dataframe(label="Centroids and Counts", type="pandas")
106
+ ]
107
+
108
+ # Create the Gradio interface
109
+ interface = gr.Interface(
110
+ fn=cluster_line_params,
111
+ inputs=inputs,
112
+ # outputs=["numpy", "numpy", "image"],
113
+ outputs=outputs,
114
+ title="Line Parameter Clustering",
115
+ description="Cluster line parameters with Gaussian noise",
116
+ allow_flagging=False
117
+ )
118
+
119
+ # Launch the interface
120
+ interface.launch()
121
+
122
+
123
+
backup2.py ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+ import matplotlib.pyplot as plt
4
+ from sklearn.cluster import KMeans
5
+ import gradio as gr
6
+ from gradio.components import Slider, Number, Image, Dataframe
7
+ import matplotlib
8
+ matplotlib.use('Agg')
9
+
10
+ import numpy as np
11
+
12
+ def generate_random_points_in_circle(center_x, center_y, radius, num_points):
13
+ angles = np.random.uniform(0, 2 * np.pi, num_points)
14
+ radii = np.sqrt(np.random.uniform(0, radius**2, num_points))
15
+
16
+ x_values = center_x + radii * np.cos(angles)
17
+ y_values = center_y + radii * np.sin(angles)
18
+
19
+ points = np.column_stack((x_values, y_values))
20
+
21
+ return points
22
+
23
+ def compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations):
24
+ line_parameters = np.zeros((num_iterations, 2))
25
+ all_points = []
26
+ for i in range(num_iterations):
27
+ x_values, y_values_with_noise = predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max)
28
+ all_points.append(np.column_stack((x_values, y_values_with_noise)))
29
+
30
+ idx = np.random.choice(num_points, 2, replace=False)
31
+ x1, y1 = x_values[idx[0]], y_values_with_noise[idx[0]]
32
+ x2, y2 = x_values[idx[1]], y_values_with_noise[idx[1]]
33
+
34
+ line_slope = (y2 - y1) / (x2 - x1)
35
+ line_intercept = y1 - line_slope * x1
36
+
37
+ line_parameters[i, 0] = line_slope
38
+ line_parameters[i, 1] = line_intercept
39
+
40
+ return line_parameters, all_points
41
+
42
+ def create_points_plot(all_points, circle_points):
43
+ fig, ax = plt.subplots()
44
+
45
+ for points in all_points:
46
+ x_values = points[:, 0]
47
+ y_values = points[:, 1]
48
+ ax.scatter(x_values, y_values, alpha=0.2, color="blue")
49
+
50
+ ax.scatter(circle_points[:, 0], circle_points[:, 1], alpha=0.2, color='red')
51
+
52
+ fig.canvas.draw()
53
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
54
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
55
+
56
+ plt.close(fig)
57
+
58
+ return img
59
+
60
+ def create_points_lines_plot(all_points, line_parameters):
61
+ fig, ax = plt.subplots()
62
+
63
+ for points, (slope, intercept) in zip(all_points, line_parameters):
64
+ x_values = points[:, 0]
65
+ y_values = points[:, 1]
66
+ ax.scatter(x_values, y_values, alpha=0.2)
67
+ ax.plot(x_values, slope * x_values + intercept, alpha=0.5)
68
+
69
+ fig.canvas.draw()
70
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
71
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
72
+
73
+ plt.close(fig)
74
+
75
+ return img
76
+
77
+ def create_cluster_plot(line_parameters, labels, centroids):
78
+ fig, ax = plt.subplots()
79
+ ax.scatter(line_parameters[:, 0], line_parameters[:, 1], c=labels, cmap='viridis')
80
+ ax.set_xlabel('Slope')
81
+ ax.set_ylabel('Intercept')
82
+
83
+ fig.canvas.draw()
84
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
85
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
86
+
87
+ plt.close(fig)
88
+
89
+ return img
90
+
91
+ def cluster_line_parameters(line_parameters, num_clusters, all_points, circle_points):
92
+ kmeans = KMeans(n_clusters=num_clusters)
93
+ kmeans.fit(line_parameters)
94
+ labels = kmeans.labels_
95
+ centroids = kmeans.cluster_centers_
96
+ counts = np.bincount(labels)
97
+
98
+ points_img = create_points_plot(all_points, circle_points)
99
+ points_lines_img = create_points_lines_plot(all_points, line_parameters)
100
+ cluster_img = create_cluster_plot(line_parameters, labels, centroids)
101
+
102
+ return labels, centroids, counts, points_img, points_lines_img, cluster_img
103
+
104
+ def predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max):
105
+ x_values = np.linspace(x_min, x_max, num_points)
106
+ noise = np.random.normal(mean, std, num_points)
107
+ y_values = slope * x_values + intercept + noise
108
+ return x_values, y_values
109
+
110
+ def cluster_line_params(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations, num_clusters, center_x, center_y, radius, circle_points, random_seed):
111
+ np.random.seed(random_seed)
112
+ num_points = int(num_points)
113
+ num_iterations = int(num_iterations)
114
+ num_clusters = int(num_clusters)
115
+ points_in_circle = generate_random_points_in_circle(center_x, center_y, radius, circle_points)
116
+ line_parameters, all_points = compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations)
117
+ labels, centroids, counts, points_img, points_lines_img, cluster_img = cluster_line_parameters(line_parameters, num_clusters, all_points, points_in_circle)
118
+ # return labels, centroids, img
119
+ # put counts as the third column of centroids
120
+ centroids = np.c_[centroids, counts]
121
+ df = pd.DataFrame(centroids, columns=["Slope", "Intercept", "Count"])
122
+ # return img, centroids, df
123
+ return points_img, points_lines_img, cluster_img, df
124
+
125
+ # Define input and output components
126
+ inputs = [
127
+ Slider(minimum=-5.0, maximum=5.0, value=1.0, label="Line Slope"),
128
+ Slider(minimum=-10.0, maximum=10.0, value=0.0, label="Line Intercept"),
129
+ Slider(minimum=0.0, maximum=5.0, value=1.0, label="Line Error Mean"),
130
+ Slider(minimum=0.0, maximum=5.0, value=1.0, label="Line Error Standard Deviation"),
131
+ Number(value=100, label="Number of Points Sampled from the Line"),
132
+ Number(value=-5, label="Minimum Value of x for Sampling"),
133
+ Number(value=5, label="Maximum Value of x for Sampling"),
134
+ Number(value=100, label="Number of Iterations for RANSAC-like Line Parameter Estimation"),
135
+ Number(value=3, label="Number of Clusters of Line Parameters"),
136
+ Number(value=0, label="X Value Center of the Circle"),
137
+ Number(value=0, label="Y Value Center of the Circle"),
138
+ Number(value=1, label="Radius of the Circle"),
139
+ Number(value=100, precision=0, label="Number of Points Sampled from the Circle"),
140
+ Number(value=0, precision=0, label="Random Seed")
141
+ ]
142
+
143
+ outputs = [
144
+ Image(label="Points", type="pil"),
145
+ Image(label="Points and Lines", type="pil"),
146
+ Image(label="Clustering of the line parameters", type="pil"),
147
+ Dataframe(label="Centroids and Counts", type="pandas")
148
+ ]
149
+
150
+ # Create the Gradio interface
151
+ interface = gr.Interface(
152
+ fn=cluster_line_params,
153
+ inputs=inputs,
154
+ # outputs=["numpy", "numpy", "image"],
155
+ outputs=outputs,
156
+ title="Line Parameter Clustering",
157
+ description="Cluster line parameters with Gaussian noise",
158
+ allow_flagging="never"
159
+ )
160
+
161
+ # Launch the interface
162
+ interface.launch()
163
+
164
+
165
+
line_models_sampling.py CHANGED
@@ -1,18 +1,80 @@
1
  import numpy as np
2
  import pandas as pd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
- def compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  line_parameters = np.zeros((num_iterations, 2))
6
  for i in range(num_iterations):
7
- # Generate points on the line with noise
8
- x_values, y_values_with_noise = predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max)
 
9
 
10
- # Randomly sample two points from the line
11
- idx = np.random.choice(num_points, 2, replace=False)
12
- x1, y1 = x_values[idx[0]], y_values_with_noise[idx[0]]
13
- x2, y2 = x_values[idx[1]], y_values_with_noise[idx[1]]
14
-
15
- # Compute slope and intercept of line passing through sampled points
16
  line_slope = (y2 - y1) / (x2 - x1)
17
  line_intercept = y1 - line_slope * x1
18
 
@@ -21,88 +83,59 @@ def compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_ma
21
 
22
  return line_parameters
23
 
24
- from sklearn.cluster import KMeans
25
- # import matplotlib.pyplot as plt
26
 
27
- import gradio as gr
28
- import matplotlib.pyplot as plt
29
- import numpy as np
30
- from sklearn.cluster import KMeans
31
 
32
- def cluster_line_parameters(line_parameters, num_clusters):
33
- # Cluster line parameters using KMeans
34
  kmeans = KMeans(n_clusters=num_clusters)
35
  kmeans.fit(line_parameters)
36
  labels = kmeans.labels_
37
  centroids = kmeans.cluster_centers_
38
- # how many points are in each cluster
39
  counts = np.bincount(labels)
40
 
41
- # Create a scatter plot of the data points
42
- fig, ax = plt.subplots()
43
- ax.scatter(line_parameters[:, 0], line_parameters[:, 1], c=labels, cmap='viridis')
44
- ax.set_xlabel('Slope')
45
- ax.set_ylabel('Intercept')
46
-
47
- # Generate some lines using the centroids
48
- '''
49
- x = np.linspace(x_min, x_max, num_points)
50
- for i in range(num_clusters):
51
- slope, intercept = centroids[i]
52
- y = slope * x + intercept
53
- ax.plot(x, y, linewidth=2)
54
- '''
55
-
56
- # Convert the figure to a PNG image
57
- fig.canvas.draw()
58
- img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
59
- img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
60
-
61
- # Close the figure to free up memory
62
- plt.close(fig)
63
-
64
- # Return the labels, centroids, and image
65
- return labels, centroids, counts, img
66
-
67
- import gradio as gr
68
 
69
- def predict_line_with_noise(slope, intercept, mean, std, num_points, x_min, x_max):
70
- x_values = np.linspace(x_min, x_max, num_points)
71
- noise = np.random.normal(mean, std, num_points)
72
- y_values = slope * x_values + intercept + noise
73
- return x_values, y_values
74
 
75
- def cluster_line_params(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations, num_clusters):
76
- num_points = int(num_points)
 
77
  num_iterations = int(num_iterations)
78
  num_clusters = int(num_clusters)
79
- line_parameters = compute_line_parameters(slope, intercept, mean, std, num_points, x_min, x_max, num_iterations)
80
- labels, centroids, counts, img = cluster_line_parameters(line_parameters, num_clusters)
81
- # return labels, centroids, img
82
- # put counts as the third column of centroids
 
83
  centroids = np.c_[centroids, counts]
84
  df = pd.DataFrame(centroids, columns=["Slope", "Intercept", "Count"])
85
- # return img, centroids, df
86
- return img, df
87
 
88
  # Define input and output components
89
  inputs = [
90
- gr.inputs.Slider(minimum=-5.0, maximum=5.0, default=1.0, label="Slope"),
91
- gr.inputs.Slider(minimum=-10.0, maximum=10.0, default=0.0, label="Intercept"),
92
- gr.inputs.Slider(minimum=0.0, maximum=5.0, default=1.0, label="Mean"),
93
- gr.inputs.Slider(minimum=0.0, maximum=5.0, default=1.0, label="Standard Deviation"),
94
- gr.inputs.Number(default=100, label="Number of Points"),
95
- gr.inputs.Number(default=-5, label="Minimum Value of x"),
96
- gr.inputs.Number(default=5, label="Maximum Value of x"),
97
- gr.inputs.Number(default=100, label="Number of Iterations"),
98
- gr.inputs.Number(default=3, label="Number of Clusters")
 
 
 
 
 
99
  ]
100
 
101
  outputs = [
102
- #image and numpy
103
- gr.outputs.Image(label="Image", type="pil"),
104
- # show the centroids and counts, which is a numpy array
105
- gr.outputs.Dataframe(label="Centroids and Counts", type="pandas")
106
  ]
107
 
108
  # Create the Gradio interface
@@ -113,11 +146,8 @@ interface = gr.Interface(
113
  outputs=outputs,
114
  title="Line Parameter Clustering",
115
  description="Cluster line parameters with Gaussian noise",
116
- allow_flagging=False
117
  )
118
 
119
  # Launch the interface
120
- interface.launch(share=True)
121
-
122
-
123
-
 
1
  import numpy as np
2
  import pandas as pd
3
+ import matplotlib.pyplot as plt
4
+ from sklearn.cluster import KMeans
5
+ import gradio as gr
6
+ from gradio.components import Slider, Number, Image, Dataframe
7
+ import matplotlib
8
+ matplotlib.use('Agg')
9
+
10
+ def generate_random_points_in_circle(center_x, center_y, radius, num_points):
11
+ angles = np.random.uniform(0, 2 * np.pi, num_points)
12
+ radii = np.sqrt(np.random.uniform(0, radius**2, num_points))
13
+ x_values = center_x + radii * np.cos(angles)
14
+ y_values = center_y + radii * np.sin(angles)
15
+ points = np.column_stack((x_values, y_values))
16
+ return points
17
+
18
+ def generate_random_points_in_line_between_bounds_and_with_noise(slope, intercept, mean, std, num_points, x_min, x_max):
19
+ x_values = np.linspace(x_min, x_max, num_points)
20
+ noise = np.random.normal(mean, std, num_points)
21
+ y_values = slope * x_values + intercept + noise
22
+ points = np.column_stack((x_values, y_values))
23
+ return points
24
 
25
+ def generate_all_points(line_num_points, circle_num_points, center_x, center_y, radius, slope, intercept, mean, std, x_min, x_max):
26
+ circle_points = generate_random_points_in_circle(center_x, center_y, radius, circle_num_points)
27
+ line_points = generate_random_points_in_line_between_bounds_and_with_noise(slope, intercept, mean, std, line_num_points, x_min, x_max)
28
+ all_points = np.concatenate((circle_points, line_points), axis=0)
29
+ return line_points, circle_points, all_points
30
+
31
+ def create_points_plot(line_points, circle_points):
32
+ fig, ax = plt.subplots()
33
+ x_values = line_points[:, 0]
34
+ y_values = line_points[:, 1]
35
+ ax.scatter(x_values, y_values, alpha=0.2, color="blue")
36
+ ax.scatter(circle_points[:, 0], circle_points[:, 1], alpha=0.2, color='red')
37
+ fig.canvas.draw()
38
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
39
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
40
+ plt.close(fig)
41
+ return img
42
+
43
+ def create_points_lines_plot(line_points, line_parameters):
44
+ fig, ax = plt.subplots()
45
+ x_values = line_points[:, 0]
46
+ y_values = line_points[:, 1]
47
+ ax.scatter(x_values, y_values, alpha=0.2)
48
+ for slope, intercept in line_parameters:
49
+ ax.plot(x_values, slope * x_values + intercept, alpha=0.5)
50
+ fig.canvas.draw()
51
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
52
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
53
+ plt.close(fig)
54
+ return img
55
+
56
+ def create_cluster_plot(line_parameters, labels, centroids):
57
+ fig, ax = plt.subplots()
58
+ ax.scatter(line_parameters[:, 0], line_parameters[:, 1], c=labels, cmap='viridis')
59
+ ax.set_xlabel('Slope')
60
+ ax.set_ylabel('Intercept')
61
+
62
+ fig.canvas.draw()
63
+ img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
64
+ img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
65
+
66
+ plt.close(fig)
67
+
68
+ return img
69
+
70
+ # Modify the compute_line_parameters function
71
+ def compute_line_parameters(num_iterations, all_points):
72
  line_parameters = np.zeros((num_iterations, 2))
73
  for i in range(num_iterations):
74
+ idx = np.random.choice(all_points.shape[0], 2, replace=False)
75
+ x1, y1 = all_points[idx[0], 0], all_points[idx[0], 1]
76
+ x2, y2 = all_points[idx[1], 0], all_points[idx[1], 1]
77
 
 
 
 
 
 
 
78
  line_slope = (y2 - y1) / (x2 - x1)
79
  line_intercept = y1 - line_slope * x1
80
 
 
83
 
84
  return line_parameters
85
 
 
 
86
 
 
 
 
 
87
 
88
+ def cluster_line_parameters(line_parameters, num_clusters, all_points, circle_points):
 
89
  kmeans = KMeans(n_clusters=num_clusters)
90
  kmeans.fit(line_parameters)
91
  labels = kmeans.labels_
92
  centroids = kmeans.cluster_centers_
 
93
  counts = np.bincount(labels)
94
 
95
+ points_img = create_points_plot(all_points, circle_points)
96
+ points_lines_img = create_points_lines_plot(all_points, line_parameters)
97
+ cluster_img = create_cluster_plot(line_parameters, labels, centroids)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
 
99
+ return labels, centroids, counts, points_img, points_lines_img, cluster_img
 
 
 
 
100
 
101
+ # Update the cluster_line_params function
102
+ def cluster_line_params(slope, intercept, mean, std, line_num_points, x_min, x_max, num_iterations, num_clusters, center_x, center_y, radius, circle_num_points, random_seed):
103
+ np.random.seed(random_seed)
104
  num_iterations = int(num_iterations)
105
  num_clusters = int(num_clusters)
106
+
107
+ line_points, circle_points, all_points = generate_all_points(line_num_points, circle_num_points, center_x, center_y, radius, slope, intercept, mean, std, x_min, x_max)
108
+ line_parameters = compute_line_parameters(num_iterations, all_points)
109
+ labels, centroids, counts, points_img, points_lines_img, cluster_img = cluster_line_parameters(line_parameters, num_clusters, all_points, circle_points)
110
+
111
  centroids = np.c_[centroids, counts]
112
  df = pd.DataFrame(centroids, columns=["Slope", "Intercept", "Count"])
113
+
114
+ return points_img, points_lines_img, cluster_img, df
115
 
116
  # Define input and output components
117
  inputs = [
118
+ Slider(minimum=-5.0, maximum=5.0, value=1.0, label="Line Slope"),
119
+ Slider(minimum=-10.0, maximum=10.0, value=0.0, label="Line Intercept"),
120
+ Slider(minimum=0.0, maximum=5.0, value=1.0, label="Line Error Mean"),
121
+ Slider(minimum=0.0, maximum=5.0, value=1.0, label="Line Error Standard Deviation"),
122
+ Number(value=100, precision=0, label="Number of Points Sampled from the Line"),
123
+ Number(value=-5, label="Minimum Value of x for Sampling"),
124
+ Number(value=5, label="Maximum Value of x for Sampling"),
125
+ Number(value=100, label="Number of Iterations for RANSAC-like Line Parameter Estimation"),
126
+ Number(value=3, label="Number of Clusters of Line Parameters"),
127
+ Number(value=0, label="X Value Center of the Circle"),
128
+ Number(value=0, label="Y Value Center of the Circle"),
129
+ Number(value=1, label="Radius of the Circle"),
130
+ Number(value=100, precision=0, label="Number of Points Sampled from the Circle"),
131
+ Number(value=0, precision=0, label="Random Seed")
132
  ]
133
 
134
  outputs = [
135
+ Image(label="Points", type="pil"),
136
+ Image(label="Points and Lines", type="pil"),
137
+ Image(label="Clustering of the line parameters", type="pil"),
138
+ Dataframe(label="Centroids and Counts", type="pandas")
139
  ]
140
 
141
  # Create the Gradio interface
 
146
  outputs=outputs,
147
  title="Line Parameter Clustering",
148
  description="Cluster line parameters with Gaussian noise",
149
+ allow_flagging="never"
150
  )
151
 
152
  # Launch the interface
153
+ interface.launch()