Laufey commited on
Commit
58da6de
·
verified ·
1 Parent(s): fa18cc6

Update rule_based_quality.py

Browse files
Files changed (1) hide show
  1. rule_based_quality.py +24 -38
rule_based_quality.py CHANGED
@@ -1,59 +1,45 @@
1
  import numpy as np
2
 
3
  class RuleBasedQualityEvaluator:
4
- def __init__(self):
5
- self.thresholds = {
6
- "perfect": {
7
- "circularity": 0.90,
8
- "angle_error": 5.0,
9
- "side_var": 0.05
10
- },
11
- "medium": {
12
- "circularity": 0.70,
13
- "angle_error": 15.0,
14
- "side_var": 0.15
15
- }
16
- }
17
-
18
- def evaluate(self, features: dict, shape: str):
19
- score = 1.0
20
-
21
- # circle
22
- if shape.lower() == "circle":
23
- circ = features.get("circularity", 0.0)
24
- score = np.clip((circ - 0.7) / 0.3, 0, 1)
25
-
26
- if circ >= self.thresholds["perfect"]["circularity"]:
27
  return "perfect", float(score)
28
- elif circ >= self.thresholds["medium"]["circularity"]:
29
  return "medium", float(score * 0.8)
30
  else:
31
  return "irregular", float(score * 0.6)
32
 
33
- # square/rectangle
34
- if shape.lower() in ["square", "rectangle"]:
35
- angle_err = features.get("angle_error", 90.0)
36
- side_var = features.get("side_length_variance", 1.0)
37
 
38
- score = 1 - np.clip((angle_err / 30 + side_var) / 2, 0, 1)
39
 
40
- if angle_err <= 5 and side_var <= 0.05:
41
  return "perfect", float(score)
42
- elif angle_err <= 15 and side_var <= 0.15:
43
  return "medium", float(score * 0.8)
44
  else:
45
  return "irregular", float(score * 0.6)
46
 
47
- # triangle
48
- if shape.lower() == "triangle":
49
- side_var = features.get("side_length_variance", 1.0)
50
- angle_err = features.get("angle_error", 60.0)
51
 
52
- score = 1 - np.clip((side_var + angle_err / 60) / 2, 0, 1)
53
 
54
- if side_var <= 0.05 and angle_err <= 5:
55
  return "perfect", float(score)
56
- elif side_var <= 0.15 and angle_err <= 15:
57
  return "medium", float(score * 0.8)
58
  else:
59
  return "irregular", float(score * 0.6)
 
1
  import numpy as np
2
 
3
  class RuleBasedQualityEvaluator:
4
+
5
+ def evaluate(self, f: dict, shape: str):
6
+ shape = shape.lower()
7
+
8
+ if shape == "circle":
9
+ circ = f["circularity"]
10
+ ecc = f["eccentricity"]
11
+
12
+ score = np.clip((circ - 0.8) / 0.2, 0, 1)
13
+
14
+ if circ >= 0.95 and ecc < 0.3:
 
 
 
 
 
 
 
 
 
 
 
 
15
  return "perfect", float(score)
16
+ elif circ >= 0.85:
17
  return "medium", float(score * 0.8)
18
  else:
19
  return "irregular", float(score * 0.6)
20
 
21
+ if shape in ["square", "rectangle"]:
22
+ ang = f["angle_error"]
23
+ side_var = f["side_length_variance"]
 
24
 
25
+ score = 1 - np.clip((ang/30 + side_var) / 2, 0, 1)
26
 
27
+ if ang <= 5 and side_var <= 0.05:
28
  return "perfect", float(score)
29
+ elif ang <= 15 and side_var <= 0.15:
30
  return "medium", float(score * 0.8)
31
  else:
32
  return "irregular", float(score * 0.6)
33
 
34
+ if shape == "triangle":
35
+ ang = f["angle_error"]
36
+ side_var = f["side_length_variance"]
 
37
 
38
+ score = 1 - np.clip((ang/25 + side_var) / 2, 0, 1)
39
 
40
+ if ang <= 5 and side_var <= 0.05:
41
  return "perfect", float(score)
42
+ elif ang <= 15 and side_var <= 0.15:
43
  return "medium", float(score * 0.8)
44
  else:
45
  return "irregular", float(score * 0.6)