Skip to main content

Collection of fast polygon operations for DL

Project description

uPolygon

Library of handy polygon related functions to speed up machine learning projects.

It was born as a replacement for cv2.fillPoly when generating masks for instance segmentation, without having to bring in all of opencv.

TODO

  • draw_polygon
  • find_contours
  • polygon_area
  • point_in_polygon

Usage

This library expects all polygons to be model as a list of paths, each path is a list of alternating x and y coordinates ([x1,y1,x2,y2,...]).

A simple triangle would be declared as:

triangle = [[50,50, 100,0, 0,0]]

Complex polygons (holes and/or disjoints) follow the even-odd rule.

draw_polygon

draw_polygon(mask: array[:, :], paths: path[]) -> array[:, :]

from upolygon import draw_polygon 
import numpy as np

mask = np.zeros((100,100), dtype=np.int32)
draw_polygon(mask, [[50,50, 100,0, 0,0]], 1)

Equivalent of calling cv2.fillPoly(mask, [np.array([[50,50], [100,0], [0,0]])], 1) or cv2.drawContours(mask, [np.array([[50,50], [100,0], [0,0]])], -1, 1, cv2.FILLED) when using opencv.

uPolygon is ~ 6 times faster than opencv for large random polygons with many intersecting lines. For smaller polygons or few intersections, uPolygon is half as fast as opencv.

find_contours

find_contours(mask: array[:, :]) -> (array[:, :], path[:], path[:])

0 is treated as background, 1 is treated as foreground.

from upolygon import find_contours
import numpy as np

mask = np.array([
        [0, 0, 0, 0, 0],
        [0, 1, 1, 1, 0],
        [0, 1, 1, 1, 0],
        [0, 1, 1, 1, 0]
    ], dtype=np.uint8)

_labels, external_paths, internal_paths = find_contours(mask)

Similar to OpenCV's cv2.findContours but lacking hierarchies. Also similar to BoofCV's LinearContourLabelChang2004 which is based on the same algorithm.

Note that currently the input mask to find_contour needs to be uint8.

rle_encode

rle_encode(mask: array[:,:]) -> list Takes a 2-dim binary mask and generates a run length encoding according to the coco specs

~ 15 times faster than written in plain python

Development

This is a Cython project and thus has some additional development dependencies to compile code into binaries, as well as extra steps to build/use the project

Dependencies

  • gcc:
    • Ubuntu/debian: sudo apt install build-essential
    • Arch: yay -Sy base-devel
    • Mac/OS: brew install gcc
  • Cython pip install Cython

Local Testing

To ensure building correctly, set the Cython environment variable export USE_CYTHON=true To install and test locally, build with the following command python setup.py install which will locate the virtual environment activated, build and then install the local version to that python environment. Alternatively, python setup.py build_ext --inplace will build and install to the working directory for importing from local.

Each change to the code needs to be rebuilt before it can be used.

Interactive debugging

TODO

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

upolygon-0.1.11.tar.gz (408.3 kB view hashes)

Uploaded Source

Built Distributions

upolygon-0.1.11-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (285.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (295.7 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-pp310-pypy310_pp73-macosx_10_9_x86_64.whl (210.0 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

upolygon-0.1.11-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (284.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (295.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (209.9 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

upolygon-0.1.11-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (281.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (291.7 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (207.0 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

upolygon-0.1.11-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (282.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (291.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (207.1 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

upolygon-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl (1.6 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

upolygon-0.1.11-cp311-cp311-musllinux_1_1_i686.whl (1.5 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

upolygon-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.5 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-cp311-cp311-macosx_10_9_x86_64.whl (253.3 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

upolygon-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

upolygon-0.1.11-cp310-cp310-musllinux_1_1_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

upolygon-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-cp310-cp310-macosx_10_9_x86_64.whl (256.6 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

upolygon-0.1.11-cp39-cp39-musllinux_1_1_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

upolygon-0.1.11-cp39-cp39-musllinux_1_1_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

upolygon-0.1.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-cp39-cp39-macosx_10_9_x86_64.whl (259.9 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

upolygon-0.1.11-cp38-cp38-musllinux_1_1_x86_64.whl (1.6 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

upolygon-0.1.11-cp38-cp38-musllinux_1_1_i686.whl (1.5 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

upolygon-0.1.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-cp38-cp38-macosx_10_9_x86_64.whl (253.7 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

upolygon-0.1.11-cp37-cp37m-musllinux_1_1_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

upolygon-0.1.11-cp37-cp37m-musllinux_1_1_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

upolygon-0.1.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.3 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-cp37-cp37m-macosx_10_9_x86_64.whl (253.1 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

upolygon-0.1.11-cp36-cp36m-musllinux_1_1_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

upolygon-0.1.11-cp36-cp36m-musllinux_1_1_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

upolygon-0.1.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

upolygon-0.1.11-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.3 MB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

upolygon-0.1.11-cp36-cp36m-macosx_10_9_x86_64.whl (252.4 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page