halpecocotools 0.0.0__cp312-cp312-macosx_14_0_arm64.whl → 0.0.1__cp312-cp312-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,308 @@
1
+ # distutils: language = c
2
+ # distutils: sources = common/maskApi.c
3
+
4
+ #**************************************************************************
5
+ # Microsoft COCO Toolbox. version 2.0
6
+ # Data, paper, and tutorials available at: http://mscoco.org/
7
+ # Code written by Piotr Dollar and Tsung-Yi Lin, 2015.
8
+ # Licensed under the Simplified BSD License [see coco/license.txt]
9
+ #**************************************************************************
10
+
11
+ __author__ = 'tsungyi'
12
+
13
+ import sys
14
+ PYTHON_VERSION = sys.version_info[0]
15
+
16
+ # import both Python-level and C-level symbols of Numpy
17
+ # the API uses Numpy to interface C and Python
18
+ import numpy as np
19
+ cimport numpy as np
20
+ from libc.stdlib cimport malloc, free
21
+
22
+ # intialized Numpy. must do.
23
+ np.import_array()
24
+
25
+ # import numpy C function
26
+ # we use PyArray_ENABLEFLAGS to make Numpy ndarray responsible to memoery management
27
+ cdef extern from "numpy/arrayobject.h":
28
+ void PyArray_ENABLEFLAGS(np.ndarray arr, int flags)
29
+
30
+ # Declare the prototype of the C functions in MaskApi.h
31
+ cdef extern from "maskApi.h":
32
+ ctypedef unsigned int uint
33
+ ctypedef unsigned long siz
34
+ ctypedef unsigned char byte
35
+ ctypedef double* BB
36
+ ctypedef struct RLE:
37
+ siz h,
38
+ siz w,
39
+ siz m,
40
+ uint* cnts,
41
+ void rlesInit( RLE **R, siz n )
42
+ void rleEncode( RLE *R, const byte *M, siz h, siz w, siz n )
43
+ void rleDecode( const RLE *R, byte *mask, siz n )
44
+ void rleMerge( const RLE *R, RLE *M, siz n, int intersect )
45
+ void rleArea( const RLE *R, siz n, uint *a )
46
+ void rleIou( RLE *dt, RLE *gt, siz m, siz n, byte *iscrowd, double *o )
47
+ void bbIou( BB dt, BB gt, siz m, siz n, byte *iscrowd, double *o )
48
+ void rleToBbox( const RLE *R, BB bb, siz n )
49
+ void rleFrBbox( RLE *R, const BB bb, siz h, siz w, siz n )
50
+ void rleFrPoly( RLE *R, const double *xy, siz k, siz h, siz w )
51
+ char* rleToString( const RLE *R )
52
+ void rleFrString( RLE *R, char *s, siz h, siz w )
53
+
54
+ # python class to wrap RLE array in C
55
+ # the class handles the memory allocation and deallocation
56
+ cdef class RLEs:
57
+ cdef RLE *_R
58
+ cdef siz _n
59
+
60
+ def __cinit__(self, siz n =0):
61
+ rlesInit(&self._R, n)
62
+ self._n = n
63
+
64
+ # free the RLE array here
65
+ def __dealloc__(self):
66
+ if self._R is not NULL:
67
+ for i in range(self._n):
68
+ free(self._R[i].cnts)
69
+ free(self._R)
70
+ def __getattr__(self, key):
71
+ if key == 'n':
72
+ return self._n
73
+ raise AttributeError(key)
74
+
75
+ # python class to wrap Mask array in C
76
+ # the class handles the memory allocation and deallocation
77
+ cdef class Masks:
78
+ cdef byte *_mask
79
+ cdef siz _h
80
+ cdef siz _w
81
+ cdef siz _n
82
+
83
+ def __cinit__(self, h, w, n):
84
+ self._mask = <byte*> malloc(h*w*n* sizeof(byte))
85
+ self._h = h
86
+ self._w = w
87
+ self._n = n
88
+ # def __dealloc__(self):
89
+ # the memory management of _mask has been passed to np.ndarray
90
+ # it doesn't need to be freed here
91
+
92
+ # called when passing into np.array() and return an np.ndarray in column-major order
93
+ def __array__(self):
94
+ cdef np.npy_intp shape[1]
95
+ shape[0] = <np.npy_intp> self._h*self._w*self._n
96
+ # Create a 1D array, and reshape it to fortran/Matlab column-major array
97
+ ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT8, self._mask).reshape((self._h, self._w, self._n), order='F')
98
+ # The _mask allocated by Masks is now handled by ndarray
99
+ PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA)
100
+ return ndarray
101
+
102
+ # internal conversion from Python RLEs object to compressed RLE format
103
+ def _toString(RLEs Rs):
104
+ cdef siz n = Rs.n
105
+ cdef bytes py_string
106
+ cdef char* c_string
107
+ objs = []
108
+ for i in range(n):
109
+ c_string = rleToString( <RLE*> &Rs._R[i] )
110
+ py_string = c_string
111
+ objs.append({
112
+ 'size': [Rs._R[i].h, Rs._R[i].w],
113
+ 'counts': py_string
114
+ })
115
+ free(c_string)
116
+ return objs
117
+
118
+ # internal conversion from compressed RLE format to Python RLEs object
119
+ def _frString(rleObjs):
120
+ cdef siz n = len(rleObjs)
121
+ Rs = RLEs(n)
122
+ cdef bytes py_string
123
+ cdef char* c_string
124
+ for i, obj in enumerate(rleObjs):
125
+ if PYTHON_VERSION == 2:
126
+ py_string = str(obj['counts']).encode('utf8')
127
+ elif PYTHON_VERSION == 3:
128
+ py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts']
129
+ else:
130
+ raise Exception('Python version must be 2 or 3')
131
+ c_string = py_string
132
+ rleFrString( <RLE*> &Rs._R[i], <char*> c_string, obj['size'][0], obj['size'][1] )
133
+ return Rs
134
+
135
+ # encode mask to RLEs objects
136
+ # list of RLE string can be generated by RLEs member function
137
+ def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask):
138
+ h, w, n = mask.shape[0], mask.shape[1], mask.shape[2]
139
+ cdef RLEs Rs = RLEs(n)
140
+ rleEncode(Rs._R,<byte*>mask.data,h,w,n)
141
+ objs = _toString(Rs)
142
+ return objs
143
+
144
+ # decode mask from compressed list of RLE string or RLEs object
145
+ def decode(rleObjs):
146
+ cdef RLEs Rs = _frString(rleObjs)
147
+ h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n
148
+ masks = Masks(h, w, n)
149
+ rleDecode(<RLE*>Rs._R, masks._mask, n);
150
+ return np.array(masks)
151
+
152
+ def merge(rleObjs, intersect=0):
153
+ cdef RLEs Rs = _frString(rleObjs)
154
+ cdef RLEs R = RLEs(1)
155
+ rleMerge(<RLE*>Rs._R, <RLE*> R._R, <siz> Rs._n, intersect)
156
+ obj = _toString(R)[0]
157
+ return obj
158
+
159
+ def area(rleObjs):
160
+ cdef RLEs Rs = _frString(rleObjs)
161
+ cdef uint* _a = <uint*> malloc(Rs._n* sizeof(uint))
162
+ rleArea(Rs._R, Rs._n, _a)
163
+ cdef np.npy_intp shape[1]
164
+ shape[0] = <np.npy_intp> Rs._n
165
+ a = np.array((Rs._n, ), dtype=np.uint8)
166
+ a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a)
167
+ PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA)
168
+ return a
169
+
170
+ # iou computation. support function overload (RLEs-RLEs and bbox-bbox).
171
+ def iou( dt, gt, pyiscrowd ):
172
+ def _preproc(objs):
173
+ if len(objs) == 0:
174
+ return objs
175
+ if type(objs) == np.ndarray:
176
+ if len(objs.shape) == 1:
177
+ objs = objs.reshape((objs[0], 1))
178
+ # check if it's Nx4 bbox
179
+ if not len(objs.shape) == 2 or not objs.shape[1] == 4:
180
+ raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension')
181
+ objs = objs.astype(np.double)
182
+ elif type(objs) == list:
183
+ # check if list is in box format and convert it to np.ndarray
184
+ isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs]))
185
+ isrle = np.all(np.array([type(obj) == dict for obj in objs]))
186
+ if isbox:
187
+ objs = np.array(objs, dtype=np.double)
188
+ if len(objs.shape) == 1:
189
+ objs = objs.reshape((1,objs.shape[0]))
190
+ elif isrle:
191
+ objs = _frString(objs)
192
+ else:
193
+ raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])')
194
+ else:
195
+ raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.')
196
+ return objs
197
+ def _rleIou(RLEs dt, RLEs gt, np.ndarray[np.uint8_t, ndim=1] iscrowd, siz m, siz n, np.ndarray[np.double_t, ndim=1] _iou):
198
+ rleIou( <RLE*> dt._R, <RLE*> gt._R, m, n, <byte*> iscrowd.data, <double*> _iou.data )
199
+ def _bbIou(np.ndarray[np.double_t, ndim=2] dt, np.ndarray[np.double_t, ndim=2] gt, np.ndarray[np.uint8_t, ndim=1] iscrowd, siz m, siz n, np.ndarray[np.double_t, ndim=1] _iou):
200
+ bbIou( <BB> dt.data, <BB> gt.data, m, n, <byte*> iscrowd.data, <double*>_iou.data )
201
+ def _len(obj):
202
+ cdef siz N = 0
203
+ if type(obj) == RLEs:
204
+ N = obj.n
205
+ elif len(obj)==0:
206
+ pass
207
+ elif type(obj) == np.ndarray:
208
+ N = obj.shape[0]
209
+ return N
210
+ # convert iscrowd to numpy array
211
+ cdef np.ndarray[np.uint8_t, ndim=1] iscrowd = np.array(pyiscrowd, dtype=np.uint8)
212
+ # simple type checking
213
+ cdef siz m, n
214
+ dt = _preproc(dt)
215
+ gt = _preproc(gt)
216
+ m = _len(dt)
217
+ n = _len(gt)
218
+ if m == 0 or n == 0:
219
+ return []
220
+ if not type(dt) == type(gt):
221
+ raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray')
222
+
223
+ # define local variables
224
+ cdef double* _iou = <double*> 0
225
+ cdef np.npy_intp shape[1]
226
+ # check type and assign iou function
227
+ if type(dt) == RLEs:
228
+ _iouFun = _rleIou
229
+ elif type(dt) == np.ndarray:
230
+ _iouFun = _bbIou
231
+ else:
232
+ raise Exception('input data type not allowed.')
233
+ _iou = <double*> malloc(m*n* sizeof(double))
234
+ iou = np.zeros((m*n, ), dtype=np.double)
235
+ shape[0] = <np.npy_intp> m*n
236
+ iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou)
237
+ PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA)
238
+ _iouFun(dt, gt, iscrowd, m, n, iou)
239
+ return iou.reshape((m,n), order='F')
240
+
241
+ def toBbox( rleObjs ):
242
+ cdef RLEs Rs = _frString(rleObjs)
243
+ cdef siz n = Rs.n
244
+ cdef BB _bb = <BB> malloc(4*n* sizeof(double))
245
+ rleToBbox( <const RLE*> Rs._R, _bb, n )
246
+ cdef np.npy_intp shape[1]
247
+ shape[0] = <np.npy_intp> 4*n
248
+ bb = np.array((1,4*n), dtype=np.double)
249
+ bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4))
250
+ PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA)
251
+ return bb
252
+
253
+ def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ):
254
+ cdef siz n = bb.shape[0]
255
+ Rs = RLEs(n)
256
+ rleFrBbox( <RLE*> Rs._R, <const BB> bb.data, h, w, n )
257
+ objs = _toString(Rs)
258
+ return objs
259
+
260
+ def frPoly( poly, siz h, siz w ):
261
+ cdef np.ndarray[np.double_t, ndim=1] np_poly
262
+ n = len(poly)
263
+ Rs = RLEs(n)
264
+ for i, p in enumerate(poly):
265
+ np_poly = np.array(p, dtype=np.double, order='F')
266
+ rleFrPoly( <RLE*>&Rs._R[i], <const double*> np_poly.data, int(len(p)/2), h, w )
267
+ objs = _toString(Rs)
268
+ return objs
269
+
270
+ def frUncompressedRLE(ucRles, siz h, siz w):
271
+ cdef np.ndarray[np.uint32_t, ndim=1] cnts
272
+ cdef RLE R
273
+ cdef uint *data
274
+ n = len(ucRles)
275
+ objs = []
276
+ for i in range(n):
277
+ Rs = RLEs(1)
278
+ cnts = np.array(ucRles[i]['counts'], dtype=np.uint32)
279
+ # time for malloc can be saved here but it's fine
280
+ data = <uint*> malloc(len(cnts)* sizeof(uint))
281
+ for j in range(len(cnts)):
282
+ data[j] = <uint> cnts[j]
283
+ R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), <uint*> data)
284
+ Rs._R[0] = R
285
+ objs.append(_toString(Rs)[0])
286
+ return objs
287
+
288
+ def frPyObjects(pyobj, h, w):
289
+ # encode rle from a list of python objects
290
+ if type(pyobj) == np.ndarray:
291
+ objs = frBbox(pyobj, h, w)
292
+ elif type(pyobj) == list and len(pyobj[0]) == 4:
293
+ objs = frBbox(pyobj, h, w)
294
+ elif type(pyobj) == list and len(pyobj[0]) > 4:
295
+ objs = frPoly(pyobj, h, w)
296
+ elif type(pyobj) == list and type(pyobj[0]) == dict \
297
+ and 'counts' in pyobj[0] and 'size' in pyobj[0]:
298
+ objs = frUncompressedRLE(pyobj, h, w)
299
+ # encode rle from single python object
300
+ elif type(pyobj) == list and len(pyobj) == 4:
301
+ objs = frBbox([pyobj], h, w)[0]
302
+ elif type(pyobj) == list and len(pyobj) > 4:
303
+ objs = frPoly([pyobj], h, w)[0]
304
+ elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj:
305
+ objs = frUncompressedRLE([pyobj], h, w)[0]
306
+ else:
307
+ raise Exception('input type is not supported.')
308
+ return objs
@@ -0,0 +1,5 @@
1
+ Metadata-Version: 2.4
2
+ Name: halpecocotools
3
+ Version: 0.0.1
4
+ Home-page: https://github.com/HaoyiZhu/HalpeCOCOAPI
5
+ Dynamic: home-page
@@ -0,0 +1,11 @@
1
+ halpecocotools/__init__.py,sha256=0C6R_hJbgubl8GQriX90OQlFBtBvMncbQNABcN646uE,21
2
+ halpecocotools/_mask.c,sha256=5haG0640f5t5wCBHm7Ev3uG3zNr1fjpWsVH4TUP4UrU,918276
3
+ halpecocotools/_mask.cpython-312-darwin.so,sha256=EqeoUhEy5IdjcJDIa0G-9cAH0cTXDxkGeeiIcGE7C2U,199496
4
+ halpecocotools/_mask.pyx,sha256=3uOd4T4WnohbRMtUYRvgmyHY_LAAENKXyVSZJrxZNnk,11437
5
+ halpecocotools/coco.py,sha256=k9a6h5WwHbGbeNsM_rXVzkppoctbLSVHPaqU1v7IQB4,20663
6
+ halpecocotools/cocoeval.py,sha256=h0Zs1DpYQfrZavprPp7gPeCdFZ-WAhLk92c10XUqqVI,40420
7
+ halpecocotools/mask.py,sha256=TUeI-ZWXHJfFVI8L0ZlB9uwfqvXQ1_tuxIklb_hyxhc,4591
8
+ halpecocotools-0.0.1.dist-info/METADATA,sha256=HPI4X003LugAw-RNVwzaHoz6OWXFhctb9N2pLBQOUDQ,129
9
+ halpecocotools-0.0.1.dist-info/WHEEL,sha256=oJs_9wLXJsDJvRn8Ha6NXcmmgIeUjBozB2c3HCpJUqE,109
10
+ halpecocotools-0.0.1.dist-info/top_level.txt,sha256=y5cu7sZe081XcELlwwjj5-XtdyJUFn1T1Ere4sqSt7A,15
11
+ halpecocotools-0.0.1.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: halpecocotools
3
- Version: 0.0.0
4
- Summary: COCO API for Halpe-Fullbody dataset
5
- Home-page: https://github.com/HaoyiZhu/HalpeCOCOAPI
6
- Requires-Dist: setuptools>=18.0
7
- Requires-Dist: cython>=0.27.3
8
- Requires-Dist: matplotlib>=2.1.0
9
- Dynamic: home-page
10
- Dynamic: requires-dist
11
- Dynamic: summary
@@ -1,9 +0,0 @@
1
- halpecocotools/__init__.py,sha256=0C6R_hJbgubl8GQriX90OQlFBtBvMncbQNABcN646uE,21
2
- halpecocotools/_mask.cpython-312-darwin.so,sha256=BEpD-GBrQcwZjzY86J9H3JssKUQh6ZBKiNKcvQBSOko,199496
3
- halpecocotools/coco.py,sha256=k9a6h5WwHbGbeNsM_rXVzkppoctbLSVHPaqU1v7IQB4,20663
4
- halpecocotools/cocoeval.py,sha256=h0Zs1DpYQfrZavprPp7gPeCdFZ-WAhLk92c10XUqqVI,40420
5
- halpecocotools/mask.py,sha256=TUeI-ZWXHJfFVI8L0ZlB9uwfqvXQ1_tuxIklb_hyxhc,4591
6
- halpecocotools-0.0.0.dist-info/METADATA,sha256=EnQlyy1ICW1xJqYaUp_QQZ9M_XEHhU2kSG7oGVHt7V0,309
7
- halpecocotools-0.0.0.dist-info/WHEEL,sha256=oJs_9wLXJsDJvRn8Ha6NXcmmgIeUjBozB2c3HCpJUqE,109
8
- halpecocotools-0.0.0.dist-info/top_level.txt,sha256=y5cu7sZe081XcELlwwjj5-XtdyJUFn1T1Ere4sqSt7A,15
9
- halpecocotools-0.0.0.dist-info/RECORD,,