add cropping and aspect ratio normalization

pull/322/head
marina.kolpakova 12 years ago
parent 18df46fbe9
commit d1952f28d9
  1. 10
      apps/sft/misk/roc_test.py
  2. 34
      apps/sft/misk/sft.py

@ -40,6 +40,7 @@ if __name__ == "__main__":
frame = 0 frame = 0
pattern = args.input pattern = args.input
camera = cv2.VideoCapture(args.input) camera = cv2.VideoCapture(args.input)
while True: while True:
ret, img = camera.read() ret, img = camera.read()
if not ret: if not ret:
@ -50,17 +51,18 @@ if __name__ == "__main__":
_, tail = os.path.split(name) _, tail = os.path.split(name)
boxes = samples[tail] boxes = samples[tail]
boxes = sft.norm_acpect_ratio(boxes, 0.5)
if boxes is not None: if boxes is not None:
sft.draw_rects(img, boxes, (255, 0, 0), lambda x, y : y) sft.draw_rects(img, boxes, (255, 0, 0), lambda x, y : y)
frame = frame + 1 frame = frame + 1
rects, confs = cascade.detect(img, rois = None) rects, confs = cascade.detect(img, rois = None)
fp = sft.match(boxes, rects, confs) dt_old = sft.match(boxes, rects, confs)
# # draw results if dt_old is not None:
if rects is not None: sft.draw_dt(img, dt_old, (0, 255, 0))
sft.draw_rects(img, rects[0], (0, 255, 0))
cv2.imshow("result", img); cv2.imshow("result", img);
if (cv2.waitKey (0) == 27): if (cv2.waitKey (0) == 27):

@ -29,13 +29,25 @@ def plot_curve():
plt.xscale('log') plt.xscale('log')
plt.show() plt.show()
def crop_rect(rect, factor):
val_x = factor * float(rect[2])
val_y = factor * float(rect[3])
x = [int(rect[0] + val_x), int(rect[1] + val_y), int(rect[2] - 2.0 * val_x), int(rect[3] - 2.0 * val_y)]
return x
def draw_rects(img, rects, color, l = lambda x, y : x + y): def draw_rects(img, rects, color, l = lambda x, y : x + y):
if rects is not None: if rects is not None:
for x1, y1, x2, y2 in rects: for x1, y1, x2, y2 in rects:
cv2.rectangle(img, (x1, y1), (l(x1, x2), l(y1, y2)), color, 2) cv2.rectangle(img, (x1, y1), (l(x1, x2), l(y1, y2)), color, 2)
def draw_dt(img, dts, color, l = lambda x, y : x + y):
if dts is not None:
for dt in dts:
bb = dt.bb
x1, y1, x2, y2 = dt.bb[0], dt.bb[1], dt.bb[2], dt.bb[3]
cv2.rectangle(img, (x1, y1), (l(x1, x2), l(y1, y2)), color, 2)
class Annotation: class Annotation:
def __init__(self, bb): def __init__(self, bb):
self.bb = bb self.bb = bb
@ -49,6 +61,10 @@ class Detection:
# def crop(self): # def crop(self):
# rel_scale = self.bb[1] / 128 # rel_scale = self.bb[1] / 128
def crop(self, factor):
print "was", self.bb
self.bb = crop_rect(self.bb, factor)
print "bec", self.bb
# we use rect-stype for dt and box style for gt. ToDo: fix it # we use rect-stype for dt and box style for gt. ToDo: fix it
def overlap(self, b): def overlap(self, b):
@ -94,6 +110,16 @@ def parse_idl(f):
map.update(eval(l)) map.update(eval(l))
return map return map
def norm_box(box, ratio):
middle = float(box[0] + box[2]) / 2.0
new_half_width = float(box[3] - box[1]) * ratio / 2.0
return (int(round(middle - new_half_width)), box[1], int(round(middle + new_half_width)), box[3])
def norm_acpect_ratio(boxes, ratio):
return [ norm_box(box, ratio) for box in boxes]
def match(gts, rects, confs): def match(gts, rects, confs):
if rects is None: if rects is None:
return 0 return 0
@ -105,6 +131,11 @@ def match(gts, rects, confs):
dts = zip(dts[0][0], dts[0][1]) dts = zip(dts[0][0], dts[0][1])
dts = [Detection(r,c) for r, c in dts] dts = [Detection(r,c) for r, c in dts]
factor = 1.0 / 8.0
dt_old = dts
for dt in dts:
dt.crop(factor)
for gt in gts: for gt in gts:
# exclude small # exclude small
@ -132,3 +163,4 @@ def match(gts, rects, confs):
fp = fp + 1 fp = fp + 1
print "fp", fp print "fp", fp
return dt_old

Loading…
Cancel
Save