bfscore_python
bfscore_python copied to clipboard
Fast version
Dude, the prec/recall function is very slow. Use numpy if possible for batch calculations:
def calc_precision_recall(contours_a, contours_b, threshold):
x = contours_a
y = contours_b
t1 = np.tile(x, (len(y),1))
t2 = np.repeat(y, len(x), axis=0)
t = np.concatenate( (t1,t2), axis=1)
dx = (t[...,0] - t[...,2]) * (t[...,0] - t[...,2])
dy = (t[...,1] - t[...,3]) * (t[...,1] - t[...,3])
thr = (dx + dy) < (threshold * threshold)
blocks = np.split(thr, len(y))
block_has_hit = [np.any(x == True) for x in blocks]
top_count = np.sum(block_has_hit)
precision_recall = top_count/len(y)
return precision_recall, top_count, len(y)
It should be the same, you can validate it with your own data. Thanks, Balint
Even faster to keep the outer loop:
def calc_precision_recall(contours_a, contours_b, threshold):
x = contours_a
y = contours_b
xx = np.array(x)
hits = []
for yrec in y:
d = np.square(xx[:,0] - yrec[0]) + np.square(xx[:,1] - yrec[1]) < (threshold * threshold)
hits.append(np.any(d == True))
top_count = np.sum(hits)
precision_recall = top_count/len(y)
return precision_recall, top_count, len(y)
Thanks, all the best!
Thank you very much, @bpfliegel for your suggestions. Appreciate it.
Thanks to you for your work! :)
Hey, @bpfliegel , just wondering could you please create a pull request with your improvements? That would be really great. Thank you very much.
@minar09 too busy, sorry, but I posted you the source code above ^^^ thanks
@bpfliegel , same here. No problem. Thank you very much for the codes. I will try to update the repository.
Hi! Thanks for the repo. I implemented @bpfliegel's 2nd version and did a PR, all the details are there: #2
Thank you @theodumont for your contributions.