Skip to content

Commit

Permalink
caltech ROC test:
Browse files Browse the repository at this point in the history
- parse idl
- replase option parser with argument parser
  • Loading branch information
marina.kolpakova committed Feb 1, 2013
1 parent 8cd509e commit ca08101
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 63 deletions.
63 changes: 0 additions & 63 deletions apps/sft/misk/roc-test.py

This file was deleted.

70 changes: 70 additions & 0 deletions apps/sft/misk/roc_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#!/usr/bin/env python

import argparse
import sft

import sys, os, os.path, glob, math, cv2
from datetime import datetime
import numpy

def call_parser(f, a):
return eval( "sft.parse_" + f + "('" + a + "')")

if __name__ == "__main__":
parser = argparse.ArgumentParser(description = 'Plot ROC curve using Caltech mathod of per image detection performance estimation.')

# positional
parser.add_argument("cascade", help = "Path to the tested detector.")
parser.add_argument("input", help = "Image sequence pattern.")
parser.add_argument("annotations", help = "Path to the annotations.")

# optional
parser.add_argument("-m", "--min_scale", dest = "min_scale", type = float, metavar= "fl", help = "Minimum scale to be tested.", default = 0.4)
parser.add_argument("-M", "--max_scale", dest = "max_scale", type = float, metavar= "fl", help = "Maximum scale to be tested.", default = 5.0)
parser.add_argument("-o", "--output", dest = "output", type = str, metavar= "path", help = "Path to store resultiong image.", default = "./roc.png")
parser.add_argument("-n", "--nscales", dest = "nscales", type = int, metavar= "n", help = "Prefered count of scales from min to max.", default = 55)

# required
parser.add_argument("-f", "--anttn-format", dest = "anttn_format", choices = ['inria', 'caltech', "idl"], help = "Annotation file for test sequence.", required = True)

args = parser.parse_args()

samples = call_parser(args.anttn_format, args.annotations)

# where we use nms cv::SCascade::DOLLAR == 2
cascade = cv2.SCascade(args.min_scale, args.max_scale, args.nscales, 2)
xml = cv2.FileStorage(args.cascade, 0)
dom = xml.getFirstTopLevelNode()
assert cascade.load(dom)

frame = 0
pattern = args.input
camera = cv2.VideoCapture(args.input)
while True:
ret, img = camera.read()
if not ret:
break;

name = pattern % (frame,)
qq = pattern.format(frame)
_, tail = os.path.split(name)

boxes = samples[tail]
if boxes is not None:
sft.draw_rects(img, boxes, (255, 0, 0), lambda x, y : y)

frame = frame + 1

# sample = samples[]



rects, confs = cascade.detect(img, rois = None)

# # draw results
if rects is not None:
sft.draw_rects(img, rects[0], (0, 255, 0))

cv2.imshow("result", img);
if (cv2.waitKey (5) != -1):
break;
42 changes: 42 additions & 0 deletions apps/sft/misk/sft.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env python

import cv2, re, glob

def draw_rects(img, rects, color, l = lambda x, y : x + y):
if rects is not None:
for x1, y1, x2, y2 in rects:
cv2.rectangle(img, (x1, y1), (l(x1, x2), l(y1, y2)), color, 2)

class Sample:
def __init__(self, bbs, img):
self.image = img
self.bbs = bb

def parse_inria(ipath, f):
bbs = []
path = None
for l in f:
box = None
if l.startswith("Bounding box"):
b = [x.strip() for x in l.split(":")[1].split("-")]
c = [x[1:-1].split(",") for x in b]
d = [int(x) for x in sum(c, [])]
bbs.append(d)

if l.startswith("Image filename"):
path = l.split('"')[-2]

return Sample(path, bbs)

def glob_set(pattern):
return [__n for __n in glob.iglob(pattern)] #glob.iglob(pattern)

# parse ETH idl file
def parse_idl(f):
map = {}
for l in open(f):
l = re.sub(r"^\"left\/", "{\"", l)
l = re.sub(r"\:", ":[", l)
l = re.sub(r"(\;|\.)$", "]}", l)
map.update(eval(l))
return map

0 comments on commit ca08101

Please sign in to comment.