Niv Sardi commited on
Commit
e7640ca
1 Parent(s): 9996fa3

augmentor: bugfix, properly convert between bb and centroid

Browse files
Files changed (2) hide show
  1. python/augment.py +2 -1
  2. python/imtool.py +46 -16
python/augment.py CHANGED
@@ -105,7 +105,8 @@ with pipeline.pool(processes=-1, seed=1) as pool:
105
  alpha = cv2.split(batch_aug.heatmaps_aug[logo_idx])
106
  try:
107
  img, bb, (w, h) = imtool.mix_alpha(img, logo, alpha[0], random.random(), random.random())
108
- anotations.append(f'0 {bb.x/w} {bb.y/h} {bb.w/w} {bb.h/h}')
 
109
  except AssertionError as e:
110
  print(f'couldnt process {i}, {j}: {e}')
111
 
 
105
  alpha = cv2.split(batch_aug.heatmaps_aug[logo_idx])
106
  try:
107
  img, bb, (w, h) = imtool.mix_alpha(img, logo, alpha[0], random.random(), random.random())
108
+ c = bb.to_centroid((h, w, 1))
109
+ anotations.append(c.to_anotation(0))
110
  except AssertionError as e:
111
  print(f'couldnt process {i}, {j}: {e}')
112
 
python/imtool.py CHANGED
@@ -19,10 +19,13 @@ class BoundingBox(NamedTuple):
19
  h: float = 0.0
20
 
21
  @classmethod
22
- def from_centroid(cls, c):
23
- x = math.floor(c.x + c.w/2)
24
- y = math.floor(c.y + c.h/2)
25
- self = cls(x=x, y=y, w=math.ceil(c.w), h=math.ceil(c.h))
 
 
 
26
  return self
27
 
28
  @classmethod
@@ -30,26 +33,53 @@ class BoundingBox(NamedTuple):
30
  self = cls(x=d['x'], y=d['y'], w=d['width'], h=d['height'])
31
  return self
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  class Centroid(BoundingBox):
34
- @classmethod
35
- def from_bounding_box(cls, b):
36
- x = math.floor(b.x - c.w/2)
37
- y = math.floor(b.y - c.h/2)
38
- self = cls(x=x, y=y, w=math.ceil(c.w), h=math.ceil(c.h))
 
 
 
39
 
40
- def read_bounding_boxes(filename):
41
- boxes = []
 
 
 
 
 
42
  bco = None
43
  with open(filename, 'r') as f:
44
  lines = f.readlines()
45
  for l in lines:
46
  (b, x,y,w,h) = [float(i) for i in l.split(' ')]
47
  bco = b
48
- if x < 0 or y < 0 or w < 10 or h < 10:
49
- print(f"dropping logo, it has inconsistent size: {w}x{h}@{x}x{y}")
50
- continue
51
- boxes.append(BoundingBox(x,y,w,h))
52
- return bco, boxes
 
 
 
 
53
 
54
  def coord_dict_to_point(c):
55
  return coord_to_point(c['x'], c['y'], c['width'], c['heigh'])
 
19
  h: float = 0.0
20
 
21
  @classmethod
22
+ def from_centroid(cls, c, shape = (1,1,1)):
23
+ (h, w, c) = shape
24
+ print(cls, c, shape)
25
+ self = cls(x=math.floor(w*(c.x - c.w/2))
26
+ , y=math.floor(h*(c.y - c.h/2))
27
+ , w=math.ceil(w*c.w)
28
+ , h=math.ceil(h*c.h))
29
  return self
30
 
31
  @classmethod
 
33
  self = cls(x=d['x'], y=d['y'], w=d['width'], h=d['height'])
34
  return self
35
 
36
+ @property
37
+ def start(self):
38
+ return (self.x, self.y)
39
+
40
+ @property
41
+ def end(self):
42
+ return (self.x + self.w, self.y + self.h)
43
+
44
+ def to_centroid(self, shape = (1,1,1)):
45
+ (h, w, c) = shape
46
+ return Centroid(x=math.floor(self.x + self.w/2)/w
47
+ , y=math.floor(self.y + self.h/2)/h
48
+ , w=math.ceil(self.w)/w
49
+ , h=math.ceil(self.h)/h)
50
+
51
  class Centroid(BoundingBox):
52
+ def to_bounding_box(self, shape = (1,1,1)):
53
+ (h, w, c) = shape
54
+
55
+ return BoundingBox(
56
+ x=math.floor(w*(self.x - self.w/2))
57
+ , y=math.floor(h*(self.y - self.h/2))
58
+ , w=math.ceil(w*self.w)
59
+ , h=math.ceil(h*self.h))
60
 
61
+ def to_anotation(self, id: int, shape=(1,1,1)):
62
+ (h, w, c) = shape
63
+
64
+ return f'{id} {self.x/w} {self.y/h} {self.w/w} {self.h/h}'
65
+
66
+ def read_marker(filename: str, Type: type):
67
+ ret = []
68
  bco = None
69
  with open(filename, 'r') as f:
70
  lines = f.readlines()
71
  for l in lines:
72
  (b, x,y,w,h) = [float(i) for i in l.split(' ')]
73
  bco = b
74
+ print(b, x,y,w,h)
75
+ ret.append(Type(x,y,w,h))
76
+ return bco, ret
77
+
78
+ def read_bounding_boxes(filename: str):
79
+ return read_marker(filename, BoundingBox)
80
+
81
+ def read_centroids(filename: str):
82
+ return read_marker(filename, Centroid)
83
 
84
  def coord_dict_to_point(c):
85
  return coord_to_point(c['x'], c['y'], c['width'], c['heigh'])