balthou commited on
Commit
0639f56
·
1 Parent(s): caa1b69
Files changed (1) hide show
  1. app.py +56 -12
app.py CHANGED
@@ -24,49 +24,93 @@ def get_crop(img, pos_x, pos_y, crop_size=0.1):
24
  @interactive(seed=(45, [0, 100], "Puzzle seed"))
25
  def generate_random_puzzle(seed: int = 45, context: dict = {}):
26
  np.random.seed(seed)
27
- pos_x, pos_y, intensity = np.random.uniform(0.2, 0.8, 3)
28
- context["puzzle"] = (pos_x, pos_y, intensity)
29
  context["puzzle_flip_mirror"] = np.random.choice([True, False], 2)
30
 
31
 
32
- def create_puzzle(img, context: dict = {}):
33
  out = img.copy()
34
- x_gt, y_gt, intensity = context["puzzle"]
35
  flip_gt, mirror_gt = context["puzzle_flip_mirror"]
36
  cs_x, cs_y = get_crop(img, x_gt, y_gt)
37
  crop = img[cs_y[0]:cs_y[1], cs_x[0]:cs_x[1], ...]
38
- out[cs_y[0]:cs_y[1], cs_x[0]:cs_x[1]] = intensity*0.4*crop
39
  crop = flip_image(crop, flip=flip_gt, mirror=mirror_gt)
40
  return out, crop
41
 
42
 
43
  @interactive(
44
- flip=(True, "Flip Image"),
45
- mirror=(True, "Mirror Image"),
46
  )
47
- def flip_mirror_piece(piece: np.ndarray, flip=True, mirror=True):
 
 
 
 
 
 
48
  return flip_image(piece.copy(), flip=flip, mirror=mirror)
49
 
50
 
51
  @interactive(
52
- pos_x=(0.5, [0.1, 0.9], "Position X"),
53
- pos_y=(0.5, [0.1, 0.9], "Position Y"),
54
  )
55
- def place_puzzle(puzzle, piece, pos_x: float = 0.5, pos_y: float = 0.5):
 
 
 
 
 
 
56
  out = puzzle.copy()
 
57
  cp_x, cp_y = get_crop(img, pos_x, pos_y)
58
  out[cp_y[0]:cp_y[1], cp_x[0]:cp_x[1]] = piece
59
  return out
60
 
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  # pipeline definition
63
  # -------------------
 
 
64
  def captcha_pipe(inp):
65
  generate_random_puzzle()
66
  puzzle, puzzle_piece = create_puzzle(inp)
67
  puzzle_piece = flip_mirror_piece(puzzle_piece)
68
  puzzle = place_puzzle(puzzle, puzzle_piece)
69
- return [puzzle_piece, puzzle]
 
 
70
 
71
 
72
  if __name__ == "__main__":
 
24
  @interactive(seed=(45, [0, 100], "Puzzle seed"))
25
  def generate_random_puzzle(seed: int = 45, context: dict = {}):
26
  np.random.seed(seed)
27
+ pos_x, pos_y = np.random.uniform(0.2, 0.8, 2)
28
+ context["puzzle_pos"] = (pos_x, pos_y)
29
  context["puzzle_flip_mirror"] = np.random.choice([True, False], 2)
30
 
31
 
32
+ def create_puzzle(img, intensity: float = 0.4, context: dict = {}):
33
  out = img.copy()
34
+ x_gt, y_gt = context["puzzle_pos"]
35
  flip_gt, mirror_gt = context["puzzle_flip_mirror"]
36
  cs_x, cs_y = get_crop(img, x_gt, y_gt)
37
  crop = img[cs_y[0]:cs_y[1], cs_x[0]:cs_x[1], ...]
38
+ out[cs_y[0]:cs_y[1], cs_x[0]:cs_x[1]] = intensity*crop
39
  crop = flip_image(crop, flip=flip_gt, mirror=mirror_gt)
40
  return out, crop
41
 
42
 
43
  @interactive(
44
+ flip=(False, "Flip Image"),
45
+ mirror=(False, "Mirror Image"),
46
  )
47
+ def flip_mirror_piece(
48
+ piece: np.ndarray,
49
+ flip: bool = False,
50
+ mirror: bool = False,
51
+ context: dict = {}
52
+ ) -> np.ndarray:
53
+ context["user_flip_mirror"] = (flip, mirror)
54
  return flip_image(piece.copy(), flip=flip, mirror=mirror)
55
 
56
 
57
  @interactive(
58
+ pos_x=(0.5, [0.1, 0.9, 0.005], "Position X", ["left", "right"]),
59
+ pos_y=(0.5, [0.1, 0.9, 0.005], "Position Y", ["up", "down"]),
60
  )
61
+ def place_puzzle(
62
+ puzzle: np.ndarray,
63
+ piece: np.ndarray,
64
+ pos_x: float = 0.5,
65
+ pos_y: float = 0.5,
66
+ context: dict = {}
67
+ ) -> np.ndarray:
68
  out = puzzle.copy()
69
+ context["user_pos"] = (pos_x, pos_y)
70
  cp_x, cp_y = get_crop(img, pos_x, pos_y)
71
  out[cp_y[0]:cp_y[1], cp_x[0]:cp_x[1]] = piece
72
  return out
73
 
74
 
75
+ TOLERANCES = {"low": 0.01, "medium": 0.02, "high": 0.05}
76
+ TOLERANCE_LEVELS = list(TOLERANCES.keys())
77
+
78
+
79
+ @interactive(
80
+ tolerance=(TOLERANCE_LEVELS[0], TOLERANCE_LEVELS, "Tolerance")
81
+ )
82
+ def check_puzzle(tolerance: str = "low", context: dict = {}):
83
+ x_gt, y_gt = context["puzzle_pos"]
84
+ flip_gt, mirror_gt = context["puzzle_flip_mirror"]
85
+ x, y = context["user_pos"]
86
+ flip, mirror = context["user_flip_mirror"]
87
+ check_pos = np.allclose([x_gt, y_gt], [x, y],
88
+ atol=TOLERANCES.get(tolerance, 0.01))
89
+ check_flip_mirror = (flip_gt == flip) and (mirror_gt == mirror)
90
+ success = check_pos and check_flip_mirror
91
+ context["success"] = success
92
+
93
+
94
+ def show_feedback(context: dict = {}):
95
+ success = context["success"]
96
+ flat_array = np.ones((256, 256, 3))
97
+ if success:
98
+ return flat_array*np.array([0., 1., 0.])[None, None, :]
99
+ else:
100
+ return flat_array*np.array([1., 0., 0.])[None, None, :]
101
+
102
  # pipeline definition
103
  # -------------------
104
+
105
+
106
  def captcha_pipe(inp):
107
  generate_random_puzzle()
108
  puzzle, puzzle_piece = create_puzzle(inp)
109
  puzzle_piece = flip_mirror_piece(puzzle_piece)
110
  puzzle = place_puzzle(puzzle, puzzle_piece)
111
+ check_puzzle()
112
+ validity = show_feedback()
113
+ return [puzzle_piece, puzzle, validity]
114
 
115
 
116
  if __name__ == "__main__":