Skip to content

Fast version #1

Open
Open

Description

@bpfliegel

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

Activity

  1. bpfliegel commented on Oct 21, 2019

    @bpfliegel
    Author

    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!

  2. minar09 commented on Oct 22, 2019

    @minar09
    Owner

    Thank you very much, @bpfliegel for your suggestions. Appreciate it.

  3. bpfliegel commented on Oct 22, 2019

    @bpfliegel
    Author

    Thanks to you for your work! :)

  4. minar09 commented on Apr 18, 2020

    @minar09
    Owner

    Hey, @bpfliegel , just wondering could you please create a pull request with your improvements? That would be really great. Thank you very much.

  5. bpfliegel commented on Apr 19, 2020

    @bpfliegel
    Author

    @minar09 too busy, sorry, but I posted you the source code above ^^^ thanks

  6. minar09 commented on Apr 20, 2020

    @minar09
    Owner

    @bpfliegel , same here. No problem. Thank you very much for the codes. I will try to update the repository.

  7. theodumont commented on Nov 17, 2020

    @theodumont
    Contributor

    Hi! Thanks for the repo.
    I implemented @bpfliegel's 2nd version and did a PR, all the details are there: #2

  8. minar09 commented on Nov 17, 2020

    @minar09
    Owner

    Thank you @theodumont for your contributions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions