From 8b59e125d7397188354dab4f2ee6d6c3b5f4a20d Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 4 Jul 2017 18:27:58 +0900 Subject: [PATCH 01/35] added mask visualization added test.py --- libs/configs/config_v1.py | 10 +- libs/datasets/download_and_convert_coco.py | 95 + libs/datasets/pycocotools/_mask.c | 16163 +++++++++++++++++++ libs/layers/__init__.py | 2 + libs/layers/anchor.py | 415 +- libs/layers/inst.py | 141 + libs/layers/roi.py | 4 +- libs/layers/sample.py | 16 +- libs/layers/wrapper.py | 73 +- libs/nets/pyramid_network.py | 64 +- libs/visualization/pil_utils.py | 74 +- train/test.py | 286 + train/train.py | 106 +- 13 files changed, 17150 insertions(+), 299 deletions(-) create mode 100644 libs/datasets/pycocotools/_mask.c create mode 100644 libs/layers/inst.py create mode 100644 train/test.py diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 58ae994..5c1a29e 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -274,9 +274,17 @@ 'post_nms_top_n', 2000, 'Number of rpn anchors that should be sampled after nms') +tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 200, + "Number of inst after NMS") + tf.app.flags.DEFINE_float( 'rpn_nms_threshold', 0.7, - 'NMS threshold') + 'NMS threshold in RPN') + +tf.app.flags.DEFINE_float( + 'inst_nms_threshold', 0.5, + 'NMS threshold in inst inference') ################################## # Mask # diff --git a/libs/datasets/download_and_convert_coco.py b/libs/datasets/download_and_convert_coco.py index 3d0ec94..92ff6d9 100644 --- a/libs/datasets/download_and_convert_coco.py +++ b/libs/datasets/download_and_convert_coco.py @@ -64,6 +64,101 @@ def _progress(count, block_size, total_size): f.extractall(dataset_dir) print('Successfully extracted') +def _cat_id_to_cls_name(catId): + cls_name = np.array([ "background", + "person", + "bicycle", + "car", + "motorcycle", + "airplane", + "bus", + "train", + "truck", + "boat", + "traffic_light", + "fire_hydrant", + "street_sign", + "stop_sign", + "parking_meter", + "bench", + "bird", + "cat", + "dog", + "horse", + "sheep", + "cow", + "elephant", + "bear", + "zebra", + "giraffe", + "hat", + "backpack", + "umbrella", + "shoe", + "eye_glasses", + "hand_bag", + "tie", + "suitcase", + "frisbee", + "skis", + "snowboard", + "sports_ball", + "kite", + "baseball_bat", + "baseball_glove", + "skateboard", + "surfboard", + "tennis_racket", + "bottle", + "plate", + "wine_glass", + "cup", + "fork", + "knife", + "spoon", + "bowl", + "banana", + "apple", + "sandwich", + "orange", + "broccoli", + "carrot", + "hot_dog", + "pizza", + "donut", + "cake", + "chair", + "couch", + "potted_plant", + "bed", + "mirror", + "dining_table", + "window", + "desk", + "toilet", + "door", + "tv", + "laptop", + "mouse", + "remote", + "keyboard", + "cell_phone", + "microwave", + "oven", + "toaster", + "sink", + "refrigerator", + "blender", + "book", + "clock", + "vase", + "scissors", + "teddy_bear", + "hair_dryer", + "toothbrush", + "hair_brush"]) + return cls_name[catId] + def _real_id_to_cat_id(catId): """Note coco has 80 classes, but the catId ranges from 1 to 90!""" real_id_to_cat_id = \ diff --git a/libs/datasets/pycocotools/_mask.c b/libs/datasets/pycocotools/_mask.c new file mode 100644 index 0000000..9b1ccf5 --- /dev/null +++ b/libs/datasets/pycocotools/_mask.c @@ -0,0 +1,16163 @@ +/* Generated by Cython 0.25.2 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/home/shang/anaconda2/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h", + "/home/shang/anaconda2/lib/python2.7/site-packages/numpy/core/include/numpy/ufuncobject.h", + "common/maskApi.h" + ], + "extra_compile_args": [ + "-Wno-cpp", + "-Wno-unused-function", + "-std=c99" + ], + "include_dirs": [ + "/home/shang/anaconda2/lib/python2.7/site-packages/numpy/core/include", + "./common" + ], + "language": "c", + "sources": [ + "./common/maskApi.c" + ] + }, + "module_name": "_mask" +} +END: Cython Metadata */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) + #error Cython requires Python 2.6+ or Python 3.2+. +#else +#define CYTHON_ABI "0_25_2" +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x03030000 || (PY_MAJOR_VERSION == 2 && PY_VERSION_HEX >= 0x02070000) + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject **args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__thirdparty__pycocotools___mask +#define __PYX_HAVE_API__thirdparty__pycocotools___mask +#include +#include +#include +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include "maskApi.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) && defined (_M_X64) + #define __Pyx_sst_abs(value) _abs64(value) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if PY_MAJOR_VERSION < 3 +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen +#endif +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + + +static const char *__pyx_f[] = { + "thirdparty/pycocotools/_mask.pyx", + "__init__.pxd", + "type.pxd", +}; +/* BufferFormatStructs.proto */ +#define IS_UNSIGNED(type) (((type) -1) > 0) +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":725 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":727 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":728 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":732 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":734 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":735 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":739 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":740 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":749 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":750 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_longlong __pyx_t_5numpy_long_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751 + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":753 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":754 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755 + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":757 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":760 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":761 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + + +/*--- Type declarations ---*/ +struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs; +struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":764 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":765 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":768 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; + +/* "thirdparty/pycocotools/_mask.pyx":56 + * # python class to wrap RLE array in C + * # the class handles the memory allocation and deallocation + * cdef class RLEs: # <<<<<<<<<<<<<< + * cdef RLE *_R + * cdef siz _n + */ +struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs { + PyObject_HEAD + RLE *_R; + siz _n; +}; + + +/* "thirdparty/pycocotools/_mask.pyx":77 + * # python class to wrap Mask array in C + * # the class handles the memory allocation and deallocation + * cdef class Masks: # <<<<<<<<<<<<<< + * cdef byte *_mask + * cdef siz _h + */ +struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks { + PyObject_HEAD + byte *_mask; + siz _h; + siz _w; + siz _n; +}; + + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = PyThreadState_GET(); +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* ArgTypeTest.proto */ +static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, + const char *name, int exact); + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, long intval, int inplace); +#else +#define __Pyx_PyInt_EqObjC(op1, op2, intval, inplace)\ + PyObject_RichCompare(op1, op2, Py_EQ) + #endif + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* BufferFormatCheck.proto */ +static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); // PROTO + +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* FetchCommonType.proto */ +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); + +/* CythonFunction.proto */ +#define __Pyx_CyFunction_USED 1 +#include +#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 +#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +#define __Pyx_CYFUNCTION_CCLASS 0x04 +#define __Pyx_CyFunction_GetClosure(f)\ + (((__pyx_CyFunctionObject *) (f))->func_closure) +#define __Pyx_CyFunction_GetClassObj(f)\ + (((__pyx_CyFunctionObject *) (f))->func_classobj) +#define __Pyx_CyFunction_Defaults(type, f)\ + ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) +#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ + ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) +typedef struct { + PyCFunctionObject func; +#if PY_VERSION_HEX < 0x030500A0 + PyObject *func_weakreflist; +#endif + PyObject *func_dict; + PyObject *func_name; + PyObject *func_qualname; + PyObject *func_doc; + PyObject *func_globals; + PyObject *func_code; + PyObject *func_closure; + PyObject *func_classobj; + void *defaults; + int defaults_pyobjects; + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; + PyObject *(*defaults_getter)(PyObject *); + PyObject *func_annotations; +} __pyx_CyFunctionObject; +static PyTypeObject *__pyx_CyFunctionType = 0; +#define __Pyx_CyFunction_NewEx(ml, flags, qualname, self, module, globals, code)\ + __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, qualname, self, module, globals, code) +static PyObject *__Pyx_CyFunction_New(PyTypeObject *, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *self, + PyObject *module, PyObject *globals, + PyObject* code); +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, + size_t size, + int pyobjects); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, + PyObject *tuple); +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, + PyObject *dict); +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); +static int __pyx_CyFunction_init(void); + +/* BufferFallbackError.proto */ +static void __Pyx_RaiseBufferFallbackError(void); + +/* None.proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* BufferIndexError.proto */ +static void __Pyx_RaiseBufferIndexError(int axis); + +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) + PyErr_SetObject(PyExc_KeyError, args); + Py_XDECREF(args); + } + return NULL; + } + Py_INCREF(value); + return value; +} +#else + #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* None.proto */ +static Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; +static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_siz(siz value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE siz __Pyx_PyInt_As_siz(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* PyIdentifierFromString.proto */ +#if !defined(__Pyx_PyIdentifier_FromString) +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) +#else + #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) +#endif +#endif + +/* ModuleImport.proto */ +static PyObject *__Pyx_ImportModule(const char *name); + +/* TypeImport.proto */ +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'libc.stdlib' */ + +/* Module declarations from 'numpy' */ + +/* Module declarations from 'numpy' */ +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void); /*proto*/ + +/* Module declarations from 'thirdparty.pycocotools._mask' */ +static PyTypeObject *__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs = 0; +static PyTypeObject *__pyx_ptype_10thirdparty_11pycocotools_5_mask_Masks = 0; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t = { "uint8_t", NULL, sizeof(__pyx_t_5numpy_uint8_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint8_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint8_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_double_t = { "double_t", NULL, sizeof(__pyx_t_5numpy_double_t), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t = { "uint32_t", NULL, sizeof(__pyx_t_5numpy_uint32_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint32_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint32_t), 0 }; +#define __Pyx_MODULE_NAME "thirdparty.pycocotools._mask" +int __pyx_module_is_main_thirdparty__pycocotools___mask = 0; + +/* Implementation of 'thirdparty.pycocotools._mask' */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_AttributeError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_RuntimeError; +static PyObject *__pyx_builtin_ImportError; +static const char __pyx_k_F[] = "F"; +static const char __pyx_k_N[] = "N"; +static const char __pyx_k_R[] = "R"; +static const char __pyx_k_a[] = "_a"; +static const char __pyx_k_h[] = "h"; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_j[] = "j"; +static const char __pyx_k_m[] = "m"; +static const char __pyx_k_n[] = "n"; +static const char __pyx_k_p[] = "p"; +static const char __pyx_k_w[] = "w"; +static const char __pyx_k_Rs[] = "Rs"; +static const char __pyx_k_bb[] = "bb"; +static const char __pyx_k_dt[] = "dt"; +static const char __pyx_k_gt[] = "gt"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k_a_2[] = "a"; +static const char __pyx_k_all[] = "all"; +static const char __pyx_k_iou[] = "_iou"; +static const char __pyx_k_len[] = "_len"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_sys[] = "sys"; +static const char __pyx_k_area[] = "area"; +static const char __pyx_k_bb_2[] = "_bb"; +static const char __pyx_k_cnts[] = "cnts"; +static const char __pyx_k_data[] = "data"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mask[] = "mask"; +static const char __pyx_k_objs[] = "objs"; +static const char __pyx_k_poly[] = "poly"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_utf8[] = "utf8"; +static const char __pyx_k_array[] = "array"; +static const char __pyx_k_bbIou[] = "_bbIou"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_iou_2[] = "iou"; +static const char __pyx_k_isbox[] = "isbox"; +static const char __pyx_k_isrle[] = "isrle"; +static const char __pyx_k_masks[] = "masks"; +static const char __pyx_k_merge[] = "merge"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_order[] = "order"; +static const char __pyx_k_pyobj[] = "pyobj"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_uint8[] = "uint8"; +static const char __pyx_k_zeros[] = "zeros"; +static const char __pyx_k_astype[] = "astype"; +static const char __pyx_k_author[] = "__author__"; +static const char __pyx_k_counts[] = "counts"; +static const char __pyx_k_decode[] = "decode"; +static const char __pyx_k_double[] = "double"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_frBbox[] = "frBbox"; +static const char __pyx_k_frPoly[] = "frPoly"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_iouFun[] = "_iouFun"; +static const char __pyx_k_rleIou[] = "_rleIou"; +static const char __pyx_k_toBbox[] = "toBbox"; +static const char __pyx_k_ucRles[] = "ucRles"; +static const char __pyx_k_uint32[] = "uint32"; +static const char __pyx_k_iscrowd[] = "iscrowd"; +static const char __pyx_k_np_poly[] = "np_poly"; +static const char __pyx_k_preproc[] = "_preproc"; +static const char __pyx_k_reshape[] = "reshape"; +static const char __pyx_k_rleObjs[] = "rleObjs"; +static const char __pyx_k_tsungyi[] = "tsungyi"; +static const char __pyx_k_c_string[] = "c_string"; +static const char __pyx_k_frString[] = "_frString"; +static const char __pyx_k_toString[] = "_toString"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_intersect[] = "intersect"; +static const char __pyx_k_py_string[] = "py_string"; +static const char __pyx_k_pyiscrowd[] = "pyiscrowd"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_frPyObjects[] = "frPyObjects"; +static const char __pyx_k_RuntimeError[] = "RuntimeError"; +static const char __pyx_k_version_info[] = "version_info"; +static const char __pyx_k_AttributeError[] = "AttributeError"; +static const char __pyx_k_PYTHON_VERSION[] = "PYTHON_VERSION"; +static const char __pyx_k_iou_locals__len[] = "iou.._len"; +static const char __pyx_k_frUncompressedRLE[] = "frUncompressedRLE"; +static const char __pyx_k_iou_locals__bbIou[] = "iou.._bbIou"; +static const char __pyx_k_iou_locals__rleIou[] = "iou.._rleIou"; +static const char __pyx_k_iou_locals__preproc[] = "iou.._preproc"; +static const char __pyx_k_input_data_type_not_allowed[] = "input data type not allowed."; +static const char __pyx_k_input_type_is_not_supported[] = "input type is not supported."; +static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static const char __pyx_k_thirdparty_pycocotools__mask[] = "thirdparty.pycocotools._mask"; +static const char __pyx_k_Python_version_must_be_2_or_3[] = "Python version must be 2 or 3"; +static const char __pyx_k_home_shang_Work_camus_thirdpart[] = "/home/shang/Work/camus/thirdparty/pycocotools/_mask.pyx"; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_numpy_ndarray_input_is_only_for[] = "numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension"; +static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static const char __pyx_k_unrecognized_type_The_following[] = "unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported."; +static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static const char __pyx_k_The_dt_and_gt_should_have_the_sa[] = "The dt and gt should have the same data type, either RLEs, list or np.ndarray"; +static const char __pyx_k_list_input_can_be_bounding_box_N[] = "list input can be bounding box (Nx4) or RLEs ([RLE])"; +static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_AttributeError; +static PyObject *__pyx_n_s_F; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; +static PyObject *__pyx_n_s_ImportError; +static PyObject *__pyx_n_s_N; +static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_s_PYTHON_VERSION; +static PyObject *__pyx_kp_s_Python_version_must_be_2_or_3; +static PyObject *__pyx_n_s_R; +static PyObject *__pyx_n_s_Rs; +static PyObject *__pyx_n_s_RuntimeError; +static PyObject *__pyx_kp_s_The_dt_and_gt_should_have_the_sa; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s_a; +static PyObject *__pyx_n_s_a_2; +static PyObject *__pyx_n_s_all; +static PyObject *__pyx_n_s_area; +static PyObject *__pyx_n_s_array; +static PyObject *__pyx_n_s_astype; +static PyObject *__pyx_n_s_author; +static PyObject *__pyx_n_s_bb; +static PyObject *__pyx_n_s_bbIou; +static PyObject *__pyx_n_s_bb_2; +static PyObject *__pyx_n_s_c_string; +static PyObject *__pyx_n_s_cnts; +static PyObject *__pyx_n_s_counts; +static PyObject *__pyx_n_s_data; +static PyObject *__pyx_n_s_decode; +static PyObject *__pyx_n_s_double; +static PyObject *__pyx_n_s_dt; +static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_encode; +static PyObject *__pyx_n_s_enumerate; +static PyObject *__pyx_n_s_frBbox; +static PyObject *__pyx_n_s_frPoly; +static PyObject *__pyx_n_s_frPyObjects; +static PyObject *__pyx_n_s_frString; +static PyObject *__pyx_n_s_frUncompressedRLE; +static PyObject *__pyx_n_s_gt; +static PyObject *__pyx_n_s_h; +static PyObject *__pyx_kp_s_home_shang_Work_camus_thirdpart; +static PyObject *__pyx_n_s_i; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_kp_s_input_data_type_not_allowed; +static PyObject *__pyx_kp_s_input_type_is_not_supported; +static PyObject *__pyx_n_s_intersect; +static PyObject *__pyx_n_s_iou; +static PyObject *__pyx_n_s_iouFun; +static PyObject *__pyx_n_s_iou_2; +static PyObject *__pyx_n_s_iou_locals__bbIou; +static PyObject *__pyx_n_s_iou_locals__len; +static PyObject *__pyx_n_s_iou_locals__preproc; +static PyObject *__pyx_n_s_iou_locals__rleIou; +static PyObject *__pyx_n_s_isbox; +static PyObject *__pyx_n_s_iscrowd; +static PyObject *__pyx_n_s_isrle; +static PyObject *__pyx_n_s_j; +static PyObject *__pyx_n_s_len; +static PyObject *__pyx_kp_s_list_input_can_be_bounding_box_N; +static PyObject *__pyx_n_s_m; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_mask; +static PyObject *__pyx_n_s_masks; +static PyObject *__pyx_n_s_merge; +static PyObject *__pyx_n_s_n; +static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; +static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; +static PyObject *__pyx_n_s_np; +static PyObject *__pyx_n_s_np_poly; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; +static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; +static PyObject *__pyx_kp_s_numpy_ndarray_input_is_only_for; +static PyObject *__pyx_n_s_obj; +static PyObject *__pyx_n_s_objs; +static PyObject *__pyx_n_s_order; +static PyObject *__pyx_n_s_p; +static PyObject *__pyx_n_s_poly; +static PyObject *__pyx_n_s_preproc; +static PyObject *__pyx_n_s_py_string; +static PyObject *__pyx_n_s_pyiscrowd; +static PyObject *__pyx_n_s_pyobj; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_reshape; +static PyObject *__pyx_n_s_rleIou; +static PyObject *__pyx_n_s_rleObjs; +static PyObject *__pyx_n_s_shape; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_sys; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_thirdparty_pycocotools__mask; +static PyObject *__pyx_n_s_toBbox; +static PyObject *__pyx_n_s_toString; +static PyObject *__pyx_n_s_tsungyi; +static PyObject *__pyx_n_s_ucRles; +static PyObject *__pyx_n_s_uint32; +static PyObject *__pyx_n_s_uint8; +static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; +static PyObject *__pyx_kp_s_unrecognized_type_The_following; +static PyObject *__pyx_n_s_utf8; +static PyObject *__pyx_n_s_version_info; +static PyObject *__pyx_n_s_w; +static PyObject *__pyx_n_s_zeros; +static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, siz __pyx_v_n); /* proto */ +static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, PyObject *__pyx_v_key); /* proto */ +static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self, PyObject *__pyx_v_h, PyObject *__pyx_v_w, PyObject *__pyx_v_n); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_mask); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs, PyObject *__pyx_v_intersect); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_objs); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_dt, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dt, PyArrayObject *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dt, PyObject *__pyx_v_gt, PyObject *__pyx_v_pyiscrowd); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_bb, siz __pyx_v_h, siz __pyx_v_w); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_poly, siz __pyx_v_h, siz __pyx_v_w); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_ucRles, CYTHON_UNUSED siz __pyx_v_h, CYTHON_UNUSED siz __pyx_v_w); /* proto */ +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pyobj, PyObject *__pyx_v_h, PyObject *__pyx_v_w); /* proto */ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_2; +static PyObject *__pyx_int_3; +static PyObject *__pyx_int_4; +static PyObject *__pyx_tuple_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__6; +static PyObject *__pyx_tuple__7; +static PyObject *__pyx_tuple__9; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_tuple__18; +static PyObject *__pyx_tuple__19; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_tuple__21; +static PyObject *__pyx_tuple__22; +static PyObject *__pyx_tuple__23; +static PyObject *__pyx_tuple__24; +static PyObject *__pyx_tuple__25; +static PyObject *__pyx_tuple__26; +static PyObject *__pyx_tuple__27; +static PyObject *__pyx_tuple__28; +static PyObject *__pyx_tuple__30; +static PyObject *__pyx_tuple__32; +static PyObject *__pyx_tuple__34; +static PyObject *__pyx_tuple__36; +static PyObject *__pyx_tuple__38; +static PyObject *__pyx_tuple__40; +static PyObject *__pyx_tuple__42; +static PyObject *__pyx_tuple__44; +static PyObject *__pyx_tuple__46; +static PyObject *__pyx_tuple__48; +static PyObject *__pyx_tuple__50; +static PyObject *__pyx_codeobj__8; +static PyObject *__pyx_codeobj__10; +static PyObject *__pyx_codeobj__12; +static PyObject *__pyx_codeobj__14; +static PyObject *__pyx_codeobj__29; +static PyObject *__pyx_codeobj__31; +static PyObject *__pyx_codeobj__33; +static PyObject *__pyx_codeobj__35; +static PyObject *__pyx_codeobj__37; +static PyObject *__pyx_codeobj__39; +static PyObject *__pyx_codeobj__41; +static PyObject *__pyx_codeobj__43; +static PyObject *__pyx_codeobj__45; +static PyObject *__pyx_codeobj__47; +static PyObject *__pyx_codeobj__49; +static PyObject *__pyx_codeobj__51; + +/* "thirdparty/pycocotools/_mask.pyx":60 + * cdef siz _n + * + * def __cinit__(self, siz n =0): # <<<<<<<<<<<<<< + * rlesInit(&self._R, n) + * self._n = n + */ + +/* Python wrapper */ +static int __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + siz __pyx_v_n; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_n,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n); + if (value) { values[0] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 60, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + } + if (values[0]) { + __pyx_v_n = __Pyx_PyInt_As_siz(values[0]); if (unlikely((__pyx_v_n == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L3_error) + } else { + __pyx_v_n = ((siz)0); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 60, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.RLEs.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_self), __pyx_v_n); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, siz __pyx_v_n) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "thirdparty/pycocotools/_mask.pyx":61 + * + * def __cinit__(self, siz n =0): + * rlesInit(&self._R, n) # <<<<<<<<<<<<<< + * self._n = n + * + */ + rlesInit((&__pyx_v_self->_R), __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":62 + * def __cinit__(self, siz n =0): + * rlesInit(&self._R, n) + * self._n = n # <<<<<<<<<<<<<< + * + * # free the RLE array here + */ + __pyx_v_self->_n = __pyx_v_n; + + /* "thirdparty/pycocotools/_mask.pyx":60 + * cdef siz _n + * + * def __cinit__(self, siz n =0): # <<<<<<<<<<<<<< + * rlesInit(&self._R, n) + * self._n = n + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":65 + * + * # free the RLE array here + * def __dealloc__(self): # <<<<<<<<<<<<<< + * if self._R is not NULL: + * for i in range(self._n): + */ + +/* Python wrapper */ +static void __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_3__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self) { + siz __pyx_v_i; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + siz __pyx_t_2; + siz __pyx_t_3; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "thirdparty/pycocotools/_mask.pyx":66 + * # free the RLE array here + * def __dealloc__(self): + * if self._R is not NULL: # <<<<<<<<<<<<<< + * for i in range(self._n): + * free(self._R[i].cnts) + */ + __pyx_t_1 = ((__pyx_v_self->_R != NULL) != 0); + if (__pyx_t_1) { + + /* "thirdparty/pycocotools/_mask.pyx":67 + * def __dealloc__(self): + * if self._R is not NULL: + * for i in range(self._n): # <<<<<<<<<<<<<< + * free(self._R[i].cnts) + * free(self._R) + */ + __pyx_t_2 = __pyx_v_self->_n; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "thirdparty/pycocotools/_mask.pyx":68 + * if self._R is not NULL: + * for i in range(self._n): + * free(self._R[i].cnts) # <<<<<<<<<<<<<< + * free(self._R) + * def __getattr__(self, key): + */ + free((__pyx_v_self->_R[__pyx_v_i]).cnts); + } + + /* "thirdparty/pycocotools/_mask.pyx":69 + * for i in range(self._n): + * free(self._R[i].cnts) + * free(self._R) # <<<<<<<<<<<<<< + * def __getattr__(self, key): + * if key == 'n': + */ + free(__pyx_v_self->_R); + + /* "thirdparty/pycocotools/_mask.pyx":66 + * # free the RLE array here + * def __dealloc__(self): + * if self._R is not NULL: # <<<<<<<<<<<<<< + * for i in range(self._n): + * free(self._R[i].cnts) + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":65 + * + * # free the RLE array here + * def __dealloc__(self): # <<<<<<<<<<<<<< + * if self._R is not NULL: + * for i in range(self._n): + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "thirdparty/pycocotools/_mask.pyx":70 + * free(self._R[i].cnts) + * free(self._R) + * def __getattr__(self, key): # <<<<<<<<<<<<<< + * if key == 'n': + * return self._n + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_key) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_self), ((PyObject *)__pyx_v_key)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, PyObject *__pyx_v_key) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__getattr__", 0); + + /* "thirdparty/pycocotools/_mask.pyx":71 + * free(self._R) + * def __getattr__(self, key): + * if key == 'n': # <<<<<<<<<<<<<< + * return self._n + * raise AttributeError(key) + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_key, __pyx_n_s_n, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 71, __pyx_L1_error) + if (__pyx_t_1) { + + /* "thirdparty/pycocotools/_mask.pyx":72 + * def __getattr__(self, key): + * if key == 'n': + * return self._n # <<<<<<<<<<<<<< + * raise AttributeError(key) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_self->_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":71 + * free(self._R) + * def __getattr__(self, key): + * if key == 'n': # <<<<<<<<<<<<<< + * return self._n + * raise AttributeError(key) + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":73 + * if key == 'n': + * return self._n + * raise AttributeError(key) # <<<<<<<<<<<<<< + * + * # python class to wrap Mask array in C + */ + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_key); + __Pyx_GIVEREF(__pyx_v_key); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_key); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(0, 73, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":70 + * free(self._R[i].cnts) + * free(self._R) + * def __getattr__(self, key): # <<<<<<<<<<<<<< + * if key == 'n': + * return self._n + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.RLEs.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":83 + * cdef siz _n + * + * def __cinit__(self, h, w, n): # <<<<<<<<<<<<<< + * self._mask = malloc(h*w*n* sizeof(byte)) + * self._h = h + */ + +/* Python wrapper */ +static int __pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_h = 0; + PyObject *__pyx_v_w = 0; + PyObject *__pyx_v_n = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_h,&__pyx_n_s_w,&__pyx_n_s_n,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(0, 83, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(0, 83, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 83, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_h = values[0]; + __pyx_v_w = values[1]; + __pyx_v_n = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 83, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.Masks.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *)__pyx_v_self), __pyx_v_h, __pyx_v_w, __pyx_v_n); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self, PyObject *__pyx_v_h, PyObject *__pyx_v_w, PyObject *__pyx_v_n) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + size_t __pyx_t_4; + siz __pyx_t_5; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "thirdparty/pycocotools/_mask.pyx":84 + * + * def __cinit__(self, h, w, n): + * self._mask = malloc(h*w*n* sizeof(byte)) # <<<<<<<<<<<<<< + * self._h = h + * self._w = w + */ + __pyx_t_1 = PyNumber_Multiply(__pyx_v_h, __pyx_v_w); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_FromSize_t((sizeof(byte))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_t_3); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_self->_mask = ((byte *)malloc(__pyx_t_4)); + + /* "thirdparty/pycocotools/_mask.pyx":85 + * def __cinit__(self, h, w, n): + * self._mask = malloc(h*w*n* sizeof(byte)) + * self._h = h # <<<<<<<<<<<<<< + * self._w = w + * self._n = n + */ + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_h); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_v_self->_h = __pyx_t_5; + + /* "thirdparty/pycocotools/_mask.pyx":86 + * self._mask = malloc(h*w*n* sizeof(byte)) + * self._h = h + * self._w = w # <<<<<<<<<<<<<< + * self._n = n + * # def __dealloc__(self): + */ + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_w); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_v_self->_w = __pyx_t_5; + + /* "thirdparty/pycocotools/_mask.pyx":87 + * self._h = h + * self._w = w + * self._n = n # <<<<<<<<<<<<<< + * # def __dealloc__(self): + * # the memory management of _mask has been passed to np.ndarray + */ + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_n); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_v_self->_n = __pyx_t_5; + + /* "thirdparty/pycocotools/_mask.pyx":83 + * cdef siz _n + * + * def __cinit__(self, h, w, n): # <<<<<<<<<<<<<< + * self._mask = malloc(h*w*n* sizeof(byte)) + * self._h = h + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.Masks.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":93 + * + * # called when passing into np.array() and return an np.ndarray in column-major order + * def __array__(self): # <<<<<<<<<<<<<< + * cdef np.npy_intp shape[1] + * shape[0] = self._h*self._w*self._n + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_3__array__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_3__array__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__array__ (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self) { + npy_intp __pyx_v_shape[1]; + PyObject *__pyx_v_ndarray = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__array__", 0); + + /* "thirdparty/pycocotools/_mask.pyx":95 + * def __array__(self): + * cdef np.npy_intp shape[1] + * shape[0] = self._h*self._w*self._n # <<<<<<<<<<<<<< + * # Create a 1D array, and reshape it to fortran/Matlab column-major array + * ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT8, self._mask).reshape((self._h, self._w, self._n), order='F') + */ + (__pyx_v_shape[0]) = ((((npy_intp)__pyx_v_self->_h) * __pyx_v_self->_w) * __pyx_v_self->_n); + + /* "thirdparty/pycocotools/_mask.pyx":97 + * shape[0] = self._h*self._w*self._n + * # Create a 1D array, and reshape it to fortran/Matlab column-major array + * ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT8, self._mask).reshape((self._h, self._w, self._n), order='F') # <<<<<<<<<<<<<< + * # The _mask allocated by Masks is now handled by ndarray + * PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA) + */ + __pyx_t_1 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_UINT8, __pyx_v_self->_mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_reshape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_self->_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_From_siz(__pyx_v_self->_w); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_self->_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_ndarray = __pyx_t_3; + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":99 + * ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT8, self._mask).reshape((self._h, self._w, self._n), order='F') + * # The _mask allocated by Masks is now handled by ndarray + * PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA) # <<<<<<<<<<<<<< + * return ndarray + * + */ + if (!(likely(((__pyx_v_ndarray) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_ndarray, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 99, __pyx_L1_error) + PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_ndarray), NPY_OWNDATA); + + /* "thirdparty/pycocotools/_mask.pyx":100 + * # The _mask allocated by Masks is now handled by ndarray + * PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA) + * return ndarray # <<<<<<<<<<<<<< + * + * # internal conversion from Python RLEs object to compressed RLE format + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_ndarray); + __pyx_r = __pyx_v_ndarray; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":93 + * + * # called when passing into np.array() and return an np.ndarray in column-major order + * def __array__(self): # <<<<<<<<<<<<<< + * cdef np.npy_intp shape[1] + * shape[0] = self._h*self._w*self._n + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.Masks.__array__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_ndarray); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":103 + * + * # internal conversion from Python RLEs object to compressed RLE format + * def _toString(RLEs Rs): # <<<<<<<<<<<<<< + * cdef siz n = Rs.n + * cdef bytes py_string + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString(PyObject *__pyx_self, PyObject *__pyx_v_Rs); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_1_toString = {"_toString", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString(PyObject *__pyx_self, PyObject *__pyx_v_Rs) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_toString (wrapper)", 0); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Rs), __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs, 1, "Rs", 0))) __PYX_ERR(0, 103, __pyx_L1_error) + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask__toString(__pyx_self, ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_Rs)); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs) { + siz __pyx_v_n; + PyObject *__pyx_v_py_string = 0; + char *__pyx_v_c_string; + PyObject *__pyx_v_objs = NULL; + siz __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + siz __pyx_t_2; + siz __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("_toString", 0); + + /* "thirdparty/pycocotools/_mask.pyx":104 + * # internal conversion from Python RLEs object to compressed RLE format + * def _toString(RLEs Rs): + * cdef siz n = Rs.n # <<<<<<<<<<<<<< + * cdef bytes py_string + * cdef char* c_string + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_Rs), __pyx_n_s_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_2 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 104, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_n = __pyx_t_2; + + /* "thirdparty/pycocotools/_mask.pyx":107 + * cdef bytes py_string + * cdef char* c_string + * objs = [] # <<<<<<<<<<<<<< + * for i in range(n): + * c_string = rleToString( &Rs._R[i] ) + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_objs = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":108 + * cdef char* c_string + * objs = [] + * for i in range(n): # <<<<<<<<<<<<<< + * c_string = rleToString( &Rs._R[i] ) + * py_string = c_string + */ + __pyx_t_2 = __pyx_v_n; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "thirdparty/pycocotools/_mask.pyx":109 + * objs = [] + * for i in range(n): + * c_string = rleToString( &Rs._R[i] ) # <<<<<<<<<<<<<< + * py_string = c_string + * objs.append({ + */ + __pyx_v_c_string = rleToString(((RLE *)(&(__pyx_v_Rs->_R[__pyx_v_i])))); + + /* "thirdparty/pycocotools/_mask.pyx":110 + * for i in range(n): + * c_string = rleToString( &Rs._R[i] ) + * py_string = c_string # <<<<<<<<<<<<<< + * objs.append({ + * 'size': [Rs._R[i].h, Rs._R[i].w], + */ + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_c_string); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 110, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_py_string, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":112 + * py_string = c_string + * objs.append({ + * 'size': [Rs._R[i].h, Rs._R[i].w], # <<<<<<<<<<<<<< + * 'counts': py_string + * }) + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyInt_From_siz((__pyx_v_Rs->_R[__pyx_v_i]).h); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyInt_From_siz((__pyx_v_Rs->_R[__pyx_v_i]).w); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyList_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_4); + PyList_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyList_SET_ITEM(__pyx_t_6, 1, __pyx_t_5); + __pyx_t_4 = 0; + __pyx_t_5 = 0; + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_size, __pyx_t_6) < 0) __PYX_ERR(0, 112, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":114 + * 'size': [Rs._R[i].h, Rs._R[i].w], + * 'counts': py_string + * }) # <<<<<<<<<<<<<< + * free(c_string) + * return objs + */ + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_counts, __pyx_v_py_string) < 0) __PYX_ERR(0, 112, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":111 + * c_string = rleToString( &Rs._R[i] ) + * py_string = c_string + * objs.append({ # <<<<<<<<<<<<<< + * 'size': [Rs._R[i].h, Rs._R[i].w], + * 'counts': py_string + */ + __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_objs, __pyx_t_1); if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":115 + * 'counts': py_string + * }) + * free(c_string) # <<<<<<<<<<<<<< + * return objs + * + */ + free(__pyx_v_c_string); + } + + /* "thirdparty/pycocotools/_mask.pyx":116 + * }) + * free(c_string) + * return objs # <<<<<<<<<<<<<< + * + * # internal conversion from compressed RLE format to Python RLEs object + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":103 + * + * # internal conversion from Python RLEs object to compressed RLE format + * def _toString(RLEs Rs): # <<<<<<<<<<<<<< + * cdef siz n = Rs.n + * cdef bytes py_string + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("thirdparty.pycocotools._mask._toString", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_py_string); + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":119 + * + * # internal conversion from compressed RLE format to Python RLEs object + * def _frString(rleObjs): # <<<<<<<<<<<<<< + * cdef siz n = len(rleObjs) + * Rs = RLEs(n) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3_frString(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3_frString = {"_frString", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3_frString, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3_frString(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_frString (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + siz __pyx_v_n; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + PyObject *__pyx_v_py_string = 0; + char *__pyx_v_c_string; + PyObject *__pyx_v_i = NULL; + PyObject *__pyx_v_obj = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + char *__pyx_t_12; + Py_ssize_t __pyx_t_13; + siz __pyx_t_14; + siz __pyx_t_15; + __Pyx_RefNannySetupContext("_frString", 0); + + /* "thirdparty/pycocotools/_mask.pyx":120 + * # internal conversion from compressed RLE format to Python RLEs object + * def _frString(rleObjs): + * cdef siz n = len(rleObjs) # <<<<<<<<<<<<<< + * Rs = RLEs(n) + * cdef bytes py_string + */ + __pyx_t_1 = PyObject_Length(__pyx_v_rleObjs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 120, __pyx_L1_error) + __pyx_v_n = __pyx_t_1; + + /* "thirdparty/pycocotools/_mask.pyx":121 + * def _frString(rleObjs): + * cdef siz n = len(rleObjs) + * Rs = RLEs(n) # <<<<<<<<<<<<<< + * cdef bytes py_string + * cdef char* c_string + */ + __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 121, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":124 + * cdef bytes py_string + * cdef char* c_string + * for i, obj in enumerate(rleObjs): # <<<<<<<<<<<<<< + * if PYTHON_VERSION == 2: + * py_string = str(obj['counts']).encode('utf8') + */ + __Pyx_INCREF(__pyx_int_0); + __pyx_t_2 = __pyx_int_0; + if (likely(PyList_CheckExact(__pyx_v_rleObjs)) || PyTuple_CheckExact(__pyx_v_rleObjs)) { + __pyx_t_3 = __pyx_v_rleObjs; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_rleObjs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 124, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 124, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_3); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 124, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_2); + __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); + __pyx_t_2 = __pyx_t_5; + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":125 + * cdef char* c_string + * for i, obj in enumerate(rleObjs): + * if PYTHON_VERSION == 2: # <<<<<<<<<<<<<< + * py_string = str(obj['counts']).encode('utf8') + * elif PYTHON_VERSION == 3: + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_PYTHON_VERSION); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyInt_EqObjC(__pyx_t_5, __pyx_int_2, 2, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 125, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_7) { + + /* "thirdparty/pycocotools/_mask.pyx":126 + * for i, obj in enumerate(rleObjs): + * if PYTHON_VERSION == 2: + * py_string = str(obj['counts']).encode('utf8') # <<<<<<<<<<<<<< + * elif PYTHON_VERSION == 3: + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] + */ + __pyx_t_6 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_6)->tp_name), 0))) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_py_string, ((PyObject*)__pyx_t_6)); + __pyx_t_6 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":125 + * cdef char* c_string + * for i, obj in enumerate(rleObjs): + * if PYTHON_VERSION == 2: # <<<<<<<<<<<<<< + * py_string = str(obj['counts']).encode('utf8') + * elif PYTHON_VERSION == 3: + */ + goto __pyx_L5; + } + + /* "thirdparty/pycocotools/_mask.pyx":127 + * if PYTHON_VERSION == 2: + * py_string = str(obj['counts']).encode('utf8') + * elif PYTHON_VERSION == 3: # <<<<<<<<<<<<<< + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] + * else: + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_PYTHON_VERSION); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 127, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyInt_EqObjC(__pyx_t_6, __pyx_int_3, 3, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 127, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 127, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_7) { + + /* "thirdparty/pycocotools/_mask.pyx":128 + * py_string = str(obj['counts']).encode('utf8') + * elif PYTHON_VERSION == 3: + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] # <<<<<<<<<<<<<< + * else: + * raise Exception('Python version must be 2 or 3') + */ + __pyx_t_6 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_t_6)), ((PyObject *)(&PyString_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (__pyx_t_7) { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)(&PyString_Type)), __pyx_n_s_encode); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_9 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + } + } + if (!__pyx_t_10) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_9); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_8); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_9}; + __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_9}; + __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_10); __pyx_t_10 = NULL; + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_8)->tp_name), 0))) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_5 = __pyx_t_8; + __pyx_t_8 = 0; + } else { + __pyx_t_8 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + if (!(likely(PyBytes_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_8)->tp_name), 0))) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_5 = __pyx_t_8; + __pyx_t_8 = 0; + } + __Pyx_XDECREF_SET(__pyx_v_py_string, ((PyObject*)__pyx_t_5)); + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":127 + * if PYTHON_VERSION == 2: + * py_string = str(obj['counts']).encode('utf8') + * elif PYTHON_VERSION == 3: # <<<<<<<<<<<<<< + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] + * else: + */ + goto __pyx_L5; + } + + /* "thirdparty/pycocotools/_mask.pyx":130 + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] + * else: + * raise Exception('Python version must be 2 or 3') # <<<<<<<<<<<<<< + * c_string = py_string + * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(0, 130, __pyx_L1_error) + } + __pyx_L5:; + + /* "thirdparty/pycocotools/_mask.pyx":131 + * else: + * raise Exception('Python version must be 2 or 3') + * c_string = py_string # <<<<<<<<<<<<<< + * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) + * return Rs + */ + __pyx_t_12 = __Pyx_PyObject_AsString(__pyx_v_py_string); if (unlikely((!__pyx_t_12) && PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) + __pyx_v_c_string = __pyx_t_12; + + /* "thirdparty/pycocotools/_mask.pyx":132 + * raise Exception('Python version must be 2 or 3') + * c_string = py_string + * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) # <<<<<<<<<<<<<< + * return Rs + * + */ + __pyx_t_13 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_13 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_5 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_14 = __Pyx_PyInt_As_siz(__pyx_t_8); if (unlikely((__pyx_t_14 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_8, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_15 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_15 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + rleFrString(((RLE *)(&(__pyx_v_Rs->_R[__pyx_t_13]))), ((char *)__pyx_v_c_string), __pyx_t_14, __pyx_t_15); + + /* "thirdparty/pycocotools/_mask.pyx":124 + * cdef bytes py_string + * cdef char* c_string + * for i, obj in enumerate(rleObjs): # <<<<<<<<<<<<<< + * if PYTHON_VERSION == 2: + * py_string = str(obj['counts']).encode('utf8') + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":133 + * c_string = py_string + * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) + * return Rs # <<<<<<<<<<<<<< + * + * # encode mask to RLEs objects + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __pyx_r = ((PyObject *)__pyx_v_Rs); + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":119 + * + * # internal conversion from compressed RLE format to Python RLEs object + * def _frString(rleObjs): # <<<<<<<<<<<<<< + * cdef siz n = len(rleObjs) + * Rs = RLEs(n) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("thirdparty.pycocotools._mask._frString", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF(__pyx_v_py_string); + __Pyx_XDECREF(__pyx_v_i); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":137 + * # encode mask to RLEs objects + * # list of RLE string can be generated by RLEs member function + * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] + * cdef RLEs Rs = RLEs(n) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode(PyObject *__pyx_self, PyObject *__pyx_v_mask); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_5encode = {"encode", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode(PyObject *__pyx_self, PyObject *__pyx_v_mask) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("encode (wrapper)", 0); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_mask), __pyx_ptype_5numpy_ndarray, 1, "mask", 0))) __PYX_ERR(0, 137, __pyx_L1_error) + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(__pyx_self, ((PyArrayObject *)__pyx_v_mask)); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_mask) { + npy_intp __pyx_v_h; + npy_intp __pyx_v_w; + npy_intp __pyx_v_n; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + PyObject *__pyx_v_objs = NULL; + __Pyx_LocalBuf_ND __pyx_pybuffernd_mask; + __Pyx_Buffer __pyx_pybuffer_mask; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + npy_intp __pyx_t_1; + npy_intp __pyx_t_2; + npy_intp __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + __Pyx_RefNannySetupContext("encode", 0); + __pyx_pybuffer_mask.pybuffer.buf = NULL; + __pyx_pybuffer_mask.refcount = 0; + __pyx_pybuffernd_mask.data = NULL; + __pyx_pybuffernd_mask.rcbuffer = &__pyx_pybuffer_mask; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_mask.rcbuffer->pybuffer, (PyObject*)__pyx_v_mask, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 3, 0, __pyx_stack) == -1)) __PYX_ERR(0, 137, __pyx_L1_error) + } + __pyx_pybuffernd_mask.diminfo[0].strides = __pyx_pybuffernd_mask.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_mask.diminfo[0].shape = __pyx_pybuffernd_mask.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_mask.diminfo[1].strides = __pyx_pybuffernd_mask.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_mask.diminfo[1].shape = __pyx_pybuffernd_mask.rcbuffer->pybuffer.shape[1]; __pyx_pybuffernd_mask.diminfo[2].strides = __pyx_pybuffernd_mask.rcbuffer->pybuffer.strides[2]; __pyx_pybuffernd_mask.diminfo[2].shape = __pyx_pybuffernd_mask.rcbuffer->pybuffer.shape[2]; + + /* "thirdparty/pycocotools/_mask.pyx":138 + * # list of RLE string can be generated by RLEs member function + * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] # <<<<<<<<<<<<<< + * cdef RLEs Rs = RLEs(n) + * rleEncode(Rs._R,mask.data,h,w,n) + */ + __pyx_t_1 = (__pyx_v_mask->dimensions[0]); + __pyx_t_2 = (__pyx_v_mask->dimensions[1]); + __pyx_t_3 = (__pyx_v_mask->dimensions[2]); + __pyx_v_h = __pyx_t_1; + __pyx_v_w = __pyx_t_2; + __pyx_v_n = __pyx_t_3; + + /* "thirdparty/pycocotools/_mask.pyx":139 + * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] + * cdef RLEs Rs = RLEs(n) # <<<<<<<<<<<<<< + * rleEncode(Rs._R,mask.data,h,w,n) + * objs = _toString(Rs) + */ + __pyx_t_4 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":140 + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] + * cdef RLEs Rs = RLEs(n) + * rleEncode(Rs._R,mask.data,h,w,n) # <<<<<<<<<<<<<< + * objs = _toString(Rs) + * return objs + */ + rleEncode(__pyx_v_Rs->_R, ((byte *)__pyx_v_mask->data), __pyx_v_h, __pyx_v_w, __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":141 + * cdef RLEs Rs = RLEs(n) + * rleEncode(Rs._R,mask.data,h,w,n) + * objs = _toString(Rs) # <<<<<<<<<<<<<< + * return objs + * + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + } + } + if (!__pyx_t_6) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_4); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_4); + } else + #endif + { + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_objs = __pyx_t_4; + __pyx_t_4 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":142 + * rleEncode(Rs._R,mask.data,h,w,n) + * objs = _toString(Rs) + * return objs # <<<<<<<<<<<<<< + * + * # decode mask from compressed list of RLE string or RLEs object + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":137 + * # encode mask to RLEs objects + * # list of RLE string can be generated by RLEs member function + * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] + * cdef RLEs Rs = RLEs(n) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_mask.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.encode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_mask.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":145 + * + * # decode mask from compressed list of RLE string or RLEs object + * def decode(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_7decode(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_7decode = {"decode", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_7decode, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_7decode(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("decode (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + siz __pyx_v_h; + siz __pyx_v_w; + siz __pyx_v_n; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_masks = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + siz __pyx_t_5; + siz __pyx_t_6; + siz __pyx_t_7; + __Pyx_RefNannySetupContext("decode", 0); + + /* "thirdparty/pycocotools/_mask.pyx":146 + * # decode mask from compressed list of RLE string or RLEs object + * def decode(rleObjs): + * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + * masks = Masks(h, w, n) + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_3) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 146, __pyx_L1_error) + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":147 + * def decode(rleObjs): + * cdef RLEs Rs = _frString(rleObjs) + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n # <<<<<<<<<<<<<< + * masks = Masks(h, w, n) + * rleDecode(Rs._R, masks._mask, n); + */ + __pyx_t_5 = (__pyx_v_Rs->_R[0]).h; + __pyx_t_6 = (__pyx_v_Rs->_R[0]).w; + __pyx_t_7 = __pyx_v_Rs->_n; + __pyx_v_h = __pyx_t_5; + __pyx_v_w = __pyx_t_6; + __pyx_v_n = __pyx_t_7; + + /* "thirdparty/pycocotools/_mask.pyx":148 + * cdef RLEs Rs = _frString(rleObjs) + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + * masks = Masks(h, w, n) # <<<<<<<<<<<<<< + * rleDecode(Rs._R, masks._mask, n); + * return np.array(masks) + */ + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_w); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_4); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_Masks), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_masks = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":149 + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + * masks = Masks(h, w, n) + * rleDecode(Rs._R, masks._mask, n); # <<<<<<<<<<<<<< + * return np.array(masks) + * + */ + rleDecode(((RLE *)__pyx_v_Rs->_R), __pyx_v_masks->_mask, __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":150 + * masks = Masks(h, w, n) + * rleDecode(Rs._R, masks._mask, n); + * return np.array(masks) # <<<<<<<<<<<<<< + * + * def merge(rleObjs, intersect=0): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_3) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_masks)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_masks)}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_4); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_masks)}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_4); + } else + #endif + { + __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_masks)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_masks)); + PyTuple_SET_ITEM(__pyx_t_1, 0+1, ((PyObject *)__pyx_v_masks)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":145 + * + * # decode mask from compressed list of RLE string or RLEs object + * def decode(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.decode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF((PyObject *)__pyx_v_masks); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":152 + * return np.array(masks) + * + * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_9merge = {"merge", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_rleObjs = 0; + PyObject *__pyx_v_intersect = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("merge (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rleObjs,&__pyx_n_s_intersect,0}; + PyObject* values[2] = {0,0}; + values[1] = ((PyObject *)__pyx_int_0); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_rleObjs)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_intersect); + if (value) { values[1] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "merge") < 0)) __PYX_ERR(0, 152, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_rleObjs = values[0]; + __pyx_v_intersect = values[1]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("merge", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 152, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.merge", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(__pyx_self, __pyx_v_rleObjs, __pyx_v_intersect); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs, PyObject *__pyx_v_intersect) { + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_R = 0; + PyObject *__pyx_v_obj = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + __Pyx_RefNannySetupContext("merge", 0); + + /* "thirdparty/pycocotools/_mask.pyx":153 + * + * def merge(rleObjs, intersect=0): + * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< + * cdef RLEs R = RLEs(1) + * rleMerge(Rs._R, R._R, Rs._n, intersect) + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_3) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 153, __pyx_L1_error) + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":154 + * def merge(rleObjs, intersect=0): + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) # <<<<<<<<<<<<<< + * rleMerge(Rs._R, R._R, Rs._n, intersect) + * obj = _toString(R)[0] + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_R = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":155 + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) + * rleMerge(Rs._R, R._R, Rs._n, intersect) # <<<<<<<<<<<<<< + * obj = _toString(R)[0] + * return obj + */ + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_intersect); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L1_error) + rleMerge(((RLE *)__pyx_v_Rs->_R), ((RLE *)__pyx_v_R->_R), ((siz)__pyx_v_Rs->_n), __pyx_t_5); + + /* "thirdparty/pycocotools/_mask.pyx":156 + * cdef RLEs R = RLEs(1) + * rleMerge(Rs._R, R._R, Rs._n, intersect) + * obj = _toString(R)[0] # <<<<<<<<<<<<<< + * return obj + * + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_4) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_R)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, ((PyObject *)__pyx_v_R)}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, ((PyObject *)__pyx_v_R)}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_R)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_R)); + PyTuple_SET_ITEM(__pyx_t_3, 0+1, ((PyObject *)__pyx_v_R)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_obj = __pyx_t_2; + __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":157 + * rleMerge(Rs._R, R._R, Rs._n, intersect) + * obj = _toString(R)[0] + * return obj # <<<<<<<<<<<<<< + * + * def area(rleObjs): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":152 + * return np.array(masks) + * + * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.merge", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF((PyObject *)__pyx_v_R); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":159 + * return obj + * + * def area(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_11area(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_11area = {"area", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_11area, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_11area(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("area (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_10area(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + uint *__pyx_v__a; + npy_intp __pyx_v_shape[1]; + PyObject *__pyx_v_a = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("area", 0); + + /* "thirdparty/pycocotools/_mask.pyx":160 + * + * def area(rleObjs): + * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) + * rleArea(Rs._R, Rs._n, _a) + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_3) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":161 + * def area(rleObjs): + * cdef RLEs Rs = _frString(rleObjs) + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) # <<<<<<<<<<<<<< + * rleArea(Rs._R, Rs._n, _a) + * cdef np.npy_intp shape[1] + */ + __pyx_v__a = ((uint *)malloc((__pyx_v_Rs->_n * (sizeof(unsigned int))))); + + /* "thirdparty/pycocotools/_mask.pyx":162 + * cdef RLEs Rs = _frString(rleObjs) + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) + * rleArea(Rs._R, Rs._n, _a) # <<<<<<<<<<<<<< + * cdef np.npy_intp shape[1] + * shape[0] = Rs._n + */ + rleArea(__pyx_v_Rs->_R, __pyx_v_Rs->_n, __pyx_v__a); + + /* "thirdparty/pycocotools/_mask.pyx":164 + * rleArea(Rs._R, Rs._n, _a) + * cdef np.npy_intp shape[1] + * shape[0] = Rs._n # <<<<<<<<<<<<<< + * a = np.array((Rs._n, ), dtype=np.uint8) + * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) + */ + (__pyx_v_shape[0]) = ((npy_intp)__pyx_v_Rs->_n); + + /* "thirdparty/pycocotools/_mask.pyx":165 + * cdef np.npy_intp shape[1] + * shape[0] = Rs._n + * a = np.array((Rs._n, ), dtype=np.uint8) # <<<<<<<<<<<<<< + * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) + * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_Rs->_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_a = __pyx_t_5; + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":166 + * shape[0] = Rs._n + * a = np.array((Rs._n, ), dtype=np.uint8) + * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) # <<<<<<<<<<<<<< + * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) + * return a + */ + __pyx_t_5 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_UINT32, __pyx_v__a); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 166, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_a, __pyx_t_5); + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":167 + * a = np.array((Rs._n, ), dtype=np.uint8) + * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) + * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) # <<<<<<<<<<<<<< + * return a + * + */ + if (!(likely(((__pyx_v_a) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_a, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 167, __pyx_L1_error) + PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_a), NPY_OWNDATA); + + /* "thirdparty/pycocotools/_mask.pyx":168 + * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) + * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) + * return a # <<<<<<<<<<<<<< + * + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_a); + __pyx_r = __pyx_v_a; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":159 + * return obj + * + * def area(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.area", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF(__pyx_v_a); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":171 + * + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< + * def _preproc(objs): + * if len(objs) == 0: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_13iou = {"iou", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_dt = 0; + PyObject *__pyx_v_gt = 0; + PyObject *__pyx_v_pyiscrowd = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("iou (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_dt,&__pyx_n_s_gt,&__pyx_n_s_pyiscrowd,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dt)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gt)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, 1); __PYX_ERR(0, 171, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_pyiscrowd)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, 2); __PYX_ERR(0, 171, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "iou") < 0)) __PYX_ERR(0, 171, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_dt = values[0]; + __pyx_v_gt = values[1]; + __pyx_v_pyiscrowd = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 171, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_pyiscrowd); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":172 + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): + * def _preproc(objs): # <<<<<<<<<<<<<< + * if len(objs) == 0: + * return objs + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_1_preproc(PyObject *__pyx_self, PyObject *__pyx_v_objs); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_1_preproc = {"_preproc", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_1_preproc, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_1_preproc(PyObject *__pyx_self, PyObject *__pyx_v_objs) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_preproc (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(__pyx_self, ((PyObject *)__pyx_v_objs)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_objs) { + PyObject *__pyx_v_isbox = NULL; + PyObject *__pyx_v_isrle = NULL; + PyObject *__pyx_v_obj = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *(*__pyx_t_11)(PyObject *); + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + PyObject *__pyx_t_14 = NULL; + __Pyx_RefNannySetupContext("_preproc", 0); + __Pyx_INCREF(__pyx_v_objs); + + /* "thirdparty/pycocotools/_mask.pyx":173 + * def iou( dt, gt, pyiscrowd ): + * def _preproc(objs): + * if len(objs) == 0: # <<<<<<<<<<<<<< + * return objs + * if type(objs) == np.ndarray: + */ + __pyx_t_1 = PyObject_Length(__pyx_v_objs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 173, __pyx_L1_error) + __pyx_t_2 = ((__pyx_t_1 == 0) != 0); + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":174 + * def _preproc(objs): + * if len(objs) == 0: + * return objs # <<<<<<<<<<<<<< + * if type(objs) == np.ndarray: + * if len(objs.shape) == 1: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":173 + * def iou( dt, gt, pyiscrowd ): + * def _preproc(objs): + * if len(objs) == 0: # <<<<<<<<<<<<<< + * return objs + * if type(objs) == np.ndarray: + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":175 + * if len(objs) == 0: + * return objs + * if type(objs) == np.ndarray: # <<<<<<<<<<<<<< + * if len(objs.shape) == 1: + * objs = objs.reshape((objs[0], 1)) + */ + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_objs)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 175, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":176 + * return objs + * if type(objs) == np.ndarray: + * if len(objs.shape) == 1: # <<<<<<<<<<<<<< + * objs = objs.reshape((objs[0], 1)) + * # check if it's Nx4 bbox + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 176, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 176, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_2 = ((__pyx_t_1 == 1) != 0); + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":177 + * if type(objs) == np.ndarray: + * if len(objs.shape) == 1: + * objs = objs.reshape((objs[0], 1)) # <<<<<<<<<<<<<< + * # check if it's Nx4 bbox + * if not len(objs.shape) == 2 or not objs.shape[1] == 4: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_objs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); + __Pyx_INCREF(__pyx_int_1); + __Pyx_GIVEREF(__pyx_int_1); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_1); + __pyx_t_5 = 0; + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_5) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_3); + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":176 + * return objs + * if type(objs) == np.ndarray: + * if len(objs.shape) == 1: # <<<<<<<<<<<<<< + * objs = objs.reshape((objs[0], 1)) + * # check if it's Nx4 bbox + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":179 + * objs = objs.reshape((objs[0], 1)) + * # check if it's Nx4 bbox + * if not len(objs.shape) == 2 or not objs.shape[1] == 4: # <<<<<<<<<<<<<< + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') + * objs = objs.astype(np.double) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_8 = ((!((__pyx_t_1 == 2) != 0)) != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_2 = __pyx_t_8; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_t_4, __pyx_int_4, 4, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_9 = ((!__pyx_t_8) != 0); + __pyx_t_2 = __pyx_t_9; + __pyx_L7_bool_binop_done:; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":180 + * # check if it's Nx4 bbox + * if not len(objs.shape) == 2 or not objs.shape[1] == 4: + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') # <<<<<<<<<<<<<< + * objs = objs.astype(np.double) + * elif type(objs) == list: + */ + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 180, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(0, 180, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":179 + * objs = objs.reshape((objs[0], 1)) + * # check if it's Nx4 bbox + * if not len(objs.shape) == 2 or not objs.shape[1] == 4: # <<<<<<<<<<<<<< + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') + * objs = objs.astype(np.double) + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":181 + * if not len(objs.shape) == 2 or not objs.shape[1] == 4: + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') + * objs = objs.astype(np.double) # <<<<<<<<<<<<<< + * elif type(objs) == list: + * # check if list is in box format and convert it to np.ndarray + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_double); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_7) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_3); + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":175 + * if len(objs) == 0: + * return objs + * if type(objs) == np.ndarray: # <<<<<<<<<<<<<< + * if len(objs.shape) == 1: + * objs = objs.reshape((objs[0], 1)) + */ + goto __pyx_L4; + } + + /* "thirdparty/pycocotools/_mask.pyx":182 + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') + * objs = objs.astype(np.double) + * elif type(objs) == list: # <<<<<<<<<<<<<< + * # check if list is in box format and convert it to np.ndarray + * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) + */ + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_objs)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":184 + * elif type(objs) == list: + * # check if list is in box format and convert it to np.ndarray + * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) # <<<<<<<<<<<<<< + * isrle = np.all(np.array([type(obj) == dict for obj in objs])) + * if isbox: + */ + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_all); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (likely(PyList_CheckExact(__pyx_v_objs)) || PyTuple_CheckExact(__pyx_v_objs)) { + __pyx_t_10 = __pyx_v_objs; __Pyx_INCREF(__pyx_t_10); __pyx_t_1 = 0; + __pyx_t_11 = NULL; + } else { + __pyx_t_1 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_v_objs); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 184, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_11)) { + if (likely(PyList_CheckExact(__pyx_t_10))) { + if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_10)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_12 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + #else + __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + #endif + } else { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_10)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + #else + __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + #endif + } + } else { + __pyx_t_12 = __pyx_t_11(__pyx_t_10); + if (unlikely(!__pyx_t_12)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 184, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_12); + } + __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_12); + __pyx_t_12 = 0; + __pyx_t_13 = PyObject_Length(__pyx_v_obj); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_13 == 4); + if (__pyx_t_2) { + } else { + __pyx_t_14 = __Pyx_PyBool_FromLong(__pyx_t_2); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_12 = __pyx_t_14; + __pyx_t_14 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_14 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + if (!__pyx_t_2) { + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + } else { + __Pyx_INCREF(__pyx_t_14); + __pyx_t_12 = __pyx_t_14; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_14 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_INCREF(__pyx_t_14); + __pyx_t_12 = __pyx_t_14; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_L11_bool_binop_done:; + if (unlikely(__Pyx_ListComp_Append(__pyx_t_6, (PyObject*)__pyx_t_12))) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (!__pyx_t_10) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_4); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_6}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_6}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + } + } + if (!__pyx_t_7) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_isbox = __pyx_t_3; + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":185 + * # check if list is in box format and convert it to np.ndarray + * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) + * isrle = np.all(np.array([type(obj) == dict for obj in objs])) # <<<<<<<<<<<<<< + * if isbox: + * objs = np.array(objs, dtype=np.double) + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_all); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (likely(PyList_CheckExact(__pyx_v_objs)) || PyTuple_CheckExact(__pyx_v_objs)) { + __pyx_t_6 = __pyx_v_objs; __Pyx_INCREF(__pyx_t_6); __pyx_t_1 = 0; + __pyx_t_11 = NULL; + } else { + __pyx_t_1 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_objs); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 185, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_11)) { + if (likely(PyList_CheckExact(__pyx_t_6))) { + if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_6)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 185, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_6, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } else { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_6)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 185, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_6, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } + } else { + __pyx_t_10 = __pyx_t_11(__pyx_t_6); + if (unlikely(!__pyx_t_10)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 185, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_10); + } + __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_10); + __pyx_t_10 = 0; + __pyx_t_10 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_4, (PyObject*)__pyx_t_10))) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (!__pyx_t_6) { + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_5); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_4}; + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_4}; + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_12))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_12, function); + } + } + if (!__pyx_t_7) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_12)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_12)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + { + __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + } + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_v_isrle = __pyx_t_3; + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":186 + * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) + * isrle = np.all(np.array([type(obj) == dict for obj in objs])) + * if isbox: # <<<<<<<<<<<<<< + * objs = np.array(objs, dtype=np.double) + * if len(objs.shape) == 1: + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_isbox); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 186, __pyx_L1_error) + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":187 + * isrle = np.all(np.array([type(obj) == dict for obj in objs])) + * if isbox: + * objs = np.array(objs, dtype=np.double) # <<<<<<<<<<<<<< + * if len(objs.shape) == 1: + * objs = objs.reshape((1,objs.shape[0])) + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_objs); + __Pyx_GIVEREF(__pyx_v_objs); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_objs); + __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_double); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_3, __pyx_t_10); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_7); + __pyx_t_7 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":188 + * if isbox: + * objs = np.array(objs, dtype=np.double) + * if len(objs.shape) == 1: # <<<<<<<<<<<<<< + * objs = objs.reshape((1,objs.shape[0])) + * elif isrle: + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = PyObject_Length(__pyx_t_7); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_2 = ((__pyx_t_1 == 1) != 0); + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":189 + * objs = np.array(objs, dtype=np.double) + * if len(objs.shape) == 1: + * objs = objs.reshape((1,objs.shape[0])) # <<<<<<<<<<<<<< + * elif isrle: + * objs = _frString(objs) + */ + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_reshape); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_int_1); + __Pyx_GIVEREF(__pyx_int_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_1); + __Pyx_GIVEREF(__pyx_t_12); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12); + __pyx_t_12 = 0; + __pyx_t_12 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_10, function); + } + } + if (!__pyx_t_12) { + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_3}; + __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_3}; + __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_12); __pyx_t_12 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_5, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_7); + __pyx_t_7 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":188 + * if isbox: + * objs = np.array(objs, dtype=np.double) + * if len(objs.shape) == 1: # <<<<<<<<<<<<<< + * objs = objs.reshape((1,objs.shape[0])) + * elif isrle: + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":186 + * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) + * isrle = np.all(np.array([type(obj) == dict for obj in objs])) + * if isbox: # <<<<<<<<<<<<<< + * objs = np.array(objs, dtype=np.double) + * if len(objs.shape) == 1: + */ + goto __pyx_L16; + } + + /* "thirdparty/pycocotools/_mask.pyx":190 + * if len(objs.shape) == 1: + * objs = objs.reshape((1,objs.shape[0])) + * elif isrle: # <<<<<<<<<<<<<< + * objs = _frString(objs) + * else: + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_isrle); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 190, __pyx_L1_error) + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":191 + * objs = objs.reshape((1,objs.shape[0])) + * elif isrle: + * objs = _frString(objs) # <<<<<<<<<<<<<< + * else: + * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') + */ + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_10, function); + } + } + if (!__pyx_t_5) { + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_v_objs); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_v_objs}; + __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_v_objs}; + __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else + #endif + { + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_INCREF(__pyx_v_objs); + __Pyx_GIVEREF(__pyx_v_objs); + PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_objs); + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_7); + __pyx_t_7 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":190 + * if len(objs.shape) == 1: + * objs = objs.reshape((1,objs.shape[0])) + * elif isrle: # <<<<<<<<<<<<<< + * objs = _frString(objs) + * else: + */ + goto __pyx_L16; + } + + /* "thirdparty/pycocotools/_mask.pyx":193 + * objs = _frString(objs) + * else: + * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') # <<<<<<<<<<<<<< + * else: + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + */ + /*else*/ { + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_Raise(__pyx_t_7, 0, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(0, 193, __pyx_L1_error) + } + __pyx_L16:; + + /* "thirdparty/pycocotools/_mask.pyx":182 + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') + * objs = objs.astype(np.double) + * elif type(objs) == list: # <<<<<<<<<<<<<< + * # check if list is in box format and convert it to np.ndarray + * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) + */ + goto __pyx_L4; + } + + /* "thirdparty/pycocotools/_mask.pyx":195 + * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') + * else: + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') # <<<<<<<<<<<<<< + * return objs + * 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): + */ + /*else*/ { + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_Raise(__pyx_t_7, 0, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(0, 195, __pyx_L1_error) + } + __pyx_L4:; + + /* "thirdparty/pycocotools/_mask.pyx":196 + * else: + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + * return objs # <<<<<<<<<<<<<< + * 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): + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":172 + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): + * def _preproc(objs): # <<<<<<<<<<<<<< + * if len(objs) == 0: + * return objs + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._preproc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_isbox); + __Pyx_XDECREF(__pyx_v_isrle); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":197 + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + * return objs + * 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): # <<<<<<<<<<<<<< + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou = {"_rleIou", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_dt = 0; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_gt = 0; + PyArrayObject *__pyx_v_iscrowd = 0; + siz __pyx_v_m; + siz __pyx_v_n; + PyArrayObject *__pyx_v__iou = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_rleIou (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_dt,&__pyx_n_s_gt,&__pyx_n_s_iscrowd,&__pyx_n_s_m,&__pyx_n_s_n,&__pyx_n_s_iou,0}; + PyObject* values[6] = {0,0,0,0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dt)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gt)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 1); __PYX_ERR(0, 197, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iscrowd)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 2); __PYX_ERR(0, 197, __pyx_L3_error) + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_m)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 3); __PYX_ERR(0, 197, __pyx_L3_error) + } + case 4: + if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 4); __PYX_ERR(0, 197, __pyx_L3_error) + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iou)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 5); __PYX_ERR(0, 197, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_rleIou") < 0)) __PYX_ERR(0, 197, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + } + __pyx_v_dt = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)values[0]); + __pyx_v_gt = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)values[1]); + __pyx_v_iscrowd = ((PyArrayObject *)values[2]); + __pyx_v_m = __Pyx_PyInt_As_siz(values[3]); if (unlikely((__pyx_v_m == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) + __pyx_v_n = __Pyx_PyInt_As_siz(values[4]); if (unlikely((__pyx_v_n == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) + __pyx_v__iou = ((PyArrayObject *)values[5]); + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 197, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._rleIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs, 1, "dt", 0))) __PYX_ERR(0, 197, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gt), __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs, 1, "gt", 0))) __PYX_ERR(0, 197, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_iscrowd), __pyx_ptype_5numpy_ndarray, 1, "iscrowd", 0))) __PYX_ERR(0, 197, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v__iou), __pyx_ptype_5numpy_ndarray, 1, "_iou", 0))) __PYX_ERR(0, 197, __pyx_L1_error) + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_iscrowd, __pyx_v_m, __pyx_v_n, __pyx_v__iou); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_dt, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou) { + __Pyx_LocalBuf_ND __pyx_pybuffernd__iou; + __Pyx_Buffer __pyx_pybuffer__iou; + __Pyx_LocalBuf_ND __pyx_pybuffernd_iscrowd; + __Pyx_Buffer __pyx_pybuffer_iscrowd; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_rleIou", 0); + __pyx_pybuffer_iscrowd.pybuffer.buf = NULL; + __pyx_pybuffer_iscrowd.refcount = 0; + __pyx_pybuffernd_iscrowd.data = NULL; + __pyx_pybuffernd_iscrowd.rcbuffer = &__pyx_pybuffer_iscrowd; + __pyx_pybuffer__iou.pybuffer.buf = NULL; + __pyx_pybuffer__iou.refcount = 0; + __pyx_pybuffernd__iou.data = NULL; + __pyx_pybuffernd__iou.rcbuffer = &__pyx_pybuffer__iou; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_v_iscrowd, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd_iscrowd.diminfo[0].strides = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_iscrowd.diminfo[0].shape = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd__iou.rcbuffer->pybuffer, (PyObject*)__pyx_v__iou, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + } + __pyx_pybuffernd__iou.diminfo[0].strides = __pyx_pybuffernd__iou.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd__iou.diminfo[0].shape = __pyx_pybuffernd__iou.rcbuffer->pybuffer.shape[0]; + + /* "thirdparty/pycocotools/_mask.pyx":198 + * return objs + * 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): + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) # <<<<<<<<<<<<<< + * 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): + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + */ + rleIou(((RLE *)__pyx_v_dt->_R), ((RLE *)__pyx_v_gt->_R), __pyx_v_m, __pyx_v_n, ((byte *)__pyx_v_iscrowd->data), ((double *)__pyx_v__iou->data)); + + /* "thirdparty/pycocotools/_mask.pyx":197 + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + * return objs + * 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): # <<<<<<<<<<<<<< + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd__iou.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._rleIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd__iou.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":199 + * 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): + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): # <<<<<<<<<<<<<< + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou = {"_bbIou", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_dt = 0; + PyArrayObject *__pyx_v_gt = 0; + PyArrayObject *__pyx_v_iscrowd = 0; + siz __pyx_v_m; + siz __pyx_v_n; + PyArrayObject *__pyx_v__iou = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_bbIou (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_dt,&__pyx_n_s_gt,&__pyx_n_s_iscrowd,&__pyx_n_s_m,&__pyx_n_s_n,&__pyx_n_s_iou,0}; + PyObject* values[6] = {0,0,0,0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dt)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gt)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 1); __PYX_ERR(0, 199, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iscrowd)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 2); __PYX_ERR(0, 199, __pyx_L3_error) + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_m)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 3); __PYX_ERR(0, 199, __pyx_L3_error) + } + case 4: + if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 4); __PYX_ERR(0, 199, __pyx_L3_error) + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iou)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 5); __PYX_ERR(0, 199, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_bbIou") < 0)) __PYX_ERR(0, 199, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + } + __pyx_v_dt = ((PyArrayObject *)values[0]); + __pyx_v_gt = ((PyArrayObject *)values[1]); + __pyx_v_iscrowd = ((PyArrayObject *)values[2]); + __pyx_v_m = __Pyx_PyInt_As_siz(values[3]); if (unlikely((__pyx_v_m == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 199, __pyx_L3_error) + __pyx_v_n = __Pyx_PyInt_As_siz(values[4]); if (unlikely((__pyx_v_n == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 199, __pyx_L3_error) + __pyx_v__iou = ((PyArrayObject *)values[5]); + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 199, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._bbIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_5numpy_ndarray, 1, "dt", 0))) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gt), __pyx_ptype_5numpy_ndarray, 1, "gt", 0))) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_iscrowd), __pyx_ptype_5numpy_ndarray, 1, "iscrowd", 0))) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v__iou), __pyx_ptype_5numpy_ndarray, 1, "_iou", 0))) __PYX_ERR(0, 199, __pyx_L1_error) + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_iscrowd, __pyx_v_m, __pyx_v_n, __pyx_v__iou); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dt, PyArrayObject *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou) { + __Pyx_LocalBuf_ND __pyx_pybuffernd__iou; + __Pyx_Buffer __pyx_pybuffer__iou; + __Pyx_LocalBuf_ND __pyx_pybuffernd_dt; + __Pyx_Buffer __pyx_pybuffer_dt; + __Pyx_LocalBuf_ND __pyx_pybuffernd_gt; + __Pyx_Buffer __pyx_pybuffer_gt; + __Pyx_LocalBuf_ND __pyx_pybuffernd_iscrowd; + __Pyx_Buffer __pyx_pybuffer_iscrowd; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_bbIou", 0); + __pyx_pybuffer_dt.pybuffer.buf = NULL; + __pyx_pybuffer_dt.refcount = 0; + __pyx_pybuffernd_dt.data = NULL; + __pyx_pybuffernd_dt.rcbuffer = &__pyx_pybuffer_dt; + __pyx_pybuffer_gt.pybuffer.buf = NULL; + __pyx_pybuffer_gt.refcount = 0; + __pyx_pybuffernd_gt.data = NULL; + __pyx_pybuffernd_gt.rcbuffer = &__pyx_pybuffer_gt; + __pyx_pybuffer_iscrowd.pybuffer.buf = NULL; + __pyx_pybuffer_iscrowd.refcount = 0; + __pyx_pybuffernd_iscrowd.data = NULL; + __pyx_pybuffernd_iscrowd.rcbuffer = &__pyx_pybuffer_iscrowd; + __pyx_pybuffer__iou.pybuffer.buf = NULL; + __pyx_pybuffer__iou.refcount = 0; + __pyx_pybuffernd__iou.data = NULL; + __pyx_pybuffernd__iou.rcbuffer = &__pyx_pybuffer__iou; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_dt.rcbuffer->pybuffer, (PyObject*)__pyx_v_dt, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + } + __pyx_pybuffernd_dt.diminfo[0].strides = __pyx_pybuffernd_dt.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_dt.diminfo[0].shape = __pyx_pybuffernd_dt.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_dt.diminfo[1].strides = __pyx_pybuffernd_dt.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_dt.diminfo[1].shape = __pyx_pybuffernd_dt.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_gt.rcbuffer->pybuffer, (PyObject*)__pyx_v_gt, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + } + __pyx_pybuffernd_gt.diminfo[0].strides = __pyx_pybuffernd_gt.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_gt.diminfo[0].shape = __pyx_pybuffernd_gt.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_gt.diminfo[1].strides = __pyx_pybuffernd_gt.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_gt.diminfo[1].shape = __pyx_pybuffernd_gt.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_v_iscrowd, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + } + __pyx_pybuffernd_iscrowd.diminfo[0].strides = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_iscrowd.diminfo[0].shape = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.shape[0]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd__iou.rcbuffer->pybuffer, (PyObject*)__pyx_v__iou, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + } + __pyx_pybuffernd__iou.diminfo[0].strides = __pyx_pybuffernd__iou.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd__iou.diminfo[0].shape = __pyx_pybuffernd__iou.rcbuffer->pybuffer.shape[0]; + + /* "thirdparty/pycocotools/_mask.pyx":200 + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) # <<<<<<<<<<<<<< + * def _len(obj): + * cdef siz N = 0 + */ + bbIou(((BB)__pyx_v_dt->data), ((BB)__pyx_v_gt->data), __pyx_v_m, __pyx_v_n, ((byte *)__pyx_v_iscrowd->data), ((double *)__pyx_v__iou->data)); + + /* "thirdparty/pycocotools/_mask.pyx":199 + * 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): + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): # <<<<<<<<<<<<<< + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd__iou.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dt.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_gt.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._bbIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd__iou.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dt.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_gt.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":201 + * 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): + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): # <<<<<<<<<<<<<< + * cdef siz N = 0 + * if type(obj) == RLEs: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_7_len(PyObject *__pyx_self, PyObject *__pyx_v_obj); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_7_len = {"_len", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_7_len, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_7_len(PyObject *__pyx_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_len (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(__pyx_self, ((PyObject *)__pyx_v_obj)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj) { + siz __pyx_v_N; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + siz __pyx_t_3; + Py_ssize_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("_len", 0); + + /* "thirdparty/pycocotools/_mask.pyx":202 + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): + * cdef siz N = 0 # <<<<<<<<<<<<<< + * if type(obj) == RLEs: + * N = obj.n + */ + __pyx_v_N = 0; + + /* "thirdparty/pycocotools/_mask.pyx":203 + * def _len(obj): + * cdef siz N = 0 + * if type(obj) == RLEs: # <<<<<<<<<<<<<< + * N = obj.n + * elif len(obj)==0: + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 203, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":204 + * cdef siz N = 0 + * if type(obj) == RLEs: + * N = obj.n # <<<<<<<<<<<<<< + * elif len(obj)==0: + * pass + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_obj, __pyx_n_s_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_3 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 204, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_N = __pyx_t_3; + + /* "thirdparty/pycocotools/_mask.pyx":203 + * def _len(obj): + * cdef siz N = 0 + * if type(obj) == RLEs: # <<<<<<<<<<<<<< + * N = obj.n + * elif len(obj)==0: + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":205 + * if type(obj) == RLEs: + * N = obj.n + * elif len(obj)==0: # <<<<<<<<<<<<<< + * pass + * elif type(obj) == np.ndarray: + */ + __pyx_t_4 = PyObject_Length(__pyx_v_obj); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 205, __pyx_L1_error) + __pyx_t_2 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_2) { + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":207 + * elif len(obj)==0: + * pass + * elif type(obj) == np.ndarray: # <<<<<<<<<<<<<< + * N = obj.shape[0] + * return N + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 207, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 207, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":208 + * pass + * elif type(obj) == np.ndarray: + * N = obj.shape[0] # <<<<<<<<<<<<<< + * return N + * # convert iscrowd to numpy array + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_obj, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_3 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_N = __pyx_t_3; + + /* "thirdparty/pycocotools/_mask.pyx":207 + * elif len(obj)==0: + * pass + * elif type(obj) == np.ndarray: # <<<<<<<<<<<<<< + * N = obj.shape[0] + * return N + */ + } + __pyx_L3:; + + /* "thirdparty/pycocotools/_mask.pyx":209 + * elif type(obj) == np.ndarray: + * N = obj.shape[0] + * return N # <<<<<<<<<<<<<< + * # convert iscrowd to numpy array + * cdef np.ndarray[np.uint8_t, ndim=1] iscrowd = np.array(pyiscrowd, dtype=np.uint8) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_PyInt_From_siz(__pyx_v_N); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 209, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":201 + * 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): + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): # <<<<<<<<<<<<<< + * cdef siz N = 0 + * if type(obj) == RLEs: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._len", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":171 + * + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< + * def _preproc(objs): + * if len(objs) == 0: + */ + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dt, PyObject *__pyx_v_gt, PyObject *__pyx_v_pyiscrowd) { + PyObject *__pyx_v__preproc = 0; + PyObject *__pyx_v__rleIou = 0; + PyObject *__pyx_v__bbIou = 0; + PyObject *__pyx_v__len = 0; + PyArrayObject *__pyx_v_iscrowd = 0; + siz __pyx_v_m; + siz __pyx_v_n; + double *__pyx_v__iou; + npy_intp __pyx_v_shape[1]; + PyObject *__pyx_v__iouFun = NULL; + PyObject *__pyx_v_iou = NULL; + __Pyx_LocalBuf_ND __pyx_pybuffernd_iscrowd; + __Pyx_Buffer __pyx_pybuffer_iscrowd; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyArrayObject *__pyx_t_6 = NULL; + siz __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("iou", 0); + __Pyx_INCREF(__pyx_v_dt); + __Pyx_INCREF(__pyx_v_gt); + __pyx_pybuffer_iscrowd.pybuffer.buf = NULL; + __pyx_pybuffer_iscrowd.refcount = 0; + __pyx_pybuffernd_iscrowd.data = NULL; + __pyx_pybuffernd_iscrowd.rcbuffer = &__pyx_pybuffer_iscrowd; + + /* "thirdparty/pycocotools/_mask.pyx":172 + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): + * def _preproc(objs): # <<<<<<<<<<<<<< + * if len(objs) == 0: + * return objs + */ + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_1_preproc, 0, __pyx_n_s_iou_locals__preproc, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__preproc = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":197 + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + * return objs + * 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): # <<<<<<<<<<<<<< + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): + */ + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou, 0, __pyx_n_s_iou_locals__rleIou, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__rleIou = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":199 + * 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): + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): # <<<<<<<<<<<<<< + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): + */ + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou, 0, __pyx_n_s_iou_locals__bbIou, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 199, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__bbIou = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":201 + * 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): + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): # <<<<<<<<<<<<<< + * cdef siz N = 0 + * if type(obj) == RLEs: + */ + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_7_len, 0, __pyx_n_s_iou_locals__len, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__len = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":211 + * return N + * # convert iscrowd to numpy array + * cdef np.ndarray[np.uint8_t, ndim=1] iscrowd = np.array(pyiscrowd, dtype=np.uint8) # <<<<<<<<<<<<<< + * # simple type checking + * cdef siz m, n + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_pyiscrowd); + __Pyx_GIVEREF(__pyx_v_pyiscrowd); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_pyiscrowd); + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_uint8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 211, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { + __pyx_v_iscrowd = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.buf = NULL; + __PYX_ERR(0, 211, __pyx_L1_error) + } else {__pyx_pybuffernd_iscrowd.diminfo[0].strides = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_iscrowd.diminfo[0].shape = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.shape[0]; + } + } + __pyx_t_6 = 0; + __pyx_v_iscrowd = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":214 + * # simple type checking + * cdef siz m, n + * dt = _preproc(dt) # <<<<<<<<<<<<<< + * gt = _preproc(gt) + * m = _len(dt) + */ + __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(__pyx_v__preproc, __pyx_v_dt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 214, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_dt, __pyx_t_5); + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":215 + * cdef siz m, n + * dt = _preproc(dt) + * gt = _preproc(gt) # <<<<<<<<<<<<<< + * m = _len(dt) + * n = _len(gt) + */ + __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(__pyx_v__preproc, __pyx_v_gt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_gt, __pyx_t_5); + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":216 + * dt = _preproc(dt) + * gt = _preproc(gt) + * m = _len(dt) # <<<<<<<<<<<<<< + * n = _len(gt) + * if m == 0 or n == 0: + */ + __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(__pyx_v__len, __pyx_v_dt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 216, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_7 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 216, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_m = __pyx_t_7; + + /* "thirdparty/pycocotools/_mask.pyx":217 + * gt = _preproc(gt) + * m = _len(dt) + * n = _len(gt) # <<<<<<<<<<<<<< + * if m == 0 or n == 0: + * return [] + */ + __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(__pyx_v__len, __pyx_v_gt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_7 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_n = __pyx_t_7; + + /* "thirdparty/pycocotools/_mask.pyx":218 + * m = _len(dt) + * n = _len(gt) + * if m == 0 or n == 0: # <<<<<<<<<<<<<< + * return [] + * if not type(dt) == type(gt): + */ + __pyx_t_9 = ((__pyx_v_m == 0) != 0); + if (!__pyx_t_9) { + } else { + __pyx_t_8 = __pyx_t_9; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_9 = ((__pyx_v_n == 0) != 0); + __pyx_t_8 = __pyx_t_9; + __pyx_L4_bool_binop_done:; + if (__pyx_t_8) { + + /* "thirdparty/pycocotools/_mask.pyx":219 + * n = _len(gt) + * if m == 0 or n == 0: + * return [] # <<<<<<<<<<<<<< + * if not type(dt) == type(gt): + * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 219, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":218 + * m = _len(dt) + * n = _len(gt) + * if m == 0 or n == 0: # <<<<<<<<<<<<<< + * return [] + * if not type(dt) == type(gt): + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":220 + * if m == 0 or n == 0: + * return [] + * if not type(dt) == type(gt): # <<<<<<<<<<<<<< + * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') + * + */ + __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)Py_TYPE(__pyx_v_gt)), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 220, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 220, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_9 = ((!__pyx_t_8) != 0); + if (__pyx_t_9) { + + /* "thirdparty/pycocotools/_mask.pyx":221 + * return [] + * if not type(dt) == type(gt): + * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') # <<<<<<<<<<<<<< + * + * # define local variables + */ + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(0, 221, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":220 + * if m == 0 or n == 0: + * return [] + * if not type(dt) == type(gt): # <<<<<<<<<<<<<< + * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') + * + */ + } + + /* "thirdparty/pycocotools/_mask.pyx":224 + * + * # define local variables + * cdef double* _iou = 0 # <<<<<<<<<<<<<< + * cdef np.npy_intp shape[1] + * # check type and assign iou function + */ + __pyx_v__iou = ((double *)0); + + /* "thirdparty/pycocotools/_mask.pyx":227 + * cdef np.npy_intp shape[1] + * # check type and assign iou function + * if type(dt) == RLEs: # <<<<<<<<<<<<<< + * _iouFun = _rleIou + * elif type(dt) == np.ndarray: + */ + __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 227, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 227, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_9) { + + /* "thirdparty/pycocotools/_mask.pyx":228 + * # check type and assign iou function + * if type(dt) == RLEs: + * _iouFun = _rleIou # <<<<<<<<<<<<<< + * elif type(dt) == np.ndarray: + * _iouFun = _bbIou + */ + __Pyx_INCREF(__pyx_v__rleIou); + __pyx_v__iouFun = __pyx_v__rleIou; + + /* "thirdparty/pycocotools/_mask.pyx":227 + * cdef np.npy_intp shape[1] + * # check type and assign iou function + * if type(dt) == RLEs: # <<<<<<<<<<<<<< + * _iouFun = _rleIou + * elif type(dt) == np.ndarray: + */ + goto __pyx_L7; + } + + /* "thirdparty/pycocotools/_mask.pyx":229 + * if type(dt) == RLEs: + * _iouFun = _rleIou + * elif type(dt) == np.ndarray: # <<<<<<<<<<<<<< + * _iouFun = _bbIou + * else: + */ + __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 229, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 229, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_9) { + + /* "thirdparty/pycocotools/_mask.pyx":230 + * _iouFun = _rleIou + * elif type(dt) == np.ndarray: + * _iouFun = _bbIou # <<<<<<<<<<<<<< + * else: + * raise Exception('input data type not allowed.') + */ + __Pyx_INCREF(__pyx_v__bbIou); + __pyx_v__iouFun = __pyx_v__bbIou; + + /* "thirdparty/pycocotools/_mask.pyx":229 + * if type(dt) == RLEs: + * _iouFun = _rleIou + * elif type(dt) == np.ndarray: # <<<<<<<<<<<<<< + * _iouFun = _bbIou + * else: + */ + goto __pyx_L7; + } + + /* "thirdparty/pycocotools/_mask.pyx":232 + * _iouFun = _bbIou + * else: + * raise Exception('input data type not allowed.') # <<<<<<<<<<<<<< + * _iou = malloc(m*n* sizeof(double)) + * iou = np.zeros((m*n, ), dtype=np.double) + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(0, 232, __pyx_L1_error) + } + __pyx_L7:; + + /* "thirdparty/pycocotools/_mask.pyx":233 + * else: + * raise Exception('input data type not allowed.') + * _iou = malloc(m*n* sizeof(double)) # <<<<<<<<<<<<<< + * iou = np.zeros((m*n, ), dtype=np.double) + * shape[0] = m*n + */ + __pyx_v__iou = ((double *)malloc(((__pyx_v_m * __pyx_v_n) * (sizeof(double))))); + + /* "thirdparty/pycocotools/_mask.pyx":234 + * raise Exception('input data type not allowed.') + * _iou = malloc(m*n* sizeof(double)) + * iou = np.zeros((m*n, ), dtype=np.double) # <<<<<<<<<<<<<< + * shape[0] = m*n + * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyInt_From_siz((__pyx_v_m * __pyx_v_n)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_iou = __pyx_t_4; + __pyx_t_4 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":235 + * _iou = malloc(m*n* sizeof(double)) + * iou = np.zeros((m*n, ), dtype=np.double) + * shape[0] = m*n # <<<<<<<<<<<<<< + * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) + * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) + */ + (__pyx_v_shape[0]) = (((npy_intp)__pyx_v_m) * __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":236 + * iou = np.zeros((m*n, ), dtype=np.double) + * shape[0] = m*n + * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) # <<<<<<<<<<<<<< + * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) + * _iouFun(dt, gt, iscrowd, m, n, iou) + */ + __pyx_t_4 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_DOUBLE, __pyx_v__iou); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_iou, __pyx_t_4); + __pyx_t_4 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":237 + * shape[0] = m*n + * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) + * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) # <<<<<<<<<<<<<< + * _iouFun(dt, gt, iscrowd, m, n, iou) + * return iou.reshape((m,n), order='F') + */ + if (!(likely(((__pyx_v_iou) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_iou, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 237, __pyx_L1_error) + PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_iou), NPY_OWNDATA); + + /* "thirdparty/pycocotools/_mask.pyx":238 + * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) + * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) + * _iouFun(dt, gt, iscrowd, m, n, iou) # <<<<<<<<<<<<<< + * return iou.reshape((m,n), order='F') + * + */ + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_m); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v__iouFun); + __pyx_t_3 = __pyx_v__iouFun; __pyx_t_2 = NULL; + __pyx_t_10 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_10 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[7] = {__pyx_t_2, __pyx_v_dt, __pyx_v_gt, ((PyObject *)__pyx_v_iscrowd), __pyx_t_1, __pyx_t_5, __pyx_v_iou}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_10, 6+__pyx_t_10); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[7] = {__pyx_t_2, __pyx_v_dt, __pyx_v_gt, ((PyObject *)__pyx_v_iscrowd), __pyx_t_1, __pyx_t_5, __pyx_v_iou}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_10, 6+__pyx_t_10); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + { + __pyx_t_11 = PyTuple_New(6+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + if (__pyx_t_2) { + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_2); __pyx_t_2 = NULL; + } + __Pyx_INCREF(__pyx_v_dt); + __Pyx_GIVEREF(__pyx_v_dt); + PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_v_dt); + __Pyx_INCREF(__pyx_v_gt); + __Pyx_GIVEREF(__pyx_v_gt); + PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_v_gt); + __Pyx_INCREF(((PyObject *)__pyx_v_iscrowd)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_iscrowd)); + PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, ((PyObject *)__pyx_v_iscrowd)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_11, 3+__pyx_t_10, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_11, 4+__pyx_t_10, __pyx_t_5); + __Pyx_INCREF(__pyx_v_iou); + __Pyx_GIVEREF(__pyx_v_iou); + PyTuple_SET_ITEM(__pyx_t_11, 5+__pyx_t_10, __pyx_v_iou); + __pyx_t_1 = 0; + __pyx_t_5 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_11, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":239 + * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) + * _iouFun(dt, gt, iscrowd, m, n, iou) + * return iou.reshape((m,n), order='F') # <<<<<<<<<<<<<< + * + * def toBbox( rleObjs ): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_iou, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __Pyx_PyInt_From_siz(__pyx_v_m); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_11 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_11); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_11); + __pyx_t_3 = 0; + __pyx_t_11 = 0; + __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_11, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":171 + * + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< + * def _preproc(objs): + * if len(objs) == 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_11); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF(__pyx_v__preproc); + __Pyx_XDECREF(__pyx_v__rleIou); + __Pyx_XDECREF(__pyx_v__bbIou); + __Pyx_XDECREF(__pyx_v__len); + __Pyx_XDECREF((PyObject *)__pyx_v_iscrowd); + __Pyx_XDECREF(__pyx_v__iouFun); + __Pyx_XDECREF(__pyx_v_iou); + __Pyx_XDECREF(__pyx_v_dt); + __Pyx_XDECREF(__pyx_v_gt); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":241 + * return iou.reshape((m,n), order='F') + * + * def toBbox( rleObjs ): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef siz n = Rs.n + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_15toBbox(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_15toBbox = {"toBbox", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_15toBbox, METH_O, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_15toBbox(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("toBbox (wrapper)", 0); + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + siz __pyx_v_n; + BB __pyx_v__bb; + npy_intp __pyx_v_shape[1]; + PyObject *__pyx_v_bb = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + siz __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("toBbox", 0); + + /* "thirdparty/pycocotools/_mask.pyx":242 + * + * def toBbox( rleObjs ): + * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< + * cdef siz n = Rs.n + * cdef BB _bb = malloc(4*n* sizeof(double)) + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_3) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 242, __pyx_L1_error) + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":243 + * def toBbox( rleObjs ): + * cdef RLEs Rs = _frString(rleObjs) + * cdef siz n = Rs.n # <<<<<<<<<<<<<< + * cdef BB _bb = malloc(4*n* sizeof(double)) + * rleToBbox( Rs._R, _bb, n ) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_Rs), __pyx_n_s_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 243, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_n = __pyx_t_5; + + /* "thirdparty/pycocotools/_mask.pyx":244 + * cdef RLEs Rs = _frString(rleObjs) + * cdef siz n = Rs.n + * cdef BB _bb = malloc(4*n* sizeof(double)) # <<<<<<<<<<<<<< + * rleToBbox( Rs._R, _bb, n ) + * cdef np.npy_intp shape[1] + */ + __pyx_v__bb = ((BB)malloc(((4 * __pyx_v_n) * (sizeof(double))))); + + /* "thirdparty/pycocotools/_mask.pyx":245 + * cdef siz n = Rs.n + * cdef BB _bb = malloc(4*n* sizeof(double)) + * rleToBbox( Rs._R, _bb, n ) # <<<<<<<<<<<<<< + * cdef np.npy_intp shape[1] + * shape[0] = 4*n + */ + rleToBbox(((RLE const *)__pyx_v_Rs->_R), __pyx_v__bb, __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":247 + * rleToBbox( Rs._R, _bb, n ) + * cdef np.npy_intp shape[1] + * shape[0] = 4*n # <<<<<<<<<<<<<< + * bb = np.array((1,4*n), dtype=np.double) + * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) + */ + (__pyx_v_shape[0]) = (((npy_intp)4) * __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":248 + * cdef np.npy_intp shape[1] + * shape[0] = 4*n + * bb = np.array((1,4*n), dtype=np.double) # <<<<<<<<<<<<<< + * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) + * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_siz((4 * __pyx_v_n)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_int_1); + __Pyx_GIVEREF(__pyx_int_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_int_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_double); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_bb = __pyx_t_6; + __pyx_t_6 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":249 + * shape[0] = 4*n + * bb = np.array((1,4*n), dtype=np.double) + * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) # <<<<<<<<<<<<<< + * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) + * return bb + */ + __pyx_t_4 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_DOUBLE, __pyx_v__bb); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_reshape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); + __Pyx_INCREF(__pyx_int_4); + __Pyx_GIVEREF(__pyx_int_4); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_4); + __pyx_t_4 = 0; + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_4) { + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_6); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_2}; + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_2}; + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + { + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_bb, __pyx_t_6); + __pyx_t_6 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":250 + * bb = np.array((1,4*n), dtype=np.double) + * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) + * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) # <<<<<<<<<<<<<< + * return bb + * + */ + if (!(likely(((__pyx_v_bb) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_bb, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 250, __pyx_L1_error) + PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_bb), NPY_OWNDATA); + + /* "thirdparty/pycocotools/_mask.pyx":251 + * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) + * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) + * return bb # <<<<<<<<<<<<<< + * + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_bb); + __pyx_r = __pyx_v_bb; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":241 + * return iou.reshape((m,n), order='F') + * + * def toBbox( rleObjs ): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef siz n = Rs.n + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.toBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF(__pyx_v_bb); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":253 + * return bb + * + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef siz n = bb.shape[0] + * Rs = RLEs(n) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_17frBbox = {"frBbox", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_bb = 0; + siz __pyx_v_h; + siz __pyx_v_w; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("frBbox (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bb,&__pyx_n_s_h,&__pyx_n_s_w,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bb)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, 1); __PYX_ERR(0, 253, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, 2); __PYX_ERR(0, 253, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frBbox") < 0)) __PYX_ERR(0, 253, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_bb = ((PyArrayObject *)values[0]); + __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 253, __pyx_L3_error) + __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 253, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 253, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bb), __pyx_ptype_5numpy_ndarray, 1, "bb", 0))) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(__pyx_self, __pyx_v_bb, __pyx_v_h, __pyx_v_w); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_bb, siz __pyx_v_h, siz __pyx_v_w) { + siz __pyx_v_n; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + PyObject *__pyx_v_objs = NULL; + __Pyx_LocalBuf_ND __pyx_pybuffernd_bb; + __Pyx_Buffer __pyx_pybuffer_bb; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("frBbox", 0); + __pyx_pybuffer_bb.pybuffer.buf = NULL; + __pyx_pybuffer_bb.refcount = 0; + __pyx_pybuffernd_bb.data = NULL; + __pyx_pybuffernd_bb.rcbuffer = &__pyx_pybuffer_bb; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bb.rcbuffer->pybuffer, (PyObject*)__pyx_v_bb, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 253, __pyx_L1_error) + } + __pyx_pybuffernd_bb.diminfo[0].strides = __pyx_pybuffernd_bb.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bb.diminfo[0].shape = __pyx_pybuffernd_bb.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bb.diminfo[1].strides = __pyx_pybuffernd_bb.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bb.diminfo[1].shape = __pyx_pybuffernd_bb.rcbuffer->pybuffer.shape[1]; + + /* "thirdparty/pycocotools/_mask.pyx":254 + * + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): + * cdef siz n = bb.shape[0] # <<<<<<<<<<<<<< + * Rs = RLEs(n) + * rleFrBbox( Rs._R, bb.data, h, w, n ) + */ + __pyx_v_n = (__pyx_v_bb->dimensions[0]); + + /* "thirdparty/pycocotools/_mask.pyx":255 + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): + * cdef siz n = bb.shape[0] + * Rs = RLEs(n) # <<<<<<<<<<<<<< + * rleFrBbox( Rs._R, bb.data, h, w, n ) + * objs = _toString(Rs) + */ + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":256 + * cdef siz n = bb.shape[0] + * Rs = RLEs(n) + * rleFrBbox( Rs._R, bb.data, h, w, n ) # <<<<<<<<<<<<<< + * objs = _toString(Rs) + * return objs + */ + rleFrBbox(((RLE *)__pyx_v_Rs->_R), ((BB const )__pyx_v_bb->data), __pyx_v_h, __pyx_v_w, __pyx_v_n); + + /* "thirdparty/pycocotools/_mask.pyx":257 + * Rs = RLEs(n) + * rleFrBbox( Rs._R, bb.data, h, w, n ) + * objs = _toString(Rs) # <<<<<<<<<<<<<< + * return objs + * + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 257, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_3) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 257, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_objs = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":258 + * rleFrBbox( Rs._R, bb.data, h, w, n ) + * objs = _toString(Rs) + * return objs # <<<<<<<<<<<<<< + * + * def frPoly( poly, siz h, siz w ): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":253 + * return bb + * + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef siz n = bb.shape[0] + * Rs = RLEs(n) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bb.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bb.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":260 + * return objs + * + * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.double_t, ndim=1] np_poly + * n = len(poly) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_19frPoly = {"frPoly", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_poly = 0; + siz __pyx_v_h; + siz __pyx_v_w; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("frPoly (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_poly,&__pyx_n_s_h,&__pyx_n_s_w,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_poly)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, 1); __PYX_ERR(0, 260, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, 2); __PYX_ERR(0, 260, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frPoly") < 0)) __PYX_ERR(0, 260, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_poly = values[0]; + __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 260, __pyx_L3_error) + __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 260, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 260, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPoly", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(__pyx_self, __pyx_v_poly, __pyx_v_h, __pyx_v_w); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_poly, siz __pyx_v_h, siz __pyx_v_w) { + PyArrayObject *__pyx_v_np_poly = 0; + Py_ssize_t __pyx_v_n; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + PyObject *__pyx_v_i = NULL; + PyObject *__pyx_v_p = NULL; + PyObject *__pyx_v_objs = NULL; + __Pyx_LocalBuf_ND __pyx_pybuffernd_np_poly; + __Pyx_Buffer __pyx_pybuffer_np_poly; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyArrayObject *__pyx_t_10 = NULL; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __Pyx_RefNannySetupContext("frPoly", 0); + __pyx_pybuffer_np_poly.pybuffer.buf = NULL; + __pyx_pybuffer_np_poly.refcount = 0; + __pyx_pybuffernd_np_poly.data = NULL; + __pyx_pybuffernd_np_poly.rcbuffer = &__pyx_pybuffer_np_poly; + + /* "thirdparty/pycocotools/_mask.pyx":262 + * def frPoly( poly, siz h, siz w ): + * cdef np.ndarray[np.double_t, ndim=1] np_poly + * n = len(poly) # <<<<<<<<<<<<<< + * Rs = RLEs(n) + * for i, p in enumerate(poly): + */ + __pyx_t_1 = PyObject_Length(__pyx_v_poly); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 262, __pyx_L1_error) + __pyx_v_n = __pyx_t_1; + + /* "thirdparty/pycocotools/_mask.pyx":263 + * cdef np.ndarray[np.double_t, ndim=1] np_poly + * n = len(poly) + * Rs = RLEs(n) # <<<<<<<<<<<<<< + * for i, p in enumerate(poly): + * np_poly = np.array(p, dtype=np.double, order='F') + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":264 + * n = len(poly) + * Rs = RLEs(n) + * for i, p in enumerate(poly): # <<<<<<<<<<<<<< + * np_poly = np.array(p, dtype=np.double, order='F') + * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) + */ + __Pyx_INCREF(__pyx_int_0); + __pyx_t_2 = __pyx_int_0; + if (likely(PyList_CheckExact(__pyx_v_poly)) || PyTuple_CheckExact(__pyx_v_poly)) { + __pyx_t_3 = __pyx_v_poly; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_poly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 264, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 264, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 264, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 264, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 264, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 264, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_3); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 264, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_p, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_2); + __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 264, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); + __pyx_t_2 = __pyx_t_5; + __pyx_t_5 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":265 + * Rs = RLEs(n) + * for i, p in enumerate(poly): + * np_poly = np.array(p, dtype=np.double, order='F') # <<<<<<<<<<<<<< + * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) + * objs = _toString(Rs) + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_p); + __Pyx_GIVEREF(__pyx_v_p); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_p); + __pyx_t_7 = PyDict_New(); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_5, __pyx_t_7); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 265, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_10 = ((PyArrayObject *)__pyx_t_9); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_np_poly.rcbuffer->pybuffer); + __pyx_t_11 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_np_poly.rcbuffer->pybuffer, (PyObject*)__pyx_t_10, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_11 < 0)) { + PyErr_Fetch(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14); + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_np_poly.rcbuffer->pybuffer, (PyObject*)__pyx_v_np_poly, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { + Py_XDECREF(__pyx_t_12); Py_XDECREF(__pyx_t_13); Py_XDECREF(__pyx_t_14); + __Pyx_RaiseBufferFallbackError(); + } else { + PyErr_Restore(__pyx_t_12, __pyx_t_13, __pyx_t_14); + } + } + __pyx_pybuffernd_np_poly.diminfo[0].strides = __pyx_pybuffernd_np_poly.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_np_poly.diminfo[0].shape = __pyx_pybuffernd_np_poly.rcbuffer->pybuffer.shape[0]; + if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 265, __pyx_L1_error) + } + __pyx_t_10 = 0; + __Pyx_XDECREF_SET(__pyx_v_np_poly, ((PyArrayObject *)__pyx_t_9)); + __pyx_t_9 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":266 + * for i, p in enumerate(poly): + * np_poly = np.array(p, dtype=np.double, order='F') + * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) # <<<<<<<<<<<<<< + * objs = _toString(Rs) + * return objs + */ + __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 266, __pyx_L1_error) + __pyx_t_16 = PyObject_Length(__pyx_v_p); if (unlikely(__pyx_t_16 == -1)) __PYX_ERR(0, 266, __pyx_L1_error) + rleFrPoly(((RLE *)(&(__pyx_v_Rs->_R[__pyx_t_15]))), ((double const *)__pyx_v_np_poly->data), ((siz)__Pyx_div_Py_ssize_t(__pyx_t_16, 2)), __pyx_v_h, __pyx_v_w); + + /* "thirdparty/pycocotools/_mask.pyx":264 + * n = len(poly) + * Rs = RLEs(n) + * for i, p in enumerate(poly): # <<<<<<<<<<<<<< + * np_poly = np.array(p, dtype=np.double, order='F') + * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":267 + * np_poly = np.array(p, dtype=np.double, order='F') + * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) + * objs = _toString(Rs) # <<<<<<<<<<<<<< + * return objs + * + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_9)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_9); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + if (!__pyx_t_9) { + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_9, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_9, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else + #endif + { + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_9); __pyx_t_9 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_objs = __pyx_t_2; + __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":268 + * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) + * objs = _toString(Rs) + * return objs # <<<<<<<<<<<<<< + * + * def frUncompressedRLE(ucRles, siz h, siz w): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":260 + * return objs + * + * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.double_t, ndim=1] np_poly + * n = len(poly) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_np_poly.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPoly", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_np_poly.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_np_poly); + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XDECREF(__pyx_v_i); + __Pyx_XDECREF(__pyx_v_p); + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":270 + * return objs + * + * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.uint32_t, ndim=1] cnts + * cdef RLE R + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE = {"frUncompressedRLE", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_ucRles = 0; + CYTHON_UNUSED siz __pyx_v_h; + CYTHON_UNUSED siz __pyx_v_w; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("frUncompressedRLE (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_ucRles,&__pyx_n_s_h,&__pyx_n_s_w,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ucRles)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, 1); __PYX_ERR(0, 270, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, 2); __PYX_ERR(0, 270, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frUncompressedRLE") < 0)) __PYX_ERR(0, 270, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_ucRles = values[0]; + __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error) + __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 270, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frUncompressedRLE", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE(__pyx_self, __pyx_v_ucRles, __pyx_v_h, __pyx_v_w); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_ucRles, CYTHON_UNUSED siz __pyx_v_h, CYTHON_UNUSED siz __pyx_v_w) { + PyArrayObject *__pyx_v_cnts = 0; + RLE __pyx_v_R; + uint *__pyx_v_data; + Py_ssize_t __pyx_v_n; + PyObject *__pyx_v_objs = NULL; + Py_ssize_t __pyx_v_i; + struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + Py_ssize_t __pyx_v_j; + __Pyx_LocalBuf_ND __pyx_pybuffernd_cnts; + __Pyx_Buffer __pyx_pybuffer_cnts; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyArrayObject *__pyx_t_8 = NULL; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + RLE __pyx_t_16; + siz __pyx_t_17; + int __pyx_t_18; + __Pyx_RefNannySetupContext("frUncompressedRLE", 0); + __pyx_pybuffer_cnts.pybuffer.buf = NULL; + __pyx_pybuffer_cnts.refcount = 0; + __pyx_pybuffernd_cnts.data = NULL; + __pyx_pybuffernd_cnts.rcbuffer = &__pyx_pybuffer_cnts; + + /* "thirdparty/pycocotools/_mask.pyx":274 + * cdef RLE R + * cdef uint *data + * n = len(ucRles) # <<<<<<<<<<<<<< + * objs = [] + * for i in range(n): + */ + __pyx_t_1 = PyObject_Length(__pyx_v_ucRles); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 274, __pyx_L1_error) + __pyx_v_n = __pyx_t_1; + + /* "thirdparty/pycocotools/_mask.pyx":275 + * cdef uint *data + * n = len(ucRles) + * objs = [] # <<<<<<<<<<<<<< + * for i in range(n): + * Rs = RLEs(1) + */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_objs = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":276 + * n = len(ucRles) + * objs = [] + * for i in range(n): # <<<<<<<<<<<<<< + * Rs = RLEs(1) + * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) + */ + __pyx_t_1 = __pyx_v_n; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_1; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "thirdparty/pycocotools/_mask.pyx":277 + * objs = [] + * for i in range(n): + * Rs = RLEs(1) # <<<<<<<<<<<<<< + * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) + * # time for malloc can be saved here but it's fine + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_Rs, ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_2)); + __pyx_t_2 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":278 + * for i in range(n): + * Rs = RLEs(1) + * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) # <<<<<<<<<<<<<< + * # time for malloc can be saved here but it's fine + * data = malloc(len(cnts)* sizeof(uint)) + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_counts); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_uint32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_8 = ((PyArrayObject *)__pyx_t_7); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cnts.rcbuffer->pybuffer); + __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cnts.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_9 < 0)) { + PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_cnts.rcbuffer->pybuffer, (PyObject*)__pyx_v_cnts, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { + Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12); + __Pyx_RaiseBufferFallbackError(); + } else { + PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12); + } + } + __pyx_pybuffernd_cnts.diminfo[0].strides = __pyx_pybuffernd_cnts.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cnts.diminfo[0].shape = __pyx_pybuffernd_cnts.rcbuffer->pybuffer.shape[0]; + if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 278, __pyx_L1_error) + } + __pyx_t_8 = 0; + __Pyx_XDECREF_SET(__pyx_v_cnts, ((PyArrayObject *)__pyx_t_7)); + __pyx_t_7 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":280 + * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) + * # time for malloc can be saved here but it's fine + * data = malloc(len(cnts)* sizeof(uint)) # <<<<<<<<<<<<<< + * for j in range(len(cnts)): + * data[j] = cnts[j] + */ + __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 280, __pyx_L1_error) + __pyx_v_data = ((uint *)malloc((__pyx_t_13 * (sizeof(unsigned int))))); + + /* "thirdparty/pycocotools/_mask.pyx":281 + * # time for malloc can be saved here but it's fine + * data = malloc(len(cnts)* sizeof(uint)) + * for j in range(len(cnts)): # <<<<<<<<<<<<<< + * data[j] = cnts[j] + * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) + */ + __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 281, __pyx_L1_error) + for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { + __pyx_v_j = __pyx_t_14; + + /* "thirdparty/pycocotools/_mask.pyx":282 + * data = malloc(len(cnts)* sizeof(uint)) + * for j in range(len(cnts)): + * data[j] = cnts[j] # <<<<<<<<<<<<<< + * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) + * Rs._R[0] = R + */ + __pyx_t_15 = __pyx_v_j; + __pyx_t_9 = -1; + if (__pyx_t_15 < 0) { + __pyx_t_15 += __pyx_pybuffernd_cnts.diminfo[0].shape; + if (unlikely(__pyx_t_15 < 0)) __pyx_t_9 = 0; + } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_cnts.diminfo[0].shape)) __pyx_t_9 = 0; + if (unlikely(__pyx_t_9 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_9); + __PYX_ERR(0, 282, __pyx_L1_error) + } + (__pyx_v_data[__pyx_v_j]) = ((uint)(*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint32_t *, __pyx_pybuffernd_cnts.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_cnts.diminfo[0].strides))); + } + + /* "thirdparty/pycocotools/_mask.pyx":283 + * for j in range(len(cnts)): + * data[j] = cnts[j] + * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) # <<<<<<<<<<<<<< + * Rs._R[0] = R + * objs.append(_toString(Rs)[0]) + */ + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = PyObject_GetItem(__pyx_t_7, __pyx_n_s_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_17 = __Pyx_PyInt_As_siz(__pyx_t_7); if (unlikely((__pyx_t_17 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_16.h = __pyx_t_17; + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = PyObject_GetItem(__pyx_t_7, __pyx_n_s_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_17 = __Pyx_PyInt_As_siz(__pyx_t_7); if (unlikely((__pyx_t_17 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 283, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_16.w = __pyx_t_17; + __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_16.m = __pyx_t_13; + __pyx_t_16.cnts = ((uint *)__pyx_v_data); + __pyx_v_R = __pyx_t_16; + + /* "thirdparty/pycocotools/_mask.pyx":284 + * data[j] = cnts[j] + * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) + * Rs._R[0] = R # <<<<<<<<<<<<<< + * objs.append(_toString(Rs)[0]) + * return objs + */ + (__pyx_v_Rs->_R[0]) = __pyx_v_R; + + /* "thirdparty/pycocotools/_mask.pyx":285 + * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) + * Rs._R[0] = R + * objs.append(_toString(Rs)[0]) # <<<<<<<<<<<<<< + * return objs + * + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + } + } + if (!__pyx_t_2) { + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, ((PyObject *)__pyx_v_Rs)}; + __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_objs, __pyx_t_5); if (unlikely(__pyx_t_18 == -1)) __PYX_ERR(0, 285, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + + /* "thirdparty/pycocotools/_mask.pyx":286 + * Rs._R[0] = R + * objs.append(_toString(Rs)[0]) + * return objs # <<<<<<<<<<<<<< + * + * def frPyObjects(pyobj, h, w): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":270 + * return objs + * + * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.uint32_t, ndim=1] cnts + * cdef RLE R + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cnts.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frUncompressedRLE", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cnts.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_cnts); + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XDECREF((PyObject *)__pyx_v_Rs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "thirdparty/pycocotools/_mask.pyx":288 + * return objs + * + * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_23frPyObjects = {"frPyObjects", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_pyobj = 0; + PyObject *__pyx_v_h = 0; + PyObject *__pyx_v_w = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("frPyObjects (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyobj,&__pyx_n_s_h,&__pyx_n_s_w,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_pyobj)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, 1); __PYX_ERR(0, 288, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, 2); __PYX_ERR(0, 288, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frPyObjects") < 0)) __PYX_ERR(0, 288, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_pyobj = values[0]; + __pyx_v_h = values[1]; + __pyx_v_w = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 288, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPyObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(__pyx_self, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pyobj, PyObject *__pyx_v_h, PyObject *__pyx_v_w) { + PyObject *__pyx_v_objs = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + __Pyx_RefNannySetupContext("frPyObjects", 0); + + /* "thirdparty/pycocotools/_mask.pyx":290 + * def frPyObjects(pyobj, h, w): + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: # <<<<<<<<<<<<<< + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) == 4: + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 290, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 290, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":291 + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: + * objs = frBbox(pyobj, h, w) # <<<<<<<<<<<<<< + * elif type(pyobj) == list and len(pyobj[0]) == 4: + * objs = frBbox(pyobj, h, w) + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; + } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_objs = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":290 + * def frPyObjects(pyobj, h, w): + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: # <<<<<<<<<<<<<< + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) == 4: + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":292 + * if type(pyobj) == np.ndarray: + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) == 4: # <<<<<<<<<<<<<< + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) > 4: + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 292, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_7 = ((__pyx_t_8 == 4) != 0); + __pyx_t_2 = __pyx_t_7; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":293 + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) == 4: + * objs = frBbox(pyobj, h, w) # <<<<<<<<<<<<<< + * elif type(pyobj) == list and len(pyobj[0]) > 4: + * objs = frPoly(pyobj, h, w) + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (__pyx_t_6) { + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_objs = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":292 + * if type(pyobj) == np.ndarray: + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) == 4: # <<<<<<<<<<<<<< + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) > 4: + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":294 + * elif type(pyobj) == list and len(pyobj[0]) == 4: + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) > 4: # <<<<<<<<<<<<<< + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 294, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 294, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_7 = ((__pyx_t_8 > 4) != 0); + __pyx_t_2 = __pyx_t_7; + __pyx_L6_bool_binop_done:; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":295 + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) > 4: + * objs = frPoly(pyobj, h, w) # <<<<<<<<<<<<<< + * elif type(pyobj) == list and type(pyobj[0]) == dict \ + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frPoly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; + } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_objs = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":294 + * elif type(pyobj) == list and len(pyobj[0]) == 4: + * objs = frBbox(pyobj, h, w) + * elif type(pyobj) == list and len(pyobj[0]) > 4: # <<<<<<<<<<<<<< + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":296 + * elif type(pyobj) == list and len(pyobj[0]) > 4: + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: + * objs = frUncompressedRLE(pyobj, h, w) + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L8_bool_binop_done; + } + + /* "thirdparty/pycocotools/_mask.pyx":297 + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: # <<<<<<<<<<<<<< + * objs = frUncompressedRLE(pyobj, h, w) + * # encode rle from single python object + */ + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + + /* "thirdparty/pycocotools/_mask.pyx":296 + * elif type(pyobj) == list and len(pyobj[0]) > 4: + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: + * objs = frUncompressedRLE(pyobj, h, w) + */ + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_t_1)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L8_bool_binop_done; + } + + /* "thirdparty/pycocotools/_mask.pyx":297 + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: # <<<<<<<<<<<<<< + * objs = frUncompressedRLE(pyobj, h, w) + * # encode rle from single python object + */ + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_counts, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 297, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_9 = (__pyx_t_7 != 0); + if (__pyx_t_9) { + } else { + __pyx_t_2 = __pyx_t_9; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_size, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 297, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_7 = (__pyx_t_9 != 0); + __pyx_t_2 = __pyx_t_7; + __pyx_L8_bool_binop_done:; + + /* "thirdparty/pycocotools/_mask.pyx":296 + * elif type(pyobj) == list and len(pyobj[0]) > 4: + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: + * objs = frUncompressedRLE(pyobj, h, w) + */ + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":298 + * elif type(pyobj) == list and type(pyobj[0]) == dict \ + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: + * objs = frUncompressedRLE(pyobj, h, w) # <<<<<<<<<<<<<< + * # encode rle from single python object + * elif type(pyobj) == list and len(pyobj) == 4: + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frUncompressedRLE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + { + __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (__pyx_t_6) { + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_objs = __pyx_t_3; + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":296 + * elif type(pyobj) == list and len(pyobj[0]) > 4: + * objs = frPoly(pyobj, h, w) + * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< + * and 'counts' in pyobj[0] and 'size' in pyobj[0]: + * objs = frUncompressedRLE(pyobj, h, w) + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":300 + * objs = frUncompressedRLE(pyobj, h, w) + * # encode rle from single python object + * elif type(pyobj) == list and len(pyobj) == 4: # <<<<<<<<<<<<<< + * objs = frBbox([pyobj], h, w)[0] + * elif type(pyobj) == list and len(pyobj) > 4: + */ + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L12_bool_binop_done; + } + __pyx_t_8 = PyObject_Length(__pyx_v_pyobj); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 300, __pyx_L1_error) + __pyx_t_7 = ((__pyx_t_8 == 4) != 0); + __pyx_t_2 = __pyx_t_7; + __pyx_L12_bool_binop_done:; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":301 + * # encode rle from single python object + * elif type(pyobj) == list and len(pyobj) == 4: + * objs = frBbox([pyobj], h, w)[0] # <<<<<<<<<<<<<< + * elif type(pyobj) == list and len(pyobj) > 4: + * objs = frPoly([pyobj], h, w)[0] + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_pyobj); + __pyx_t_6 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_t_4, __pyx_v_h, __pyx_v_w}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_t_4, __pyx_v_h, __pyx_v_w}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_10 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + if (__pyx_t_6) { + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6); __pyx_t_6 = NULL; + } + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_5, __pyx_t_4); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_objs = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":300 + * objs = frUncompressedRLE(pyobj, h, w) + * # encode rle from single python object + * elif type(pyobj) == list and len(pyobj) == 4: # <<<<<<<<<<<<<< + * objs = frBbox([pyobj], h, w)[0] + * elif type(pyobj) == list and len(pyobj) > 4: + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":302 + * elif type(pyobj) == list and len(pyobj) == 4: + * objs = frBbox([pyobj], h, w)[0] + * elif type(pyobj) == list and len(pyobj) > 4: # <<<<<<<<<<<<<< + * objs = frPoly([pyobj], h, w)[0] + * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: + */ + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 302, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 302, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_8 = PyObject_Length(__pyx_v_pyobj); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 302, __pyx_L1_error) + __pyx_t_7 = ((__pyx_t_8 > 4) != 0); + __pyx_t_2 = __pyx_t_7; + __pyx_L14_bool_binop_done:; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":303 + * objs = frBbox([pyobj], h, w)[0] + * elif type(pyobj) == list and len(pyobj) > 4: + * objs = frPoly([pyobj], h, w)[0] # <<<<<<<<<<<<<< + * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: + * objs = frUncompressedRLE([pyobj], h, w)[0] + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frPoly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyList_SET_ITEM(__pyx_t_10, 0, __pyx_v_pyobj); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_t_10, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_t_10, __pyx_v_h, __pyx_v_w}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; + } + __Pyx_GIVEREF(__pyx_t_10); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_t_10); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_10 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 303, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_objs = __pyx_t_3; + __pyx_t_3 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":302 + * elif type(pyobj) == list and len(pyobj) == 4: + * objs = frBbox([pyobj], h, w)[0] + * elif type(pyobj) == list and len(pyobj) > 4: # <<<<<<<<<<<<<< + * objs = frPoly([pyobj], h, w)[0] + * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":304 + * elif type(pyobj) == list and len(pyobj) > 4: + * objs = frPoly([pyobj], h, w)[0] + * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: # <<<<<<<<<<<<<< + * objs = frUncompressedRLE([pyobj], h, w)[0] + * else: + */ + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 304, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_7) { + } else { + __pyx_t_2 = __pyx_t_7; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_counts, __pyx_v_pyobj, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_9 = (__pyx_t_7 != 0); + if (__pyx_t_9) { + } else { + __pyx_t_2 = __pyx_t_9; + goto __pyx_L16_bool_binop_done; + } + __pyx_t_9 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_size, __pyx_v_pyobj, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_7 = (__pyx_t_9 != 0); + __pyx_t_2 = __pyx_t_7; + __pyx_L16_bool_binop_done:; + if (__pyx_t_2) { + + /* "thirdparty/pycocotools/_mask.pyx":305 + * objs = frPoly([pyobj], h, w)[0] + * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: + * objs = frUncompressedRLE([pyobj], h, w)[0] # <<<<<<<<<<<<<< + * else: + * raise Exception('input type is not supported.') + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frUncompressedRLE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyList_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyList_SET_ITEM(__pyx_t_6, 0, __pyx_v_pyobj); + __pyx_t_10 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_t_6, __pyx_v_h, __pyx_v_w}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_t_6, __pyx_v_h, __pyx_v_w}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (__pyx_t_10) { + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10); __pyx_t_10 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_t_6); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 305, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_objs = __pyx_t_1; + __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":304 + * elif type(pyobj) == list and len(pyobj) > 4: + * objs = frPoly([pyobj], h, w)[0] + * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: # <<<<<<<<<<<<<< + * objs = frUncompressedRLE([pyobj], h, w)[0] + * else: + */ + goto __pyx_L3; + } + + /* "thirdparty/pycocotools/_mask.pyx":307 + * objs = frUncompressedRLE([pyobj], h, w)[0] + * else: + * raise Exception('input type is not supported.') # <<<<<<<<<<<<<< + * return objs + */ + /*else*/ { + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 307, __pyx_L1_error) + } + __pyx_L3:; + + /* "thirdparty/pycocotools/_mask.pyx":308 + * else: + * raise Exception('input type is not supported.') + * return objs # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_objs); + __pyx_r = __pyx_v_objs; + goto __pyx_L0; + + /* "thirdparty/pycocotools/_mask.pyx":288 + * return objs + * + * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPyObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_objs); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_copy_shape; + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_v_hasfields; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + char *__pyx_t_7; + __Pyx_RefNannySetupContext("__getbuffer__", 0); + if (__pyx_v_info != NULL) { + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203 + * # of flags + * + * if info == NULL: return # <<<<<<<<<<<<<< + * + * cdef int copy_shape, i, ndim + */ + __pyx_t_1 = ((__pyx_v_info == NULL) != 0); + if (__pyx_t_1) { + __pyx_r = 0; + goto __pyx_L0; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206 + * + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":207 + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":212 + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * copy_shape = 1 # <<<<<<<<<<<<<< + * else: + * copy_shape = 0 + */ + __pyx_v_copy_shape = 1; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + goto __pyx_L4; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214 + * copy_shape = 1 + * else: + * copy_shape = 0 # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + /*else*/ { + __pyx_v_copy_shape = 0; + } + __pyx_L4:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L6_bool_binop_done; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L6_bool_binop_done:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 218, __pyx_L1_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L9_bool_binop_done; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L9_bool_binop_done:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 222, __pyx_L1_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":224 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if copy_shape: + */ + __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":225 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if copy_shape: + * # Allocate new buffer for strides and shape info. + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + __pyx_t_1 = (__pyx_v_copy_shape != 0); + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230 + * # This is allocated as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_4 = __pyx_v_ndim; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + goto __pyx_L11; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + /*else*/ { + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); + } + __pyx_L11:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":238 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":242 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef int offset + */ + __pyx_v_f = NULL; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":243 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef int offset + * + */ + __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":246 + * cdef int offset + * + * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< + * + * if not hasfields and not copy_shape: + */ + __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":248 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L15_bool_binop_done:; + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":250 + * if not hasfields and not copy_shape: + * # do not call releasebuffer + * info.obj = None # <<<<<<<<<<<<<< + * else: + * # need to call releasebuffer + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = Py_None; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":248 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + goto __pyx_L14; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":253 + * else: + * # need to call releasebuffer + * info.obj = self # <<<<<<<<<<<<<< + * + * if not hasfields: + */ + /*else*/ { + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + } + __pyx_L14:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0); + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256 + * + * if not hasfields: + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + */ + __pyx_t_4 = __pyx_v_descr->type_num; + __pyx_v_t = __pyx_t_4; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); + if (!__pyx_t_2) { + goto __pyx_L20_next_or; + } else { + } + __pyx_t_2 = (__pyx_v_little_endian != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L19_bool_binop_done; + } + __pyx_L20_next_or:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258 + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L19_bool_binop_done:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 259, __pyx_L1_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260 + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + switch (__pyx_v_t) { + case NPY_BYTE: + __pyx_v_f = ((char *)"b"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + case NPY_UBYTE: + __pyx_v_f = ((char *)"B"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + case NPY_SHORT: + __pyx_v_f = ((char *)"h"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + case NPY_USHORT: + __pyx_v_f = ((char *)"H"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + case NPY_INT: + __pyx_v_f = ((char *)"i"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + case NPY_UINT: + __pyx_v_f = ((char *)"I"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + case NPY_LONG: + __pyx_v_f = ((char *)"l"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + case NPY_ULONG: + __pyx_v_f = ((char *)"L"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + case NPY_LONGLONG: + __pyx_v_f = ((char *)"q"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + case NPY_ULONGLONG: + __pyx_v_f = ((char *)"Q"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + case NPY_FLOAT: + __pyx_v_f = ((char *)"f"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + case NPY_DOUBLE: + __pyx_v_f = ((char *)"d"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + case NPY_LONGDOUBLE: + __pyx_v_f = ((char *)"g"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + case NPY_CFLOAT: + __pyx_v_f = ((char *)"Zf"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + case NPY_CDOUBLE: + __pyx_v_f = ((char *)"Zd"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":275 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + case NPY_CLONGDOUBLE: + __pyx_v_f = ((char *)"Zg"); + break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + case NPY_OBJECT: + __pyx_v_f = ((char *)"O"); + break; + default: + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":278 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 278, __pyx_L1_error) + break; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":279 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":282 + * return + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + */ + /*else*/ { + __pyx_v_info->format = ((char *)malloc(0xFF)); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283 + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":284 + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":285 + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< + * info.format + _buffer_format_string_len, + * &offset) + */ + __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) __PYX_ERR(1, 285, __pyx_L1_error) + __pyx_v_f = __pyx_t_7; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":288 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = '\x00'; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(Py_None); + __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":290 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + +/* Python wrapper */ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); + __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) + */ + free(__pyx_v_info->format); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + free(__pyx_v_info->strides); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":290 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":770 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 771, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":770 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":773 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":773 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":776 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":776 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":779 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":779 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":782 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":782 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":785 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child = 0; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields = 0; + PyObject *__pyx_v_childname = NULL; + PyObject *__pyx_v_new_offset = NULL; + PyObject *__pyx_v_t = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; + char *__pyx_t_9; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * + * cdef dtype child + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * cdef dtype child + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (unlikely(__pyx_v_descr->names == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 794, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 794, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":795 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + if (unlikely(__pyx_v_descr->fields == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 795, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 795, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 795, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(__pyx_v_fields != Py_None)) { + PyObject* sequence = __pyx_v_fields; + #if !CYTHON_COMPILING_IN_PYPY + Py_ssize_t size = Py_SIZE(sequence); + #else + Py_ssize_t size = PySequence_Size(sequence); + #endif + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 796, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 796, __pyx_L1_error) + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); + __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 798, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 798, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 798, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); + if (__pyx_t_6) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 799, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 799, __pyx_L1_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); + if (!__pyx_t_7) { + goto __pyx_L8_next_or; + } else { + } + __pyx_t_7 = (__pyx_v_little_endian != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_L8_next_or:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 + * + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_6 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (__pyx_t_6) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 803, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 803, __pyx_L1_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":813 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 0x78; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":815 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":820 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); + if (__pyx_t_6) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 821, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":822 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); + if (__pyx_t_6) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 823, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 823, __pyx_L1_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":822 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 826, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 826, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 826, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":827 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 827, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 827, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 827, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":828 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 828, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 828, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 828, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 829, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 829, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 829, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 830, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 830, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 830, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 831, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 831, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 831, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 833, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 833, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 833, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 835, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 835, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 835, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 836, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 836, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 836, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x66; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x64; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x67; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + /*else*/ { + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 844, __pyx_L1_error) + } + __pyx_L15:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":820 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + goto __pyx_L13; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":849 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + /*else*/ { + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) __PYX_ERR(1, 849, __pyx_L1_error) + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":850 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":785 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_child); + __Pyx_XDECREF(__pyx_v_fields); + __Pyx_XDECREF(__pyx_v_childname); + __Pyx_XDECREF(__pyx_v_new_offset); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("set_array_base", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":968 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":968 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + goto __pyx_L3; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + /*else*/ { + Py_INCREF(__pyx_v_base); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":973 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); + if (__pyx_t_1) { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":978 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":985 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_array", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":986 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * cdef inline int import_array() except -1: + * try: + * _import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 987, __pyx_L3_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":986 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_try_end; + __pyx_L3_error:; + __Pyx_PyThreadState_assign + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * try: + * _import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 988, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":989 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 989, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 989, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":986 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L10_try_end:; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":985 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":991 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_umath", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":992 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":993 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 993, __pyx_L3_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":992 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_try_end; + __pyx_L3_error:; + __Pyx_PyThreadState_assign + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":994 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 994, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":995 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 995, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 995, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":992 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L10_try_end:; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":991 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_ufunc", 0); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":998 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":999 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 999, __pyx_L3_error) + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":998 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_try_end; + __pyx_L3_error:; + __Pyx_PyThreadState_assign + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1000, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":1001 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1001, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1001, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":998 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L10_try_end:; + } + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs(PyTypeObject *t, PyObject *a, PyObject *k) { + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + if (unlikely(__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_RLEs(PyObject *o) { + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_3__dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + (*Py_TYPE(o)->tp_free)(o); +} + +static PyObject *__pyx_tp_getattro_10thirdparty_11pycocotools_5_mask_RLEs(PyObject *o, PyObject *n) { + PyObject *v = PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__(o, n); + } + return v; +} + +static PyMethodDef __pyx_methods_10thirdparty_11pycocotools_5_mask_RLEs[] = { + {"__getattr__", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__, METH_O|METH_COEXIST, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs = { + PyVarObject_HEAD_INIT(0, 0) + "thirdparty.pycocotools._mask.RLEs", /*tp_name*/ + sizeof(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks(PyTypeObject *t, PyObject *a, PyObject *k) { + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + if (unlikely(__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_Masks(PyObject *o) { + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + (*Py_TYPE(o)->tp_free)(o); +} + +static PyMethodDef __pyx_methods_10thirdparty_11pycocotools_5_mask_Masks[] = { + {"__array__", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_3__array__, METH_NOARGS, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_Masks = { + PyVarObject_HEAD_INIT(0, 0) + "thirdparty.pycocotools._mask.Masks", /*tp_name*/ + sizeof(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_Masks, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_10thirdparty_11pycocotools_5_mask_Masks, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + #if PY_VERSION_HEX < 0x03020000 + { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, + #else + PyModuleDef_HEAD_INIT, + #endif + "_mask", + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_n_s_F, __pyx_k_F, sizeof(__pyx_k_F), 0, 0, 1, 1}, + {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_n_s_N, __pyx_k_N, sizeof(__pyx_k_N), 0, 0, 1, 1}, + {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_s_PYTHON_VERSION, __pyx_k_PYTHON_VERSION, sizeof(__pyx_k_PYTHON_VERSION), 0, 0, 1, 1}, + {&__pyx_kp_s_Python_version_must_be_2_or_3, __pyx_k_Python_version_must_be_2_or_3, sizeof(__pyx_k_Python_version_must_be_2_or_3), 0, 0, 1, 0}, + {&__pyx_n_s_R, __pyx_k_R, sizeof(__pyx_k_R), 0, 0, 1, 1}, + {&__pyx_n_s_Rs, __pyx_k_Rs, sizeof(__pyx_k_Rs), 0, 0, 1, 1}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_kp_s_The_dt_and_gt_should_have_the_sa, __pyx_k_The_dt_and_gt_should_have_the_sa, sizeof(__pyx_k_The_dt_and_gt_should_have_the_sa), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1}, + {&__pyx_n_s_a_2, __pyx_k_a_2, sizeof(__pyx_k_a_2), 0, 0, 1, 1}, + {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, + {&__pyx_n_s_area, __pyx_k_area, sizeof(__pyx_k_area), 0, 0, 1, 1}, + {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1}, + {&__pyx_n_s_astype, __pyx_k_astype, sizeof(__pyx_k_astype), 0, 0, 1, 1}, + {&__pyx_n_s_author, __pyx_k_author, sizeof(__pyx_k_author), 0, 0, 1, 1}, + {&__pyx_n_s_bb, __pyx_k_bb, sizeof(__pyx_k_bb), 0, 0, 1, 1}, + {&__pyx_n_s_bbIou, __pyx_k_bbIou, sizeof(__pyx_k_bbIou), 0, 0, 1, 1}, + {&__pyx_n_s_bb_2, __pyx_k_bb_2, sizeof(__pyx_k_bb_2), 0, 0, 1, 1}, + {&__pyx_n_s_c_string, __pyx_k_c_string, sizeof(__pyx_k_c_string), 0, 0, 1, 1}, + {&__pyx_n_s_cnts, __pyx_k_cnts, sizeof(__pyx_k_cnts), 0, 0, 1, 1}, + {&__pyx_n_s_counts, __pyx_k_counts, sizeof(__pyx_k_counts), 0, 0, 1, 1}, + {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, + {&__pyx_n_s_decode, __pyx_k_decode, sizeof(__pyx_k_decode), 0, 0, 1, 1}, + {&__pyx_n_s_double, __pyx_k_double, sizeof(__pyx_k_double), 0, 0, 1, 1}, + {&__pyx_n_s_dt, __pyx_k_dt, sizeof(__pyx_k_dt), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_frBbox, __pyx_k_frBbox, sizeof(__pyx_k_frBbox), 0, 0, 1, 1}, + {&__pyx_n_s_frPoly, __pyx_k_frPoly, sizeof(__pyx_k_frPoly), 0, 0, 1, 1}, + {&__pyx_n_s_frPyObjects, __pyx_k_frPyObjects, sizeof(__pyx_k_frPyObjects), 0, 0, 1, 1}, + {&__pyx_n_s_frString, __pyx_k_frString, sizeof(__pyx_k_frString), 0, 0, 1, 1}, + {&__pyx_n_s_frUncompressedRLE, __pyx_k_frUncompressedRLE, sizeof(__pyx_k_frUncompressedRLE), 0, 0, 1, 1}, + {&__pyx_n_s_gt, __pyx_k_gt, sizeof(__pyx_k_gt), 0, 0, 1, 1}, + {&__pyx_n_s_h, __pyx_k_h, sizeof(__pyx_k_h), 0, 0, 1, 1}, + {&__pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_k_home_shang_Work_camus_thirdpart, sizeof(__pyx_k_home_shang_Work_camus_thirdpart), 0, 0, 1, 0}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_kp_s_input_data_type_not_allowed, __pyx_k_input_data_type_not_allowed, sizeof(__pyx_k_input_data_type_not_allowed), 0, 0, 1, 0}, + {&__pyx_kp_s_input_type_is_not_supported, __pyx_k_input_type_is_not_supported, sizeof(__pyx_k_input_type_is_not_supported), 0, 0, 1, 0}, + {&__pyx_n_s_intersect, __pyx_k_intersect, sizeof(__pyx_k_intersect), 0, 0, 1, 1}, + {&__pyx_n_s_iou, __pyx_k_iou, sizeof(__pyx_k_iou), 0, 0, 1, 1}, + {&__pyx_n_s_iouFun, __pyx_k_iouFun, sizeof(__pyx_k_iouFun), 0, 0, 1, 1}, + {&__pyx_n_s_iou_2, __pyx_k_iou_2, sizeof(__pyx_k_iou_2), 0, 0, 1, 1}, + {&__pyx_n_s_iou_locals__bbIou, __pyx_k_iou_locals__bbIou, sizeof(__pyx_k_iou_locals__bbIou), 0, 0, 1, 1}, + {&__pyx_n_s_iou_locals__len, __pyx_k_iou_locals__len, sizeof(__pyx_k_iou_locals__len), 0, 0, 1, 1}, + {&__pyx_n_s_iou_locals__preproc, __pyx_k_iou_locals__preproc, sizeof(__pyx_k_iou_locals__preproc), 0, 0, 1, 1}, + {&__pyx_n_s_iou_locals__rleIou, __pyx_k_iou_locals__rleIou, sizeof(__pyx_k_iou_locals__rleIou), 0, 0, 1, 1}, + {&__pyx_n_s_isbox, __pyx_k_isbox, sizeof(__pyx_k_isbox), 0, 0, 1, 1}, + {&__pyx_n_s_iscrowd, __pyx_k_iscrowd, sizeof(__pyx_k_iscrowd), 0, 0, 1, 1}, + {&__pyx_n_s_isrle, __pyx_k_isrle, sizeof(__pyx_k_isrle), 0, 0, 1, 1}, + {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, + {&__pyx_n_s_len, __pyx_k_len, sizeof(__pyx_k_len), 0, 0, 1, 1}, + {&__pyx_kp_s_list_input_can_be_bounding_box_N, __pyx_k_list_input_can_be_bounding_box_N, sizeof(__pyx_k_list_input_can_be_bounding_box_N), 0, 0, 1, 0}, + {&__pyx_n_s_m, __pyx_k_m, sizeof(__pyx_k_m), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 0, 0, 1, 1}, + {&__pyx_n_s_masks, __pyx_k_masks, sizeof(__pyx_k_masks), 0, 0, 1, 1}, + {&__pyx_n_s_merge, __pyx_k_merge, sizeof(__pyx_k_merge), 0, 0, 1, 1}, + {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, + {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, + {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_np_poly, __pyx_k_np_poly, sizeof(__pyx_k_np_poly), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, + {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, + {&__pyx_kp_s_numpy_ndarray_input_is_only_for, __pyx_k_numpy_ndarray_input_is_only_for, sizeof(__pyx_k_numpy_ndarray_input_is_only_for), 0, 0, 1, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_objs, __pyx_k_objs, sizeof(__pyx_k_objs), 0, 0, 1, 1}, + {&__pyx_n_s_order, __pyx_k_order, sizeof(__pyx_k_order), 0, 0, 1, 1}, + {&__pyx_n_s_p, __pyx_k_p, sizeof(__pyx_k_p), 0, 0, 1, 1}, + {&__pyx_n_s_poly, __pyx_k_poly, sizeof(__pyx_k_poly), 0, 0, 1, 1}, + {&__pyx_n_s_preproc, __pyx_k_preproc, sizeof(__pyx_k_preproc), 0, 0, 1, 1}, + {&__pyx_n_s_py_string, __pyx_k_py_string, sizeof(__pyx_k_py_string), 0, 0, 1, 1}, + {&__pyx_n_s_pyiscrowd, __pyx_k_pyiscrowd, sizeof(__pyx_k_pyiscrowd), 0, 0, 1, 1}, + {&__pyx_n_s_pyobj, __pyx_k_pyobj, sizeof(__pyx_k_pyobj), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reshape, __pyx_k_reshape, sizeof(__pyx_k_reshape), 0, 0, 1, 1}, + {&__pyx_n_s_rleIou, __pyx_k_rleIou, sizeof(__pyx_k_rleIou), 0, 0, 1, 1}, + {&__pyx_n_s_rleObjs, __pyx_k_rleObjs, sizeof(__pyx_k_rleObjs), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_thirdparty_pycocotools__mask, __pyx_k_thirdparty_pycocotools__mask, sizeof(__pyx_k_thirdparty_pycocotools__mask), 0, 0, 1, 1}, + {&__pyx_n_s_toBbox, __pyx_k_toBbox, sizeof(__pyx_k_toBbox), 0, 0, 1, 1}, + {&__pyx_n_s_toString, __pyx_k_toString, sizeof(__pyx_k_toString), 0, 0, 1, 1}, + {&__pyx_n_s_tsungyi, __pyx_k_tsungyi, sizeof(__pyx_k_tsungyi), 0, 0, 1, 1}, + {&__pyx_n_s_ucRles, __pyx_k_ucRles, sizeof(__pyx_k_ucRles), 0, 0, 1, 1}, + {&__pyx_n_s_uint32, __pyx_k_uint32, sizeof(__pyx_k_uint32), 0, 0, 1, 1}, + {&__pyx_n_s_uint8, __pyx_k_uint8, sizeof(__pyx_k_uint8), 0, 0, 1, 1}, + {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, + {&__pyx_kp_s_unrecognized_type_The_following, __pyx_k_unrecognized_type_The_following, sizeof(__pyx_k_unrecognized_type_The_following), 0, 0, 1, 0}, + {&__pyx_n_s_utf8, __pyx_k_utf8, sizeof(__pyx_k_utf8), 0, 0, 1, 1}, + {&__pyx_n_s_version_info, __pyx_k_version_info, sizeof(__pyx_k_version_info), 0, 0, 1, 1}, + {&__pyx_n_s_w, __pyx_k_w, sizeof(__pyx_k_w), 0, 0, 1, 1}, + {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 67, __pyx_L1_error) + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 218, __pyx_L1_error) + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 799, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 989, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "thirdparty/pycocotools/_mask.pyx":126 + * for i, obj in enumerate(rleObjs): + * if PYTHON_VERSION == 2: + * py_string = str(obj['counts']).encode('utf8') # <<<<<<<<<<<<<< + * elif PYTHON_VERSION == 3: + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_n_s_utf8); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "thirdparty/pycocotools/_mask.pyx":130 + * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] + * else: + * raise Exception('Python version must be 2 or 3') # <<<<<<<<<<<<<< + * c_string = py_string + * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Python_version_must_be_2_or_3); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "thirdparty/pycocotools/_mask.pyx":154 + * def merge(rleObjs, intersect=0): + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) # <<<<<<<<<<<<<< + * rleMerge(Rs._R, R._R, Rs._n, intersect) + * obj = _toString(R)[0] + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "thirdparty/pycocotools/_mask.pyx":180 + * # check if it's Nx4 bbox + * if not len(objs.shape) == 2 or not objs.shape[1] == 4: + * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') # <<<<<<<<<<<<<< + * objs = objs.astype(np.double) + * elif type(objs) == list: + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_ndarray_input_is_only_for); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 180, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "thirdparty/pycocotools/_mask.pyx":193 + * objs = _frString(objs) + * else: + * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') # <<<<<<<<<<<<<< + * else: + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_list_input_can_be_bounding_box_N); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "thirdparty/pycocotools/_mask.pyx":195 + * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') + * else: + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') # <<<<<<<<<<<<<< + * return objs + * 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): + */ + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_unrecognized_type_The_following); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "thirdparty/pycocotools/_mask.pyx":172 + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): + * def _preproc(objs): # <<<<<<<<<<<<<< + * if len(objs) == 0: + * return objs + */ + __pyx_tuple__7 = PyTuple_Pack(4, __pyx_n_s_objs, __pyx_n_s_isbox, __pyx_n_s_isrle, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_preproc, 172, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 172, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":197 + * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') + * return objs + * 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): # <<<<<<<<<<<<<< + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): + */ + __pyx_tuple__9 = PyTuple_Pack(6, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(6, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_rleIou, 197, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 197, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":199 + * 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): + * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) + * 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): # <<<<<<<<<<<<<< + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): + */ + __pyx_tuple__11 = PyTuple_Pack(6, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 199, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(6, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_bbIou, 199, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 199, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":201 + * 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): + * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) + * def _len(obj): # <<<<<<<<<<<<<< + * cdef siz N = 0 + * if type(obj) == RLEs: + */ + __pyx_tuple__13 = PyTuple_Pack(2, __pyx_n_s_obj, __pyx_n_s_N); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 201, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_len, 201, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 201, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":221 + * return [] + * if not type(dt) == type(gt): + * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') # <<<<<<<<<<<<<< + * + * # define local variables + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_The_dt_and_gt_should_have_the_sa); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + + /* "thirdparty/pycocotools/_mask.pyx":232 + * _iouFun = _bbIou + * else: + * raise Exception('input data type not allowed.') # <<<<<<<<<<<<<< + * _iou = malloc(m*n* sizeof(double)) + * iou = np.zeros((m*n, ), dtype=np.double) + */ + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_input_data_type_not_allowed); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 232, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "thirdparty/pycocotools/_mask.pyx":277 + * objs = [] + * for i in range(n): + * Rs = RLEs(1) # <<<<<<<<<<<<<< + * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) + * # time for malloc can be saved here but it's fine + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "thirdparty/pycocotools/_mask.pyx":307 + * objs = frUncompressedRLE([pyobj], h, w)[0] + * else: + * raise Exception('input type is not supported.') # <<<<<<<<<<<<<< + * return objs + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_input_type_is_not_supported); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 799, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 803, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 823, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":989 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 989, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":995 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(1, 995, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":1001 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(1, 1001, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); + + /* "thirdparty/pycocotools/_mask.pyx":103 + * + * # internal conversion from Python RLEs object to compressed RLE format + * def _toString(RLEs Rs): # <<<<<<<<<<<<<< + * cdef siz n = Rs.n + * cdef bytes py_string + */ + __pyx_tuple__28 = PyTuple_Pack(6, __pyx_n_s_Rs, __pyx_n_s_n, __pyx_n_s_py_string, __pyx_n_s_c_string, __pyx_n_s_objs, __pyx_n_s_i); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_toString, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 103, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":119 + * + * # internal conversion from compressed RLE format to Python RLEs object + * def _frString(rleObjs): # <<<<<<<<<<<<<< + * cdef siz n = len(rleObjs) + * Rs = RLEs(n) + */ + __pyx_tuple__30 = PyTuple_Pack(7, __pyx_n_s_rleObjs, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_py_string, __pyx_n_s_c_string, __pyx_n_s_i, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(1, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frString, 119, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 119, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":137 + * # encode mask to RLEs objects + * # list of RLE string can be generated by RLEs member function + * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] + * cdef RLEs Rs = RLEs(n) + */ + __pyx_tuple__32 = PyTuple_Pack(6, __pyx_n_s_mask, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__32); + __Pyx_GIVEREF(__pyx_tuple__32); + __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_encode, 137, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 137, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":145 + * + * # decode mask from compressed list of RLE string or RLEs object + * def decode(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + */ + __pyx_tuple__34 = PyTuple_Pack(6, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_masks); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__34); + __Pyx_GIVEREF(__pyx_tuple__34); + __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_decode, 145, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 145, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":152 + * return np.array(masks) + * + * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) + */ + __pyx_tuple__36 = PyTuple_Pack(5, __pyx_n_s_rleObjs, __pyx_n_s_intersect, __pyx_n_s_Rs, __pyx_n_s_R, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); + __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(2, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_merge, 152, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 152, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":159 + * return obj + * + * def area(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) + */ + __pyx_tuple__38 = PyTuple_Pack(5, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_a, __pyx_n_s_shape, __pyx_n_s_a_2); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_area, 159, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 159, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":171 + * + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< + * def _preproc(objs): + * if len(objs) == 0: + */ + __pyx_tuple__40 = PyTuple_Pack(18, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_pyiscrowd, __pyx_n_s_preproc, __pyx_n_s_preproc, __pyx_n_s_rleIou, __pyx_n_s_rleIou, __pyx_n_s_bbIou, __pyx_n_s_bbIou, __pyx_n_s_len, __pyx_n_s_len, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou, __pyx_n_s_shape, __pyx_n_s_iouFun, __pyx_n_s_iou_2); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 171, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__40); + __Pyx_GIVEREF(__pyx_tuple__40); + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(3, 0, 18, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_iou_2, 171, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 171, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":241 + * return iou.reshape((m,n), order='F') + * + * def toBbox( rleObjs ): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef siz n = Rs.n + */ + __pyx_tuple__42 = PyTuple_Pack(6, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_n, __pyx_n_s_bb_2, __pyx_n_s_shape, __pyx_n_s_bb); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 241, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__42); + __Pyx_GIVEREF(__pyx_tuple__42); + __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_toBbox, 241, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 241, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":253 + * return bb + * + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef siz n = bb.shape[0] + * Rs = RLEs(n) + */ + __pyx_tuple__44 = PyTuple_Pack(6, __pyx_n_s_bb, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__44); + __Pyx_GIVEREF(__pyx_tuple__44); + __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__44, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frBbox, 253, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(0, 253, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":260 + * return objs + * + * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.double_t, ndim=1] np_poly + * n = len(poly) + */ + __pyx_tuple__46 = PyTuple_Pack(9, __pyx_n_s_poly, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_np_poly, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_i, __pyx_n_s_p, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(0, 260, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__46); + __Pyx_GIVEREF(__pyx_tuple__46); + __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(3, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frPoly, 260, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(0, 260, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":270 + * return objs + * + * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.uint32_t, ndim=1] cnts + * cdef RLE R + */ + __pyx_tuple__48 = PyTuple_Pack(11, __pyx_n_s_ucRles, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_cnts, __pyx_n_s_R, __pyx_n_s_data, __pyx_n_s_n, __pyx_n_s_objs, __pyx_n_s_i, __pyx_n_s_Rs, __pyx_n_s_j); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(0, 270, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__48); + __Pyx_GIVEREF(__pyx_tuple__48); + __pyx_codeobj__49 = (PyObject*)__Pyx_PyCode_New(3, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__48, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frUncompressedRLE, 270, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__49)) __PYX_ERR(0, 270, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":288 + * return objs + * + * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: + */ + __pyx_tuple__50 = PyTuple_Pack(4, __pyx_n_s_pyobj, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(0, 288, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__50); + __Pyx_GIVEREF(__pyx_tuple__50); + __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__50, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frPyObjects, 288, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(0, 288, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC init_mask(void); /*proto*/ +PyMODINIT_FUNC init_mask(void) +#else +PyMODINIT_FUNC PyInit__mask(void); /*proto*/ +PyMODINIT_FUNC PyInit__mask(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + __Pyx_RefNannyDeclarations + #if CYTHON_REFNANNY + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + #endif + __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__mask(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_mask", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_thirdparty__pycocotools___mask) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "thirdparty.pycocotools._mask")) { + if (unlikely(PyDict_SetItemString(modules, "thirdparty.pycocotools._mask", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + if (PyType_Ready(&__pyx_type_10thirdparty_11pycocotools_5_mask_RLEs) < 0) __PYX_ERR(0, 56, __pyx_L1_error) + __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs.tp_print = 0; + if (PyObject_SetAttrString(__pyx_m, "RLEs", (PyObject *)&__pyx_type_10thirdparty_11pycocotools_5_mask_RLEs) < 0) __PYX_ERR(0, 56, __pyx_L1_error) + __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs = &__pyx_type_10thirdparty_11pycocotools_5_mask_RLEs; + if (PyType_Ready(&__pyx_type_10thirdparty_11pycocotools_5_mask_Masks) < 0) __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_type_10thirdparty_11pycocotools_5_mask_Masks.tp_print = 0; + if (PyObject_SetAttrString(__pyx_m, "Masks", (PyObject *)&__pyx_type_10thirdparty_11pycocotools_5_mask_Masks) < 0) __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_ptype_10thirdparty_11pycocotools_5_mask_Masks = &__pyx_type_10thirdparty_11pycocotools_5_mask_Masks; + /*--- Type import code ---*/ + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + #if CYTHON_COMPILING_IN_PYPY + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(1, 155, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(1, 168, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(1, 172, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(1, 181, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(1, 861, __pyx_L1_error) + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "thirdparty/pycocotools/_mask.pyx":11 + * #************************************************************************** + * + * __author__ = 'tsungyi' # <<<<<<<<<<<<<< + * + * import sys + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_author, __pyx_n_s_tsungyi) < 0) __PYX_ERR(0, 11, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":13 + * __author__ = 'tsungyi' + * + * import sys # <<<<<<<<<<<<<< + * PYTHON_VERSION = sys.version_info[0] + * + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_sys, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":14 + * + * import sys + * PYTHON_VERSION = sys.version_info[0] # <<<<<<<<<<<<<< + * + * # import both Python-level and C-level symbols of Numpy + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_version_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYTHON_VERSION, __pyx_t_1) < 0) __PYX_ERR(0, 14, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":18 + * # import both Python-level and C-level symbols of Numpy + * # the API uses Numpy to interface C and Python + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * from libc.stdlib cimport malloc, free + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":23 + * + * # intialized Numpy. must do. + * np.import_array() # <<<<<<<<<<<<<< + * + * # import numpy C function + */ + __pyx_t_3 = __pyx_f_5numpy_import_array(); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 23, __pyx_L1_error) + + /* "thirdparty/pycocotools/_mask.pyx":103 + * + * # internal conversion from Python RLEs object to compressed RLE format + * def _toString(RLEs Rs): # <<<<<<<<<<<<<< + * cdef siz n = Rs.n + * cdef bytes py_string + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_1_toString, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_toString, __pyx_t_1) < 0) __PYX_ERR(0, 103, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":119 + * + * # internal conversion from compressed RLE format to Python RLEs object + * def _frString(rleObjs): # <<<<<<<<<<<<<< + * cdef siz n = len(rleObjs) + * Rs = RLEs(n) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3_frString, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frString, __pyx_t_1) < 0) __PYX_ERR(0, 119, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":137 + * # encode mask to RLEs objects + * # list of RLE string can be generated by RLEs member function + * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< + * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] + * cdef RLEs Rs = RLEs(n) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_5encode, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_encode, __pyx_t_1) < 0) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":145 + * + * # decode mask from compressed list of RLE string or RLEs object + * def decode(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_7decode, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode, __pyx_t_1) < 0) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":152 + * return np.array(masks) + * + * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef RLEs R = RLEs(1) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_9merge, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_merge, __pyx_t_1) < 0) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":159 + * return obj + * + * def area(rleObjs): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef uint* _a = malloc(Rs._n* sizeof(uint)) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_11area, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_area, __pyx_t_1) < 0) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":171 + * + * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). + * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< + * def _preproc(objs): + * if len(objs) == 0: + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_13iou, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_iou_2, __pyx_t_1) < 0) __PYX_ERR(0, 171, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":241 + * return iou.reshape((m,n), order='F') + * + * def toBbox( rleObjs ): # <<<<<<<<<<<<<< + * cdef RLEs Rs = _frString(rleObjs) + * cdef siz n = Rs.n + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_15toBbox, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_toBbox, __pyx_t_1) < 0) __PYX_ERR(0, 241, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":253 + * return bb + * + * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef siz n = bb.shape[0] + * Rs = RLEs(n) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_17frBbox, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frBbox, __pyx_t_1) < 0) __PYX_ERR(0, 253, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":260 + * return objs + * + * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.double_t, ndim=1] np_poly + * n = len(poly) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_19frPoly, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 260, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frPoly, __pyx_t_1) < 0) __PYX_ERR(0, 260, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":270 + * return objs + * + * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< + * cdef np.ndarray[np.uint32_t, ndim=1] cnts + * cdef RLE R + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 270, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frUncompressedRLE, __pyx_t_1) < 0) __PYX_ERR(0, 270, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":288 + * return objs + * + * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< + * # encode rle from a list of python objects + * if type(pyobj) == np.ndarray: + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_23frPyObjects, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 288, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frPyObjects, __pyx_t_1) < 0) __PYX_ERR(0, 288, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "thirdparty/pycocotools/_mask.pyx":1 + * # distutils: language = c # <<<<<<<<<<<<<< + * # distutils: sources = ./common/maskApi.c + * + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init thirdparty.pycocotools._mask", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init thirdparty.pycocotools._mask"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } +#if PY_VERSION_HEX >= 0x03030000 + if (cause) { +#else + if (cause && cause != Py_None) { +#endif + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(PyObject_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* ArgTypeTest */ + static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); +} +static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, + const char *name, int exact) +{ + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (none_allowed && obj == Py_None) return 1; + else if (exact) { + if (likely(Py_TYPE(obj) == type)) return 1; + #if PY_MAJOR_VERSION == 2 + else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(PyObject_TypeCheck(obj, type))) return 1; + } + __Pyx_RaiseArgumentTypeInvalid(name, obj, type); + return 0; +} + +/* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + x = (long)((unsigned long)a + b); + if (likely((x^a) >= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + double result; + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { + if (op1 == op2) { + Py_RETURN_TRUE; + } + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long a = PyInt_AS_LONG(op1); + if (a == b) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a; + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } + #if PyLong_SHIFT < 30 && PyLong_SHIFT != 15 + default: return PyLong_Type.tp_richcompare(op1, op2, Py_EQ); + #else + default: Py_RETURN_FALSE; + #endif + } + } + if (a == b) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + if ((double)a == (double)b) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } + } + return PyObject_RichCompare(op1, op2, Py_EQ); +} +#endif + +/* GetModuleGlobalName */ + static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* PyCFunctionFastCall */ + #if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs, NULL); +} +#endif // CYTHON_FAST_PYCCALL + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL +#include "frameobject.h" +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = PyThreadState_GET(); + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = f->f_localsplus; + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif // CPython < 3.6 +#endif // CYTHON_FAST_PYCALL + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { +#else + if (likely(PyCFunction_Check(func))) { +#endif + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* GetItemInt */ + static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); + if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* BufferFormatCheck */ + static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { + unsigned int n = 1; + return *(unsigned char*)(&n) != 0; +} +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparseable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static CYTHON_INLINE PyObject * +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number; + int ndim = ctx->head->field->type->ndim; +; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) + return PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + if (*ts != ',' && *ts != ')') + return PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + if (*ts == ',') ts++; + i++; + } + if (i != ndim) + return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return NULL; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return Py_None; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_IsLittleEndian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_IsLittleEndian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex && + ctx->enc_packmode == ctx->new_packmode) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} +static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static CYTHON_INLINE int __Pyx_GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + if (obj == Py_None || obj == NULL) { + __Pyx_ZeroBuffer(buf); + return 0; + } + buf->buf = NULL; + if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; + if (buf->ndim != nd) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned)buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_ZeroBuffer(buf); + return -1; +} +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (info->buf == NULL) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} + +/* FetchCommonType */ + static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* fake_module; + PyTypeObject* cached_type = NULL; + fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); + if (!fake_module) return NULL; + Py_INCREF(fake_module); + cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name); + if (cached_type) { + if (!PyType_Check((PyObject*)cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", + type->tp_name); + goto bad; + } + if (cached_type->tp_basicsize != type->tp_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + type->tp_name); + goto bad; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; + } +done: + Py_DECREF(fake_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} + +/* CythonFunction */ + static PyObject * +__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure) +{ + if (unlikely(op->func_doc == NULL)) { + if (op->func.m_ml->ml_doc) { +#if PY_MAJOR_VERSION >= 3 + op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc); +#else + op->func_doc = PyString_FromString(op->func.m_ml->ml_doc); +#endif + if (unlikely(op->func_doc == NULL)) + return NULL; + } else { + Py_INCREF(Py_None); + return Py_None; + } + } + Py_INCREF(op->func_doc); + return op->func_doc; +} +static int +__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value) +{ + PyObject *tmp = op->func_doc; + if (value == NULL) { + value = Py_None; + } + Py_INCREF(value); + op->func_doc = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op) +{ + if (unlikely(op->func_name == NULL)) { +#if PY_MAJOR_VERSION >= 3 + op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name); +#else + op->func_name = PyString_InternFromString(op->func.m_ml->ml_name); +#endif + if (unlikely(op->func_name == NULL)) + return NULL; + } + Py_INCREF(op->func_name); + return op->func_name; +} +static int +__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value) +{ + PyObject *tmp; +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) { +#else + if (unlikely(value == NULL || !PyString_Check(value))) { +#endif + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + tmp = op->func_name; + Py_INCREF(value); + op->func_name = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op) +{ + Py_INCREF(op->func_qualname); + return op->func_qualname; +} +static int +__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value) +{ + PyObject *tmp; +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) { +#else + if (unlikely(value == NULL || !PyString_Check(value))) { +#endif + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + tmp = op->func_qualname; + Py_INCREF(value); + op->func_qualname = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure) +{ + PyObject *self; + self = m->func_closure; + if (self == NULL) + self = Py_None; + Py_INCREF(self); + return self; +} +static PyObject * +__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op) +{ + if (unlikely(op->func_dict == NULL)) { + op->func_dict = PyDict_New(); + if (unlikely(op->func_dict == NULL)) + return NULL; + } + Py_INCREF(op->func_dict); + return op->func_dict; +} +static int +__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value) +{ + PyObject *tmp; + if (unlikely(value == NULL)) { + PyErr_SetString(PyExc_TypeError, + "function's dictionary may not be deleted"); + return -1; + } + if (unlikely(!PyDict_Check(value))) { + PyErr_SetString(PyExc_TypeError, + "setting function's dictionary to a non-dict"); + return -1; + } + tmp = op->func_dict; + Py_INCREF(value); + op->func_dict = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op) +{ + Py_INCREF(op->func_globals); + return op->func_globals; +} +static PyObject * +__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op) +{ + Py_INCREF(Py_None); + return Py_None; +} +static PyObject * +__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op) +{ + PyObject* result = (op->func_code) ? op->func_code : Py_None; + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { + int result = 0; + PyObject *res = op->defaults_getter((PyObject *) op); + if (unlikely(!res)) + return -1; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + op->defaults_tuple = PyTuple_GET_ITEM(res, 0); + Py_INCREF(op->defaults_tuple); + op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); + Py_INCREF(op->defaults_kwdict); + #else + op->defaults_tuple = PySequence_ITEM(res, 0); + if (unlikely(!op->defaults_tuple)) result = -1; + else { + op->defaults_kwdict = PySequence_ITEM(res, 1); + if (unlikely(!op->defaults_kwdict)) result = -1; + } + #endif + Py_DECREF(res); + return result; +} +static int +__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value) { + PyObject* tmp; + if (!value) { + value = Py_None; + } else if (value != Py_None && !PyTuple_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "__defaults__ must be set to a tuple object"); + return -1; + } + Py_INCREF(value); + tmp = op->defaults_tuple; + op->defaults_tuple = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op) { + PyObject* result = op->defaults_tuple; + if (unlikely(!result)) { + if (op->defaults_getter) { + if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL; + result = op->defaults_tuple; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value) { + PyObject* tmp; + if (!value) { + value = Py_None; + } else if (value != Py_None && !PyDict_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "__kwdefaults__ must be set to a dict object"); + return -1; + } + Py_INCREF(value); + tmp = op->defaults_kwdict; + op->defaults_kwdict = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op) { + PyObject* result = op->defaults_kwdict; + if (unlikely(!result)) { + if (op->defaults_getter) { + if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL; + result = op->defaults_kwdict; + } else { + result = Py_None; + } + } + Py_INCREF(result); + return result; +} +static int +__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value) { + PyObject* tmp; + if (!value || value == Py_None) { + value = NULL; + } else if (!PyDict_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "__annotations__ must be set to a dict object"); + return -1; + } + Py_XINCREF(value); + tmp = op->func_annotations; + op->func_annotations = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op) { + PyObject* result = op->func_annotations; + if (unlikely(!result)) { + result = PyDict_New(); + if (unlikely(!result)) return NULL; + op->func_annotations = result; + } + Py_INCREF(result); + return result; +} +static PyGetSetDef __pyx_CyFunction_getsets[] = { + {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, + {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, + {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, + {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0}, + {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, + {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, + {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, + {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, + {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, + {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, + {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, + {0, 0, 0, 0, 0} +}; +static PyMemberDef __pyx_CyFunction_members[] = { + {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0}, + {0, 0, 0, 0, 0} +}; +static PyObject * +__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromString(m->func.m_ml->ml_name); +#else + return PyString_FromString(m->func.m_ml->ml_name); +#endif +} +static PyMethodDef __pyx_CyFunction_methods[] = { + {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, + {0, 0, 0, 0} +}; +#if PY_VERSION_HEX < 0x030500A0 +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) +#else +#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func.m_weakreflist) +#endif +static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, PyObject* qualname, + PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { + __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type); + if (op == NULL) + return NULL; + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; + op->func.m_ml = ml; + op->func.m_self = (PyObject *) op; + Py_XINCREF(closure); + op->func_closure = closure; + Py_XINCREF(module); + op->func.m_module = module; + op->func_dict = NULL; + op->func_name = NULL; + Py_INCREF(qualname); + op->func_qualname = qualname; + op->func_doc = NULL; + op->func_classobj = NULL; + op->func_globals = globals; + Py_INCREF(op->func_globals); + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; + PyObject_GC_Track(op); + return (PyObject *) op; +} +static int +__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) +{ + Py_CLEAR(m->func_closure); + Py_CLEAR(m->func.m_module); + Py_CLEAR(m->func_dict); + Py_CLEAR(m->func_name); + Py_CLEAR(m->func_qualname); + Py_CLEAR(m->func_doc); + Py_CLEAR(m->func_globals); + Py_CLEAR(m->func_code); + Py_CLEAR(m->func_classobj); + Py_CLEAR(m->defaults_tuple); + Py_CLEAR(m->defaults_kwdict); + Py_CLEAR(m->func_annotations); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_XDECREF(pydefaults[i]); + PyObject_Free(m->defaults); + m->defaults = NULL; + } + return 0; +} +static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) +{ + PyObject_GC_UnTrack(m); + if (__Pyx_CyFunction_weakreflist(m) != NULL) + PyObject_ClearWeakRefs((PyObject *) m); + __Pyx_CyFunction_clear(m); + PyObject_GC_Del(m); +} +static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) +{ + Py_VISIT(m->func_closure); + Py_VISIT(m->func.m_module); + Py_VISIT(m->func_dict); + Py_VISIT(m->func_name); + Py_VISIT(m->func_qualname); + Py_VISIT(m->func_doc); + Py_VISIT(m->func_globals); + Py_VISIT(m->func_code); + Py_VISIT(m->func_classobj); + Py_VISIT(m->defaults_tuple); + Py_VISIT(m->defaults_kwdict); + if (m->defaults) { + PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); + int i; + for (i = 0; i < m->defaults_pyobjects; i++) + Py_VISIT(pydefaults[i]); + } + return 0; +} +static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type) +{ + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(func); + return func; + } + if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) { + if (type == NULL) + type = (PyObject *)(Py_TYPE(obj)); + return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type))); + } + if (obj == Py_None) + obj = NULL; + return __Pyx_PyMethod_New(func, obj, type); +} +static PyObject* +__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", + op->func_qualname, (void *)op); +#else + return PyString_FromFormat("", + PyString_AsString(op->func_qualname), (void *)op); +#endif +} +static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { + PyCFunctionObject* f = (PyCFunctionObject*)func; + PyCFunction meth = f->m_ml->ml_meth; + Py_ssize_t size; + switch (f->m_ml->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { + case METH_VARARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) + return (*meth)(self, arg); + break; + case METH_VARARGS | METH_KEYWORDS: + return (*(PyCFunctionWithKeywords)meth)(self, arg, kw); + case METH_NOARGS: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { + size = PyTuple_GET_SIZE(arg); + if (likely(size == 0)) + return (*meth)(self, NULL); + PyErr_Format(PyExc_TypeError, + "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); + return NULL; + } + break; + case METH_O: + if (likely(kw == NULL || PyDict_Size(kw) == 0)) { + size = PyTuple_GET_SIZE(arg); + if (likely(size == 1)) { + PyObject *result, *arg0 = PySequence_ITEM(arg, 0); + if (unlikely(!arg0)) return NULL; + result = (*meth)(self, arg0); + Py_DECREF(arg0); + return result; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", + f->m_ml->ml_name, size); + return NULL; + } + break; + default: + PyErr_SetString(PyExc_SystemError, "Bad call flags in " + "__Pyx_CyFunction_Call. METH_OLDARGS is no " + "longer supported!"); + return NULL; + } + PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", + f->m_ml->ml_name); + return NULL; +} +static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + return __Pyx_CyFunction_CallMethod(func, ((PyCFunctionObject*)func)->m_self, arg, kw); +} +static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { + PyObject *result; + __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; + if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { + Py_ssize_t argc; + PyObject *new_args; + PyObject *self; + argc = PyTuple_GET_SIZE(args); + new_args = PyTuple_GetSlice(args, 1, argc); + if (unlikely(!new_args)) + return NULL; + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); + Py_DECREF(new_args); + } else { + result = __Pyx_CyFunction_Call(func, args, kw); + } + return result; +} +static PyTypeObject __pyx_CyFunctionType_type = { + PyVarObject_HEAD_INIT(0, 0) + "cython_function_or_method", + sizeof(__pyx_CyFunctionObject), + 0, + (destructor) __Pyx_CyFunction_dealloc, + 0, + 0, + 0, +#if PY_MAJOR_VERSION < 3 + 0, +#else + 0, +#endif + (reprfunc) __Pyx_CyFunction_repr, + 0, + 0, + 0, + 0, + __Pyx_CyFunction_CallAsMethod, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + 0, + (traverseproc) __Pyx_CyFunction_traverse, + (inquiry) __Pyx_CyFunction_clear, + 0, +#if PY_VERSION_HEX < 0x030500A0 + offsetof(__pyx_CyFunctionObject, func_weakreflist), +#else + offsetof(PyCFunctionObject, m_weakreflist), +#endif + 0, + 0, + __pyx_CyFunction_methods, + __pyx_CyFunction_members, + __pyx_CyFunction_getsets, + 0, + 0, + __Pyx_CyFunction_descr_get, + 0, + offsetof(__pyx_CyFunctionObject, func_dict), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +}; +static int __pyx_CyFunction_init(void) { + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); + if (__pyx_CyFunctionType == NULL) { + return -1; + } + return 0; +} +static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults = PyObject_Malloc(size); + if (!m->defaults) + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; + return m->defaults; +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_tuple = tuple; + Py_INCREF(tuple); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->defaults_kwdict = dict; + Py_INCREF(dict); +} +static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + m->func_annotations = dict; + Py_INCREF(dict); +} + +/* BufferFallbackError */ + static void __Pyx_RaiseBufferFallbackError(void) { + PyErr_SetString(PyExc_ValueError, + "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!"); +} + +/* None */ + static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* BufferIndexError */ + static void __Pyx_RaiseBufferIndexError(int axis) { + PyErr_Format(PyExc_IndexError, + "Out of bounds on buffer access (axis %d)", axis); +} + +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ + static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* SaveResetException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* PyErrExceptionMatches */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) { + PyObject *exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + return PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* GetException */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { +#endif + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(1); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + #endif + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_VERSION_HEX < 0x03030000 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + py_code = __pyx_find_code_object(c_line ? c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? c_line : py_line, py_code); + } + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); + PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) { __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); return; } + Py_DECREF(obj); + view->obj = NULL; +} +#endif + + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_siz(siz value) { + const siz neg_one = (siz) -1, const_zero = (siz) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(siz) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(siz) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(siz) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(siz) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(siz) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(siz), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value) { + const Py_intptr_t neg_one = (Py_intptr_t) -1, const_zero = (Py_intptr_t) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(Py_intptr_t) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(Py_intptr_t) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(Py_intptr_t) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(Py_intptr_t) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(Py_intptr_t) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(Py_intptr_t), + little, !is_unsigned); + } +} + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = 1.0 / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = 1.0 / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0, -1); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = 1.0 / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = 1.0 / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0, -1); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } +} + +/* CIntFromPy */ + static CYTHON_INLINE siz __Pyx_PyInt_As_siz(PyObject *x) { + const siz neg_one = (siz) -1, const_zero = (siz) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(siz) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(siz, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (siz) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (siz) 0; + case 1: __PYX_VERIFY_RETURN_INT(siz, digit, digits[0]) + case 2: + if (8 * sizeof(siz) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) >= 2 * PyLong_SHIFT) { + return (siz) (((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(siz) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) >= 3 * PyLong_SHIFT) { + return (siz) (((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(siz) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) >= 4 * PyLong_SHIFT) { + return (siz) (((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (siz) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(siz) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(siz) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (siz) 0; + case -1: __PYX_VERIFY_RETURN_INT(siz, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(siz, digit, +digits[0]) + case -2: + if (8 * sizeof(siz) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + return (siz) (((siz)-1)*(((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(siz) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + return (siz) ((((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + return (siz) (((siz)-1)*(((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(siz) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + return (siz) ((((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 4 * PyLong_SHIFT) { + return (siz) (((siz)-1)*(((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(siz) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 4 * PyLong_SHIFT) { + return (siz) ((((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + } +#endif + if (sizeof(siz) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(siz) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + siz val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (siz) -1; + } + } else { + siz val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (siz) -1; + val = __Pyx_PyInt_As_siz(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to siz"); + return (siz) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to siz"); + return (siz) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { + const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(size_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (size_t) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { + return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { + return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { + return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (size_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(size_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) + case -2: + if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + } +#endif + if (sizeof(size_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + size_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (size_t) -1; + } + } else { + size_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (size_t) -1; + val = __Pyx_PyInt_As_size_t(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to size_t"); + return (size_t) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* ModuleImport */ + #ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + py_name = __Pyx_PyIdentifier_FromString(name); + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + size_t size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + py_name = __Pyx_PyIdentifier_FromString(class_name); + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (!strict && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + else if ((size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { +#if PY_VERSION_HEX < 0x03030000 + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +#else + if (__Pyx_PyUnicode_READY(o) == -1) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (PyUnicode_IS_ASCII(o)) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +#endif + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } + #else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } + #endif +#else + res = PyNumber_Int(x); +#endif + if (res) { +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/libs/layers/__init__.py b/libs/layers/__init__.py index f68ff7c..76c8060 100644 --- a/libs/layers/__init__.py +++ b/libs/layers/__init__.py @@ -16,5 +16,7 @@ from .wrapper import sample_with_gt_wrapper as sample_rpn_outputs_with_gt from .wrapper import gen_all_anchors from .wrapper import assign_boxes +from .wrapper import assign_boxes_ from .crop import crop as ROIAlign from .crop import crop_ as ROIAlign_ +from .wrapper import inst_inference diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index ac00b5a..08a8521 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -14,223 +14,234 @@ _DEBUG = False def encode(gt_boxes, all_anchors, height, width, stride): - """Matching and Encoding groundtruth into learning targets - Sampling - - Parameters - --------- - gt_boxes: an array of shape (G x 5), [x1, y1, x2, y2, class] - all_anchors: an array of shape (h, w, A, 4), - width: width of feature - height: height of feature - stride: downscale factor w.r.t the input size, e.g., [4, 8, 16, 32] - Returns - -------- - labels: Nx1 array in [0, num_classes] - bbox_targets: N x (4) regression targets - bbox_inside_weights: N x (4), in {0, 1} indicating to which class is assigned. - """ - # TODO: speedup this module - # if all_anchors is None: - # all_anchors = anchors_plane(height, width, stride=stride) - - # # anchors, inds_inside, total_anchors - # border = cfg.FLAGS.allow_border - # all_anchors = all_anchors.reshape((-1, 4)) - # inds_inside = np.where( - # (all_anchors[:, 0] >= -border) & - # (all_anchors[:, 1] >= -border) & - # (all_anchors[:, 2] < (width * stride) + border) & - # (all_anchors[:, 3] < (height * stride) + border))[0] - # anchors = all_anchors[inds_inside, :] - all_anchors = all_anchors.reshape([-1, 4]) - anchors = all_anchors - total_anchors = all_anchors.shape[0] - - # labels = np.zeros((anchors.shape[0], ), dtype=np.float32) - labels = np.empty((anchors.shape[0], ), dtype=np.float32) - labels.fill(-1) - - if gt_boxes.size > 0: - overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(anchors, dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) - - # if _DEBUG: - # print ('gt_boxes shape: ', gt_boxes.shape) - # print ('anchors shape: ', anchors.shape) - # print ('overlaps shape: ', overlaps.shape) - - gt_assignment = overlaps.argmax(axis=1) # (A) - max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] - gt_argmax_overlaps = overlaps.argmax(axis=0) # G - gt_max_overlaps = overlaps[gt_argmax_overlaps, - np.arange(overlaps.shape[1])] - - labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 - - if True: - # this is sentive to boxes of little overlaps, no need! - # gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] - - # fg label: for each gt, hard-assign anchor with highest overlap despite its overlaps - labels[gt_argmax_overlaps] = 1 - - # exclude examples with little overlaps - # added later - # excludes = np.where(gt_max_overlaps < cfg.FLAGS.bg_threshold)[0] - # labels[gt_argmax_overlaps[excludes]] = -1 + """Matching and Encoding groundtruth into learning targets + Sampling + + Parameters + --------- + gt_boxes: an array of shape (G x 5), [x1, y1, x2, y2, class] + all_anchors: an array of shape (h, w, A, 4), + width: width of feature + height: height of feature + stride: downscale factor w.r.t the input size, e.g., [4, 8, 16, 32] + Returns + -------- + labels: Nx1 array in [0, num_classes] + bbox_targets: N x (4) regression targets + bbox_inside_weights: N x (4), in {0, 1} indicating to which class is assigned. + """ + # TODO: speedup this module + # if all_anchors is None: + # all_anchors = anchors_plane(height, width, stride=stride) + + # # anchors, inds_inside, total_anchors + # border = cfg.FLAGS.allow_border + # all_anchors = all_anchors.reshape((-1, 4)) + # inds_inside = np.where( + # (all_anchors[:, 0] >= -border) & + # (all_anchors[:, 1] >= -border) & + # (all_anchors[:, 2] < (width * stride) + border) & + # (all_anchors[:, 3] < (height * stride) + border))[0] + # anchors = all_anchors[inds_inside, :] + all_anchors = all_anchors.reshape([-1, 4]) + anchors = all_anchors + total_anchors = all_anchors.shape[0] + + # labels = np.zeros((anchors.shape[0], ), dtype=np.float32) + labels = np.empty((anchors.shape[0], ), dtype=np.float32) + labels.fill(-1) + + if gt_boxes.size > 0: + overlaps = cython_bbox.bbox_overlaps( + np.ascontiguousarray(anchors, dtype=np.float), + np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) + + # if _DEBUG: + # print ('gt_boxes shape: ', gt_boxes.shape) + # print ('anchors shape: ', anchors.shape) + # print ('overlaps shape: ', overlaps.shape) + + + gt_assignment = overlaps.argmax(axis=1) # (A) + max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] + gt_argmax_overlaps = overlaps.argmax(axis=0) # G + gt_max_overlaps = overlaps[gt_argmax_overlaps, + np.arange(overlaps.shape[1])] + + labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 + + if _DEBUG: + print ('gt_assignment shape: ', gt_assignment.shape) + print ('max_overlaps shape: ', max_overlaps.shape) + print ('gt_argmax_overlaps shape: ', gt_argmax_overlaps.shape) + print ('gt_max_overlaps shape: ', gt_max_overlaps.shape) + + if True: + # this is sentive to boxes of little overlaps, no need! + # gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] + + # fg label: for each gt, hard-assign anchor with highest overlap despite its overlaps + labels[gt_argmax_overlaps] = 1 + + # exclude examples with little overlaps + # added later + # excludes = np.where(gt_max_overlaps < cfg.FLAGS.bg_threshold)[0] + # labels[gt_argmax_overlaps[excludes]] = -1 + + # if _DEBUG: + # min_ov = np.min(gt_max_overlaps) + # max_ov = np.max(gt_max_overlaps) + # mean_ov = np.mean(gt_max_overlaps) + # if min_ov < cfg.FLAGS.bg_threshold: + # LOG('ANCHOREncoder: overlaps: (min %.3f mean:%.3f max:%.3f), stride: %d, shape:(h:%d, w:%d)' + # % (min_ov, mean_ov, max_ov, stride, height, width)) + # worst = gt_boxes[np.argmin(gt_max_overlaps)] + # anc = anchors[gt_argmax_overlaps[np.argmin(gt_max_overlaps)], :] + # LOG('ANCHOREncoder: worst case: overlap: %.3f, box:(%.1f, %.1f, %.1f, %.1f %d), anchor:(%.1f, %.1f, %.1f, %.1f)' + # % (min_ov, worst[0], worst[1], worst[2], worst[3], worst[4], + # anc[0], anc[1], anc[2], anc[3])) + + + # fg label: above threshold IOU + labels[max_overlaps >= cfg.FLAGS.rpn_fg_threshold] = 1 if _DEBUG: - min_ov = np.min(gt_max_overlaps) - max_ov = np.max(gt_max_overlaps) - mean_ov = np.mean(gt_max_overlaps) - if min_ov < cfg.FLAGS.bg_threshold: - LOG('ANCHOREncoder: overlaps: (min %.3f mean:%.3f max:%.3f), stride: %d, shape:(h:%d, w:%d)' - % (min_ov, mean_ov, max_ov, stride, height, width)) - worst = gt_boxes[np.argmin(gt_max_overlaps)] - anc = anchors[gt_argmax_overlaps[np.argmin(gt_max_overlaps)], :] - LOG('ANCHOREncoder: worst case: overlap: %.3f, box:(%.1f, %.1f, %.1f, %.1f %d), anchor:(%.1f, %.1f, %.1f, %.1f)' - % (min_ov, worst[0], worst[1], worst[2], worst[3], worst[4], - anc[0], anc[1], anc[2], anc[3])) - - - # fg label: above threshold IOU - labels[max_overlaps >= cfg.FLAGS.rpn_fg_threshold] = 1 - # print (np.min(labels), np.max(labels)) - - # subsample positive labels if there are too many - num_fg = int(cfg.FLAGS.fg_rpn_fraction * cfg.FLAGS.rpn_batch_size) - fg_inds = np.where(labels == 1)[0] - if len(fg_inds) > num_fg: - disable_inds = np.random.choice(fg_inds, size=(len(fg_inds) - num_fg), replace=False) + print('highest cover :', gt_max_overlaps.shape) + print('more than 0.7 :', len(max_overlaps >= cfg.FLAGS.rpn_fg_threshold)) + print('labels is 1 :', len(labels == 1)) + + # subsample positive labels if there are too many + num_fg = int(cfg.FLAGS.fg_rpn_fraction * cfg.FLAGS.rpn_batch_size) + fg_inds = np.where(labels == 1)[0] + if len(fg_inds) > num_fg: + disable_inds = np.random.choice(fg_inds, size=(len(fg_inds) - num_fg), replace=False) + labels[disable_inds] = -1 + else: + # if there is no gt + labels[:] = 0 + + # TODO: mild hard negative mining + # subsample negative labels if there are too many + num_fg = np.sum(labels == 1) + num_bg = max(min(cfg.FLAGS.rpn_batch_size - num_fg, num_fg * 3), 8) + bg_inds = np.where(labels == 0)[0] + if len(bg_inds) > num_bg: + disable_inds = np.random.choice(bg_inds, size=(len(bg_inds) - num_bg), replace=False) labels[disable_inds] = -1 - else: - # if there is no gt - labels[:] = 0 - - # TODO: mild hard negative mining - # subsample negative labels if there are too many - num_fg = np.sum(labels == 1) - num_bg = max(min(cfg.FLAGS.rpn_batch_size - num_fg, num_fg * 3), 8) - bg_inds = np.where(labels == 0)[0] - if len(bg_inds) > num_bg: - disable_inds = np.random.choice(bg_inds, size=(len(bg_inds) - num_bg), replace=False) - labels[disable_inds] = -1 - - bbox_targets = np.zeros((total_anchors, 4), dtype=np.float32) - if gt_boxes.size > 0: - bbox_targets = _compute_targets(anchors, gt_boxes[gt_assignment, :]) - bbox_inside_weights = np.zeros((total_anchors, 4), dtype=np.float32) - bbox_inside_weights[labels == 1, :] = 0.1 - - # # mapping to whole outputs - # labels = _unmap(labels, total_anchors, inds_inside, fill=-1) - # bbox_targets = _unmap(bbox_targets, total_anchors, inds_inside, fill=0) - # bbox_inside_weights = _unmap(bbox_inside_weights, total_anchors, inds_inside, fill=0) - - labels = labels.reshape((1, height, width, -1)) - bbox_targets = bbox_targets.reshape((1, height, width, -1)) - bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) - - return labels, bbox_targets, bbox_inside_weights + + bbox_targets = np.zeros((total_anchors, 4), dtype=np.float32) + if gt_boxes.size > 0: + bbox_targets = _compute_targets(anchors, gt_boxes[gt_assignment, :]) + bbox_inside_weights = np.zeros((total_anchors, 4), dtype=np.float32) + bbox_inside_weights[labels == 1, :] = 0.1 + + # # mapping to whole outputs + # labels = _unmap(labels, total_anchors, inds_inside, fill=-1) + # bbox_targets = _unmap(bbox_targets, total_anchors, inds_inside, fill=0) + # bbox_inside_weights = _unmap(bbox_inside_weights, total_anchors, inds_inside, fill=0) + + labels = labels.reshape((1, height, width, -1)) + bbox_targets = bbox_targets.reshape((1, height, width, -1)) + bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) + + return labels, bbox_targets, bbox_inside_weights def decode(boxes, scores, all_anchors, ih, iw): - """Decode outputs into boxes - Parameters - --------- - boxes: an array of shape (1, h, w, Ax4) - scores: an array of shape (1, h, w, Ax2), - all_anchors: an array of shape (1, h, w, Ax4), [x1, y1, x2, y2] - - Returns - -------- - final_boxes: of shape (R x 4) - classes: of shape (R) in {0,1,2,3... K-1} - scores: of shape (R) in [0 ~ 1] - """ - # h, w = boxes.shape[1], boxes.shape[2] - # if all_anchors is None: - # stride = 2 ** int(round(np.log2((iw + 0.0) / w))) - # all_anchors = anchors_plane(h, w, stride=stride) - all_anchors = all_anchors.reshape((-1, 4)) - boxes = boxes.reshape((-1, 4)) - scores = scores.reshape((-1, 2)) - assert scores.shape[0] == boxes.shape[0] == all_anchors.shape[0], \ - 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0],boxes.shape[0],all_anchors.reshape[0]) - boxes = bbox_transform_inv(all_anchors, boxes) - classes = np.argmax(scores, axis=1) - scores = scores[:, 1] - final_boxes = boxes - final_boxes = clip_boxes(final_boxes, (ih, iw)) - classes = classes.astype(np.int32) - return final_boxes, classes, scores + """Decode outputs into boxes + Parameters + --------- + boxes: an array of shape (1, h, w, Ax4) + scores: an array of shape (1, h, w, Ax2), + all_anchors: an array of shape (1, h, w, Ax4), [x1, y1, x2, y2] + + Returns + -------- + final_boxes: of shape (R x 4) + classes: of shape (R) in {0,1,2,3... K-1} + scores: of shape (R) in [0 ~ 1] + """ + # h, w = boxes.shape[1], boxes.shape[2] + # if all_anchors is None: + # stride = 2 ** int(round(np.log2((iw + 0.0) / w))) + # all_anchors = anchors_plane(h, w, stride=stride) + all_anchors = all_anchors.reshape((-1, 4)) + boxes = boxes.reshape((-1, 4)) + scores = scores.reshape((-1, 2)) + assert scores.shape[0] == boxes.shape[0] == all_anchors.shape[0], \ + 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0],boxes.shape[0],all_anchors.reshape[0]) + boxes = bbox_transform_inv(all_anchors, boxes) + classes = np.argmax(scores, axis=1) + scores = scores[:, 1] + final_boxes = boxes + final_boxes = clip_boxes(final_boxes, (ih, iw)) + classes = classes.astype(np.int32) + return final_boxes, classes, scores def sample(boxes, scores, ih, iw, is_training): - """ - Sampling the anchor layer outputs for next stage, mask or roi prediction or roi - - Params - ---------- - boxes: of shape (? ,4) - scores: foreground prob - ih: image height - iw: image width - is_training: 'test' or 'train' - - Returns - ---------- - rois: of shape (N, 4) - scores: of shape (N, 1) - batch_ids: - """ - return + """ + Sampling the anchor layer outputs for next stage, mask or roi prediction or roi + + Params + ---------- + boxes: of shape (? ,4) + scores: foreground prob + ih: image height + iw: image width + is_training: 'test' or 'train' + + Returns + ---------- + rois: of shape (N, 4) + scores: of shape (N, 1) + batch_ids: + """ + return def _unmap(data, count, inds, fill=0): - """ Unmap a subset of item (data) back to the original set of items (of - size count) """ - if len(data.shape) == 1: - ret = np.empty((count,), dtype=np.float32) - ret.fill(fill) - ret[inds] = data - else: - ret = np.empty((count,) + data.shape[1:], dtype=np.float32) - ret.fill(fill) - ret[inds, :] = data - return ret + """ Unmap a subset of item (data) back to the original set of items (of + size count) """ + if len(data.shape) == 1: + ret = np.empty((count,), dtype=np.float32) + ret.fill(fill) + ret[inds] = data + else: + ret = np.empty((count,) + data.shape[1:], dtype=np.float32) + ret.fill(fill) + ret[inds, :] = data + return ret def _compute_targets(ex_rois, gt_rois): - """Compute bounding-box regression targets for an image.""" + """Compute bounding-box regression targets for an image.""" - assert ex_rois.shape[0] == gt_rois.shape[0] - assert ex_rois.shape[1] == 4 - assert gt_rois.shape[1] == 5 + assert ex_rois.shape[0] == gt_rois.shape[0] + assert ex_rois.shape[1] == 4 + assert gt_rois.shape[1] == 5 - return bbox_transform(ex_rois, gt_rois[:, :4]).astype(np.float32, copy=False) + return bbox_transform(ex_rois, gt_rois[:, :4]).astype(np.float32, copy=False) if __name__ == '__main__': - import time - t = time.time() - - for i in range(10): - cfg.FLAGS.fg_threshold = 0.1 - classes = np.random.randint(0, 3, (50, 1)) - boxes = np.random.randint(10, 50, (50, 2)) - s = np.random.randint(20, 50, (50, 2)) - s = boxes + s - boxes = np.concatenate((boxes, s), axis=1) - gt_boxes = np.hstack((boxes, classes)) - # gt_boxes = boxes - rois = np.random.randint(10, 50, (20, 2)) - s = np.random.randint(0, 20, (20, 2)) - s = rois + s - rois = np.concatenate((rois, s), axis=1) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=200, width=300, stride=4) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=100, width=150, stride=8) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=50, width=75, stride=16) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=25, width=37, stride=32) - # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) + import time + t = time.time() + + for i in range(10): + cfg.FLAGS.fg_threshold = 0.1 + classes = np.random.randint(0, 3, (50, 1)) + boxes = np.random.randint(10, 50, (50, 2)) + s = np.random.randint(20, 50, (50, 2)) + s = boxes + s + boxes = np.concatenate((boxes, s), axis=1) + gt_boxes = np.hstack((boxes, classes)) + # gt_boxes = boxes + rois = np.random.randint(10, 50, (20, 2)) + s = np.random.randint(0, 20, (20, 2)) + s = rois + s + rois = np.concatenate((rois, s), axis=1) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=200, width=300, stride=4) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=100, width=150, stride=8) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=50, width=75, stride=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=25, width=37, stride=32) + # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) - print('average time: %f' % ((time.time() - t)/10.0)) + print('average time: %f' % ((time.time() - t)/10.0)) diff --git a/libs/layers/inst.py b/libs/layers/inst.py new file mode 100644 index 0000000..3163c0d --- /dev/null +++ b/libs/layers/inst.py @@ -0,0 +1,141 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +import numpy as np + +import libs.configs.config_v1 as cfg +import libs.boxes.nms_wrapper as nms_wrapper +import libs.boxes.cython_bbox as cython_bbox +from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes +from libs.logs.log import LOG + +_DEBUG=False + +def inference(boxes, classes, prob, class_agnostic=True): + + min_size = cfg.FLAGS.min_size + inst_nms_threshold = cfg.FLAGS.inst_nms_threshold + post_nms_inst_n = cfg.FLAGS.post_nms_inst_n + if class_agnostic is True: + scores = prob[range(prob.shape[0]),classes] + + boxes = boxes.reshape((-1, 4)) + scores = scores.reshape((-1, 1)) + assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' + + # filter background + keeps = np.where(classes != 0)[0] + scores = scores[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + print("after filter bg:", len(classes)) + + # filter minimum size + keeps = _filter_boxes(boxes, min_size=min_size) + scores = scores[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + + #filter with scores + keeps = np.where(scores > 0.5)[0] + scores = scores[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + # filter with nms + det = np.hstack((boxes, scores)).astype(np.float32) + keeps = nms_wrapper.nms(det, inst_nms_threshold) + + + # filter low score + if post_nms_inst_n > 0: + keeps = keeps[:post_nms_inst_n] + scores = scores[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + print("after nms:", len(classes)) + + if len(classes) is 0: + scores = np.zeros((1,81)) + boxes = np.array([[0.0,0.0,2.0,2.0]]) + classes = np.array([[0]]) + + else: + raise "inference nms type error" + + batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) + + return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds + +def _jitter_boxes(boxes, jitter=0.1): + """ jitter the boxes before appending them into rois + """ + jittered_boxes = boxes.copy() + ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 + hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 + width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws + height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs + jittered_boxes[:, 0] += width_offset + jittered_boxes[:, 2] += width_offset + jittered_boxes[:, 1] += height_offset + jittered_boxes[:, 3] += height_offset + + return jittered_boxes + +def _filter_boxes(boxes, min_size): + """Remove all boxes with any side smaller than min_size.""" + ws = boxes[:, 2] - boxes[:, 0] + 1 + hs = boxes[:, 3] - boxes[:, 1] + 1 + keep = np.where((ws >= min_size) & (hs >= min_size))[0] + return keep + +def _apply_nms(boxes, scores, threshold = 0.5): + """After this only positive boxes are left + Applying this class-wise + """ + num_class = scores.shape[1] + assert boxes.shape[0] == scores.shape[0], \ + 'Shape dismatch {} vs {}'.format(boxes.shape, scores.shape) + + final_boxes = [] + final_scores = [] + for cls in np.arange(1, num_class): + cls_boxes = boxes[:, 4*cls: 4*cls+4] + cls_scores = scores[:, cls] + dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) + keep = nms_wrapper.nms(dets, thresh=0.3) + dets = dets[keep, :] + dets = dets[np.where(dets[:, 4] > threshold)] + final_boxes.append(dets[:, :4]) + final_scores.append(dets[:, 4]) + + final_boxes = np.vstack(final_boxes) + final_scores = np.vstack(final_scores) + + return final_boxes, final_scores + +if __name__ == '__main__': + import time + t = time.time() + + for i in range(10): + N = 200000 + boxes = np.random.randint(0, 50, (N, 2)) + s = np.random.randint(10, 40, (N, 2)) + s = boxes + s + boxes = np.hstack((boxes, s)) + + scores = np.random.rand(N, 1) + # scores_ = 1 - np.random.rand(N, 1) + # scores = np.hstack((scores, scores_)) + + boxes, scores = sample_rpn_outputs(boxes, scores, only_positive=False) + + print ('average time %f' % ((time.time() - t) / 10)) diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 72cbdfb..824c5b7 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -92,12 +92,14 @@ def encode(gt_boxes, rois, num_classes): bbox_targets = np.zeros((num_rois, 4 * num_classes), np.float32) bbox_inside_weights = np.zeros((num_rois, 4 * num_classes), np.float32) bg_rois = min(int(cfg.FLAGS.rois_per_image * (1 - cfg.FLAGS.fg_roi_fraction)), 64) + if bg_rois < num_rois: bg_inds = np.arange(num_rois) ignore_inds = np.random.choice(bg_inds, size=num_rois - bg_rois, replace=False) labels[ignore_inds] = -1 + max_overlaps = labels - return labels, bbox_targets, bbox_inside_weights + return labels, bbox_targets, bbox_inside_weights, max_overlaps.astype(np.float32) def decode(boxes, scores, rois, ih, iw): """Decode prediction targets into boxes and only keep only one boxes of greatest possibility for each rois diff --git a/libs/layers/sample.py b/libs/layers/sample.py index fa31e14..b0a3da2 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -69,13 +69,13 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False): # fg_inds = np.where(scores > 0.5)[0] # num_fgs = min(len(fg_inds.size), int(rois_per_image * fg_roi_fraction)) - if _DEBUG: - LOG('SAMPLE: %d rois has been choosen' % len(scores)) - LOG('SAMPLE: a positive box: %d %d %d %d %.4f' % (boxes[0, 0], boxes[0, 1], boxes[0, 2], boxes[0, 3], scores[0])) - LOG('SAMPLE: a negative box: %d %d %d %d %.4f' % (boxes[-1, 0], boxes[-1, 1], boxes[-1, 2], boxes[-1, 3], scores[-1])) - hs = boxes[:, 3] - boxes[:, 1] - ws = boxes[:, 2] - boxes[:, 0] - assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' + # if _DEBUG: + # LOG('SAMPLE: %d rois has been choosen' % len(scores)) + # LOG('SAMPLE: a positive box: %d %d %d %d %.4f' % (boxes[0, 0], boxes[0, 1], boxes[0, 2], boxes[0, 3], scores[0])) + # LOG('SAMPLE: a negative box: %d %d %d %d %.4f' % (boxes[-1, 0], boxes[-1, 1], boxes[-1, 2], boxes[-1, 3], scores[-1])) + # hs = boxes[:, 3] - boxes[:, 1] + # ws = boxes[:, 2] - boxes[:, 0] + # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' return boxes, scores.astype(np.float32), batch_inds @@ -134,6 +134,8 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, keep_inds = bg_inds mask_fg_inds = np.arange(0) + + return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds],\ boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds] diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 0bae544..990c1d1 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -12,6 +12,7 @@ from . import mask from . import sample from . import assign +from . import inst from libs.boxes.anchor import anchors_plane def anchor_encoder(gt_boxes, all_anchors, height, width, stride, scope='AnchorEncoder'): @@ -51,18 +52,20 @@ def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): def roi_encoder(gt_boxes, rois, num_classes, scope='ROIEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights = \ + labels, bbox_targets, bbox_inside_weights, max_overlaps = \ tf.py_func(roi.encode, [gt_boxes, rois, num_classes], - [tf.float32, tf.float32, tf.float32]) + [tf.float32, tf.float32, tf.float32, tf.float32] + ) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (-1, )) bbox_targets = tf.reshape(bbox_targets, (-1, num_classes * 4)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (-1, num_classes * 4)) + max_overlaps = tf.reshape(max_overlaps,(-1, )) - return labels, bbox_targets, bbox_inside_weights + return labels, bbox_targets, bbox_inside_weights, max_overlaps def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): @@ -174,4 +177,66 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): split_tensors.append(tf.gather(t, inds)) assigned_tensors.append(split_tensors) - return assigned_tensors + [assigned_layers] \ No newline at end of file + return assigned_tensors + [assigned_layers] + +def assign_boxes_(gt_boxes, tensors, layers, scope='AssignGTBoxes'): + + with tf.name_scope(scope) as sc: + min_k = layers[0] + max_k = layers[-1] + assigned_layers = \ + tf.py_func(assign.assign_boxes, + [ gt_boxes, min_k, max_k ], + tf.int32) + assigned_layers = tf.reshape(assigned_layers, [-1]) + + assigned_tensors = [] + for t in tensors: + split_tensors = [] + for l in layers: + tf.cast(l, tf.int32) + inds = tf.where(tf.equal(assigned_layers, l)) + inds = tf.reshape(inds, [-1]) + split_tensors.append(tf.gather(t, inds)) + assigned_tensors.append(split_tensors) + + return assigned_tensors + [assigned_layers] + +# def assign_boxes_(gt_boxes, tensors, layers, scope='AssignGTBoxes'): + +# with tf.name_scope(scope) as sc: +# min_k = layers[0] +# max_k = layers[-1] +# assigned_layers = \ +# tf.py_func(assign.assign_boxes, +# [ gt_boxes, min_k, max_k ], +# tf.int32) +# assigned_layers = tf.reshape(assigned_layers, [-1]) + +# assigned_tensors = [] +# for t in tensors: +# split_tensors = [] +# for l in layers: +# tf.cast(l, tf.int32) +# inds = tf.where(tf.equal(assigned_layers, l)) +# inds = tf.reshape(inds, [-1]) +# split_tensors.append(tf.gather(t, inds)) +# assigned_tensors.append(split_tensors) + +# ordered_cropped_rois = tf.concat([assigned_tensors[0][3],assigned_tensors[0][2],assigned_tensors[0][1],assigned_tensors[0][0]],0) + +# return [ordered_cropped_rois] + assigned_tensors + [assigned_layers] + +def inst_inference(final_boxes, classes, cls2_prob, scope='instInference'): + with tf.name_scope(scope) as sc: + inst_boxes, inst_classes, inst_prob, batch_inds = \ + tf.py_func(inst.inference, + [final_boxes, classes, cls2_prob], + [tf.float32, tf.int32, tf.float32, tf.int32]) + + inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') + inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') + inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') + batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + + return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 567c2be..e2630dc 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -19,6 +19,8 @@ from libs.layers import sample_rpn_outputs from libs.layers import sample_rpn_outputs_with_gt from libs.layers import assign_boxes +from libs.layers import assign_boxes_ +from libs.layers import inst_inference from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input _TRAIN_MASK = True @@ -248,14 +250,13 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) rois, roi_clses, scores, = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - # rois, scores, batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) - rois, scores, batch_inds, mask_rois, mask_scores, mask_batch_inds = \ + if is_training is True: + rois, scores, batch_inds, mask_rois, mask_scores, mask_batch_inds = \ sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, is_training=is_training) - - # if is_training: - # # rois, scores, batch_inds = _add_jittered_boxes(rois, scores, batch_inds, gt_boxes) - # rois, scores, batch_inds = _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.2) + else: + rois, scores, batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) + outputs['roi'] = {'box': rois, 'score': scores} ## cropping regions @@ -269,26 +270,18 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g ordered_rois = [] pyramid_feature = [] for i in range(5, 1, -1): - print(i) p = 'P%d'%i splitted_rois = assigned_rois[i-2] batch_inds = assigned_batch_inds[i-2] cropped, boxes_in_crop = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) - # cropped = ROIAlign(pyramid[p], splitted_rois, batch_inds, stride=2**i, - # pooled_height=14, pooled_width=14) cropped_rois.append(cropped) ordered_rois.append(splitted_rois) pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - # if i is 5: - # outputs['tmp_0'] = tf.transpose(pyramid[p],[0,3,1,2]) - # outputs['tmp_1'] = splitted_rois - # outputs['tmp_2'] = tf.transpose(cropped,[0,3,1,2]) - # outputs['tmp_3'] = boxes_in_crop - # outputs['tmp_4'] = [ih, iw] cropped_rois = tf.concat(values=cropped_rois, axis=0) ordered_rois = tf.concat(values=ordered_rois, axis=0) + #pyramid_feature = tf.concat(values=pyramid_feature, axis=0) outputs['ordered_rois'] = ordered_rois @@ -317,30 +310,40 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g final_boxes, classes, scores = \ roi_decoder(box, cls2_prob, ordered_rois, ih, iw) - #outputs['tmp_0'] = ordered_rois - #outputs['tmp_1'] = assigned_rois - #outputs['tmp_2'] = box - #outputs['tmp_3'] = final_boxes - #outputs['tmp_4'] = cls2_prob + - #outputs['final_boxes'] = {'box': final_boxes, 'cls': classes} - outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob} ## for testing, maskrcnn takes refined boxes as inputs if not is_training: - rois = final_boxes - # [assigned_rois, assigned_batch_inds, assigned_layer_inds] = \ - # assign_boxes(rois, [rois, batch_inds], [2, 3, 4, 5]) + + inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) + [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) + + cropped_rois = [] + ordered_inst_boxes = [] + ordered_inst_classes = [] + ordered_inst_prob = [] for i in range(5, 1, -1): p = 'P%d'%i splitted_rois = assigned_rois[i-2] + splitted_classes = assigned_classes[i-2] + splitted_prob = assigned_prob[i-2] batch_inds = assigned_batch_inds[i-2] - cropped = ROIAlign(pyramid[p], splitted_rois, batch_inds, stride=2**i, + cropped, boxes_in_crop = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) cropped_rois.append(cropped) - ordered_rois.append(splitted_rois) + ordered_inst_boxes.append(splitted_rois) + ordered_inst_classes.append(splitted_classes) + ordered_inst_prob.append(splitted_prob) + + cropped_rois = tf.concat(values=cropped_rois, axis=0) - ordered_rois = tf.concat(values=ordered_rois, axis=0) - + ordered_inst_boxes = tf.concat(values=ordered_inst_boxes, axis=0) + ordered_inst_classes = tf.concat(values=ordered_inst_classes, axis=0) + ordered_inst_prob = tf.concat(values=ordered_inst_prob, axis=0) + outputs['final_boxes'] = {'box': ordered_inst_boxes, 'cls': ordered_inst_classes, 'prob': ordered_inst_prob, 'rpn_box': ordered_rois} + else: + outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} + ## mask head m = cropped_rois for _ in range(4): @@ -460,10 +463,11 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, boxes = outputs['refined']['box'] classes = outputs['refined']['cls'] - labels, bbox_targets, bbox_inside_weights = \ + labels, bbox_targets, bbox_inside_weights, max_overlaps = \ roi_encoder(gt_boxes, ordered_rois, num_classes, scope='ROIEncoder') outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) + outputs['final_boxes']['max_overlaps'] = max_overlaps outputs['gt'] = gt_boxes labels, classes, boxes, bbox_targets, bbox_inside_weights = \ _filter_negative_samples(tf.reshape(labels, [-1]),[ diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index e7665af..e517553 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -1,44 +1,69 @@ import numpy as np import tensorflow as tf from PIL import Image, ImageFont, ImageDraw, ImageEnhance +from scipy.misc import imresize FLAGS = tf.app.flags.FLAGS _DEBUG = False def draw_img(step, image, name='', image_height=1, image_width=1, rois=None): - #print("image") - #print(image) - #norm_image = np.uint8(image/np.max(np.abs(image))*255.0) - norm_image = np.uint8(image/0.1*127.0 + 127.0) - #print("norm_image") - #print(norm_image) - source_img = Image.fromarray(norm_image) - return source_img.save(FLAGS.train_dir + 'test_' + name + '_' + str(step) +'.jpg', 'JPEG') + img = np.uint8(image/0.1*127.0 + 127.0) + img = Image.fromarray(img) + return img.save(FLAGS.train_dir + 'test_' + name + '_' + str(step) +'.jpg', 'JPEG') -def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, label=None, gt_label=None, prob=None): - #print(prob[:,label]) +def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, label=None, gt_label=None, mask=None, prob=None, iou=None, vis_th=0.7, vis_all=False, ignore_bg=True): source_img = Image.fromarray(image) b, g, r = source_img.split() source_img = Image.merge("RGB", (r, g, b)) draw = ImageDraw.Draw(source_img) color = '#0000ff' + if mask is not None: + m = np.array(mask*255.0) + m = np.transpose(m,(0,3,1,2)) if bbox is not None: for i, box in enumerate(bbox): if label is not None: if prob is not None: - if (prob[i,label[i]] > 0.5) and (label[i] > 0): + if ((prob[i,label[i]] > vis_th) or (vis_all is True)) and ((ignore_bg is True) and (label[i] > 0)) : if gt_label is not None: - text = cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]) + if gt_label is not None and len(iou) > 1: + text = cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]) + ' : ' + str(iou[i])[:3] + else: + text = cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]) + ' : ' + str(prob[i][label[i]])[:4] if label[i] != gt_label[i]: color = '#ff0000'#draw.text((2+bbox[i,0], 2+bbox[i,1]), cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]), fill='#ff0000') else: color = '#0000ff' else: - text = cat_id_to_cls_name(label[i]) + text = cat_id_to_cls_name(label[i]) + ' : ' + str(prob[i][label[i]])[:4] draw.text((2+bbox[i,0], 2+bbox[i,1]), text, fill=color) + if _DEBUG is True: print("plot",label[i], prob[i,label[i]]) draw.rectangle(box,fill=None,outline=color) + + if mask is not None: + # print("mask number: ",i) + # print(box) + box = np.floor(box).astype('uint16') + bbox_w = box[2]-box[0] + bbox_h = box[3]-box[1] + mask_color_id = np.random.randint(15) + color_img = color_id_to_color_code(mask_color_id)* np.ones((bbox_h,bbox_w,1)) * 255 + color_img = Image.fromarray(color_img.astype('uint8')).convert('RGBA') + #color_img = Image.new("RGBA", (bbox_w,bbox_h), np.random.rand(1,3) * 255 ) + # print(bbox_w, bbox_h, i, label[i], bbox.shape) + resized_m = imresize(m[i][label[i]], [bbox_h, bbox_w], interp='nearest') + resized_m[resized_m >= 128] = 128 + resized_m[resized_m < 128] = 0 + resized_m = Image.fromarray(resized_m.astype('uint8'), 'L') + #print(box) + #print(resized_m) + + source_img.paste(color_img , (box[0], box[1]), mask=resized_m) + + #return source_img.save(FLAGS.train_dir + 'est_imgs/' + name + '_' + str(step) +'.jpg', 'JPEG') + else: if _DEBUG is True: print("skip",label[i], prob[i,label[i]]) @@ -47,8 +72,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la draw.text((2+bbox[i,0], 2+bbox[i,1]), text, fill=color) draw.rectangle(box,fill=None,outline=color) - - return source_img.save(FLAGS.train_dir + '/est_imgs/test_' + name + '_' + str(step) +'.jpg', 'JPEG') + return source_img.save(FLAGS.train_dir + 'est_imgs/' + name + '_' + str(step) +'.jpg', 'JPEG') def cat_id_to_cls_name(catId): cls_name = np.array([ 'background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', @@ -65,4 +89,22 @@ def cat_id_to_cls_name(catId): 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']) - return cls_name[catId] \ No newline at end of file + return cls_name[catId] + +def color_id_to_color_code(colorId): + color_code = np.array([[178, 31, 53], + [216, 39, 53], + [255, 116, 53], + [255, 161, 53], + [255, 203, 53], + [255, 255, 53], + [0, 117, 58], + [0, 158, 71], + [22, 221, 53], + [0, 82, 165], + [0, 121, 231], + [0, 169, 252], + [104, 30, 126], + [125, 60, 181], + [189, 122, 246]]) + return color_code[colorId] diff --git a/train/test.py b/train/test.py new file mode 100644 index 0000000..ed1e420 --- /dev/null +++ b/train/test.py @@ -0,0 +1,286 @@ +#!/usr/bin/env python +# coding=utf-8 +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import os, sys +import time +import numpy as np +import tensorflow as tf +import tensorflow.contrib.slim as slim +from time import gmtime, strftime + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) +import libs.configs.config_v1 as cfg +import libs.datasets.dataset_factory as datasets +import libs.nets.nets_factory as network + +import libs.preprocessings.coco_v1 as coco_preprocess +import libs.nets.pyramid_network as pyramid_network +import libs.nets.resnet_v1 as resnet_v1 + +from train.train_utils import _configure_learning_rate, _configure_optimizer, \ + _get_variables_to_train, _get_init_fn, get_var_list_to_restore + +from PIL import Image, ImageFont, ImageDraw, ImageEnhance +from libs.datasets import download_and_convert_coco +from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox + +FLAGS = tf.app.flags.FLAGS +resnet50 = resnet_v1.resnet_v1_50 + +def solve(global_step): + """add solver to losses""" + # learning reate + lr = _configure_learning_rate(82783, global_step) + optimizer = _configure_optimizer(lr) + tf.summary.scalar('learning_rate', lr) + + # compute and apply gradient + losses = tf.get_collection(tf.GraphKeys.LOSSES) + regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + regular_loss = tf.add_n(regular_losses) + out_loss = tf.add_n(losses) + total_loss = tf.add_n(losses + regular_losses) + + tf.summary.scalar('total_loss', total_loss) + tf.summary.scalar('out_loss', out_loss) + tf.summary.scalar('regular_loss', regular_loss) + + update_ops = [] + variables_to_train = _get_variables_to_train() + # update_op = optimizer.minimize(total_loss) + gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) + grad_updates = optimizer.apply_gradients(gradients, + global_step=global_step) + update_ops.append(grad_updates) + + # update moving mean and variance + if FLAGS.update_bn: + update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + update_bn = tf.group(*update_bns) + update_ops.append(update_bn) + + return tf.group(*update_ops) + +def restore(sess): + """choose which param to restore""" + if FLAGS.restore_previous_if_exists: + try: + checkpoint_path = tf.train.latest_checkpoint(FLAGS.train_dir) + ########### + restorer = tf.train.Saver() + + restorer.restore(sess, checkpoint_path) + print ('restored previous model %s from %s'\ + %(checkpoint_path, FLAGS.train_dir)) + time.sleep(2) + return + except: + print ('--restore_previous_if_exists is set, but failed to restore in %s %s'\ + % (FLAGS.train_dir, checkpoint_path)) + time.sleep(2) + + if FLAGS.pretrained_model: + if tf.gfile.IsDirectory(FLAGS.pretrained_model): + checkpoint_path = tf.train.latest_checkpoint(FLAGS.pretrained_model) + else: + checkpoint_path = FLAGS.pretrained_model + + if FLAGS.checkpoint_exclude_scopes is None: + FLAGS.checkpoint_exclude_scopes='pyramid' + if FLAGS.checkpoint_include_scopes is None: + FLAGS.checkpoint_include_scopes='resnet_v1_50' + + vars_to_restore = get_var_list_to_restore() + for var in vars_to_restore: + print ('restoring ', var.name) + + try: + restorer = tf.train.Saver(vars_to_restore) + restorer.restore(sess, checkpoint_path) + print ('Restored %d(%d) vars from %s' %( + len(vars_to_restore), len(tf.global_variables()), + checkpoint_path )) + except: + print ('Checking your params %s' %(checkpoint_path)) + raise + +def test(): + """The main function that runs training""" + + ## data + image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ + datasets.get_dataset(FLAGS.dataset_name, + FLAGS.dataset_split_name, + FLAGS.dataset_dir, + FLAGS.im_batch, + is_training=False) + + # data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, + # dtypes=( + # image.dtype, ih.dtype, iw.dtype, + # gt_boxes.dtype, gt_masks.dtype, + # num_instances.dtype, img_id.dtype)) + # enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) + # data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) + # tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) + # (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() + im_shape = tf.shape(image) + image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) + + ## network + logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, + weight_decay=FLAGS.weight_decay, is_training=True) + outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, + num_classes=81, + base_anchors=9, + is_training=False, + gt_boxes=gt_boxes, gt_masks=gt_masks, + loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) + + input_image = end_points['input'] + final_box = outputs['final_boxes']['box'] + final_cls = outputs['final_boxes']['cls'] + final_prob = outputs['final_boxes']['prob'] + final_rpn_box = outputs['final_boxes']['rpn_box'] + final_mask = outputs['mask']['mask'] + + ############################# + tmp_0 = outputs['mask']['mask'] + tmp_1 = outputs['mask']['mask'] + tmp_2 = outputs['mask']['mask'] + tmp_3 = outputs['mask']['mask'] + tmp_4 = outputs['mask']['mask'] + ############################ + + + ## solvers + global_step = slim.create_global_step() + #update_op = solve(global_step) + + cropped_rois = tf.get_collection('__CROPPED__')[0] + transposed = tf.get_collection('__TRANSPOSED__')[0] + + gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) + sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) + init_op = tf.group( + tf.global_variables_initializer(), + tf.local_variables_initializer() + ) + sess.run(init_op) + + summary_op = tf.summary.merge_all() + logdir = os.path.join(FLAGS.train_dir, strftime('%Y%m%d%H%M%S', gmtime())) + if not os.path.exists(logdir): + os.makedirs(logdir) + summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph) + + ## restore + restore(sess) + + ## main loop + coord = tf.train.Coordinator() + threads = [] + # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) + for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): + threads.extend(qr.create_threads(sess, coord=coord, daemon=True, + start=True)) + + tf.train.start_queue_runners(sess=sess, coord=coord) + saver = tf.train.Saver(max_to_keep=20) + + for step in range(FLAGS.max_iters): + + start_time = time.time() + + img_id_str, \ + gt_boxesnp, \ + input_imagenp, final_boxnp, final_clsnp, final_probnp, final_rpn_boxnp, final_masknp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ + sess.run([img_id] + + [gt_boxes] + + [input_image] + [final_box] + [final_cls] + [final_prob] + [final_rpn_box] + [final_mask] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) + + duration_time = time.time() - start_time + if step % 1 == 0: + print ( """iter %d: image-id:%07d, time:%.3f(sec), """ + """instances: %d, """ + + % (step, img_id_str, duration_time, + gt_boxesnp.shape[0])) + + # print("tmp") + # print(np.asarray(tmp_0np).shape) + # print(np.asarray(tmp_1np).shape) + # print(np.asarray(tmp_2np).shape) + + # print ("labels") + # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) + # print ("classes") + # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + + #print ("iw", np.asanyarray(tmp_4np)) + #if np.asarray(tmp_3np[3]).shape[0]>=1: + #print ("ordered_rois") + #print (np.asarray(tmp_0np)[0]) + #print ("pyramid_feature") + #print ("p5",np.asarray(tmp_1np[0]).shape) + #print (np.asarray(tmp_1np[0][0][0])) + + #print ("real_pyramid") + #print (np.asarray(tmp_4np).shape) + #print (np.asarray(tmp_4np)[0][0]) + #print ("p4",np.asanyarray(tmp_1np[1]).shape) + #print ("p3",np.asanyarray(tmp_1np[2]).shape) + #print ("p2",np.asanyarray(tmp_1np[3]).shape) + + #print ("cropped_rois") + #print (np.asarray(tmp_2np).shape) + #print (np.asarray(tmp_2np)[0][0]) + # print ("assigned_layer_num") + # print ("p5:",np.asarray(tmp_3np[3]).shape[0]) + # print ("p4:",np.asarray(tmp_3np[2]).shape[0]) + # print ("p3:",np.asarray(tmp_3np[1]).shape[0]) + # print ("p2:",np.asarray(tmp_3np[0]).shape[0]) + if step % 1 == 0: + draw_bbox(step, + np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + name='test_est', + bbox=final_boxnp, + label=final_clsnp, + prob=final_probnp, + mask=final_masknp,) + + draw_bbox(step, + np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + name='test_roi', + bbox=final_boxnp, + label=final_clsnp, + prob=final_probnp, + ) + # print ("boxes") + # print (np.asarray(final_boxnp).shape) + # print ("classes") + # print (cat_id_to_cls_name(np.unique(np.asarray(final_clsnp)))) + #print (cat_id_to_cls_name(np.unique(np.argmax(np.array(final_clsnp),axis=1)))) + + + if step % 100 == 0: + summary_str = sess.run(summary_op) + summary_writer.add_summary(summary_str, step) + summary_writer.flush() + + if (step % 10000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: + checkpoint_path = os.path.join(FLAGS.train_dir, + FLAGS.dataset_name + '_' + FLAGS.network + '_model.ckpt') + saver.save(sess, checkpoint_path, global_step=step) + + if coord.should_stop(): + coord.request_stop() + coord.join(threads) + + +if __name__ == '__main__': + test() diff --git a/train/train.py b/train/train.py index c171b92..e2b0cb0 100644 --- a/train/train.py +++ b/train/train.py @@ -26,7 +26,6 @@ from PIL import Image, ImageFont, ImageDraw, ImageEnhance from libs.datasets import download_and_convert_coco -#from libs.datasets.download_and_convert_coco import _cat_id_to_cls_name from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox FLAGS = tf.app.flags.FLAGS @@ -67,8 +66,8 @@ def solve(global_step): return tf.group(*update_ops) def restore(sess): - """choose which param to restore""" - if FLAGS.restore_previous_if_exists: + """choose which param to restore""" + if FLAGS.restore_previous_if_exists: try: checkpoint_path = tf.train.latest_checkpoint(FLAGS.train_dir) ########### @@ -134,7 +133,7 @@ def restore(sess): % (FLAGS.train_dir, checkpoint_path)) time.sleep(2) - if FLAGS.pretrained_model: + if FLAGS.pretrained_model: if tf.gfile.IsDirectory(FLAGS.pretrained_model): checkpoint_path = tf.train.latest_checkpoint(FLAGS.pretrained_model) else: @@ -203,6 +202,9 @@ def train(): final_cls = outputs['final_boxes']['cls'] final_prob = outputs['final_boxes']['prob'] final_gt_cls = outputs['final_boxes']['gt_cls'] + final_rpn_box = outputs['final_boxes']['rpn_box'] + final_max_overlaps = outputs['final_boxes']['max_overlaps'] + final_mask = outputs['mask']['mask'] gt = outputs['gt'] ############################# @@ -213,8 +215,8 @@ def train(): tmp_4 = outputs['losses'] # tmp_0 = outputs['tmp_0'] - # tmp_1 = outputs['tmp_1'] - # tmp_2 = outputs['tmp_2'] + #tmp_1 = outputs['tmp_1'] + #tmp_2 = outputs['tmp_2'] tmp_3 = outputs['tmp_3'] tmp_4 = outputs['tmp_4'] ############################ @@ -227,7 +229,7 @@ def train(): cropped_rois = tf.get_collection('__CROPPED__')[0] transposed = tf.get_collection('__TRANSPOSED__')[0] - gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) + gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) init_op = tf.group( tf.global_variables_initializer(), @@ -263,12 +265,12 @@ def train(): rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, \ gt_boxesnp, \ rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch, \ - input_imagenp, final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, gtnp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ + input_imagenp, final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ sess.run([update_op, total_loss, regular_loss, img_id] + losses + [gt_boxes] + batch_info + - [input_image] + [final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [gt] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) + [input_image] + [final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) duration_time = time.time() - start_time if step % 1 == 0: @@ -281,40 +283,68 @@ def train(): gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch)) - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='est', - # bbox=final_boxnp, - # label=final_clsnp, - # prob=final_probnp, - # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), - # ) - - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='gt', - # bbox=gtnp[:,0:4], - # label=np.asarray(gtnp[:,4], dtype=np.uint8), - # ) + # print ("labels") + # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) + # print ("classes") + # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + + #print ("iw", np.asanyarray(tmp_4np)) + #if np.asarray(tmp_3np[3]).shape[0]>=1: + #print ("ordered_rois") + #print (np.asarray(tmp_0np)[0]) + #print ("pyramid_feature") + #print ("p5",np.asarray(tmp_1np[0]).shape) + #print (np.asarray(tmp_1np[0][0][0])) + + #print ("real_pyramid") + #print (np.asarray(tmp_4np).shape) + #print (np.asarray(tmp_4np)[0][0]) + #print ("p4",np.asanyarray(tmp_1np[1]).shape) + #print ("p3",np.asanyarray(tmp_1np[2]).shape) + #print ("p2",np.asanyarray(tmp_1np[3]).shape) + + #print ("cropped_rois") + #print (np.asarray(tmp_2np).shape) + #print (np.asarray(tmp_2np)[0][0]) + # print ("assigned_layer_num") + # print ("p5:",np.asarray(tmp_3np[3]).shape[0]) + # print ("p4:",np.asarray(tmp_3np[2]).shape[0]) + # print ("p3:",np.asarray(tmp_3np[1]).shape[0]) + # print ("p2:",np.asarray(tmp_3np[0]).shape[0]) + if step % 10 == 0: + draw_bbox(step, + np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + name='train_est', + bbox=final_rpn_boxnp, + label=final_clsnp, + prob=final_probnp, + mask=final_masknp, + gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), + iou=final_max_overlapsnp, + vis_all=True + ) + + draw_bbox(step, + np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + name='train_roi', + bbox=final_rpn_boxnp, + label=final_clsnp, + prob=final_probnp, + gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), + iou=final_max_overlapsnp + ) + + draw_bbox(step, + np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + name='train_gt', + bbox=gtnp[:,0:4], + label=np.asarray(gtnp[:,4], dtype=np.uint8), + ) print ("labels") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(final_gt_clsnp),axis=1)))[1:]) - # print (cat_id_to_cls_name(np.unique(np.asarray(gt_boxesnp, dtype=np.uint8)[:,4]))) print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) - #print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(gt_boxesnp)[:,4],axis=1)))) print ("classes") print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) - # print (np.asanyarray(tmp_3np)) - - #print ("ordered rois") - #print (np.asarray(tmp_0np)[0]) - #print ("pyramid_feature") - #print () - #print(np.unique(np.argmax(np.array(final_probnp),axis=1))) - #for var, val in zip(tmp_2, tmp_2np): - # print(var.name) - #print(np.argmax(np.array(tmp_0np),axis=1)) - if np.isnan(tot_loss) or np.isinf(tot_loss): print (gt_boxesnp) From b0f41c83ae8193dfe84a8a2aac4eeffa5e8c416c Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 17 Jul 2017 15:27:42 +0900 Subject: [PATCH 02/35] fixed multiple mask related issue - bad assignment in mask.py - smoothen the cropped features from pyramid in crop.py - other visualization and minor parameter tuning fixed network setting - add relu and maxpooling pad to non-batch normalization scope --- libs/boxes/bbox_transform.py | 27 +- libs/configs/config_v1.py | 13 +- libs/datasets/coco.py | 2 +- libs/datasets/pycocotools/_mask.c | 7414 ++++++++++++----------------- libs/layers/__init__.py | 1 + libs/layers/anchor.py | 4 +- libs/layers/crop.py | 10 +- libs/layers/inst.py | 2 + libs/layers/mask.py | 102 +- libs/layers/roi.py | 12 +- libs/layers/sample.py | 4 +- libs/layers/wrapper.py | 21 +- libs/nets/pyramid_network.py | 71 +- libs/visualization/pil_utils.py | 11 +- train/test.py | 358 +- train/train.py | 120 +- unit_test/resnet50_test.py | 4 +- 17 files changed, 3558 insertions(+), 4618 deletions(-) diff --git a/libs/boxes/bbox_transform.py b/libs/boxes/bbox_transform.py index d284957..2df3b6e 100644 --- a/libs/boxes/bbox_transform.py +++ b/libs/boxes/bbox_transform.py @@ -31,10 +31,16 @@ def bbox_transform(ex_rois, gt_rois): # warnings.catch_warnings() # warnings.filterwarnings('error') - targets_dx = 10.0 * (gt_ctr_x - ex_ctr_x) / ex_widths - targets_dy = 10.0 * (gt_ctr_y - ex_ctr_y) / ex_heights - targets_dw = 5.0 * np.log(gt_widths / ex_widths) - targets_dh = 5.0 * np.log(gt_heights / ex_heights) + + # targets_dx = 10.0 * (gt_ctr_x - ex_ctr_x) / ex_widths + # targets_dy = 10.0 * (gt_ctr_y - ex_ctr_y) / ex_heights + # targets_dw = 5.0 * np.log(gt_widths / ex_widths) + # targets_dh = 5.0 * np.log(gt_heights / ex_heights) + + targets_dx = (gt_ctr_x - ex_ctr_x) / ex_widths + targets_dy = (gt_ctr_y - ex_ctr_y) / ex_heights + targets_dw = np.log(gt_widths / ex_widths) + targets_dh = np.log(gt_heights / ex_heights) targets = np.vstack( (targets_dx, targets_dy, targets_dw, targets_dh)).transpose() @@ -51,10 +57,15 @@ def bbox_transform_inv(boxes, deltas): ctr_x = boxes[:, 0] + 0.5 * widths ctr_y = boxes[:, 1] + 0.5 * heights - dx = deltas[:, 0::4] * 0.1 - dy = deltas[:, 1::4] * 0.1 - dw = deltas[:, 2::4] * 0.2 - dh = deltas[:, 3::4] * 0.2 + # dx = deltas[:, 0::4] * 0.1 + # dy = deltas[:, 1::4] * 0.1 + # dw = deltas[:, 2::4] * 0.2 + # dh = deltas[:, 3::4] * 0.2 + + dx = deltas[:, 0::4] + dy = deltas[:, 1::4] + dw = deltas[:, 2::4] + dh = deltas[:, 3::4] pred_ctr_x = dx * widths[:, np.newaxis] + ctr_x[:, np.newaxis] pred_ctr_y = dy * heights[:, np.newaxis] + ctr_y[:, np.newaxis] diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 5c1a29e..b4f7e46 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.002, +tf.app.flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.') tf.app.flags.DEFINE_float( @@ -226,14 +226,15 @@ ####################### # BOX Flags # ####################### -tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( 'rpn_fg_threshold', 0.7, 'Only regions which intersection is larger than fg_threshold are considered to be fg') +tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') + tf.app.flags.DEFINE_float( 'fg_threshold', 0.7, 'Only regions which intersection is larger than fg_threshold are considered to be fg') @@ -243,7 +244,7 @@ 'Only regions which intersection is less than bg_threshold are considered to be bg') tf.app.flags.DEFINE_integer( - 'rois_per_image', 256, + 'rois_per_image', 512, 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_float( @@ -298,7 +299,7 @@ 'mask_threshold', 0.50, 'Least intersection of a positive mask') tf.app.flags.DEFINE_integer( - 'masks_per_image', 64, + 'masks_per_image', 128, 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_float( diff --git a/libs/datasets/coco.py b/libs/datasets/coco.py index 464a8c5..b87563d 100644 --- a/libs/datasets/coco.py +++ b/libs/datasets/coco.py @@ -95,7 +95,7 @@ def read(tfrecords_filename): if not isinstance(tfrecords_filename, list): tfrecords_filename = [tfrecords_filename] filename_queue = tf.train.string_input_producer( - tfrecords_filename, num_epochs=100) + tfrecords_filename, num_epochs=1)#100 options = tf.python_io.TFRecordOptions(TFRecordCompressionType.ZLIB) reader = tf.TFRecordReader(options=options) diff --git a/libs/datasets/pycocotools/_mask.c b/libs/datasets/pycocotools/_mask.c index 9b1ccf5..e1fc5f9 100644 --- a/libs/datasets/pycocotools/_mask.c +++ b/libs/datasets/pycocotools/_mask.c @@ -1,11 +1,11 @@ -/* Generated by Cython 0.25.2 */ +/* Generated by Cython 0.23.4 */ /* BEGIN: Cython Metadata { "distutils": { "depends": [ - "/home/shang/anaconda2/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h", - "/home/shang/anaconda2/lib/python2.7/site-packages/numpy/core/include/numpy/ufuncobject.h", + "/usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h", + "/usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ufuncobject.h", "common/maskApi.h" ], "extra_compile_args": [ @@ -14,15 +14,14 @@ "-std=c99" ], "include_dirs": [ - "/home/shang/anaconda2/lib/python2.7/site-packages/numpy/core/include", + "/usr/local/lib/python2.7/dist-packages/numpy/core/include", "./common" ], "language": "c", "sources": [ "./common/maskApi.c" ] - }, - "module_name": "_mask" + } } END: Cython Metadata */ @@ -33,10 +32,10 @@ END: Cython Metadata */ #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) #error Cython requires Python 2.6+ or Python 3.2+. #else -#define CYTHON_ABI "0_25_2" +#define CYTHON_ABI "0_23_4" #include #ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall @@ -55,11 +54,6 @@ END: Cython Metadata */ #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x03030000 || (PY_MAJOR_VERSION == 2 && PY_VERSION_HEX >= 0x02070000) - #define HAVE_LONG_LONG - #endif -#endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif @@ -67,120 +61,17 @@ END: Cython Metadata */ #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 +#define CYTHON_COMPILING_IN_PYPY 1 +#define CYTHON_COMPILING_IN_CPYTHON 0 #else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif +#define CYTHON_COMPILING_IN_PYPY 0 +#define CYTHON_COMPILING_IN_CPYTHON 1 #endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #undef SHIFT - #undef BASE - #undef MASK +#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000 +#define CYTHON_USE_PYLONG_INTERNALS 1 #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 +#define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" @@ -207,45 +98,23 @@ END: Cython Metadata */ #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif -#ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject **args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) @@ -258,24 +127,6 @@ END: Cython Metadata */ #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 @@ -283,9 +134,6 @@ END: Cython Metadata */ #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject @@ -304,7 +152,6 @@ END: Cython Metadata */ #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type @@ -343,20 +190,18 @@ END: Cython Metadata */ #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif +#if PY_VERSION_HEX >= 0x030500B1 +#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods +#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) +#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 +typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; +} __Pyx_PyAsyncMethodsStruct; +#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #else - #define __Pyx_PyType_AsAsync(obj) NULL +#define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) @@ -369,39 +214,10 @@ END: Cython Metadata */ #define CYTHON_RESTRICT #endif #endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) + #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline @@ -425,18 +241,8 @@ static CYTHON_INLINE float __PYX_NAN() { return value; } #endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif -#define __PYX_ERR(f_index, lineno, Ln_error) \ -{ \ - __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ -} - #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) @@ -453,11 +259,11 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #endif -#define __PYX_HAVE__thirdparty__pycocotools___mask -#define __PYX_HAVE_API__thirdparty__pycocotools___mask -#include -#include -#include +#define __PYX_HAVE__libs__datasets__pycocotools___mask +#define __PYX_HAVE_API__libs__datasets__pycocotools___mask +#include "string.h" +#include "stdio.h" +#include "stdlib.h" #include "numpy/arrayobject.h" #include "numpy/ufuncobject.h" #include "maskApi.h" @@ -469,7 +275,27 @@ static CYTHON_INLINE float __PYX_NAN() { #define CYTHON_WITHOUT_ASSERTIONS #endif -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 @@ -543,21 +369,15 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_ASSUME_SAFE_MACROS +#if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { @@ -648,13 +468,11 @@ static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; -/* Header.proto */ #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 @@ -678,11 +496,10 @@ static const char *__pyx_filename; static const char *__pyx_f[] = { - "thirdparty/pycocotools/_mask.pyx", + "libs/datasets/pycocotools/_mask.pyx", "__init__.pxd", "type.pxd", }; -/* BufferFormatStructs.proto */ #define IS_UNSIGNED(type) (((type) -1) > 0) struct __Pyx_StructField_; #define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) @@ -719,7 +536,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":725 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":725 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -728,7 +545,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":726 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":726 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -737,7 +554,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":727 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":727 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -746,7 +563,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":728 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":728 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -755,7 +572,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":732 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -764,7 +581,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":733 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -773,7 +590,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":734 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":734 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -782,7 +599,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":735 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":735 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -791,7 +608,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":739 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -800,7 +617,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":740 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -809,7 +626,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":749 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":749 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -818,7 +635,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":750 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":750 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -827,7 +644,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":751 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":751 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -836,7 +653,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":753 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":753 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -845,7 +662,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":754 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -854,7 +671,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":755 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -863,7 +680,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":757 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":757 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -872,7 +689,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":758 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -881,7 +698,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -890,7 +707,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":761 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":761 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -899,7 +716,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -907,7 +724,6 @@ typedef npy_double __pyx_t_5numpy_double_t; * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; -/* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; @@ -917,9 +733,7 @@ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif -static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); -/* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; @@ -929,14 +743,13 @@ static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(floa #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif -static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); /*--- Type declarations ---*/ -struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs; -struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks; +struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs; +struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":764 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":764 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -945,7 +758,7 @@ struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":765 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -954,7 +767,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":766 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -963,7 +776,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":768 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":768 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -972,28 +785,28 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; */ typedef npy_cdouble __pyx_t_5numpy_complex_t; -/* "thirdparty/pycocotools/_mask.pyx":56 +/* "libs/datasets/pycocotools/_mask.pyx":56 * # python class to wrap RLE array in C * # the class handles the memory allocation and deallocation * cdef class RLEs: # <<<<<<<<<<<<<< * cdef RLE *_R * cdef siz _n */ -struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs { +struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs { PyObject_HEAD RLE *_R; siz _n; }; -/* "thirdparty/pycocotools/_mask.pyx":77 +/* "libs/datasets/pycocotools/_mask.pyx":77 * # python class to wrap Mask array in C * # the class handles the memory allocation and deallocation * cdef class Masks: # <<<<<<<<<<<<<< * cdef byte *_mask * cdef siz _h */ -struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks { +struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks { PyObject_HEAD byte *_mask; siz _h; @@ -1003,7 +816,6 @@ struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks { /* --- Runtime support code (head) --- */ -/* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif @@ -1066,8 +878,7 @@ struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks { #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS +#if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) @@ -1082,80 +893,46 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif -/* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); -/* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); -/* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); -/* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); -/* IncludeStringH.proto */ #include -/* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); -/* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); -/* StrEquals.proto */ #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals #else #define __Pyx_PyString_Equals __Pyx_PyBytes_Equals #endif -/* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = PyThreadState_GET(); -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); -/* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); -/* ExtTypeTest.proto */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); -/* ArgTypeTest.proto */ static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); -/* ListAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +#if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); @@ -1171,52 +948,28 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { #define __Pyx_PyList_Append(L,x) PyList_Append(L,x) #endif -/* PyIntBinop.proto */ -#if !CYTHON_COMPILING_IN_PYPY +#if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); #else #define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) #endif -/* PyIntBinop.proto */ -#if !CYTHON_COMPILING_IN_PYPY +#if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, long intval, int inplace); #else #define __Pyx_PyInt_EqObjC(op1, op2, intval, inplace)\ PyObject_RichCompare(op1, op2, Py_EQ) #endif -/* GetModuleGlobalName.proto */ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#endif - -/* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif -/* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); -/* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ @@ -1238,17 +991,11 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); -/* BufferFormatCheck.proto */ static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); -static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); -static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, - __Pyx_BufFmt_StackElem* stack, - __Pyx_TypeInfo* type); // PROTO -/* ListCompAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +#if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); @@ -1264,10 +1011,8 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { #define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) #endif -/* FetchCommonType.proto */ static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); -/* CythonFunction.proto */ #define __Pyx_CyFunction_USED 1 #include #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 @@ -1321,23 +1066,18 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, PyObject *dict); static int __pyx_CyFunction_init(void); -/* BufferFallbackError.proto */ static void __Pyx_RaiseBufferFallbackError(void); -/* None.proto */ static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); -/* BufferIndexError.proto */ static void __Pyx_RaiseBufferIndexError(int axis); #define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) -/* PySequenceContains.proto */ static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { int result = PySequence_Contains(seq, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } -/* DictGetItem.proto */ #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { PyObject *value; @@ -1358,49 +1098,17 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) #endif -/* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); -/* RaiseNeedMoreValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); -/* RaiseNoneIterError.proto */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* PyErrExceptionMatches.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); -#else -#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) -#endif - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); -/* CodeObjectCache.proto */ typedef struct { - PyCodeObject* code_object; int code_line; + PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; @@ -1412,11 +1120,9 @@ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int co static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); -/* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); -/* BufferStructDeclare.proto */ typedef struct { Py_ssize_t shape, strides, suboffsets; } __Pyx_Buf_DimInfo; @@ -1439,20 +1145,21 @@ typedef struct { #endif -/* None.proto */ static Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; -/* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); -/* CIntToPy.proto */ +static CYTHON_INLINE siz __Pyx_PyInt_As_siz(PyObject *); + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_siz(siz value); -/* CIntToPy.proto */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value); -/* RealImag.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) @@ -1465,8 +1172,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value); #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif -#if defined(__cplusplus) && CYTHON_CCOMPLEX\ - && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) +#if (defined(_WIN32) || defined(__clang__)) && defined(__cplusplus) && CYTHON_CCOMPLEX #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else @@ -1474,104 +1180,92 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value); #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif -/* Arithmetic.proto */ +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + #if CYTHON_CCOMPLEX - #define __Pyx_c_eq_float(a, b) ((a)==(b)) - #define __Pyx_c_sum_float(a, b) ((a)+(b)) - #define __Pyx_c_diff_float(a, b) ((a)-(b)) - #define __Pyx_c_prod_float(a, b) ((a)*(b)) - #define __Pyx_c_quot_float(a, b) ((a)/(b)) - #define __Pyx_c_neg_float(a) (-(a)) + #define __Pyx_c_eqf(a, b) ((a)==(b)) + #define __Pyx_c_sumf(a, b) ((a)+(b)) + #define __Pyx_c_difff(a, b) ((a)-(b)) + #define __Pyx_c_prodf(a, b) ((a)*(b)) + #define __Pyx_c_quotf(a, b) ((a)/(b)) + #define __Pyx_c_negf(a) (-(a)) #ifdef __cplusplus - #define __Pyx_c_is_zero_float(z) ((z)==(float)0) - #define __Pyx_c_conj_float(z) (::std::conj(z)) + #define __Pyx_c_is_zerof(z) ((z)==(float)0) + #define __Pyx_c_conjf(z) (::std::conj(z)) #if 1 - #define __Pyx_c_abs_float(z) (::std::abs(z)) - #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #define __Pyx_c_absf(z) (::std::abs(z)) + #define __Pyx_c_powf(a, b) (::std::pow(a, b)) #endif #else - #define __Pyx_c_is_zero_float(z) ((z)==0) - #define __Pyx_c_conj_float(z) (conjf(z)) + #define __Pyx_c_is_zerof(z) ((z)==0) + #define __Pyx_c_conjf(z) (conjf(z)) #if 1 - #define __Pyx_c_abs_float(z) (cabsf(z)) - #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #define __Pyx_c_absf(z) (cabsf(z)) + #define __Pyx_c_powf(a, b) (cpowf(a, b)) #endif #endif #else - static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); - static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); #if 1 - static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif -/* Arithmetic.proto */ +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + #if CYTHON_CCOMPLEX - #define __Pyx_c_eq_double(a, b) ((a)==(b)) - #define __Pyx_c_sum_double(a, b) ((a)+(b)) - #define __Pyx_c_diff_double(a, b) ((a)-(b)) - #define __Pyx_c_prod_double(a, b) ((a)*(b)) - #define __Pyx_c_quot_double(a, b) ((a)/(b)) - #define __Pyx_c_neg_double(a) (-(a)) + #define __Pyx_c_eq(a, b) ((a)==(b)) + #define __Pyx_c_sum(a, b) ((a)+(b)) + #define __Pyx_c_diff(a, b) ((a)-(b)) + #define __Pyx_c_prod(a, b) ((a)*(b)) + #define __Pyx_c_quot(a, b) ((a)/(b)) + #define __Pyx_c_neg(a) (-(a)) #ifdef __cplusplus - #define __Pyx_c_is_zero_double(z) ((z)==(double)0) - #define __Pyx_c_conj_double(z) (::std::conj(z)) + #define __Pyx_c_is_zero(z) ((z)==(double)0) + #define __Pyx_c_conj(z) (::std::conj(z)) #if 1 - #define __Pyx_c_abs_double(z) (::std::abs(z)) - #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #define __Pyx_c_abs(z) (::std::abs(z)) + #define __Pyx_c_pow(a, b) (::std::pow(a, b)) #endif #else - #define __Pyx_c_is_zero_double(z) ((z)==0) - #define __Pyx_c_conj_double(z) (conj(z)) + #define __Pyx_c_is_zero(z) ((z)==0) + #define __Pyx_c_conj(z) (conj(z)) #if 1 - #define __Pyx_c_abs_double(z) (cabs(z)) - #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #define __Pyx_c_abs(z) (cabs(z)) + #define __Pyx_c_pow(a, b) (cpow(a, b)) #endif #endif #else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif -/* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); -/* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); -/* CIntFromPy.proto */ -static CYTHON_INLINE siz __Pyx_PyInt_As_siz(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); -/* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); -/* PyIdentifierFromString.proto */ #if !defined(__Pyx_PyIdentifier_FromString) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) @@ -1580,13 +1274,10 @@ static int __Pyx_check_binary_version(void); #endif #endif -/* ModuleImport.proto */ static PyObject *__Pyx_ImportModule(const char *name); -/* TypeImport.proto */ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); -/* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); @@ -1618,133 +1309,145 @@ static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ -static CYTHON_INLINE int __pyx_f_5numpy_import_array(void); /*proto*/ -/* Module declarations from 'thirdparty.pycocotools._mask' */ -static PyTypeObject *__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs = 0; -static PyTypeObject *__pyx_ptype_10thirdparty_11pycocotools_5_mask_Masks = 0; +/* Module declarations from 'libs.datasets.pycocotools._mask' */ +static PyTypeObject *__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs = 0; +static PyTypeObject *__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_Masks = 0; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t = { "uint8_t", NULL, sizeof(__pyx_t_5numpy_uint8_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint8_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint8_t), 0 }; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_double_t = { "double_t", NULL, sizeof(__pyx_t_5numpy_double_t), { 0 }, 0, 'R', 0, 0 }; static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t = { "uint32_t", NULL, sizeof(__pyx_t_5numpy_uint32_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_uint32_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_uint32_t), 0 }; -#define __Pyx_MODULE_NAME "thirdparty.pycocotools._mask" -int __pyx_module_is_main_thirdparty__pycocotools___mask = 0; +#define __Pyx_MODULE_NAME "libs.datasets.pycocotools._mask" +int __pyx_module_is_main_libs__datasets__pycocotools___mask = 0; -/* Implementation of 'thirdparty.pycocotools._mask' */ +/* Implementation of 'libs.datasets.pycocotools._mask' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_AttributeError; static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_Exception; static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_RuntimeError; -static PyObject *__pyx_builtin_ImportError; -static const char __pyx_k_F[] = "F"; -static const char __pyx_k_N[] = "N"; -static const char __pyx_k_R[] = "R"; -static const char __pyx_k_a[] = "_a"; -static const char __pyx_k_h[] = "h"; -static const char __pyx_k_i[] = "i"; -static const char __pyx_k_j[] = "j"; -static const char __pyx_k_m[] = "m"; -static const char __pyx_k_n[] = "n"; -static const char __pyx_k_p[] = "p"; -static const char __pyx_k_w[] = "w"; -static const char __pyx_k_Rs[] = "Rs"; -static const char __pyx_k_bb[] = "bb"; -static const char __pyx_k_dt[] = "dt"; -static const char __pyx_k_gt[] = "gt"; -static const char __pyx_k_np[] = "np"; -static const char __pyx_k_a_2[] = "a"; -static const char __pyx_k_all[] = "all"; -static const char __pyx_k_iou[] = "_iou"; -static const char __pyx_k_len[] = "_len"; -static const char __pyx_k_obj[] = "obj"; -static const char __pyx_k_sys[] = "sys"; -static const char __pyx_k_area[] = "area"; -static const char __pyx_k_bb_2[] = "_bb"; -static const char __pyx_k_cnts[] = "cnts"; -static const char __pyx_k_data[] = "data"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_mask[] = "mask"; -static const char __pyx_k_objs[] = "objs"; -static const char __pyx_k_poly[] = "poly"; -static const char __pyx_k_size[] = "size"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_utf8[] = "utf8"; -static const char __pyx_k_array[] = "array"; -static const char __pyx_k_bbIou[] = "_bbIou"; -static const char __pyx_k_dtype[] = "dtype"; -static const char __pyx_k_iou_2[] = "iou"; -static const char __pyx_k_isbox[] = "isbox"; -static const char __pyx_k_isrle[] = "isrle"; -static const char __pyx_k_masks[] = "masks"; -static const char __pyx_k_merge[] = "merge"; -static const char __pyx_k_numpy[] = "numpy"; -static const char __pyx_k_order[] = "order"; -static const char __pyx_k_pyobj[] = "pyobj"; -static const char __pyx_k_range[] = "range"; -static const char __pyx_k_shape[] = "shape"; -static const char __pyx_k_uint8[] = "uint8"; -static const char __pyx_k_zeros[] = "zeros"; -static const char __pyx_k_astype[] = "astype"; -static const char __pyx_k_author[] = "__author__"; -static const char __pyx_k_counts[] = "counts"; -static const char __pyx_k_decode[] = "decode"; -static const char __pyx_k_double[] = "double"; -static const char __pyx_k_encode[] = "encode"; -static const char __pyx_k_frBbox[] = "frBbox"; -static const char __pyx_k_frPoly[] = "frPoly"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_iouFun[] = "_iouFun"; -static const char __pyx_k_rleIou[] = "_rleIou"; -static const char __pyx_k_toBbox[] = "toBbox"; -static const char __pyx_k_ucRles[] = "ucRles"; -static const char __pyx_k_uint32[] = "uint32"; -static const char __pyx_k_iscrowd[] = "iscrowd"; -static const char __pyx_k_np_poly[] = "np_poly"; -static const char __pyx_k_preproc[] = "_preproc"; -static const char __pyx_k_reshape[] = "reshape"; -static const char __pyx_k_rleObjs[] = "rleObjs"; -static const char __pyx_k_tsungyi[] = "tsungyi"; -static const char __pyx_k_c_string[] = "c_string"; -static const char __pyx_k_frString[] = "_frString"; -static const char __pyx_k_toString[] = "_toString"; -static const char __pyx_k_enumerate[] = "enumerate"; -static const char __pyx_k_intersect[] = "intersect"; -static const char __pyx_k_py_string[] = "py_string"; -static const char __pyx_k_pyiscrowd[] = "pyiscrowd"; -static const char __pyx_k_ValueError[] = "ValueError"; -static const char __pyx_k_ImportError[] = "ImportError"; -static const char __pyx_k_frPyObjects[] = "frPyObjects"; -static const char __pyx_k_RuntimeError[] = "RuntimeError"; -static const char __pyx_k_version_info[] = "version_info"; -static const char __pyx_k_AttributeError[] = "AttributeError"; -static const char __pyx_k_PYTHON_VERSION[] = "PYTHON_VERSION"; -static const char __pyx_k_iou_locals__len[] = "iou.._len"; -static const char __pyx_k_frUncompressedRLE[] = "frUncompressedRLE"; -static const char __pyx_k_iou_locals__bbIou[] = "iou.._bbIou"; -static const char __pyx_k_iou_locals__rleIou[] = "iou.._rleIou"; -static const char __pyx_k_iou_locals__preproc[] = "iou.._preproc"; -static const char __pyx_k_input_data_type_not_allowed[] = "input data type not allowed."; -static const char __pyx_k_input_type_is_not_supported[] = "input type is not supported."; -static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; -static const char __pyx_k_thirdparty_pycocotools__mask[] = "thirdparty.pycocotools._mask"; -static const char __pyx_k_Python_version_must_be_2_or_3[] = "Python version must be 2 or 3"; -static const char __pyx_k_home_shang_Work_camus_thirdpart[] = "/home/shang/Work/camus/thirdparty/pycocotools/_mask.pyx"; -static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; -static const char __pyx_k_numpy_ndarray_input_is_only_for[] = "numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension"; -static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; -static const char __pyx_k_unrecognized_type_The_following[] = "unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported."; -static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; -static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; -static const char __pyx_k_The_dt_and_gt_should_have_the_sa[] = "The dt and gt should have the same data type, either RLEs, list or np.ndarray"; -static const char __pyx_k_list_input_can_be_bounding_box_N[] = "list input can be bounding box (Nx4) or RLEs ([RLE])"; -static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; -static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; -static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static char __pyx_k_B[] = "B"; +static char __pyx_k_F[] = "F"; +static char __pyx_k_H[] = "H"; +static char __pyx_k_I[] = "I"; +static char __pyx_k_L[] = "L"; +static char __pyx_k_N[] = "N"; +static char __pyx_k_O[] = "O"; +static char __pyx_k_Q[] = "Q"; +static char __pyx_k_R[] = "R"; +static char __pyx_k_a[] = "_a"; +static char __pyx_k_b[] = "b"; +static char __pyx_k_d[] = "d"; +static char __pyx_k_f[] = "f"; +static char __pyx_k_g[] = "g"; +static char __pyx_k_h[] = "h"; +static char __pyx_k_i[] = "i"; +static char __pyx_k_j[] = "j"; +static char __pyx_k_l[] = "l"; +static char __pyx_k_m[] = "m"; +static char __pyx_k_n[] = "n"; +static char __pyx_k_p[] = "p"; +static char __pyx_k_q[] = "q"; +static char __pyx_k_w[] = "w"; +static char __pyx_k_Rs[] = "Rs"; +static char __pyx_k_Zd[] = "Zd"; +static char __pyx_k_Zf[] = "Zf"; +static char __pyx_k_Zg[] = "Zg"; +static char __pyx_k_bb[] = "bb"; +static char __pyx_k_dt[] = "dt"; +static char __pyx_k_gt[] = "gt"; +static char __pyx_k_np[] = "np"; +static char __pyx_k_a_2[] = "a"; +static char __pyx_k_all[] = "all"; +static char __pyx_k_iou[] = "_iou"; +static char __pyx_k_len[] = "_len"; +static char __pyx_k_obj[] = "obj"; +static char __pyx_k_sys[] = "sys"; +static char __pyx_k_area[] = "area"; +static char __pyx_k_bb_2[] = "_bb"; +static char __pyx_k_cnts[] = "cnts"; +static char __pyx_k_data[] = "data"; +static char __pyx_k_main[] = "__main__"; +static char __pyx_k_mask[] = "mask"; +static char __pyx_k_objs[] = "objs"; +static char __pyx_k_poly[] = "poly"; +static char __pyx_k_size[] = "size"; +static char __pyx_k_test[] = "__test__"; +static char __pyx_k_utf8[] = "utf8"; +static char __pyx_k_array[] = "array"; +static char __pyx_k_bbIou[] = "_bbIou"; +static char __pyx_k_dtype[] = "dtype"; +static char __pyx_k_iou_2[] = "iou"; +static char __pyx_k_isbox[] = "isbox"; +static char __pyx_k_isrle[] = "isrle"; +static char __pyx_k_masks[] = "masks"; +static char __pyx_k_merge[] = "merge"; +static char __pyx_k_numpy[] = "numpy"; +static char __pyx_k_order[] = "order"; +static char __pyx_k_pyobj[] = "pyobj"; +static char __pyx_k_range[] = "range"; +static char __pyx_k_shape[] = "shape"; +static char __pyx_k_uint8[] = "uint8"; +static char __pyx_k_zeros[] = "zeros"; +static char __pyx_k_astype[] = "astype"; +static char __pyx_k_author[] = "__author__"; +static char __pyx_k_counts[] = "counts"; +static char __pyx_k_decode[] = "decode"; +static char __pyx_k_double[] = "double"; +static char __pyx_k_encode[] = "encode"; +static char __pyx_k_frBbox[] = "frBbox"; +static char __pyx_k_frPoly[] = "frPoly"; +static char __pyx_k_import[] = "__import__"; +static char __pyx_k_iouFun[] = "_iouFun"; +static char __pyx_k_rleIou[] = "_rleIou"; +static char __pyx_k_toBbox[] = "toBbox"; +static char __pyx_k_ucRles[] = "ucRles"; +static char __pyx_k_uint32[] = "uint32"; +static char __pyx_k_iscrowd[] = "iscrowd"; +static char __pyx_k_np_poly[] = "np_poly"; +static char __pyx_k_preproc[] = "_preproc"; +static char __pyx_k_reshape[] = "reshape"; +static char __pyx_k_rleObjs[] = "rleObjs"; +static char __pyx_k_tsungyi[] = "tsungyi"; +static char __pyx_k_c_string[] = "c_string"; +static char __pyx_k_frString[] = "_frString"; +static char __pyx_k_toString[] = "_toString"; +static char __pyx_k_Exception[] = "Exception"; +static char __pyx_k_enumerate[] = "enumerate"; +static char __pyx_k_intersect[] = "intersect"; +static char __pyx_k_py_string[] = "py_string"; +static char __pyx_k_pyiscrowd[] = "pyiscrowd"; +static char __pyx_k_ValueError[] = "ValueError"; +static char __pyx_k_frPyObjects[] = "frPyObjects"; +static char __pyx_k_RuntimeError[] = "RuntimeError"; +static char __pyx_k_version_info[] = "version_info"; +static char __pyx_k_AttributeError[] = "AttributeError"; +static char __pyx_k_PYTHON_VERSION[] = "PYTHON_VERSION"; +static char __pyx_k_iou_locals__len[] = "iou.._len"; +static char __pyx_k_frUncompressedRLE[] = "frUncompressedRLE"; +static char __pyx_k_iou_locals__bbIou[] = "iou.._bbIou"; +static char __pyx_k_iou_locals__rleIou[] = "iou.._rleIou"; +static char __pyx_k_iou_locals__preproc[] = "iou.._preproc"; +static char __pyx_k_input_data_type_not_allowed[] = "input data type not allowed."; +static char __pyx_k_input_type_is_not_supported[] = "input type is not supported."; +static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static char __pyx_k_Python_version_must_be_2_or_3[] = "Python version must be 2 or 3"; +static char __pyx_k_home_rojana_workspace_FastMaskR[] = "/home/rojana/workspace/FastMaskRCNN/libs/datasets/pycocotools/_mask.pyx"; +static char __pyx_k_libs_datasets_pycocotools__mask[] = "libs.datasets.pycocotools._mask"; +static char __pyx_k_numpy_ndarray_input_is_only_for[] = "numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension"; +static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static char __pyx_k_unrecognized_type_The_following[] = "unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported."; +static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static char __pyx_k_The_dt_and_gt_should_have_the_sa[] = "The dt and gt should have the same data type, either RLEs, list or np.ndarray"; +static char __pyx_k_list_input_can_be_bounding_box_N[] = "list input can be bounding box (Nx4) or RLEs ([RLE])"; +static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; static PyObject *__pyx_n_s_AttributeError; +static PyObject *__pyx_n_s_Exception; static PyObject *__pyx_n_s_F; static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; -static PyObject *__pyx_n_s_ImportError; static PyObject *__pyx_n_s_N; static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; static PyObject *__pyx_n_s_PYTHON_VERSION; @@ -1781,7 +1484,7 @@ static PyObject *__pyx_n_s_frString; static PyObject *__pyx_n_s_frUncompressedRLE; static PyObject *__pyx_n_s_gt; static PyObject *__pyx_n_s_h; -static PyObject *__pyx_kp_s_home_shang_Work_camus_thirdpart; +static PyObject *__pyx_kp_s_home_rojana_workspace_FastMaskR; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_import; static PyObject *__pyx_kp_s_input_data_type_not_allowed; @@ -1799,6 +1502,7 @@ static PyObject *__pyx_n_s_iscrowd; static PyObject *__pyx_n_s_isrle; static PyObject *__pyx_n_s_j; static PyObject *__pyx_n_s_len; +static PyObject *__pyx_n_s_libs_datasets_pycocotools__mask; static PyObject *__pyx_kp_s_list_input_can_be_bounding_box_N; static PyObject *__pyx_n_s_m; static PyObject *__pyx_n_s_main; @@ -1811,8 +1515,6 @@ static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; static PyObject *__pyx_n_s_np; static PyObject *__pyx_n_s_np_poly; static PyObject *__pyx_n_s_numpy; -static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; -static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; static PyObject *__pyx_kp_s_numpy_ndarray_input_is_only_for; static PyObject *__pyx_n_s_obj; static PyObject *__pyx_n_s_objs; @@ -1831,7 +1533,6 @@ static PyObject *__pyx_n_s_shape; static PyObject *__pyx_n_s_size; static PyObject *__pyx_n_s_sys; static PyObject *__pyx_n_s_test; -static PyObject *__pyx_n_s_thirdparty_pycocotools__mask; static PyObject *__pyx_n_s_toBbox; static PyObject *__pyx_n_s_toString; static PyObject *__pyx_n_s_tsungyi; @@ -1844,31 +1545,31 @@ static PyObject *__pyx_n_s_utf8; static PyObject *__pyx_n_s_version_info; static PyObject *__pyx_n_s_w; static PyObject *__pyx_n_s_zeros; -static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, siz __pyx_v_n); /* proto */ -static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, PyObject *__pyx_v_key); /* proto */ -static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self, PyObject *__pyx_v_h, PyObject *__pyx_v_w, PyObject *__pyx_v_n); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_mask); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs, PyObject *__pyx_v_intersect); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_objs); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_dt, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dt, PyArrayObject *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dt, PyObject *__pyx_v_gt, PyObject *__pyx_v_pyiscrowd); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_bb, siz __pyx_v_h, siz __pyx_v_w); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_poly, siz __pyx_v_h, siz __pyx_v_w); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_ucRles, CYTHON_UNUSED siz __pyx_v_h, CYTHON_UNUSED siz __pyx_v_w); /* proto */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pyobj, PyObject *__pyx_v_h, PyObject *__pyx_v_w); /* proto */ +static int __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs___cinit__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_self, siz __pyx_v_n); /* proto */ +static void __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs_4__getattr__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_self, PyObject *__pyx_v_key); /* proto */ +static int __pyx_pf_4libs_8datasets_11pycocotools_5_mask_5Masks___cinit__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *__pyx_v_self, PyObject *__pyx_v_h, PyObject *__pyx_v_w, PyObject *__pyx_v_n); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_5Masks_2__array__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask__toString(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_2_frString(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_4encode(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_mask); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_6decode(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs, PyObject *__pyx_v_intersect); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou__preproc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_objs); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_2_rleIou(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_dt, struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dt, PyArrayObject *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_6_len(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dt, PyObject *__pyx_v_gt, PyObject *__pyx_v_pyiscrowd); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_14toBbox(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_16frBbox(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_bb, siz __pyx_v_h, siz __pyx_v_w); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_18frPoly(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_poly, siz __pyx_v_h, siz __pyx_v_w); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_20frUncompressedRLE(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_ucRles, CYTHON_UNUSED siz __pyx_v_h, CYTHON_UNUSED siz __pyx_v_w); /* proto */ +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_22frPyObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pyobj, PyObject *__pyx_v_h, PyObject *__pyx_v_w); /* proto */ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ -static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_4libs_8datasets_11pycocotools_5_mask_RLEs(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_4libs_8datasets_11pycocotools_5_mask_Masks(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_int_0; static PyObject *__pyx_int_1; static PyObject *__pyx_int_2; @@ -1895,38 +1596,35 @@ static PyObject *__pyx_tuple__22; static PyObject *__pyx_tuple__23; static PyObject *__pyx_tuple__24; static PyObject *__pyx_tuple__25; -static PyObject *__pyx_tuple__26; static PyObject *__pyx_tuple__27; -static PyObject *__pyx_tuple__28; -static PyObject *__pyx_tuple__30; -static PyObject *__pyx_tuple__32; -static PyObject *__pyx_tuple__34; -static PyObject *__pyx_tuple__36; -static PyObject *__pyx_tuple__38; -static PyObject *__pyx_tuple__40; -static PyObject *__pyx_tuple__42; -static PyObject *__pyx_tuple__44; -static PyObject *__pyx_tuple__46; -static PyObject *__pyx_tuple__48; -static PyObject *__pyx_tuple__50; +static PyObject *__pyx_tuple__29; +static PyObject *__pyx_tuple__31; +static PyObject *__pyx_tuple__33; +static PyObject *__pyx_tuple__35; +static PyObject *__pyx_tuple__37; +static PyObject *__pyx_tuple__39; +static PyObject *__pyx_tuple__41; +static PyObject *__pyx_tuple__43; +static PyObject *__pyx_tuple__45; +static PyObject *__pyx_tuple__47; static PyObject *__pyx_codeobj__8; static PyObject *__pyx_codeobj__10; static PyObject *__pyx_codeobj__12; static PyObject *__pyx_codeobj__14; -static PyObject *__pyx_codeobj__29; -static PyObject *__pyx_codeobj__31; -static PyObject *__pyx_codeobj__33; -static PyObject *__pyx_codeobj__35; -static PyObject *__pyx_codeobj__37; -static PyObject *__pyx_codeobj__39; -static PyObject *__pyx_codeobj__41; -static PyObject *__pyx_codeobj__43; -static PyObject *__pyx_codeobj__45; -static PyObject *__pyx_codeobj__47; -static PyObject *__pyx_codeobj__49; -static PyObject *__pyx_codeobj__51; - -/* "thirdparty/pycocotools/_mask.pyx":60 +static PyObject *__pyx_codeobj__26; +static PyObject *__pyx_codeobj__28; +static PyObject *__pyx_codeobj__30; +static PyObject *__pyx_codeobj__32; +static PyObject *__pyx_codeobj__34; +static PyObject *__pyx_codeobj__36; +static PyObject *__pyx_codeobj__38; +static PyObject *__pyx_codeobj__40; +static PyObject *__pyx_codeobj__42; +static PyObject *__pyx_codeobj__44; +static PyObject *__pyx_codeobj__46; +static PyObject *__pyx_codeobj__48; + +/* "libs/datasets/pycocotools/_mask.pyx":60 * cdef siz _n * * def __cinit__(self, siz n =0): # <<<<<<<<<<<<<< @@ -1935,9 +1633,12 @@ static PyObject *__pyx_codeobj__51; */ /* Python wrapper */ -static int __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static int __pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { siz __pyx_v_n; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); @@ -1961,7 +1662,7 @@ static int __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 60, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -1971,32 +1672,32 @@ static int __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(PyObject } } if (values[0]) { - __pyx_v_n = __Pyx_PyInt_As_siz(values[0]); if (unlikely((__pyx_v_n == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L3_error) + __pyx_v_n = __Pyx_PyInt_As_siz(values[0]); if (unlikely((__pyx_v_n == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } else { __pyx_v_n = ((siz)0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 60, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.RLEs.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.RLEs.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_self), __pyx_v_n); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs___cinit__(((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_v_self), __pyx_v_n); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, siz __pyx_v_n) { +static int __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs___cinit__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_self, siz __pyx_v_n) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__", 0); - /* "thirdparty/pycocotools/_mask.pyx":61 + /* "libs/datasets/pycocotools/_mask.pyx":61 * * def __cinit__(self, siz n =0): * rlesInit(&self._R, n) # <<<<<<<<<<<<<< @@ -2005,7 +1706,7 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __p */ rlesInit((&__pyx_v_self->_R), __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":62 + /* "libs/datasets/pycocotools/_mask.pyx":62 * def __cinit__(self, siz n =0): * rlesInit(&self._R, n) * self._n = n # <<<<<<<<<<<<<< @@ -2014,7 +1715,7 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __p */ __pyx_v_self->_n = __pyx_v_n; - /* "thirdparty/pycocotools/_mask.pyx":60 + /* "libs/datasets/pycocotools/_mask.pyx":60 * cdef siz _n * * def __cinit__(self, siz n =0): # <<<<<<<<<<<<<< @@ -2028,7 +1729,7 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __p return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":65 +/* "libs/datasets/pycocotools/_mask.pyx":65 * * # free the RLE array here * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -2037,17 +1738,17 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs___cinit__(struct __p */ /* Python wrapper */ -static void __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_3__dealloc__(PyObject *__pyx_v_self) { +static void __pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_3__dealloc__(PyObject *__pyx_v_self) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_self)); + __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs_2__dealloc__(((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); } -static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self) { +static void __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_self) { siz __pyx_v_i; __Pyx_RefNannyDeclarations int __pyx_t_1; @@ -2055,7 +1756,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct siz __pyx_t_3; __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "thirdparty/pycocotools/_mask.pyx":66 + /* "libs/datasets/pycocotools/_mask.pyx":66 * # free the RLE array here * def __dealloc__(self): * if self._R is not NULL: # <<<<<<<<<<<<<< @@ -2065,7 +1766,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __pyx_t_1 = ((__pyx_v_self->_R != NULL) != 0); if (__pyx_t_1) { - /* "thirdparty/pycocotools/_mask.pyx":67 + /* "libs/datasets/pycocotools/_mask.pyx":67 * def __dealloc__(self): * if self._R is not NULL: * for i in range(self._n): # <<<<<<<<<<<<<< @@ -2076,7 +1777,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; - /* "thirdparty/pycocotools/_mask.pyx":68 + /* "libs/datasets/pycocotools/_mask.pyx":68 * if self._R is not NULL: * for i in range(self._n): * free(self._R[i].cnts) # <<<<<<<<<<<<<< @@ -2086,7 +1787,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct free((__pyx_v_self->_R[__pyx_v_i]).cnts); } - /* "thirdparty/pycocotools/_mask.pyx":69 + /* "libs/datasets/pycocotools/_mask.pyx":69 * for i in range(self._n): * free(self._R[i].cnts) * free(self._R) # <<<<<<<<<<<<<< @@ -2095,7 +1796,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct */ free(__pyx_v_self->_R); - /* "thirdparty/pycocotools/_mask.pyx":66 + /* "libs/datasets/pycocotools/_mask.pyx":66 * # free the RLE array here * def __dealloc__(self): * if self._R is not NULL: # <<<<<<<<<<<<<< @@ -2104,7 +1805,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct */ } - /* "thirdparty/pycocotools/_mask.pyx":65 + /* "libs/datasets/pycocotools/_mask.pyx":65 * * # free the RLE array here * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -2116,7 +1817,7 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct __Pyx_RefNannyFinishContext(); } -/* "thirdparty/pycocotools/_mask.pyx":70 +/* "libs/datasets/pycocotools/_mask.pyx":70 * free(self._R[i].cnts) * free(self._R) * def __getattr__(self, key): # <<<<<<<<<<<<<< @@ -2125,37 +1826,40 @@ static void __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_2__dealloc__(struct */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_key) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_5__getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_key); /*proto*/ +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_5__getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_key) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_self), ((PyObject *)__pyx_v_key)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs_4__getattr__(((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_v_self), ((PyObject *)__pyx_v_key)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_self, PyObject *__pyx_v_key) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_4RLEs_4__getattr__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_self, PyObject *__pyx_v_key) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getattr__", 0); - /* "thirdparty/pycocotools/_mask.pyx":71 + /* "libs/datasets/pycocotools/_mask.pyx":71 * free(self._R) * def __getattr__(self, key): * if key == 'n': # <<<<<<<<<<<<<< * return self._n * raise AttributeError(key) */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_key, __pyx_n_s_n, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 71, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_key, __pyx_n_s_n, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_t_1) { - /* "thirdparty/pycocotools/_mask.pyx":72 + /* "libs/datasets/pycocotools/_mask.pyx":72 * def __getattr__(self, key): * if key == 'n': * return self._n # <<<<<<<<<<<<<< @@ -2163,13 +1867,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(s * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_self->_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_self->_n); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":71 + /* "libs/datasets/pycocotools/_mask.pyx":71 * free(self._R) * def __getattr__(self, key): * if key == 'n': # <<<<<<<<<<<<<< @@ -2178,26 +1882,26 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(s */ } - /* "thirdparty/pycocotools/_mask.pyx":73 + /* "libs/datasets/pycocotools/_mask.pyx":73 * if key == 'n': * return self._n * raise AttributeError(key) # <<<<<<<<<<<<<< * * # python class to wrap Mask array in C */ - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_key); __Pyx_GIVEREF(__pyx_v_key); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_key); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 73, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":70 + /* "libs/datasets/pycocotools/_mask.pyx":70 * free(self._R[i].cnts) * free(self._R) * def __getattr__(self, key): # <<<<<<<<<<<<<< @@ -2209,7 +1913,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(s __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.RLEs.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.RLEs.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); @@ -2217,7 +1921,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(s return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":83 +/* "libs/datasets/pycocotools/_mask.pyx":83 * cdef siz _n * * def __cinit__(self, h, w, n): # <<<<<<<<<<<<<< @@ -2226,11 +1930,14 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4RLEs_4__getattr__(s */ /* Python wrapper */ -static int __pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static int __pyx_pw_4libs_8datasets_11pycocotools_5_mask_5Masks_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_4libs_8datasets_11pycocotools_5_mask_5Masks_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_h = 0; PyObject *__pyx_v_w = 0; PyObject *__pyx_v_n = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); @@ -2255,16 +1962,16 @@ static int __pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(PyObject case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(0, 83, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(0, 83, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 83, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -2279,20 +1986,20 @@ static int __pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(PyObject } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 83, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.Masks.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.Masks.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *)__pyx_v_self), __pyx_v_h, __pyx_v_w, __pyx_v_n); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_5Masks___cinit__(((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *)__pyx_v_self), __pyx_v_h, __pyx_v_w, __pyx_v_n); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self, PyObject *__pyx_v_h, PyObject *__pyx_v_w, PyObject *__pyx_v_n) { +static int __pyx_pf_4libs_8datasets_11pycocotools_5_mask_5Masks___cinit__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *__pyx_v_self, PyObject *__pyx_v_h, PyObject *__pyx_v_w, PyObject *__pyx_v_n) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -2300,61 +2007,64 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __ PyObject *__pyx_t_3 = NULL; size_t __pyx_t_4; siz __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__cinit__", 0); - /* "thirdparty/pycocotools/_mask.pyx":84 + /* "libs/datasets/pycocotools/_mask.pyx":84 * * def __cinit__(self, h, w, n): * self._mask = malloc(h*w*n* sizeof(byte)) # <<<<<<<<<<<<<< * self._h = h * self._w = w */ - __pyx_t_1 = PyNumber_Multiply(__pyx_v_h, __pyx_v_w); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_t_1 = PyNumber_Multiply(__pyx_v_h, __pyx_v_w); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_v_n); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_FromSize_t((sizeof(byte))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_FromSize_t((sizeof(byte))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_t_3); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_t_3); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_self->_mask = ((byte *)malloc(__pyx_t_4)); - /* "thirdparty/pycocotools/_mask.pyx":85 + /* "libs/datasets/pycocotools/_mask.pyx":85 * def __cinit__(self, h, w, n): * self._mask = malloc(h*w*n* sizeof(byte)) * self._h = h # <<<<<<<<<<<<<< * self._w = w * self._n = n */ - __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_h); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_h); if (unlikely((__pyx_t_5 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_self->_h = __pyx_t_5; - /* "thirdparty/pycocotools/_mask.pyx":86 + /* "libs/datasets/pycocotools/_mask.pyx":86 * self._mask = malloc(h*w*n* sizeof(byte)) * self._h = h * self._w = w # <<<<<<<<<<<<<< * self._n = n * # def __dealloc__(self): */ - __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_w); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_w); if (unlikely((__pyx_t_5 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_self->_w = __pyx_t_5; - /* "thirdparty/pycocotools/_mask.pyx":87 + /* "libs/datasets/pycocotools/_mask.pyx":87 * self._h = h * self._w = w * self._n = n # <<<<<<<<<<<<<< * # def __dealloc__(self): * # the memory management of _mask has been passed to np.ndarray */ - __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_n); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_v_n); if (unlikely((__pyx_t_5 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_self->_n = __pyx_t_5; - /* "thirdparty/pycocotools/_mask.pyx":83 + /* "libs/datasets/pycocotools/_mask.pyx":83 * cdef siz _n * * def __cinit__(self, h, w, n): # <<<<<<<<<<<<<< @@ -2369,14 +2079,14 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __ __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.Masks.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.Masks.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":93 +/* "libs/datasets/pycocotools/_mask.pyx":93 * * # called when passing into np.array() and return an np.ndarray in column-major order * def __array__(self): # <<<<<<<<<<<<<< @@ -2385,19 +2095,19 @@ static int __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks___cinit__(struct __ */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_3__array__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_3__array__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5Masks_3__array__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5Masks_3__array__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__array__ (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *)__pyx_v_self)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_5Masks_2__array__(((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_self) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_5Masks_2__array__(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *__pyx_v_self) { npy_intp __pyx_v_shape[1]; PyObject *__pyx_v_ndarray = NULL; PyObject *__pyx_r = NULL; @@ -2407,9 +2117,12 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__array__", 0); - /* "thirdparty/pycocotools/_mask.pyx":95 + /* "libs/datasets/pycocotools/_mask.pyx":95 * def __array__(self): * cdef np.npy_intp shape[1] * shape[0] = self._h*self._w*self._n # <<<<<<<<<<<<<< @@ -2418,25 +2131,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st */ (__pyx_v_shape[0]) = ((((npy_intp)__pyx_v_self->_h) * __pyx_v_self->_w) * __pyx_v_self->_n); - /* "thirdparty/pycocotools/_mask.pyx":97 + /* "libs/datasets/pycocotools/_mask.pyx":97 * shape[0] = self._h*self._w*self._n * # Create a 1D array, and reshape it to fortran/Matlab column-major array * ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT8, self._mask).reshape((self._h, self._w, self._n), order='F') # <<<<<<<<<<<<<< * # The _mask allocated by Masks is now handled by ndarray * PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA) */ - __pyx_t_1 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_UINT8, __pyx_v_self->_mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_1 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_UINT8, __pyx_v_self->_mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_reshape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_reshape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_self->_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_self->_h); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyInt_From_siz(__pyx_v_self->_w); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_siz(__pyx_v_self->_w); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_self->_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_self->_n); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); @@ -2447,15 +2160,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 97, __pyx_L1_error) + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 97, __pyx_L1_error) - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_F) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; @@ -2463,17 +2176,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st __pyx_v_ndarray = __pyx_t_3; __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":99 + /* "libs/datasets/pycocotools/_mask.pyx":99 * ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT8, self._mask).reshape((self._h, self._w, self._n), order='F') * # The _mask allocated by Masks is now handled by ndarray * PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA) # <<<<<<<<<<<<<< * return ndarray * */ - if (!(likely(((__pyx_v_ndarray) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_ndarray, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 99, __pyx_L1_error) + if (!(likely(((__pyx_v_ndarray) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_ndarray, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;} PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_ndarray), NPY_OWNDATA); - /* "thirdparty/pycocotools/_mask.pyx":100 + /* "libs/datasets/pycocotools/_mask.pyx":100 * # The _mask allocated by Masks is now handled by ndarray * PyArray_ENABLEFLAGS(ndarray, np.NPY_OWNDATA) * return ndarray # <<<<<<<<<<<<<< @@ -2485,7 +2198,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st __pyx_r = __pyx_v_ndarray; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":93 + /* "libs/datasets/pycocotools/_mask.pyx":93 * * # called when passing into np.array() and return an np.ndarray in column-major order * def __array__(self): # <<<<<<<<<<<<<< @@ -2500,7 +2213,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.Masks.__array__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.Masks.__array__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_ndarray); @@ -2509,7 +2222,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":103 +/* "libs/datasets/pycocotools/_mask.pyx":103 * * # internal conversion from Python RLEs object to compressed RLE format * def _toString(RLEs Rs): # <<<<<<<<<<<<<< @@ -2518,14 +2231,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_5Masks_2__array__(st */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString(PyObject *__pyx_self, PyObject *__pyx_v_Rs); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_1_toString = {"_toString", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString(PyObject *__pyx_self, PyObject *__pyx_v_Rs) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_1_toString(PyObject *__pyx_self, PyObject *__pyx_v_Rs); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_1_toString = {"_toString", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_1_toString, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_1_toString(PyObject *__pyx_self, PyObject *__pyx_v_Rs) { + CYTHON_UNUSED int __pyx_lineno = 0; + CYTHON_UNUSED const char *__pyx_filename = NULL; + CYTHON_UNUSED int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_toString (wrapper)", 0); - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Rs), __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs, 1, "Rs", 0))) __PYX_ERR(0, 103, __pyx_L1_error) - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask__toString(__pyx_self, ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_v_Rs)); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Rs), __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs, 1, "Rs", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask__toString(__pyx_self, ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_v_Rs)); /* function exit code */ goto __pyx_L0; @@ -2536,7 +2252,7 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_1_toString(PyObject return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask__toString(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs) { siz __pyx_v_n; PyObject *__pyx_v_py_string = 0; char *__pyx_v_c_string; @@ -2551,34 +2267,37 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_toString", 0); - /* "thirdparty/pycocotools/_mask.pyx":104 + /* "libs/datasets/pycocotools/_mask.pyx":104 * # internal conversion from Python RLEs object to compressed RLE format * def _toString(RLEs Rs): * cdef siz n = Rs.n # <<<<<<<<<<<<<< * cdef bytes py_string * cdef char* c_string */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_Rs), __pyx_n_s_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_Rs), __pyx_n_s_n); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_2 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 104, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_2 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_n = __pyx_t_2; - /* "thirdparty/pycocotools/_mask.pyx":107 + /* "libs/datasets/pycocotools/_mask.pyx":107 * cdef bytes py_string * cdef char* c_string * objs = [] # <<<<<<<<<<<<<< * for i in range(n): * c_string = rleToString( &Rs._R[i] ) */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v_objs = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":108 + /* "libs/datasets/pycocotools/_mask.pyx":108 * cdef char* c_string * objs = [] * for i in range(n): # <<<<<<<<<<<<<< @@ -2589,7 +2308,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; - /* "thirdparty/pycocotools/_mask.pyx":109 + /* "libs/datasets/pycocotools/_mask.pyx":109 * objs = [] * for i in range(n): * c_string = rleToString( &Rs._R[i] ) # <<<<<<<<<<<<<< @@ -2598,32 +2317,32 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU */ __pyx_v_c_string = rleToString(((RLE *)(&(__pyx_v_Rs->_R[__pyx_v_i])))); - /* "thirdparty/pycocotools/_mask.pyx":110 + /* "libs/datasets/pycocotools/_mask.pyx":110 * for i in range(n): * c_string = rleToString( &Rs._R[i] ) * py_string = c_string # <<<<<<<<<<<<<< * objs.append({ * 'size': [Rs._R[i].h, Rs._R[i].w], */ - __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_c_string); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_c_string); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_py_string, ((PyObject*)__pyx_t_1)); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":112 + /* "libs/datasets/pycocotools/_mask.pyx":112 * py_string = c_string * objs.append({ * 'size': [Rs._R[i].h, Rs._R[i].w], # <<<<<<<<<<<<<< * 'counts': py_string * }) */ - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 112, __pyx_L1_error) + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyInt_From_siz((__pyx_v_Rs->_R[__pyx_v_i]).h); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 112, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_siz((__pyx_v_Rs->_R[__pyx_v_i]).h); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyInt_From_siz((__pyx_v_Rs->_R[__pyx_v_i]).w); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 112, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_From_siz((__pyx_v_Rs->_R[__pyx_v_i]).w); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyList_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 112, __pyx_L1_error) + __pyx_t_6 = PyList_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_4); PyList_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); @@ -2631,29 +2350,29 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU PyList_SET_ITEM(__pyx_t_6, 1, __pyx_t_5); __pyx_t_4 = 0; __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_size, __pyx_t_6) < 0) __PYX_ERR(0, 112, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_size, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - /* "thirdparty/pycocotools/_mask.pyx":114 + /* "libs/datasets/pycocotools/_mask.pyx":114 * 'size': [Rs._R[i].h, Rs._R[i].w], * 'counts': py_string * }) # <<<<<<<<<<<<<< * free(c_string) * return objs */ - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_counts, __pyx_v_py_string) < 0) __PYX_ERR(0, 112, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_counts, __pyx_v_py_string) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":111 + /* "libs/datasets/pycocotools/_mask.pyx":111 * c_string = rleToString( &Rs._R[i] ) * py_string = c_string * objs.append({ # <<<<<<<<<<<<<< * 'size': [Rs._R[i].h, Rs._R[i].w], * 'counts': py_string */ - __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_objs, __pyx_t_1); if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 111, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_objs, __pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":115 + /* "libs/datasets/pycocotools/_mask.pyx":115 * 'counts': py_string * }) * free(c_string) # <<<<<<<<<<<<<< @@ -2663,7 +2382,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU free(__pyx_v_c_string); } - /* "thirdparty/pycocotools/_mask.pyx":116 + /* "libs/datasets/pycocotools/_mask.pyx":116 * }) * free(c_string) * return objs # <<<<<<<<<<<<<< @@ -2675,7 +2394,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":103 + /* "libs/datasets/pycocotools/_mask.pyx":103 * * # internal conversion from Python RLEs object to compressed RLE format * def _toString(RLEs Rs): # <<<<<<<<<<<<<< @@ -2689,7 +2408,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("thirdparty.pycocotools._mask._toString", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask._toString", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_py_string); @@ -2699,7 +2418,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":119 +/* "libs/datasets/pycocotools/_mask.pyx":119 * * # internal conversion from compressed RLE format to Python RLEs object * def _frString(rleObjs): # <<<<<<<<<<<<<< @@ -2708,22 +2427,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask__toString(CYTHON_UNU */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3_frString(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3_frString = {"_frString", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3_frString, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3_frString(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3_frString(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3_frString = {"_frString", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3_frString, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3_frString(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_frString (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_2_frString(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_2_frString(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { siz __pyx_v_n; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; PyObject *__pyx_v_py_string = 0; char *__pyx_v_c_string; PyObject *__pyx_v_i = NULL; @@ -2745,39 +2464,42 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN Py_ssize_t __pyx_t_13; siz __pyx_t_14; siz __pyx_t_15; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_frString", 0); - /* "thirdparty/pycocotools/_mask.pyx":120 + /* "libs/datasets/pycocotools/_mask.pyx":120 * # internal conversion from compressed RLE format to Python RLEs object * def _frString(rleObjs): * cdef siz n = len(rleObjs) # <<<<<<<<<<<<<< * Rs = RLEs(n) * cdef bytes py_string */ - __pyx_t_1 = PyObject_Length(__pyx_v_rleObjs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 120, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_v_rleObjs); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_n = __pyx_t_1; - /* "thirdparty/pycocotools/_mask.pyx":121 + /* "libs/datasets/pycocotools/_mask.pyx":121 * def _frString(rleObjs): * cdef siz n = len(rleObjs) * Rs = RLEs(n) # <<<<<<<<<<<<<< * cdef bytes py_string * cdef char* c_string */ - __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 121, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_2); + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_2); __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":124 + /* "libs/datasets/pycocotools/_mask.pyx":124 * cdef bytes py_string * cdef char* c_string * for i, obj in enumerate(rleObjs): # <<<<<<<<<<<<<< @@ -2790,26 +2512,26 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN __pyx_t_3 = __pyx_v_rleObjs; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; __pyx_t_4 = NULL; } else { - __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_rleObjs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_rleObjs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } for (;;) { if (likely(!__pyx_t_4)) { if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 124, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); #endif } else { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 124, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); #endif } @@ -2819,7 +2541,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 124, __pyx_L1_error) + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } @@ -2829,56 +2551,56 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN __pyx_t_5 = 0; __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_2); - __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = __pyx_t_5; __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":125 + /* "libs/datasets/pycocotools/_mask.pyx":125 * cdef char* c_string * for i, obj in enumerate(rleObjs): * if PYTHON_VERSION == 2: # <<<<<<<<<<<<<< * py_string = str(obj['counts']).encode('utf8') * elif PYTHON_VERSION == 3: */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_PYTHON_VERSION); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_PYTHON_VERSION); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyInt_EqObjC(__pyx_t_5, __pyx_int_2, 2, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_EqObjC(__pyx_t_5, __pyx_int_2, 2, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (__pyx_t_7) { - /* "thirdparty/pycocotools/_mask.pyx":126 + /* "libs/datasets/pycocotools/_mask.pyx":126 * for i, obj in enumerate(rleObjs): * if PYTHON_VERSION == 2: * py_string = str(obj['counts']).encode('utf8') # <<<<<<<<<<<<<< * elif PYTHON_VERSION == 3: * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] */ - __pyx_t_6 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_6 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_6); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_6)->tp_name), 0))) __PYX_ERR(0, 126, __pyx_L1_error) + if (!(likely(PyBytes_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_6)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF_SET(__pyx_v_py_string, ((PyObject*)__pyx_t_6)); __pyx_t_6 = 0; - /* "thirdparty/pycocotools/_mask.pyx":125 + /* "libs/datasets/pycocotools/_mask.pyx":125 * cdef char* c_string * for i, obj in enumerate(rleObjs): * if PYTHON_VERSION == 2: # <<<<<<<<<<<<<< @@ -2888,42 +2610,42 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN goto __pyx_L5; } - /* "thirdparty/pycocotools/_mask.pyx":127 + /* "libs/datasets/pycocotools/_mask.pyx":127 * if PYTHON_VERSION == 2: * py_string = str(obj['counts']).encode('utf8') * elif PYTHON_VERSION == 3: # <<<<<<<<<<<<<< * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] * else: */ - __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_PYTHON_VERSION); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_PYTHON_VERSION); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_5 = __Pyx_PyInt_EqObjC(__pyx_t_6, __pyx_int_3, 3, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_EqObjC(__pyx_t_6, __pyx_int_3, 3, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { - /* "thirdparty/pycocotools/_mask.pyx":128 + /* "libs/datasets/pycocotools/_mask.pyx":128 * py_string = str(obj['counts']).encode('utf8') * elif PYTHON_VERSION == 3: * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] # <<<<<<<<<<<<<< * else: * raise Exception('Python version must be 2 or 3') */ - __pyx_t_6 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_6 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_t_6)), ((PyObject *)(&PyString_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_8 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_t_6)), ((PyObject *)(&PyString_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (__pyx_t_7) { - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)(&PyString_Type)), __pyx_n_s_encode); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)(&PyString_Type)), __pyx_n_s_encode); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_9 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_9 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); @@ -2933,55 +2655,35 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN } } if (!__pyx_t_10) { - __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_9); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_8); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_9}; - __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_9}; - __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else - #endif - { - __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_10); __pyx_t_10 = NULL; - __Pyx_GIVEREF(__pyx_t_9); - PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_t_9); - __pyx_t_9 = 0; - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - } + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_10); __pyx_t_10 = NULL; + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_8)->tp_name), 0))) __PYX_ERR(0, 128, __pyx_L1_error) + if (!(likely(PyBytes_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_8)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = __pyx_t_8; __pyx_t_8 = 0; } else { - __pyx_t_8 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_8 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_counts); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_8); - if (!(likely(PyBytes_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_8)->tp_name), 0))) __PYX_ERR(0, 128, __pyx_L1_error) + if (!(likely(PyBytes_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_8)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = __pyx_t_8; __pyx_t_8 = 0; } __Pyx_XDECREF_SET(__pyx_v_py_string, ((PyObject*)__pyx_t_5)); __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":127 + /* "libs/datasets/pycocotools/_mask.pyx":127 * if PYTHON_VERSION == 2: * py_string = str(obj['counts']).encode('utf8') * elif PYTHON_VERSION == 3: # <<<<<<<<<<<<<< @@ -2991,7 +2693,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN goto __pyx_L5; } - /* "thirdparty/pycocotools/_mask.pyx":130 + /* "libs/datasets/pycocotools/_mask.pyx":130 * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] * else: * raise Exception('Python version must be 2 or 3') # <<<<<<<<<<<<<< @@ -2999,49 +2701,49 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) */ /*else*/ { - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 130, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(0, 130, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L5:; - /* "thirdparty/pycocotools/_mask.pyx":131 + /* "libs/datasets/pycocotools/_mask.pyx":131 * else: * raise Exception('Python version must be 2 or 3') * c_string = py_string # <<<<<<<<<<<<<< * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) * return Rs */ - __pyx_t_12 = __Pyx_PyObject_AsString(__pyx_v_py_string); if (unlikely((!__pyx_t_12) && PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyObject_AsString(__pyx_v_py_string); if (unlikely((!__pyx_t_12) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_c_string = __pyx_t_12; - /* "thirdparty/pycocotools/_mask.pyx":132 + /* "libs/datasets/pycocotools/_mask.pyx":132 * raise Exception('Python version must be 2 or 3') * c_string = py_string * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) # <<<<<<<<<<<<<< * return Rs * */ - __pyx_t_13 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_13 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) - __pyx_t_5 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_13 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_13 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_size); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_14 = __Pyx_PyInt_As_siz(__pyx_t_8); if (unlikely((__pyx_t_14 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_14 = __Pyx_PyInt_As_siz(__pyx_t_8); if (unlikely((__pyx_t_14 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_8 = PyObject_GetItem(__pyx_v_obj, __pyx_n_s_size); if (unlikely(__pyx_t_8 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_8); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_8, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_8, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_15 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_15 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_15 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; rleFrString(((RLE *)(&(__pyx_v_Rs->_R[__pyx_t_13]))), ((char *)__pyx_v_c_string), __pyx_t_14, __pyx_t_15); - /* "thirdparty/pycocotools/_mask.pyx":124 + /* "libs/datasets/pycocotools/_mask.pyx":124 * cdef bytes py_string * cdef char* c_string * for i, obj in enumerate(rleObjs): # <<<<<<<<<<<<<< @@ -3052,7 +2754,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":133 + /* "libs/datasets/pycocotools/_mask.pyx":133 * c_string = py_string * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) * return Rs # <<<<<<<<<<<<<< @@ -3064,7 +2766,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN __pyx_r = ((PyObject *)__pyx_v_Rs); goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":119 + /* "libs/datasets/pycocotools/_mask.pyx":119 * * # internal conversion from compressed RLE format to Python RLEs object * def _frString(rleObjs): # <<<<<<<<<<<<<< @@ -3082,7 +2784,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("thirdparty.pycocotools._mask._frString", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask._frString", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_Rs); @@ -3094,7 +2796,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":137 +/* "libs/datasets/pycocotools/_mask.pyx":137 * # encode mask to RLEs objects * # list of RLE string can be generated by RLEs member function * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< @@ -3103,14 +2805,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_2_frString(CYTHON_UN */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode(PyObject *__pyx_self, PyObject *__pyx_v_mask); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_5encode = {"encode", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode(PyObject *__pyx_self, PyObject *__pyx_v_mask) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5encode(PyObject *__pyx_self, PyObject *__pyx_v_mask); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_5encode = {"encode", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5encode, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5encode(PyObject *__pyx_self, PyObject *__pyx_v_mask) { + CYTHON_UNUSED int __pyx_lineno = 0; + CYTHON_UNUSED const char *__pyx_filename = NULL; + CYTHON_UNUSED int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("encode (wrapper)", 0); - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_mask), __pyx_ptype_5numpy_ndarray, 1, "mask", 0))) __PYX_ERR(0, 137, __pyx_L1_error) - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(__pyx_self, ((PyArrayObject *)__pyx_v_mask)); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_mask), __pyx_ptype_5numpy_ndarray, 1, "mask", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_4encode(__pyx_self, ((PyArrayObject *)__pyx_v_mask)); /* function exit code */ goto __pyx_L0; @@ -3121,11 +2826,11 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_5encode(PyObject *__ return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_mask) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_4encode(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_mask) { npy_intp __pyx_v_h; npy_intp __pyx_v_w; npy_intp __pyx_v_n; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; PyObject *__pyx_v_objs = NULL; __Pyx_LocalBuf_ND __pyx_pybuffernd_mask; __Pyx_Buffer __pyx_pybuffer_mask; @@ -3138,6 +2843,9 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("encode", 0); __pyx_pybuffer_mask.pybuffer.buf = NULL; __pyx_pybuffer_mask.refcount = 0; @@ -3145,11 +2853,11 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE __pyx_pybuffernd_mask.rcbuffer = &__pyx_pybuffer_mask; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_mask.rcbuffer->pybuffer, (PyObject*)__pyx_v_mask, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 3, 0, __pyx_stack) == -1)) __PYX_ERR(0, 137, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_mask.rcbuffer->pybuffer, (PyObject*)__pyx_v_mask, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_F_CONTIGUOUS, 3, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_mask.diminfo[0].strides = __pyx_pybuffernd_mask.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_mask.diminfo[0].shape = __pyx_pybuffernd_mask.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_mask.diminfo[1].strides = __pyx_pybuffernd_mask.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_mask.diminfo[1].shape = __pyx_pybuffernd_mask.rcbuffer->pybuffer.shape[1]; __pyx_pybuffernd_mask.diminfo[2].strides = __pyx_pybuffernd_mask.rcbuffer->pybuffer.strides[2]; __pyx_pybuffernd_mask.diminfo[2].shape = __pyx_pybuffernd_mask.rcbuffer->pybuffer.shape[2]; - /* "thirdparty/pycocotools/_mask.pyx":138 + /* "libs/datasets/pycocotools/_mask.pyx":138 * # list of RLE string can be generated by RLEs member function * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] # <<<<<<<<<<<<<< @@ -3163,27 +2871,27 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE __pyx_v_w = __pyx_t_2; __pyx_v_n = __pyx_t_3; - /* "thirdparty/pycocotools/_mask.pyx":139 + /* "libs/datasets/pycocotools/_mask.pyx":139 * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] * cdef RLEs Rs = RLEs(n) # <<<<<<<<<<<<<< * rleEncode(Rs._R,mask.data,h,w,n) * objs = _toString(Rs) */ - __pyx_t_4 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_n); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_4); + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_4); __pyx_t_4 = 0; - /* "thirdparty/pycocotools/_mask.pyx":140 + /* "libs/datasets/pycocotools/_mask.pyx":140 * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] * cdef RLEs Rs = RLEs(n) * rleEncode(Rs._R,mask.data,h,w,n) # <<<<<<<<<<<<<< @@ -3192,17 +2900,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE */ rleEncode(__pyx_v_Rs->_R, ((byte *)__pyx_v_mask->data), __pyx_v_h, __pyx_v_w, __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":141 + /* "libs/datasets/pycocotools/_mask.pyx":141 * cdef RLEs Rs = RLEs(n) * rleEncode(Rs._R,mask.data,h,w,n) * objs = _toString(Rs) # <<<<<<<<<<<<<< * return objs * */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); @@ -3212,42 +2920,24 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE } } if (!__pyx_t_6) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[2] = {__pyx_t_6, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[2] = {__pyx_t_6, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); - } else - #endif - { - __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 141, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL; - __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); - PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_v_Rs)); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 141, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - } + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_objs = __pyx_t_4; __pyx_t_4 = 0; - /* "thirdparty/pycocotools/_mask.pyx":142 + /* "libs/datasets/pycocotools/_mask.pyx":142 * rleEncode(Rs._R,mask.data,h,w,n) * objs = _toString(Rs) * return objs # <<<<<<<<<<<<<< @@ -3259,7 +2949,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":137 + /* "libs/datasets/pycocotools/_mask.pyx":137 * # encode mask to RLEs objects * # list of RLE string can be generated by RLEs member function * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< @@ -3274,12 +2964,10 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_mask.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.encode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.encode", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -3292,7 +2980,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":145 +/* "libs/datasets/pycocotools/_mask.pyx":145 * * # decode mask from compressed list of RLE string or RLEs object * def decode(rleObjs): # <<<<<<<<<<<<<< @@ -3301,25 +2989,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_4encode(CYTHON_UNUSE */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_7decode(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_7decode = {"decode", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_7decode, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_7decode(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_7decode(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_7decode = {"decode", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_7decode, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_7decode(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("decode (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_6decode(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_6decode(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; siz __pyx_v_h; siz __pyx_v_w; siz __pyx_v_n; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *__pyx_v_masks = NULL; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *__pyx_v_masks = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; @@ -3329,19 +3017,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE siz __pyx_t_5; siz __pyx_t_6; siz __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("decode", 0); - /* "thirdparty/pycocotools/_mask.pyx":146 + /* "libs/datasets/pycocotools/_mask.pyx":146 * # decode mask from compressed list of RLE string or RLEs object * def decode(rleObjs): * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n * masks = Masks(h, w, n) */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -3351,43 +3042,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 146, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; - __Pyx_INCREF(__pyx_v_rleObjs); - __Pyx_GIVEREF(__pyx_v_rleObjs); - PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 146, __pyx_L1_error) - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":147 + /* "libs/datasets/pycocotools/_mask.pyx":147 * def decode(rleObjs): * cdef RLEs Rs = _frString(rleObjs) * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n # <<<<<<<<<<<<<< @@ -3401,20 +3074,20 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE __pyx_v_w = __pyx_t_6; __pyx_v_n = __pyx_t_7; - /* "thirdparty/pycocotools/_mask.pyx":148 + /* "libs/datasets/pycocotools/_mask.pyx":148 * cdef RLEs Rs = _frString(rleObjs) * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n * masks = Masks(h, w, n) # <<<<<<<<<<<<<< * rleDecode(Rs._R, masks._mask, n); * return np.array(masks) */ - __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_h); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_w); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_siz(__pyx_v_w); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); @@ -3425,13 +3098,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_Masks), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_Masks), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_masks = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks *)__pyx_t_4); + __pyx_v_masks = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks *)__pyx_t_4); __pyx_t_4 = 0; - /* "thirdparty/pycocotools/_mask.pyx":149 + /* "libs/datasets/pycocotools/_mask.pyx":149 * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n * masks = Masks(h, w, n) * rleDecode(Rs._R, masks._mask, n); # <<<<<<<<<<<<<< @@ -3440,7 +3113,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE */ rleDecode(((RLE *)__pyx_v_Rs->_R), __pyx_v_masks->_mask, __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":150 + /* "libs/datasets/pycocotools/_mask.pyx":150 * masks = Masks(h, w, n) * rleDecode(Rs._R, masks._mask, n); * return np.array(masks) # <<<<<<<<<<<<<< @@ -3448,13 +3121,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE * def merge(rleObjs, intersect=0): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 150, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -3464,43 +3137,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE } } if (!__pyx_t_3) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_masks)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_masks)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_masks)}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_4); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_masks)}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_4); - } else - #endif - { - __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = NULL; - __Pyx_INCREF(((PyObject *)__pyx_v_masks)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_masks)); - PyTuple_SET_ITEM(__pyx_t_1, 0+1, ((PyObject *)__pyx_v_masks)); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } + __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_masks)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_masks)); + PyTuple_SET_ITEM(__pyx_t_1, 0+1, ((PyObject *)__pyx_v_masks)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":145 + /* "libs/datasets/pycocotools/_mask.pyx":145 * * # decode mask from compressed list of RLE string or RLEs object * def decode(rleObjs): # <<<<<<<<<<<<<< @@ -3514,7 +3169,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.decode", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.decode", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_Rs); @@ -3524,7 +3179,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":152 +/* "libs/datasets/pycocotools/_mask.pyx":152 * return np.array(masks) * * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< @@ -3533,11 +3188,14 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_6decode(CYTHON_UNUSE */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_9merge = {"merge", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_9merge(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_9merge = {"merge", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_9merge, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_9merge(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_rleObjs = 0; PyObject *__pyx_v_intersect = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("merge (wrapper)", 0); @@ -3566,7 +3224,7 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge(PyObject *__p } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "merge") < 0)) __PYX_ERR(0, 152, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "merge") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -3581,22 +3239,22 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_9merge(PyObject *__p } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("merge", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 152, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("merge", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.merge", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.merge", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(__pyx_self, __pyx_v_rleObjs, __pyx_v_intersect); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_8merge(__pyx_self, __pyx_v_rleObjs, __pyx_v_intersect); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs, PyObject *__pyx_v_intersect) { - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_R = 0; +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs, PyObject *__pyx_v_intersect) { + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_R = 0; PyObject *__pyx_v_obj = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations @@ -3605,19 +3263,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("merge", 0); - /* "thirdparty/pycocotools/_mask.pyx":153 + /* "libs/datasets/pycocotools/_mask.pyx":153 * * def merge(rleObjs, intersect=0): * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< * cdef RLEs R = RLEs(1) * rleMerge(Rs._R, R._R, Rs._n, intersect) */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 153, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -3627,75 +3288,57 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; - __Pyx_INCREF(__pyx_v_rleObjs); - __Pyx_GIVEREF(__pyx_v_rleObjs); - PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 153, __pyx_L1_error) - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":154 + /* "libs/datasets/pycocotools/_mask.pyx":154 * def merge(rleObjs, intersect=0): * cdef RLEs Rs = _frString(rleObjs) * cdef RLEs R = RLEs(1) # <<<<<<<<<<<<<< * rleMerge(Rs._R, R._R, Rs._n, intersect) * obj = _toString(R)[0] */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 154, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_v_R = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_v_R = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":155 + /* "libs/datasets/pycocotools/_mask.pyx":155 * cdef RLEs Rs = _frString(rleObjs) * cdef RLEs R = RLEs(1) * rleMerge(Rs._R, R._R, Rs._n, intersect) # <<<<<<<<<<<<<< * obj = _toString(R)[0] * return obj */ - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_intersect); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 155, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_intersect); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} rleMerge(((RLE *)__pyx_v_Rs->_R), ((RLE *)__pyx_v_R->_R), ((siz)__pyx_v_Rs->_n), __pyx_t_5); - /* "thirdparty/pycocotools/_mask.pyx":156 + /* "libs/datasets/pycocotools/_mask.pyx":156 * cdef RLEs R = RLEs(1) * rleMerge(Rs._R, R._R, Rs._n, intersect) * obj = _toString(R)[0] # <<<<<<<<<<<<<< * return obj * */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -3705,45 +3348,27 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED } } if (!__pyx_t_4) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_R)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_R)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, ((PyObject *)__pyx_v_R)}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, ((PyObject *)__pyx_v_R)}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 156, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; - __Pyx_INCREF(((PyObject *)__pyx_v_R)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_R)); - PyTuple_SET_ITEM(__pyx_t_3, 0+1, ((PyObject *)__pyx_v_R)); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_R)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_R)); + PyTuple_SET_ITEM(__pyx_t_3, 0+1, ((PyObject *)__pyx_v_R)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_obj = __pyx_t_2; __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":157 + /* "libs/datasets/pycocotools/_mask.pyx":157 * rleMerge(Rs._R, R._R, Rs._n, intersect) * obj = _toString(R)[0] * return obj # <<<<<<<<<<<<<< @@ -3755,7 +3380,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED __pyx_r = __pyx_v_obj; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":152 + /* "libs/datasets/pycocotools/_mask.pyx":152 * return np.array(masks) * * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< @@ -3769,7 +3394,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.merge", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.merge", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_Rs); @@ -3780,7 +3405,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":159 +/* "libs/datasets/pycocotools/_mask.pyx":159 * return obj * * def area(rleObjs): # <<<<<<<<<<<<<< @@ -3789,21 +3414,21 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_8merge(CYTHON_UNUSED */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_11area(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_11area = {"area", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_11area, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_11area(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_11area(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_11area = {"area", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_11area, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_11area(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("area (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_10area(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_10area(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; uint *__pyx_v__a; npy_intp __pyx_v_shape[1]; PyObject *__pyx_v_a = NULL; @@ -3814,19 +3439,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("area", 0); - /* "thirdparty/pycocotools/_mask.pyx":160 + /* "libs/datasets/pycocotools/_mask.pyx":160 * * def area(rleObjs): * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< * cdef uint* _a = malloc(Rs._n* sizeof(uint)) * rleArea(Rs._R, Rs._n, _a) */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -3836,43 +3464,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 160, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; - __Pyx_INCREF(__pyx_v_rleObjs); - __Pyx_GIVEREF(__pyx_v_rleObjs); - PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 160, __pyx_L1_error) - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":161 + /* "libs/datasets/pycocotools/_mask.pyx":161 * def area(rleObjs): * cdef RLEs Rs = _frString(rleObjs) * cdef uint* _a = malloc(Rs._n* sizeof(uint)) # <<<<<<<<<<<<<< @@ -3881,7 +3491,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED */ __pyx_v__a = ((uint *)malloc((__pyx_v_Rs->_n * (sizeof(unsigned int))))); - /* "thirdparty/pycocotools/_mask.pyx":162 + /* "libs/datasets/pycocotools/_mask.pyx":162 * cdef RLEs Rs = _frString(rleObjs) * cdef uint* _a = malloc(Rs._n* sizeof(uint)) * rleArea(Rs._R, Rs._n, _a) # <<<<<<<<<<<<<< @@ -3890,7 +3500,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED */ rleArea(__pyx_v_Rs->_R, __pyx_v_Rs->_n, __pyx_v__a); - /* "thirdparty/pycocotools/_mask.pyx":164 + /* "libs/datasets/pycocotools/_mask.pyx":164 * rleArea(Rs._R, Rs._n, _a) * cdef np.npy_intp shape[1] * shape[0] = Rs._n # <<<<<<<<<<<<<< @@ -3899,40 +3509,40 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED */ (__pyx_v_shape[0]) = ((npy_intp)__pyx_v_Rs->_n); - /* "thirdparty/pycocotools/_mask.pyx":165 + /* "libs/datasets/pycocotools/_mask.pyx":165 * cdef np.npy_intp shape[1] * shape[0] = Rs._n * a = np.array((Rs._n, ), dtype=np.uint8) # <<<<<<<<<<<<<< * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_Rs->_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_Rs->_n); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint8); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 165, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 165, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -3940,29 +3550,29 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED __pyx_v_a = __pyx_t_5; __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":166 + /* "libs/datasets/pycocotools/_mask.pyx":166 * shape[0] = Rs._n * a = np.array((Rs._n, ), dtype=np.uint8) * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) # <<<<<<<<<<<<<< * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) * return a */ - __pyx_t_5 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_UINT32, __pyx_v__a); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 166, __pyx_L1_error) + __pyx_t_5 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_UINT32, __pyx_v__a); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF_SET(__pyx_v_a, __pyx_t_5); __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":167 + /* "libs/datasets/pycocotools/_mask.pyx":167 * a = np.array((Rs._n, ), dtype=np.uint8) * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) # <<<<<<<<<<<<<< * return a * */ - if (!(likely(((__pyx_v_a) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_a, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 167, __pyx_L1_error) + if (!(likely(((__pyx_v_a) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_a, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_a), NPY_OWNDATA); - /* "thirdparty/pycocotools/_mask.pyx":168 + /* "libs/datasets/pycocotools/_mask.pyx":168 * a = np.PyArray_SimpleNewFromData(1, shape, np.NPY_UINT32, _a) * PyArray_ENABLEFLAGS(a, np.NPY_OWNDATA) * return a # <<<<<<<<<<<<<< @@ -3974,7 +3584,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED __pyx_r = __pyx_v_a; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":159 + /* "libs/datasets/pycocotools/_mask.pyx":159 * return obj * * def area(rleObjs): # <<<<<<<<<<<<<< @@ -3989,7 +3599,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.area", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.area", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_Rs); @@ -3999,7 +3609,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":171 +/* "libs/datasets/pycocotools/_mask.pyx":171 * * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< @@ -4008,12 +3618,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_10area(CYTHON_UNUSED */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_13iou = {"iou", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_13iou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_13iou = {"iou", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_13iou, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_13iou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_dt = 0; PyObject *__pyx_v_gt = 0; PyObject *__pyx_v_pyiscrowd = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("iou (wrapper)", 0); @@ -4038,16 +3651,16 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__py case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gt)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, 1); __PYX_ERR(0, 171, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_pyiscrowd)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, 2); __PYX_ERR(0, 171, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "iou") < 0)) __PYX_ERR(0, 171, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "iou") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -4062,20 +3675,20 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__py } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 171, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("iou", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_pyiscrowd); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_12iou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_pyiscrowd); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":172 +/* "libs/datasets/pycocotools/_mask.pyx":172 * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): * def _preproc(objs): # <<<<<<<<<<<<<< @@ -4084,20 +3697,20 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_13iou(PyObject *__py */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_1_preproc(PyObject *__pyx_self, PyObject *__pyx_v_objs); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_1_preproc = {"_preproc", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_1_preproc, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_1_preproc(PyObject *__pyx_self, PyObject *__pyx_v_objs) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_1_preproc(PyObject *__pyx_self, PyObject *__pyx_v_objs); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_1_preproc = {"_preproc", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_1_preproc, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_1_preproc(PyObject *__pyx_self, PyObject *__pyx_v_objs) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_preproc (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(__pyx_self, ((PyObject *)__pyx_v_objs)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou__preproc(__pyx_self, ((PyObject *)__pyx_v_objs)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_objs) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou__preproc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_objs) { PyObject *__pyx_v_isbox = NULL; PyObject *__pyx_v_isrle = NULL; PyObject *__pyx_v_obj = NULL; @@ -4117,21 +3730,24 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON PyObject *__pyx_t_12 = NULL; Py_ssize_t __pyx_t_13; PyObject *__pyx_t_14 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_preproc", 0); __Pyx_INCREF(__pyx_v_objs); - /* "thirdparty/pycocotools/_mask.pyx":173 + /* "libs/datasets/pycocotools/_mask.pyx":173 * def iou( dt, gt, pyiscrowd ): * def _preproc(objs): * if len(objs) == 0: # <<<<<<<<<<<<<< * return objs * if type(objs) == np.ndarray: */ - __pyx_t_1 = PyObject_Length(__pyx_v_objs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 173, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_v_objs); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = ((__pyx_t_1 == 0) != 0); if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":174 + /* "libs/datasets/pycocotools/_mask.pyx":174 * def _preproc(objs): * if len(objs) == 0: * return objs # <<<<<<<<<<<<<< @@ -4143,7 +3759,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":173 + /* "libs/datasets/pycocotools/_mask.pyx":173 * def iou( dt, gt, pyiscrowd ): * def _preproc(objs): * if len(objs) == 0: # <<<<<<<<<<<<<< @@ -4152,44 +3768,44 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON */ } - /* "thirdparty/pycocotools/_mask.pyx":175 + /* "libs/datasets/pycocotools/_mask.pyx":175 * if len(objs) == 0: * return objs * if type(objs) == np.ndarray: # <<<<<<<<<<<<<< * if len(objs.shape) == 1: * objs = objs.reshape((objs[0], 1)) */ - __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_objs)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 175, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 175, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_objs)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":176 + /* "libs/datasets/pycocotools/_mask.pyx":176 * return objs * if type(objs) == np.ndarray: * if len(objs.shape) == 1: # <<<<<<<<<<<<<< * objs = objs.reshape((objs[0], 1)) * # check if it's Nx4 bbox */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 176, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 176, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_2 = ((__pyx_t_1 == 1) != 0); if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":177 + /* "libs/datasets/pycocotools/_mask.pyx":177 * if type(objs) == np.ndarray: * if len(objs.shape) == 1: * objs = objs.reshape((objs[0], 1)) # <<<<<<<<<<<<<< * # check if it's Nx4 bbox * if not len(objs.shape) == 2 or not objs.shape[1] == 4: */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 177, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_objs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 177, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_objs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 177, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); @@ -4198,7 +3814,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_1); __pyx_t_5 = 0; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); @@ -4208,45 +3824,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_5) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_3); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_6}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_6}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 177, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL; - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_6); - __pyx_t_6 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - } + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_3); __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":176 + /* "libs/datasets/pycocotools/_mask.pyx":176 * return objs * if type(objs) == np.ndarray: * if len(objs.shape) == 1: # <<<<<<<<<<<<<< @@ -4255,16 +3851,16 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON */ } - /* "thirdparty/pycocotools/_mask.pyx":179 + /* "libs/datasets/pycocotools/_mask.pyx":179 * objs = objs.reshape((objs[0], 1)) * # check if it's Nx4 bbox * if not len(objs.shape) == 2 or not objs.shape[1] == 4: # <<<<<<<<<<<<<< * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') * objs = objs.astype(np.double) */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 179, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_8 = ((!((__pyx_t_1 == 2) != 0)) != 0); if (!__pyx_t_8) { @@ -4272,35 +3868,35 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON __pyx_t_2 = __pyx_t_8; goto __pyx_L7_bool_binop_done; } - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 179, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_t_4, __pyx_int_4, 4, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_EqObjC(__pyx_t_4, __pyx_int_4, 4, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 179, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_9 = ((!__pyx_t_8) != 0); __pyx_t_2 = __pyx_t_9; __pyx_L7_bool_binop_done:; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":180 + /* "libs/datasets/pycocotools/_mask.pyx":180 * # check if it's Nx4 bbox * if not len(objs.shape) == 2 or not objs.shape[1] == 4: * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') # <<<<<<<<<<<<<< * objs = objs.astype(np.double) * elif type(objs) == list: */ - __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 180, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 180, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":179 + /* "libs/datasets/pycocotools/_mask.pyx":179 * objs = objs.reshape((objs[0], 1)) * # check if it's Nx4 bbox * if not len(objs.shape) == 2 or not objs.shape[1] == 4: # <<<<<<<<<<<<<< @@ -4309,22 +3905,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON */ } - /* "thirdparty/pycocotools/_mask.pyx":181 + /* "libs/datasets/pycocotools/_mask.pyx":181 * if not len(objs.shape) == 2 or not objs.shape[1] == 4: * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') * objs = objs.astype(np.double) # <<<<<<<<<<<<<< * elif type(objs) == list: * # check if list is in box format and convert it to np.ndarray */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 181, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 181, __pyx_L1_error) + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_double); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 181, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_double); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); @@ -4334,45 +3930,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_7) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_3); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_6}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_6}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); __pyx_t_7 = NULL; - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_6); - __pyx_t_6 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_3); __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":175 + /* "libs/datasets/pycocotools/_mask.pyx":175 * if len(objs) == 0: * return objs * if type(objs) == np.ndarray: # <<<<<<<<<<<<<< @@ -4382,61 +3958,61 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON goto __pyx_L4; } - /* "thirdparty/pycocotools/_mask.pyx":182 + /* "libs/datasets/pycocotools/_mask.pyx":182 * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') * objs = objs.astype(np.double) * elif type(objs) == list: # <<<<<<<<<<<<<< * # check if list is in box format and convert it to np.ndarray * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) */ - __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_objs)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 182, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_objs)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":184 + /* "libs/datasets/pycocotools/_mask.pyx":184 * elif type(objs) == list: * # check if list is in box format and convert it to np.ndarray * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) # <<<<<<<<<<<<<< * isrle = np.all(np.array([type(obj) == dict for obj in objs])) * if isbox: */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_all); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_all); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); if (likely(PyList_CheckExact(__pyx_v_objs)) || PyTuple_CheckExact(__pyx_v_objs)) { __pyx_t_10 = __pyx_v_objs; __Pyx_INCREF(__pyx_t_10); __pyx_t_1 = 0; __pyx_t_11 = NULL; } else { - __pyx_t_1 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_v_objs); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_1 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_v_objs); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); - __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } for (;;) { if (likely(!__pyx_t_11)) { if (likely(PyList_CheckExact(__pyx_t_10))) { if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_10)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_12 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_12 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_12); #endif } else { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_10)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_12); #endif } @@ -4446,7 +4022,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 184, __pyx_L1_error) + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } @@ -4454,18 +4030,18 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_12); __pyx_t_12 = 0; - __pyx_t_13 = PyObject_Length(__pyx_v_obj); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_13 = PyObject_Length(__pyx_v_obj); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = (__pyx_t_13 == 4); if (__pyx_t_2) { } else { - __pyx_t_14 = __Pyx_PyBool_FromLong(__pyx_t_2); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_14 = __Pyx_PyBool_FromLong(__pyx_t_2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_14); __pyx_t_12 = __pyx_t_14; __pyx_t_14 = 0; goto __pyx_L11_bool_binop_done; } - __pyx_t_14 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 184, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_14 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!__pyx_t_2) { __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; } else { @@ -4474,17 +4050,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; goto __pyx_L11_bool_binop_done; } - __pyx_t_14 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_14 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_INCREF(__pyx_t_14); __pyx_t_12 = __pyx_t_14; __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; __pyx_L11_bool_binop_done:; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_6, (PyObject*)__pyx_t_12))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_6, (PyObject*)__pyx_t_12))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_10 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); @@ -4494,43 +4070,23 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_10) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_4); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_6); - __pyx_t_6 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - } + __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_12); + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); @@ -4540,87 +4096,67 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_7) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_3); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_4}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_4}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else - #endif - { - __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7); __pyx_t_7 = NULL; - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_4); - __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - } + __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_12); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_12, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_isbox = __pyx_t_3; __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":185 + /* "libs/datasets/pycocotools/_mask.pyx":185 * # check if list is in box format and convert it to np.ndarray * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) * isrle = np.all(np.array([type(obj) == dict for obj in objs])) # <<<<<<<<<<<<<< * if isbox: * objs = np.array(objs, dtype=np.double) */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_all); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_all); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); if (likely(PyList_CheckExact(__pyx_v_objs)) || PyTuple_CheckExact(__pyx_v_objs)) { __pyx_t_6 = __pyx_v_objs; __Pyx_INCREF(__pyx_t_6); __pyx_t_1 = 0; __pyx_t_11 = NULL; } else { - __pyx_t_1 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_objs); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_1 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_objs); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } for (;;) { if (likely(!__pyx_t_11)) { if (likely(PyList_CheckExact(__pyx_t_6))) { if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_6)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_10 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 185, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_10 = PySequence_ITEM(__pyx_t_6, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_10 = PySequence_ITEM(__pyx_t_6, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); #endif } else { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_6)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 185, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_1); __Pyx_INCREF(__pyx_t_10); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_10 = PySequence_ITEM(__pyx_t_6, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_10 = PySequence_ITEM(__pyx_t_6, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); #endif } @@ -4630,7 +4166,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 185, __pyx_L1_error) + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } @@ -4638,13 +4174,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) - if (unlikely(__Pyx_ListComp_Append(__pyx_t_4, (PyObject*)__pyx_t_10))) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_10 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(__Pyx_ListComp_Append(__pyx_t_4, (PyObject*)__pyx_t_10))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); @@ -4654,43 +4190,23 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_6) { - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_5); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_4}; - __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_4}; - __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else - #endif - { - __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6); __pyx_t_6 = NULL; - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_4); - __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - } + __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_12))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_12))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); @@ -4700,81 +4216,61 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_7) { - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_3); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_12)) { - PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_5}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_12)) { - PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_5}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else - #endif - { - __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7); __pyx_t_7 = NULL; - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_5); - __pyx_t_5 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 185, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - } + __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_10, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __pyx_v_isrle = __pyx_t_3; __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":186 + /* "libs/datasets/pycocotools/_mask.pyx":186 * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) * isrle = np.all(np.array([type(obj) == dict for obj in objs])) * if isbox: # <<<<<<<<<<<<<< * objs = np.array(objs, dtype=np.double) * if len(objs.shape) == 1: */ - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_isbox); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 186, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_isbox); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":187 + /* "libs/datasets/pycocotools/_mask.pyx":187 * isrle = np.all(np.array([type(obj) == dict for obj in objs])) * if isbox: * objs = np.array(objs, dtype=np.double) # <<<<<<<<<<<<<< * if len(objs.shape) == 1: * objs = objs.reshape((1,objs.shape[0])) */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_array); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_objs); __Pyx_GIVEREF(__pyx_v_objs); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_objs); - __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_double); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_double); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 187, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_3, __pyx_t_10); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 187, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_3, __pyx_t_10); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -4782,35 +4278,35 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_7); __pyx_t_7 = 0; - /* "thirdparty/pycocotools/_mask.pyx":188 + /* "libs/datasets/pycocotools/_mask.pyx":188 * if isbox: * objs = np.array(objs, dtype=np.double) * if len(objs.shape) == 1: # <<<<<<<<<<<<<< * objs = objs.reshape((1,objs.shape[0])) * elif isrle: */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 188, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_1 = PyObject_Length(__pyx_t_7); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 188, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_t_7); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_2 = ((__pyx_t_1 == 1) != 0); if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":189 + /* "libs/datasets/pycocotools/_mask.pyx":189 * objs = np.array(objs, dtype=np.double) * if len(objs.shape) == 1: * objs = objs.reshape((1,objs.shape[0])) # <<<<<<<<<<<<<< * elif isrle: * objs = _frString(objs) */ - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_reshape); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 189, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_reshape); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_objs, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 189, __pyx_L1_error) + __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_int_1); __Pyx_GIVEREF(__pyx_int_1); @@ -4819,7 +4315,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12); __pyx_t_12 = 0; __pyx_t_12 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) { + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_10))) { __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10); if (likely(__pyx_t_12)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); @@ -4829,45 +4325,25 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_12) { - __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_7); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_3}; - __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_3}; - __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } else - #endif - { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 189, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_12); __pyx_t_12 = NULL; - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3); - __pyx_t_3 = 0; - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_5, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 189, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_12); __pyx_t_12 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_5, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_7); __pyx_t_7 = 0; - /* "thirdparty/pycocotools/_mask.pyx":188 + /* "libs/datasets/pycocotools/_mask.pyx":188 * if isbox: * objs = np.array(objs, dtype=np.double) * if len(objs.shape) == 1: # <<<<<<<<<<<<<< @@ -4876,7 +4352,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON */ } - /* "thirdparty/pycocotools/_mask.pyx":186 + /* "libs/datasets/pycocotools/_mask.pyx":186 * isbox = np.all(np.array([(len(obj)==4) and ((type(obj)==list) or (type(obj)==np.ndarray)) for obj in objs])) * isrle = np.all(np.array([type(obj) == dict for obj in objs])) * if isbox: # <<<<<<<<<<<<<< @@ -4886,27 +4362,27 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON goto __pyx_L16; } - /* "thirdparty/pycocotools/_mask.pyx":190 + /* "libs/datasets/pycocotools/_mask.pyx":190 * if len(objs.shape) == 1: * objs = objs.reshape((1,objs.shape[0])) * elif isrle: # <<<<<<<<<<<<<< * objs = _frString(objs) * else: */ - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_isrle); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 190, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_isrle); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":191 + /* "libs/datasets/pycocotools/_mask.pyx":191 * objs = objs.reshape((1,objs.shape[0])) * elif isrle: * objs = _frString(objs) # <<<<<<<<<<<<<< * else: * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') */ - __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 191, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_10); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); @@ -4916,42 +4392,24 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON } } if (!__pyx_t_5) { - __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_v_objs); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_v_objs); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_v_objs}; - __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_7); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_v_objs}; - __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_7); - } else - #endif - { - __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 191, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = NULL; - __Pyx_INCREF(__pyx_v_objs); - __Pyx_GIVEREF(__pyx_v_objs); - PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_objs); - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 191, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_INCREF(__pyx_v_objs); + __Pyx_GIVEREF(__pyx_v_objs); + PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_objs); + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF_SET(__pyx_v_objs, __pyx_t_7); __pyx_t_7 = 0; - /* "thirdparty/pycocotools/_mask.pyx":190 + /* "libs/datasets/pycocotools/_mask.pyx":190 * if len(objs.shape) == 1: * objs = objs.reshape((1,objs.shape[0])) * elif isrle: # <<<<<<<<<<<<<< @@ -4961,7 +4419,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON goto __pyx_L16; } - /* "thirdparty/pycocotools/_mask.pyx":193 + /* "libs/datasets/pycocotools/_mask.pyx":193 * objs = _frString(objs) * else: * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') # <<<<<<<<<<<<<< @@ -4969,15 +4427,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') */ /*else*/ { - __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_Raise(__pyx_t_7, 0, 0, 0); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __PYX_ERR(0, 193, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L16:; - /* "thirdparty/pycocotools/_mask.pyx":182 + /* "libs/datasets/pycocotools/_mask.pyx":182 * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') * objs = objs.astype(np.double) * elif type(objs) == list: # <<<<<<<<<<<<<< @@ -4987,7 +4445,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON goto __pyx_L4; } - /* "thirdparty/pycocotools/_mask.pyx":195 + /* "libs/datasets/pycocotools/_mask.pyx":195 * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') * else: * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') # <<<<<<<<<<<<<< @@ -4995,15 +4453,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON * 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): */ /*else*/ { - __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_Raise(__pyx_t_7, 0, 0, 0); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __PYX_ERR(0, 195, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L4:; - /* "thirdparty/pycocotools/_mask.pyx":196 + /* "libs/datasets/pycocotools/_mask.pyx":196 * else: * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') * return objs # <<<<<<<<<<<<<< @@ -5015,7 +4473,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":172 + /* "libs/datasets/pycocotools/_mask.pyx":172 * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): * def _preproc(objs): # <<<<<<<<<<<<<< @@ -5033,7 +4491,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_14); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._preproc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou._preproc", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_isbox); @@ -5045,7 +4503,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":197 +/* "libs/datasets/pycocotools/_mask.pyx":197 * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') * return objs * 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): # <<<<<<<<<<<<<< @@ -5054,15 +4512,18 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(CYTHON */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou = {"_rleIou", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_dt = 0; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_gt = 0; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_3_rleIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_3_rleIou = {"_rleIou", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_3_rleIou, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_3_rleIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_dt = 0; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_gt = 0; PyArrayObject *__pyx_v_iscrowd = 0; siz __pyx_v_m; siz __pyx_v_n; PyArrayObject *__pyx_v__iou = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_rleIou (wrapper)", 0); @@ -5090,31 +4551,31 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObje case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gt)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 1); __PYX_ERR(0, 197, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iscrowd)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 2); __PYX_ERR(0, 197, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_m)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 3); __PYX_ERR(0, 197, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 4); __PYX_ERR(0, 197, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iou)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 5); __PYX_ERR(0, 197, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_rleIou") < 0)) __PYX_ERR(0, 197, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_rleIou") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -5126,26 +4587,26 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObje values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); } - __pyx_v_dt = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)values[0]); - __pyx_v_gt = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)values[1]); + __pyx_v_dt = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)values[0]); + __pyx_v_gt = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)values[1]); __pyx_v_iscrowd = ((PyArrayObject *)values[2]); - __pyx_v_m = __Pyx_PyInt_As_siz(values[3]); if (unlikely((__pyx_v_m == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) - __pyx_v_n = __Pyx_PyInt_As_siz(values[4]); if (unlikely((__pyx_v_n == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L3_error) + __pyx_v_m = __Pyx_PyInt_As_siz(values[3]); if (unlikely((__pyx_v_m == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n = __Pyx_PyInt_As_siz(values[4]); if (unlikely((__pyx_v_n == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v__iou = ((PyArrayObject *)values[5]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 197, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_rleIou", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._rleIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou._rleIou", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs, 1, "dt", 0))) __PYX_ERR(0, 197, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gt), __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs, 1, "gt", 0))) __PYX_ERR(0, 197, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_iscrowd), __pyx_ptype_5numpy_ndarray, 1, "iscrowd", 0))) __PYX_ERR(0, 197, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v__iou), __pyx_ptype_5numpy_ndarray, 1, "_iou", 0))) __PYX_ERR(0, 197, __pyx_L1_error) - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_iscrowd, __pyx_v_m, __pyx_v_n, __pyx_v__iou); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs, 1, "dt", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gt), __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs, 1, "gt", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_iscrowd), __pyx_ptype_5numpy_ndarray, 1, "iscrowd", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v__iou), __pyx_ptype_5numpy_ndarray, 1, "_iou", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_2_rleIou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_iscrowd, __pyx_v_m, __pyx_v_n, __pyx_v__iou); /* function exit code */ goto __pyx_L0; @@ -5156,13 +4617,16 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou(PyObje return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_dt, struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_2_rleIou(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_dt, struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou) { __Pyx_LocalBuf_ND __pyx_pybuffernd__iou; __Pyx_Buffer __pyx_pybuffer__iou; __Pyx_LocalBuf_ND __pyx_pybuffernd_iscrowd; __Pyx_Buffer __pyx_pybuffer_iscrowd; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_rleIou", 0); __pyx_pybuffer_iscrowd.pybuffer.buf = NULL; __pyx_pybuffer_iscrowd.refcount = 0; @@ -5174,16 +4638,16 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON __pyx_pybuffernd__iou.rcbuffer = &__pyx_pybuffer__iou; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_v_iscrowd, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_v_iscrowd, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_iscrowd.diminfo[0].strides = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_iscrowd.diminfo[0].shape = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd__iou.rcbuffer->pybuffer, (PyObject*)__pyx_v__iou, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 197, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd__iou.rcbuffer->pybuffer, (PyObject*)__pyx_v__iou, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd__iou.diminfo[0].strides = __pyx_pybuffernd__iou.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd__iou.diminfo[0].shape = __pyx_pybuffernd__iou.rcbuffer->pybuffer.shape[0]; - /* "thirdparty/pycocotools/_mask.pyx":198 + /* "libs/datasets/pycocotools/_mask.pyx":198 * return objs * 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): * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) # <<<<<<<<<<<<<< @@ -5192,7 +4656,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON */ rleIou(((RLE *)__pyx_v_dt->_R), ((RLE *)__pyx_v_gt->_R), __pyx_v_m, __pyx_v_n, ((byte *)__pyx_v_iscrowd->data), ((double *)__pyx_v__iou->data)); - /* "thirdparty/pycocotools/_mask.pyx":197 + /* "libs/datasets/pycocotools/_mask.pyx":197 * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') * return objs * 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): # <<<<<<<<<<<<<< @@ -5205,13 +4669,11 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON goto __pyx_L0; __pyx_L1_error:; { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd__iou.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._rleIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou._rleIou", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -5223,7 +4685,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":199 +/* "libs/datasets/pycocotools/_mask.pyx":199 * 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): * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): # <<<<<<<<<<<<<< @@ -5232,15 +4694,18 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_2_rleIou(CYTHON */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou = {"_bbIou", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_5_bbIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_5_bbIou = {"_bbIou", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_5_bbIou, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_5_bbIou(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyArrayObject *__pyx_v_dt = 0; PyArrayObject *__pyx_v_gt = 0; PyArrayObject *__pyx_v_iscrowd = 0; siz __pyx_v_m; siz __pyx_v_n; PyArrayObject *__pyx_v__iou = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_bbIou (wrapper)", 0); @@ -5268,31 +4733,31 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObjec case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_gt)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 1); __PYX_ERR(0, 199, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iscrowd)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 2); __PYX_ERR(0, 199, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_m)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 3); __PYX_ERR(0, 199, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 4); __PYX_ERR(0, 199, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iou)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 5); __PYX_ERR(0, 199, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_bbIou") < 0)) __PYX_ERR(0, 199, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_bbIou") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -5307,23 +4772,23 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObjec __pyx_v_dt = ((PyArrayObject *)values[0]); __pyx_v_gt = ((PyArrayObject *)values[1]); __pyx_v_iscrowd = ((PyArrayObject *)values[2]); - __pyx_v_m = __Pyx_PyInt_As_siz(values[3]); if (unlikely((__pyx_v_m == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 199, __pyx_L3_error) - __pyx_v_n = __Pyx_PyInt_As_siz(values[4]); if (unlikely((__pyx_v_n == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 199, __pyx_L3_error) + __pyx_v_m = __Pyx_PyInt_As_siz(values[3]); if (unlikely((__pyx_v_m == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_n = __Pyx_PyInt_As_siz(values[4]); if (unlikely((__pyx_v_n == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v__iou = ((PyArrayObject *)values[5]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 199, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("_bbIou", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._bbIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou._bbIou", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_5numpy_ndarray, 1, "dt", 0))) __PYX_ERR(0, 199, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gt), __pyx_ptype_5numpy_ndarray, 1, "gt", 0))) __PYX_ERR(0, 199, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_iscrowd), __pyx_ptype_5numpy_ndarray, 1, "iscrowd", 0))) __PYX_ERR(0, 199, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v__iou), __pyx_ptype_5numpy_ndarray, 1, "_iou", 0))) __PYX_ERR(0, 199, __pyx_L1_error) - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_iscrowd, __pyx_v_m, __pyx_v_n, __pyx_v__iou); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dt), __pyx_ptype_5numpy_ndarray, 1, "dt", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gt), __pyx_ptype_5numpy_ndarray, 1, "gt", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_iscrowd), __pyx_ptype_5numpy_ndarray, 1, "iscrowd", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v__iou), __pyx_ptype_5numpy_ndarray, 1, "_iou", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_4_bbIou(__pyx_self, __pyx_v_dt, __pyx_v_gt, __pyx_v_iscrowd, __pyx_v_m, __pyx_v_n, __pyx_v__iou); /* function exit code */ goto __pyx_L0; @@ -5334,7 +4799,7 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou(PyObjec return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dt, PyArrayObject *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dt, PyArrayObject *__pyx_v_gt, PyArrayObject *__pyx_v_iscrowd, siz __pyx_v_m, siz __pyx_v_n, PyArrayObject *__pyx_v__iou) { __Pyx_LocalBuf_ND __pyx_pybuffernd__iou; __Pyx_Buffer __pyx_pybuffer__iou; __Pyx_LocalBuf_ND __pyx_pybuffernd_dt; @@ -5345,6 +4810,9 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_ __Pyx_Buffer __pyx_pybuffer_iscrowd; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_bbIou", 0); __pyx_pybuffer_dt.pybuffer.buf = NULL; __pyx_pybuffer_dt.refcount = 0; @@ -5364,26 +4832,26 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_ __pyx_pybuffernd__iou.rcbuffer = &__pyx_pybuffer__iou; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_dt.rcbuffer->pybuffer, (PyObject*)__pyx_v_dt, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_dt.rcbuffer->pybuffer, (PyObject*)__pyx_v_dt, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_dt.diminfo[0].strides = __pyx_pybuffernd_dt.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_dt.diminfo[0].shape = __pyx_pybuffernd_dt.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_dt.diminfo[1].strides = __pyx_pybuffernd_dt.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_dt.diminfo[1].shape = __pyx_pybuffernd_dt.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_gt.rcbuffer->pybuffer, (PyObject*)__pyx_v_gt, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_gt.rcbuffer->pybuffer, (PyObject*)__pyx_v_gt, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_gt.diminfo[0].strides = __pyx_pybuffernd_gt.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_gt.diminfo[0].shape = __pyx_pybuffernd_gt.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_gt.diminfo[1].strides = __pyx_pybuffernd_gt.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_gt.diminfo[1].shape = __pyx_pybuffernd_gt.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_v_iscrowd, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_v_iscrowd, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_iscrowd.diminfo[0].strides = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_iscrowd.diminfo[0].shape = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd__iou.rcbuffer->pybuffer, (PyObject*)__pyx_v__iou, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd__iou.rcbuffer->pybuffer, (PyObject*)__pyx_v__iou, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd__iou.diminfo[0].strides = __pyx_pybuffernd__iou.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd__iou.diminfo[0].shape = __pyx_pybuffernd__iou.rcbuffer->pybuffer.shape[0]; - /* "thirdparty/pycocotools/_mask.pyx":200 + /* "libs/datasets/pycocotools/_mask.pyx":200 * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) # <<<<<<<<<<<<<< @@ -5392,7 +4860,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_ */ bbIou(((BB)__pyx_v_dt->data), ((BB)__pyx_v_gt->data), __pyx_v_m, __pyx_v_n, ((byte *)__pyx_v_iscrowd->data), ((double *)__pyx_v__iou->data)); - /* "thirdparty/pycocotools/_mask.pyx":199 + /* "libs/datasets/pycocotools/_mask.pyx":199 * 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): * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): # <<<<<<<<<<<<<< @@ -5405,15 +4873,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_ goto __pyx_L0; __pyx_L1_error:; { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd__iou.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_dt.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_gt.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._bbIou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou._bbIou", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -5427,7 +4893,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_ return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":201 +/* "libs/datasets/pycocotools/_mask.pyx":201 * 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): * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): # <<<<<<<<<<<<<< @@ -5436,20 +4902,20 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_4_bbIou(CYTHON_ */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_7_len(PyObject *__pyx_self, PyObject *__pyx_v_obj); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_7_len = {"_len", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_7_len, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_3iou_7_len(PyObject *__pyx_self, PyObject *__pyx_v_obj) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_7_len(PyObject *__pyx_self, PyObject *__pyx_v_obj); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_7_len = {"_len", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_7_len, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_3iou_7_len(PyObject *__pyx_self, PyObject *__pyx_v_obj) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_len (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(__pyx_self, ((PyObject *)__pyx_v_obj)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_6_len(__pyx_self, ((PyObject *)__pyx_v_obj)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_6_len(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_obj) { siz __pyx_v_N; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations @@ -5458,9 +4924,12 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN siz __pyx_t_3; Py_ssize_t __pyx_t_4; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_len", 0); - /* "thirdparty/pycocotools/_mask.pyx":202 + /* "libs/datasets/pycocotools/_mask.pyx":202 * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): * cdef siz N = 0 # <<<<<<<<<<<<<< @@ -5469,32 +4938,32 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN */ __pyx_v_N = 0; - /* "thirdparty/pycocotools/_mask.pyx":203 + /* "libs/datasets/pycocotools/_mask.pyx":203 * def _len(obj): * cdef siz N = 0 * if type(obj) == RLEs: # <<<<<<<<<<<<<< * N = obj.n * elif len(obj)==0: */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 203, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":204 + /* "libs/datasets/pycocotools/_mask.pyx":204 * cdef siz N = 0 * if type(obj) == RLEs: * N = obj.n # <<<<<<<<<<<<<< * elif len(obj)==0: * pass */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_obj, __pyx_n_s_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_obj, __pyx_n_s_n); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_3 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 204, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_3 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_N = __pyx_t_3; - /* "thirdparty/pycocotools/_mask.pyx":203 + /* "libs/datasets/pycocotools/_mask.pyx":203 * def _len(obj): * cdef siz N = 0 * if type(obj) == RLEs: # <<<<<<<<<<<<<< @@ -5504,48 +4973,48 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":205 + /* "libs/datasets/pycocotools/_mask.pyx":205 * if type(obj) == RLEs: * N = obj.n * elif len(obj)==0: # <<<<<<<<<<<<<< * pass * elif type(obj) == np.ndarray: */ - __pyx_t_4 = PyObject_Length(__pyx_v_obj); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 205, __pyx_L1_error) + __pyx_t_4 = PyObject_Length(__pyx_v_obj); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = ((__pyx_t_4 == 0) != 0); if (__pyx_t_2) { goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":207 + /* "libs/datasets/pycocotools/_mask.pyx":207 * elif len(obj)==0: * pass * elif type(obj) == np.ndarray: # <<<<<<<<<<<<<< * N = obj.shape[0] * return N */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 207, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 207, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_obj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":208 + /* "libs/datasets/pycocotools/_mask.pyx":208 * pass * elif type(obj) == np.ndarray: * N = obj.shape[0] # <<<<<<<<<<<<<< * return N * # convert iscrowd to numpy array */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_obj, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_obj, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_3 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_3 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_3 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_N = __pyx_t_3; - /* "thirdparty/pycocotools/_mask.pyx":207 + /* "libs/datasets/pycocotools/_mask.pyx":207 * elif len(obj)==0: * pass * elif type(obj) == np.ndarray: # <<<<<<<<<<<<<< @@ -5555,7 +5024,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN } __pyx_L3:; - /* "thirdparty/pycocotools/_mask.pyx":209 + /* "libs/datasets/pycocotools/_mask.pyx":209 * elif type(obj) == np.ndarray: * N = obj.shape[0] * return N # <<<<<<<<<<<<<< @@ -5563,13 +5032,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN * cdef np.ndarray[np.uint8_t, ndim=1] iscrowd = np.array(pyiscrowd, dtype=np.uint8) */ __Pyx_XDECREF(__pyx_r); - __pyx_t_5 = __Pyx_PyInt_From_siz(__pyx_v_N); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 209, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_From_siz(__pyx_v_N); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":201 + /* "libs/datasets/pycocotools/_mask.pyx":201 * 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): * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): # <<<<<<<<<<<<<< @@ -5581,7 +5050,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou._len", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou._len", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); @@ -5589,7 +5058,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":171 +/* "libs/datasets/pycocotools/_mask.pyx":171 * * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< @@ -5597,7 +5066,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(CYTHON_UN * if len(objs) == 0: */ -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dt, PyObject *__pyx_v_gt, PyObject *__pyx_v_pyiscrowd) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_dt, PyObject *__pyx_v_gt, PyObject *__pyx_v_pyiscrowd) { PyObject *__pyx_v__preproc = 0; PyObject *__pyx_v__rleIou = 0; PyObject *__pyx_v__bbIou = 0; @@ -5622,8 +5091,11 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED siz __pyx_t_7; int __pyx_t_8; int __pyx_t_9; - int __pyx_t_10; + Py_ssize_t __pyx_t_10; PyObject *__pyx_t_11 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("iou", 0); __Pyx_INCREF(__pyx_v_dt); __Pyx_INCREF(__pyx_v_gt); @@ -5632,92 +5104,92 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __pyx_pybuffernd_iscrowd.data = NULL; __pyx_pybuffernd_iscrowd.rcbuffer = &__pyx_pybuffer_iscrowd; - /* "thirdparty/pycocotools/_mask.pyx":172 + /* "libs/datasets/pycocotools/_mask.pyx":172 * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): * def _preproc(objs): # <<<<<<<<<<<<<< * if len(objs) == 0: * return objs */ - __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_1_preproc, 0, __pyx_n_s_iou_locals__preproc, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 172, __pyx_L1_error) + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_1_preproc, 0, __pyx_n_s_iou_locals__preproc, NULL, __pyx_n_s_libs_datasets_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v__preproc = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":197 + /* "libs/datasets/pycocotools/_mask.pyx":197 * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') * return objs * 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): # <<<<<<<<<<<<<< * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): */ - __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_3_rleIou, 0, __pyx_n_s_iou_locals__rleIou, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 197, __pyx_L1_error) + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_3_rleIou, 0, __pyx_n_s_iou_locals__rleIou, NULL, __pyx_n_s_libs_datasets_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v__rleIou = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":199 + /* "libs/datasets/pycocotools/_mask.pyx":199 * 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): * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): # <<<<<<<<<<<<<< * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): */ - __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_5_bbIou, 0, __pyx_n_s_iou_locals__bbIou, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 199, __pyx_L1_error) + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_5_bbIou, 0, __pyx_n_s_iou_locals__bbIou, NULL, __pyx_n_s_libs_datasets_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v__bbIou = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":201 + /* "libs/datasets/pycocotools/_mask.pyx":201 * 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): * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): # <<<<<<<<<<<<<< * cdef siz N = 0 * if type(obj) == RLEs: */ - __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3iou_7_len, 0, __pyx_n_s_iou_locals__len, NULL, __pyx_n_s_thirdparty_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error) + __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3iou_7_len, 0, __pyx_n_s_iou_locals__len, NULL, __pyx_n_s_libs_datasets_pycocotools__mask, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v__len = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":211 + /* "libs/datasets/pycocotools/_mask.pyx":211 * return N * # convert iscrowd to numpy array * cdef np.ndarray[np.uint8_t, ndim=1] iscrowd = np.array(pyiscrowd, dtype=np.uint8) # <<<<<<<<<<<<<< * # simple type checking * cdef siz m, n */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_pyiscrowd); __Pyx_GIVEREF(__pyx_v_pyiscrowd); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_pyiscrowd); - __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_uint8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_uint8); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 211, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 211, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 211, __pyx_L1_error) + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_iscrowd = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.buf = NULL; - __PYX_ERR(0, 211, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_iscrowd.diminfo[0].strides = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_iscrowd.diminfo[0].shape = __pyx_pybuffernd_iscrowd.rcbuffer->pybuffer.shape[0]; } } @@ -5725,57 +5197,57 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __pyx_v_iscrowd = ((PyArrayObject *)__pyx_t_5); __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":214 + /* "libs/datasets/pycocotools/_mask.pyx":214 * # simple type checking * cdef siz m, n * dt = _preproc(dt) # <<<<<<<<<<<<<< * gt = _preproc(gt) * m = _len(dt) */ - __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(__pyx_v__preproc, __pyx_v_dt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_t_5 = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou__preproc(__pyx_v__preproc, __pyx_v_dt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF_SET(__pyx_v_dt, __pyx_t_5); __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":215 + /* "libs/datasets/pycocotools/_mask.pyx":215 * cdef siz m, n * dt = _preproc(dt) * gt = _preproc(gt) # <<<<<<<<<<<<<< * m = _len(dt) * n = _len(gt) */ - __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou__preproc(__pyx_v__preproc, __pyx_v_gt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) + __pyx_t_5 = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou__preproc(__pyx_v__preproc, __pyx_v_gt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF_SET(__pyx_v_gt, __pyx_t_5); __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":216 + /* "libs/datasets/pycocotools/_mask.pyx":216 * dt = _preproc(dt) * gt = _preproc(gt) * m = _len(dt) # <<<<<<<<<<<<<< * n = _len(gt) * if m == 0 or n == 0: */ - __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(__pyx_v__len, __pyx_v_dt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 216, __pyx_L1_error) + __pyx_t_5 = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_6_len(__pyx_v__len, __pyx_v_dt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_7 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_7 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 216, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_7 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_m = __pyx_t_7; - /* "thirdparty/pycocotools/_mask.pyx":217 + /* "libs/datasets/pycocotools/_mask.pyx":217 * gt = _preproc(gt) * m = _len(dt) * n = _len(gt) # <<<<<<<<<<<<<< * if m == 0 or n == 0: * return [] */ - __pyx_t_5 = __pyx_pf_10thirdparty_11pycocotools_5_mask_3iou_6_len(__pyx_v__len, __pyx_v_gt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 217, __pyx_L1_error) + __pyx_t_5 = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_3iou_6_len(__pyx_v__len, __pyx_v_gt); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_7 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_7 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 217, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyInt_As_siz(__pyx_t_5); if (unlikely((__pyx_t_7 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_n = __pyx_t_7; - /* "thirdparty/pycocotools/_mask.pyx":218 + /* "libs/datasets/pycocotools/_mask.pyx":218 * m = _len(dt) * n = _len(gt) * if m == 0 or n == 0: # <<<<<<<<<<<<<< @@ -5793,7 +5265,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __pyx_L4_bool_binop_done:; if (__pyx_t_8) { - /* "thirdparty/pycocotools/_mask.pyx":219 + /* "libs/datasets/pycocotools/_mask.pyx":219 * n = _len(gt) * if m == 0 or n == 0: * return [] # <<<<<<<<<<<<<< @@ -5801,13 +5273,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') */ __Pyx_XDECREF(__pyx_r); - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 219, __pyx_L1_error) + __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":218 + /* "libs/datasets/pycocotools/_mask.pyx":218 * m = _len(dt) * n = _len(gt) * if m == 0 or n == 0: # <<<<<<<<<<<<<< @@ -5816,33 +5288,33 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED */ } - /* "thirdparty/pycocotools/_mask.pyx":220 + /* "libs/datasets/pycocotools/_mask.pyx":220 * if m == 0 or n == 0: * return [] * if not type(dt) == type(gt): # <<<<<<<<<<<<<< * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') * */ - __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)Py_TYPE(__pyx_v_gt)), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 220, __pyx_L1_error) - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 220, __pyx_L1_error) + __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)Py_TYPE(__pyx_v_gt)), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_9 = ((!__pyx_t_8) != 0); if (__pyx_t_9) { - /* "thirdparty/pycocotools/_mask.pyx":221 + /* "libs/datasets/pycocotools/_mask.pyx":221 * return [] * if not type(dt) == type(gt): * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') # <<<<<<<<<<<<<< * * # define local variables */ - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 221, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(0, 221, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":220 + /* "libs/datasets/pycocotools/_mask.pyx":220 * if m == 0 or n == 0: * return [] * if not type(dt) == type(gt): # <<<<<<<<<<<<<< @@ -5851,7 +5323,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED */ } - /* "thirdparty/pycocotools/_mask.pyx":224 + /* "libs/datasets/pycocotools/_mask.pyx":224 * * # define local variables * cdef double* _iou = 0 # <<<<<<<<<<<<<< @@ -5860,19 +5332,19 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED */ __pyx_v__iou = ((double *)0); - /* "thirdparty/pycocotools/_mask.pyx":227 + /* "libs/datasets/pycocotools/_mask.pyx":227 * cdef np.npy_intp shape[1] * # check type and assign iou function * if type(dt) == RLEs: # <<<<<<<<<<<<<< * _iouFun = _rleIou * elif type(dt) == np.ndarray: */ - __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 227, __pyx_L1_error) - __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 227, __pyx_L1_error) + __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_9) { - /* "thirdparty/pycocotools/_mask.pyx":228 + /* "libs/datasets/pycocotools/_mask.pyx":228 * # check type and assign iou function * if type(dt) == RLEs: * _iouFun = _rleIou # <<<<<<<<<<<<<< @@ -5882,7 +5354,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __Pyx_INCREF(__pyx_v__rleIou); __pyx_v__iouFun = __pyx_v__rleIou; - /* "thirdparty/pycocotools/_mask.pyx":227 + /* "libs/datasets/pycocotools/_mask.pyx":227 * cdef np.npy_intp shape[1] * # check type and assign iou function * if type(dt) == RLEs: # <<<<<<<<<<<<<< @@ -5892,19 +5364,19 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED goto __pyx_L7; } - /* "thirdparty/pycocotools/_mask.pyx":229 + /* "libs/datasets/pycocotools/_mask.pyx":229 * if type(dt) == RLEs: * _iouFun = _rleIou * elif type(dt) == np.ndarray: # <<<<<<<<<<<<<< * _iouFun = _bbIou * else: */ - __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 229, __pyx_L1_error) - __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 229, __pyx_L1_error) + __pyx_t_5 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_dt)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_9) { - /* "thirdparty/pycocotools/_mask.pyx":230 + /* "libs/datasets/pycocotools/_mask.pyx":230 * _iouFun = _rleIou * elif type(dt) == np.ndarray: * _iouFun = _bbIou # <<<<<<<<<<<<<< @@ -5914,7 +5386,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __Pyx_INCREF(__pyx_v__bbIou); __pyx_v__iouFun = __pyx_v__bbIou; - /* "thirdparty/pycocotools/_mask.pyx":229 + /* "libs/datasets/pycocotools/_mask.pyx":229 * if type(dt) == RLEs: * _iouFun = _rleIou * elif type(dt) == np.ndarray: # <<<<<<<<<<<<<< @@ -5924,7 +5396,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED goto __pyx_L7; } - /* "thirdparty/pycocotools/_mask.pyx":232 + /* "libs/datasets/pycocotools/_mask.pyx":232 * _iouFun = _bbIou * else: * raise Exception('input data type not allowed.') # <<<<<<<<<<<<<< @@ -5932,15 +5404,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED * iou = np.zeros((m*n, ), dtype=np.double) */ /*else*/ { - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 232, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(0, 232, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L7:; - /* "thirdparty/pycocotools/_mask.pyx":233 + /* "libs/datasets/pycocotools/_mask.pyx":233 * else: * raise Exception('input data type not allowed.') * _iou = malloc(m*n* sizeof(double)) # <<<<<<<<<<<<<< @@ -5949,40 +5421,40 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED */ __pyx_v__iou = ((double *)malloc(((__pyx_v_m * __pyx_v_n) * (sizeof(double))))); - /* "thirdparty/pycocotools/_mask.pyx":234 + /* "libs/datasets/pycocotools/_mask.pyx":234 * raise Exception('input data type not allowed.') * _iou = malloc(m*n* sizeof(double)) * iou = np.zeros((m*n, ), dtype=np.double) # <<<<<<<<<<<<<< * shape[0] = m*n * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyInt_From_siz((__pyx_v_m * __pyx_v_n)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_From_siz((__pyx_v_m * __pyx_v_n)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 234, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -5990,7 +5462,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __pyx_v_iou = __pyx_t_4; __pyx_t_4 = 0; - /* "thirdparty/pycocotools/_mask.pyx":235 + /* "libs/datasets/pycocotools/_mask.pyx":235 * _iou = malloc(m*n* sizeof(double)) * iou = np.zeros((m*n, ), dtype=np.double) * shape[0] = m*n # <<<<<<<<<<<<<< @@ -5999,43 +5471,43 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED */ (__pyx_v_shape[0]) = (((npy_intp)__pyx_v_m) * __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":236 + /* "libs/datasets/pycocotools/_mask.pyx":236 * iou = np.zeros((m*n, ), dtype=np.double) * shape[0] = m*n * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) # <<<<<<<<<<<<<< * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) * _iouFun(dt, gt, iscrowd, m, n, iou) */ - __pyx_t_4 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_DOUBLE, __pyx_v__iou); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 236, __pyx_L1_error) + __pyx_t_4 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_DOUBLE, __pyx_v__iou); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_iou, __pyx_t_4); __pyx_t_4 = 0; - /* "thirdparty/pycocotools/_mask.pyx":237 + /* "libs/datasets/pycocotools/_mask.pyx":237 * shape[0] = m*n * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) # <<<<<<<<<<<<<< * _iouFun(dt, gt, iscrowd, m, n, iou) * return iou.reshape((m,n), order='F') */ - if (!(likely(((__pyx_v_iou) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_iou, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 237, __pyx_L1_error) + if (!(likely(((__pyx_v_iou) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_iou, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;} PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_iou), NPY_OWNDATA); - /* "thirdparty/pycocotools/_mask.pyx":238 + /* "libs/datasets/pycocotools/_mask.pyx":238 * iou = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _iou) * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) * _iouFun(dt, gt, iscrowd, m, n, iou) # <<<<<<<<<<<<<< * return iou.reshape((m,n), order='F') * */ - __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_m); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 238, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_m); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 238, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v__iouFun); __pyx_t_3 = __pyx_v__iouFun; __pyx_t_2 = NULL; __pyx_t_10 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); @@ -6045,58 +5517,36 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __pyx_t_10 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[7] = {__pyx_t_2, __pyx_v_dt, __pyx_v_gt, ((PyObject *)__pyx_v_iscrowd), __pyx_t_1, __pyx_t_5, __pyx_v_iou}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_10, 6+__pyx_t_10); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[7] = {__pyx_t_2, __pyx_v_dt, __pyx_v_gt, ((PyObject *)__pyx_v_iscrowd), __pyx_t_1, __pyx_t_5, __pyx_v_iou}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_10, 6+__pyx_t_10); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else - #endif - { - __pyx_t_11 = PyTuple_New(6+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - if (__pyx_t_2) { - __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_2); __pyx_t_2 = NULL; - } - __Pyx_INCREF(__pyx_v_dt); - __Pyx_GIVEREF(__pyx_v_dt); - PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_v_dt); - __Pyx_INCREF(__pyx_v_gt); - __Pyx_GIVEREF(__pyx_v_gt); - PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_v_gt); - __Pyx_INCREF(((PyObject *)__pyx_v_iscrowd)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_iscrowd)); - PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, ((PyObject *)__pyx_v_iscrowd)); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_11, 3+__pyx_t_10, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_11, 4+__pyx_t_10, __pyx_t_5); - __Pyx_INCREF(__pyx_v_iou); - __Pyx_GIVEREF(__pyx_v_iou); - PyTuple_SET_ITEM(__pyx_t_11, 5+__pyx_t_10, __pyx_v_iou); - __pyx_t_1 = 0; - __pyx_t_5 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_11, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __pyx_t_11 = PyTuple_New(6+__pyx_t_10); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_11); + if (__pyx_t_2) { + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_2); __pyx_t_2 = NULL; } + __Pyx_INCREF(__pyx_v_dt); + __Pyx_GIVEREF(__pyx_v_dt); + PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_v_dt); + __Pyx_INCREF(__pyx_v_gt); + __Pyx_GIVEREF(__pyx_v_gt); + PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_v_gt); + __Pyx_INCREF(((PyObject *)__pyx_v_iscrowd)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_iscrowd)); + PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, ((PyObject *)__pyx_v_iscrowd)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_11, 3+__pyx_t_10, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_11, 4+__pyx_t_10, __pyx_t_5); + __Pyx_INCREF(__pyx_v_iou); + __Pyx_GIVEREF(__pyx_v_iou); + PyTuple_SET_ITEM(__pyx_t_11, 5+__pyx_t_10, __pyx_v_iou); + __pyx_t_1 = 0; + __pyx_t_5 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_11, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "thirdparty/pycocotools/_mask.pyx":239 + /* "libs/datasets/pycocotools/_mask.pyx":239 * PyArray_ENABLEFLAGS(iou, np.NPY_OWNDATA) * _iouFun(dt, gt, iscrowd, m, n, iou) * return iou.reshape((m,n), order='F') # <<<<<<<<<<<<<< @@ -6104,13 +5554,13 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED * def toBbox( rleObjs ): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_iou, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_iou, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_PyInt_From_siz(__pyx_v_m); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_siz(__pyx_v_m); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_11 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_11); - __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); @@ -6118,15 +5568,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_11); __pyx_t_3 = 0; __pyx_t_11 = 0; - __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 239, __pyx_L1_error) + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 239, __pyx_L1_error) - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_11, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_order, __pyx_n_s_F) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_11, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; @@ -6135,7 +5585,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __pyx_t_3 = 0; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":171 + /* "libs/datasets/pycocotools/_mask.pyx":171 * * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< @@ -6152,12 +5602,10 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_11); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_iscrowd.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.iou", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.iou", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -6177,7 +5625,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":241 +/* "libs/datasets/pycocotools/_mask.pyx":241 * return iou.reshape((m,n), order='F') * * def toBbox( rleObjs ): # <<<<<<<<<<<<<< @@ -6186,21 +5634,21 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_12iou(CYTHON_UNUSED */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_15toBbox(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_15toBbox = {"toBbox", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_15toBbox, METH_O, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_15toBbox(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_15toBbox(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_15toBbox = {"toBbox", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_15toBbox, METH_O, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_15toBbox(PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("toBbox (wrapper)", 0); - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_14toBbox(__pyx_self, ((PyObject *)__pyx_v_rleObjs)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_14toBbox(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rleObjs) { + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = 0; siz __pyx_v_n; BB __pyx_v__bb; npy_intp __pyx_v_shape[1]; @@ -6213,19 +5661,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS PyObject *__pyx_t_4 = NULL; siz __pyx_t_5; PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("toBbox", 0); - /* "thirdparty/pycocotools/_mask.pyx":242 + /* "libs/datasets/pycocotools/_mask.pyx":242 * * def toBbox( rleObjs ): * cdef RLEs Rs = _frString(rleObjs) # <<<<<<<<<<<<<< * cdef siz n = Rs.n * cdef BB _bb = malloc(4*n* sizeof(double)) */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 242, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_frString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -6235,56 +5686,38 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_rleObjs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_rleObjs}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 242, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; - __Pyx_INCREF(__pyx_v_rleObjs); - __Pyx_GIVEREF(__pyx_v_rleObjs); - PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_rleObjs); + __Pyx_GIVEREF(__pyx_v_rleObjs); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_rleObjs); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs))))) __PYX_ERR(0, 242, __pyx_L1_error) - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":243 + /* "libs/datasets/pycocotools/_mask.pyx":243 * def toBbox( rleObjs ): * cdef RLEs Rs = _frString(rleObjs) * cdef siz n = Rs.n # <<<<<<<<<<<<<< * cdef BB _bb = malloc(4*n* sizeof(double)) * rleToBbox( Rs._R, _bb, n ) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_Rs), __pyx_n_s_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_Rs), __pyx_n_s_n); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_5 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 243, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_siz(__pyx_t_1); if (unlikely((__pyx_t_5 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_n = __pyx_t_5; - /* "thirdparty/pycocotools/_mask.pyx":244 + /* "libs/datasets/pycocotools/_mask.pyx":244 * cdef RLEs Rs = _frString(rleObjs) * cdef siz n = Rs.n * cdef BB _bb = malloc(4*n* sizeof(double)) # <<<<<<<<<<<<<< @@ -6293,7 +5726,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS */ __pyx_v__bb = ((BB)malloc(((4 * __pyx_v_n) * (sizeof(double))))); - /* "thirdparty/pycocotools/_mask.pyx":245 + /* "libs/datasets/pycocotools/_mask.pyx":245 * cdef siz n = Rs.n * cdef BB _bb = malloc(4*n* sizeof(double)) * rleToBbox( Rs._R, _bb, n ) # <<<<<<<<<<<<<< @@ -6302,7 +5735,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS */ rleToBbox(((RLE const *)__pyx_v_Rs->_R), __pyx_v__bb, __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":247 + /* "libs/datasets/pycocotools/_mask.pyx":247 * rleToBbox( Rs._R, _bb, n ) * cdef np.npy_intp shape[1] * shape[0] = 4*n # <<<<<<<<<<<<<< @@ -6311,21 +5744,21 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS */ (__pyx_v_shape[0]) = (((npy_intp)4) * __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":248 + /* "libs/datasets/pycocotools/_mask.pyx":248 * cdef np.npy_intp shape[1] * shape[0] = 4*n * bb = np.array((1,4*n), dtype=np.double) # <<<<<<<<<<<<<< * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_From_siz((4 * __pyx_v_n)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_siz((4 * __pyx_v_n)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_int_1); __Pyx_GIVEREF(__pyx_int_1); @@ -6333,21 +5766,21 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_double); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_double); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 248, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 248, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -6355,21 +5788,21 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS __pyx_v_bb = __pyx_t_6; __pyx_t_6 = 0; - /* "thirdparty/pycocotools/_mask.pyx":249 + /* "libs/datasets/pycocotools/_mask.pyx":249 * shape[0] = 4*n * bb = np.array((1,4*n), dtype=np.double) * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) # <<<<<<<<<<<<<< * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) * return bb */ - __pyx_t_4 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_DOUBLE, __pyx_v__bb); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) + __pyx_t_4 = PyArray_SimpleNewFromData(1, __pyx_v_shape, NPY_DOUBLE, __pyx_v__bb); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_reshape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_reshape); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); @@ -6378,7 +5811,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); @@ -6388,55 +5821,35 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS } } if (!__pyx_t_4) { - __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_6); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_2}; - __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_2}; - __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else - #endif - { - __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_t_2); - __pyx_t_2 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_bb, __pyx_t_6); __pyx_t_6 = 0; - /* "thirdparty/pycocotools/_mask.pyx":250 + /* "libs/datasets/pycocotools/_mask.pyx":250 * bb = np.array((1,4*n), dtype=np.double) * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) # <<<<<<<<<<<<<< * return bb * */ - if (!(likely(((__pyx_v_bb) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_bb, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 250, __pyx_L1_error) + if (!(likely(((__pyx_v_bb) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_bb, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;} PyArray_ENABLEFLAGS(((PyArrayObject *)__pyx_v_bb), NPY_OWNDATA); - /* "thirdparty/pycocotools/_mask.pyx":251 + /* "libs/datasets/pycocotools/_mask.pyx":251 * bb = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, _bb).reshape((n, 4)) * PyArray_ENABLEFLAGS(bb, np.NPY_OWNDATA) * return bb # <<<<<<<<<<<<<< @@ -6448,7 +5861,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS __pyx_r = __pyx_v_bb; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":241 + /* "libs/datasets/pycocotools/_mask.pyx":241 * return iou.reshape((m,n), order='F') * * def toBbox( rleObjs ): # <<<<<<<<<<<<<< @@ -6463,7 +5876,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.toBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.toBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_Rs); @@ -6473,7 +5886,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":253 +/* "libs/datasets/pycocotools/_mask.pyx":253 * return bb * * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< @@ -6482,12 +5895,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_14toBbox(CYTHON_UNUS */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_17frBbox = {"frBbox", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_17frBbox(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_17frBbox = {"frBbox", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_17frBbox, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_17frBbox(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyArrayObject *__pyx_v_bb = 0; siz __pyx_v_h; siz __pyx_v_w; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("frBbox (wrapper)", 0); @@ -6512,16 +5928,16 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *_ case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, 1); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, 2); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frBbox") < 0)) __PYX_ERR(0, 253, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frBbox") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -6531,19 +5947,19 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *_ values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_bb = ((PyArrayObject *)values[0]); - __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 253, __pyx_L3_error) - __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 253, __pyx_L3_error) + __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frBbox", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bb), __pyx_ptype_5numpy_ndarray, 1, "bb", 0))) __PYX_ERR(0, 253, __pyx_L1_error) - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(__pyx_self, __pyx_v_bb, __pyx_v_h, __pyx_v_w); + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bb), __pyx_ptype_5numpy_ndarray, 1, "bb", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_16frBbox(__pyx_self, __pyx_v_bb, __pyx_v_h, __pyx_v_w); /* function exit code */ goto __pyx_L0; @@ -6554,9 +5970,9 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_17frBbox(PyObject *_ return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_bb, siz __pyx_v_h, siz __pyx_v_w) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_16frBbox(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_bb, siz __pyx_v_h, siz __pyx_v_w) { siz __pyx_v_n; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; PyObject *__pyx_v_objs = NULL; __Pyx_LocalBuf_ND __pyx_pybuffernd_bb; __Pyx_Buffer __pyx_pybuffer_bb; @@ -6566,6 +5982,9 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("frBbox", 0); __pyx_pybuffer_bb.pybuffer.buf = NULL; __pyx_pybuffer_bb.refcount = 0; @@ -6573,11 +5992,11 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS __pyx_pybuffernd_bb.rcbuffer = &__pyx_pybuffer_bb; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bb.rcbuffer->pybuffer, (PyObject*)__pyx_v_bb, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 253, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_bb.rcbuffer->pybuffer, (PyObject*)__pyx_v_bb, &__Pyx_TypeInfo_nn___pyx_t_5numpy_double_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_bb.diminfo[0].strides = __pyx_pybuffernd_bb.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_bb.diminfo[0].shape = __pyx_pybuffernd_bb.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_bb.diminfo[1].strides = __pyx_pybuffernd_bb.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_bb.diminfo[1].shape = __pyx_pybuffernd_bb.rcbuffer->pybuffer.shape[1]; - /* "thirdparty/pycocotools/_mask.pyx":254 + /* "libs/datasets/pycocotools/_mask.pyx":254 * * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): * cdef siz n = bb.shape[0] # <<<<<<<<<<<<<< @@ -6586,27 +6005,27 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS */ __pyx_v_n = (__pyx_v_bb->dimensions[0]); - /* "thirdparty/pycocotools/_mask.pyx":255 + /* "libs/datasets/pycocotools/_mask.pyx":255 * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): * cdef siz n = bb.shape[0] * Rs = RLEs(n) # <<<<<<<<<<<<<< * rleFrBbox( Rs._R, bb.data, h, w, n ) * objs = _toString(Rs) */ - __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_siz(__pyx_v_n); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_1); + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":256 + /* "libs/datasets/pycocotools/_mask.pyx":256 * cdef siz n = bb.shape[0] * Rs = RLEs(n) * rleFrBbox( Rs._R, bb.data, h, w, n ) # <<<<<<<<<<<<<< @@ -6615,17 +6034,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS */ rleFrBbox(((RLE *)__pyx_v_Rs->_R), ((BB const )__pyx_v_bb->data), __pyx_v_h, __pyx_v_w, __pyx_v_n); - /* "thirdparty/pycocotools/_mask.pyx":257 + /* "libs/datasets/pycocotools/_mask.pyx":257 * Rs = RLEs(n) * rleFrBbox( Rs._R, bb.data, h, w, n ) * objs = _toString(Rs) # <<<<<<<<<<<<<< * return objs * */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 257, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); @@ -6635,42 +6054,24 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS } } if (!__pyx_t_3) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[2] = {__pyx_t_3, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 257, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; - __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); - PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_Rs)); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 257, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_objs = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":258 + /* "libs/datasets/pycocotools/_mask.pyx":258 * rleFrBbox( Rs._R, bb.data, h, w, n ) * objs = _toString(Rs) * return objs # <<<<<<<<<<<<<< @@ -6682,7 +6083,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":253 + /* "libs/datasets/pycocotools/_mask.pyx":253 * return bb * * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< @@ -6697,12 +6098,10 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_bb.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frBbox", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -6715,7 +6114,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":260 +/* "libs/datasets/pycocotools/_mask.pyx":260 * return objs * * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< @@ -6724,12 +6123,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_16frBbox(CYTHON_UNUS */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_19frPoly = {"frPoly", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_19frPoly(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_19frPoly = {"frPoly", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_19frPoly, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_19frPoly(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_poly = 0; siz __pyx_v_h; siz __pyx_v_w; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("frPoly (wrapper)", 0); @@ -6754,16 +6156,16 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly(PyObject *_ case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, 1); __PYX_ERR(0, 260, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, 2); __PYX_ERR(0, 260, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frPoly") < 0)) __PYX_ERR(0, 260, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frPoly") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -6773,28 +6175,28 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_19frPoly(PyObject *_ values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_poly = values[0]; - __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 260, __pyx_L3_error) - __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 260, __pyx_L3_error) + __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 260, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frPoly", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPoly", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frPoly", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(__pyx_self, __pyx_v_poly, __pyx_v_h, __pyx_v_w); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_18frPoly(__pyx_self, __pyx_v_poly, __pyx_v_h, __pyx_v_w); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_poly, siz __pyx_v_h, siz __pyx_v_w) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_18frPoly(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_poly, siz __pyx_v_h, siz __pyx_v_w) { PyArrayObject *__pyx_v_np_poly = 0; Py_ssize_t __pyx_v_n; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; PyObject *__pyx_v_i = NULL; PyObject *__pyx_v_p = NULL; PyObject *__pyx_v_objs = NULL; @@ -6818,43 +6220,46 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS PyObject *__pyx_t_14 = NULL; Py_ssize_t __pyx_t_15; Py_ssize_t __pyx_t_16; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("frPoly", 0); __pyx_pybuffer_np_poly.pybuffer.buf = NULL; __pyx_pybuffer_np_poly.refcount = 0; __pyx_pybuffernd_np_poly.data = NULL; __pyx_pybuffernd_np_poly.rcbuffer = &__pyx_pybuffer_np_poly; - /* "thirdparty/pycocotools/_mask.pyx":262 + /* "libs/datasets/pycocotools/_mask.pyx":262 * def frPoly( poly, siz h, siz w ): * cdef np.ndarray[np.double_t, ndim=1] np_poly * n = len(poly) # <<<<<<<<<<<<<< * Rs = RLEs(n) * for i, p in enumerate(poly): */ - __pyx_t_1 = PyObject_Length(__pyx_v_poly); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 262, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_v_poly); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_n = __pyx_t_1; - /* "thirdparty/pycocotools/_mask.pyx":263 + /* "libs/datasets/pycocotools/_mask.pyx":263 * cdef np.ndarray[np.double_t, ndim=1] np_poly * n = len(poly) * Rs = RLEs(n) # <<<<<<<<<<<<<< * for i, p in enumerate(poly): * np_poly = np.array(p, dtype=np.double, order='F') */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_n); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 263, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_Rs = ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_2); + __pyx_v_Rs = ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_2); __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":264 + /* "libs/datasets/pycocotools/_mask.pyx":264 * n = len(poly) * Rs = RLEs(n) * for i, p in enumerate(poly): # <<<<<<<<<<<<<< @@ -6867,26 +6272,26 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS __pyx_t_3 = __pyx_v_poly; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; __pyx_t_4 = NULL; } else { - __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_poly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 264, __pyx_L1_error) + __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_poly); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 264, __pyx_L1_error) + __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } for (;;) { if (likely(!__pyx_t_4)) { if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 264, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 264, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); #endif } else { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 264, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 264, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); #endif } @@ -6896,7 +6301,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 264, __pyx_L1_error) + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } @@ -6906,45 +6311,45 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS __pyx_t_5 = 0; __Pyx_INCREF(__pyx_t_2); __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_2); - __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 264, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = __pyx_t_5; __pyx_t_5 = 0; - /* "thirdparty/pycocotools/_mask.pyx":265 + /* "libs/datasets/pycocotools/_mask.pyx":265 * Rs = RLEs(n) * for i, p in enumerate(poly): * np_poly = np.array(p, dtype=np.double, order='F') # <<<<<<<<<<<<<< * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) * objs = _toString(Rs) */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_p); __Pyx_GIVEREF(__pyx_v_p); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_p); - __pyx_t_7 = PyDict_New(); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_7 = PyDict_New(); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 265, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 265, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 265, __pyx_L1_error) - __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_5, __pyx_t_7); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 265, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_order, __pyx_n_s_F) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_5, __pyx_t_7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 265, __pyx_L1_error) + if (!(likely(((__pyx_t_9) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_9, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_10 = ((PyArrayObject *)__pyx_t_9); { __Pyx_BufFmt_StackElem __pyx_stack[1]; @@ -6960,24 +6365,24 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS } } __pyx_pybuffernd_np_poly.diminfo[0].strides = __pyx_pybuffernd_np_poly.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_np_poly.diminfo[0].shape = __pyx_pybuffernd_np_poly.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 265, __pyx_L1_error) + if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_10 = 0; __Pyx_XDECREF_SET(__pyx_v_np_poly, ((PyArrayObject *)__pyx_t_9)); __pyx_t_9 = 0; - /* "thirdparty/pycocotools/_mask.pyx":266 + /* "libs/datasets/pycocotools/_mask.pyx":266 * for i, p in enumerate(poly): * np_poly = np.array(p, dtype=np.double, order='F') * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) # <<<<<<<<<<<<<< * objs = _toString(Rs) * return objs */ - __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 266, __pyx_L1_error) - __pyx_t_16 = PyObject_Length(__pyx_v_p); if (unlikely(__pyx_t_16 == -1)) __PYX_ERR(0, 266, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_16 = PyObject_Length(__pyx_v_p); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} rleFrPoly(((RLE *)(&(__pyx_v_Rs->_R[__pyx_t_15]))), ((double const *)__pyx_v_np_poly->data), ((siz)__Pyx_div_Py_ssize_t(__pyx_t_16, 2)), __pyx_v_h, __pyx_v_w); - /* "thirdparty/pycocotools/_mask.pyx":264 + /* "libs/datasets/pycocotools/_mask.pyx":264 * n = len(poly) * Rs = RLEs(n) * for i, p in enumerate(poly): # <<<<<<<<<<<<<< @@ -6988,17 +6393,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":267 + /* "libs/datasets/pycocotools/_mask.pyx":267 * np_poly = np.array(p, dtype=np.double, order='F') * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) * objs = _toString(Rs) # <<<<<<<<<<<<<< * return objs * */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 267, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_9 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); @@ -7008,42 +6413,24 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS } } if (!__pyx_t_9) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[2] = {__pyx_t_9, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_GOTREF(__pyx_t_2); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[2] = {__pyx_t_9, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_GOTREF(__pyx_t_2); - } else - #endif - { - __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 267, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_9); __pyx_t_9 = NULL; - __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); - PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_v_Rs)); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - } + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_9); __pyx_t_9 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_objs = __pyx_t_2; __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":268 + /* "libs/datasets/pycocotools/_mask.pyx":268 * rleFrPoly( &Rs._R[i], np_poly.data, int(len(p)/2), h, w ) * objs = _toString(Rs) * return objs # <<<<<<<<<<<<<< @@ -7055,7 +6442,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":260 + /* "libs/datasets/pycocotools/_mask.pyx":260 * return objs * * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< @@ -7073,12 +6460,10 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_np_poly.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPoly", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frPoly", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -7094,7 +6479,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":270 +/* "libs/datasets/pycocotools/_mask.pyx":270 * return objs * * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< @@ -7103,12 +6488,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_18frPoly(CYTHON_UNUS */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE = {"frUncompressedRLE", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_21frUncompressedRLE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_21frUncompressedRLE = {"frUncompressedRLE", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_21frUncompressedRLE, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_21frUncompressedRLE(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_ucRles = 0; CYTHON_UNUSED siz __pyx_v_h; CYTHON_UNUSED siz __pyx_v_w; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("frUncompressedRLE (wrapper)", 0); @@ -7133,16 +6521,16 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE( case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, 1); __PYX_ERR(0, 270, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, 2); __PYX_ERR(0, 270, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frUncompressedRLE") < 0)) __PYX_ERR(0, 270, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frUncompressedRLE") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -7152,32 +6540,32 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE( values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_ucRles = values[0]; - __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error) - __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error) + __pyx_v_h = __Pyx_PyInt_As_siz(values[1]); if (unlikely((__pyx_v_h == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_w = __Pyx_PyInt_As_siz(values[2]); if (unlikely((__pyx_v_w == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 270, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frUncompressedRLE", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frUncompressedRLE", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frUncompressedRLE", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE(__pyx_self, __pyx_v_ucRles, __pyx_v_h, __pyx_v_w); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_20frUncompressedRLE(__pyx_self, __pyx_v_ucRles, __pyx_v_h, __pyx_v_w); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_ucRles, CYTHON_UNUSED siz __pyx_v_h, CYTHON_UNUSED siz __pyx_v_w) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_20frUncompressedRLE(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_ucRles, CYTHON_UNUSED siz __pyx_v_h, CYTHON_UNUSED siz __pyx_v_w) { PyArrayObject *__pyx_v_cnts = 0; RLE __pyx_v_R; uint *__pyx_v_data; Py_ssize_t __pyx_v_n; PyObject *__pyx_v_objs = NULL; Py_ssize_t __pyx_v_i; - struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; + struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *__pyx_v_Rs = NULL; Py_ssize_t __pyx_v_j; __Pyx_LocalBuf_ND __pyx_pybuffernd_cnts; __Pyx_Buffer __pyx_pybuffer_cnts; @@ -7201,35 +6589,38 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( RLE __pyx_t_16; siz __pyx_t_17; int __pyx_t_18; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("frUncompressedRLE", 0); __pyx_pybuffer_cnts.pybuffer.buf = NULL; __pyx_pybuffer_cnts.refcount = 0; __pyx_pybuffernd_cnts.data = NULL; __pyx_pybuffernd_cnts.rcbuffer = &__pyx_pybuffer_cnts; - /* "thirdparty/pycocotools/_mask.pyx":274 + /* "libs/datasets/pycocotools/_mask.pyx":274 * cdef RLE R * cdef uint *data * n = len(ucRles) # <<<<<<<<<<<<<< * objs = [] * for i in range(n): */ - __pyx_t_1 = PyObject_Length(__pyx_v_ucRles); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 274, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_v_ucRles); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_n = __pyx_t_1; - /* "thirdparty/pycocotools/_mask.pyx":275 + /* "libs/datasets/pycocotools/_mask.pyx":275 * cdef uint *data * n = len(ucRles) * objs = [] # <<<<<<<<<<<<<< * for i in range(n): * Rs = RLEs(1) */ - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 275, __pyx_L1_error) + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_v_objs = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":276 + /* "libs/datasets/pycocotools/_mask.pyx":276 * n = len(ucRles) * objs = [] * for i in range(n): # <<<<<<<<<<<<<< @@ -7240,55 +6631,55 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_1; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; - /* "thirdparty/pycocotools/_mask.pyx":277 + /* "libs/datasets/pycocotools/_mask.pyx":277 * objs = [] * for i in range(n): * Rs = RLEs(1) # <<<<<<<<<<<<<< * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) * # time for malloc can be saved here but it's fine */ - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs), __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 277, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs), __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __Pyx_XDECREF_SET(__pyx_v_Rs, ((struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs *)__pyx_t_2)); + __Pyx_XDECREF_SET(__pyx_v_Rs, ((struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs *)__pyx_t_2)); __pyx_t_2 = 0; - /* "thirdparty/pycocotools/_mask.pyx":278 + /* "libs/datasets/pycocotools/_mask.pyx":278 * for i in range(n): * Rs = RLEs(1) * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) # <<<<<<<<<<<<<< * # time for malloc can be saved here but it's fine * data = malloc(len(cnts)* sizeof(uint)) */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_counts); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_5 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_counts); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_uint32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_uint32); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 278, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 278, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 278, __pyx_L1_error) + if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = ((PyArrayObject *)__pyx_t_7); { __Pyx_BufFmt_StackElem __pyx_stack[1]; @@ -7304,34 +6695,34 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( } } __pyx_pybuffernd_cnts.diminfo[0].strides = __pyx_pybuffernd_cnts.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_cnts.diminfo[0].shape = __pyx_pybuffernd_cnts.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 278, __pyx_L1_error) + if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_8 = 0; __Pyx_XDECREF_SET(__pyx_v_cnts, ((PyArrayObject *)__pyx_t_7)); __pyx_t_7 = 0; - /* "thirdparty/pycocotools/_mask.pyx":280 + /* "libs/datasets/pycocotools/_mask.pyx":280 * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) * # time for malloc can be saved here but it's fine * data = malloc(len(cnts)* sizeof(uint)) # <<<<<<<<<<<<<< * for j in range(len(cnts)): * data[j] = cnts[j] */ - __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 280, __pyx_L1_error) + __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_data = ((uint *)malloc((__pyx_t_13 * (sizeof(unsigned int))))); - /* "thirdparty/pycocotools/_mask.pyx":281 + /* "libs/datasets/pycocotools/_mask.pyx":281 * # time for malloc can be saved here but it's fine * data = malloc(len(cnts)* sizeof(uint)) * for j in range(len(cnts)): # <<<<<<<<<<<<<< * data[j] = cnts[j] * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) */ - __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 281, __pyx_L1_error) + __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;} for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { __pyx_v_j = __pyx_t_14; - /* "thirdparty/pycocotools/_mask.pyx":282 + /* "libs/datasets/pycocotools/_mask.pyx":282 * data = malloc(len(cnts)* sizeof(uint)) * for j in range(len(cnts)): * data[j] = cnts[j] # <<<<<<<<<<<<<< @@ -7346,46 +6737,46 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_cnts.diminfo[0].shape)) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); - __PYX_ERR(0, 282, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_data[__pyx_v_j]) = ((uint)(*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint32_t *, __pyx_pybuffernd_cnts.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_cnts.diminfo[0].strides))); } - /* "thirdparty/pycocotools/_mask.pyx":283 + /* "libs/datasets/pycocotools/_mask.pyx":283 * for j in range(len(cnts)): * data[j] = cnts[j] * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) # <<<<<<<<<<<<<< * Rs._R[0] = R * objs.append(_toString(Rs)[0]) */ - __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_7); - __pyx_t_5 = PyObject_GetItem(__pyx_t_7, __pyx_n_s_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_5 = PyObject_GetItem(__pyx_t_7, __pyx_n_s_size); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_17 = __Pyx_PyInt_As_siz(__pyx_t_7); if (unlikely((__pyx_t_17 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_17 = __Pyx_PyInt_As_siz(__pyx_t_7); if (unlikely((__pyx_t_17 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_16.h = __pyx_t_17; - __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_ucRles, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_7); - __pyx_t_5 = PyObject_GetItem(__pyx_t_7, __pyx_n_s_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_5 = PyObject_GetItem(__pyx_t_7, __pyx_n_s_size); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_17 = __Pyx_PyInt_As_siz(__pyx_t_7); if (unlikely((__pyx_t_17 == ((siz)-1)) && PyErr_Occurred())) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_17 = __Pyx_PyInt_As_siz(__pyx_t_7); if (unlikely((__pyx_t_17 == (siz)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_16.w = __pyx_t_17; - __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_13 = PyObject_Length(((PyObject *)__pyx_v_cnts)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_16.m = __pyx_t_13; __pyx_t_16.cnts = ((uint *)__pyx_v_data); __pyx_v_R = __pyx_t_16; - /* "thirdparty/pycocotools/_mask.pyx":284 + /* "libs/datasets/pycocotools/_mask.pyx":284 * data[j] = cnts[j] * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) * Rs._R[0] = R # <<<<<<<<<<<<<< @@ -7394,17 +6785,17 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( */ (__pyx_v_Rs->_R[0]) = __pyx_v_R; - /* "thirdparty/pycocotools/_mask.pyx":285 + /* "libs/datasets/pycocotools/_mask.pyx":285 * R = RLE(ucRles[i]['size'][0], ucRles[i]['size'][1], len(cnts), data) * Rs._R[0] = R * objs.append(_toString(Rs)[0]) # <<<<<<<<<<<<<< * return objs * */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_toString); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_2 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); @@ -7414,46 +6805,28 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( } } if (!__pyx_t_2) { - __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_Rs)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[2] = {__pyx_t_2, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_7); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[2] = {__pyx_t_2, ((PyObject *)__pyx_v_Rs)}; - __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_7); - } else - #endif - { - __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; - __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); - PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_Rs)); - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_INCREF(((PyObject *)__pyx_v_Rs)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_Rs)); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)__pyx_v_Rs)); + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_objs, __pyx_t_5); if (unlikely(__pyx_t_18 == -1)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_objs, __pyx_t_5); if (unlikely(__pyx_t_18 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } - /* "thirdparty/pycocotools/_mask.pyx":286 + /* "libs/datasets/pycocotools/_mask.pyx":286 * Rs._R[0] = R * objs.append(_toString(Rs)[0]) * return objs # <<<<<<<<<<<<<< @@ -7465,7 +6838,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":270 + /* "libs/datasets/pycocotools/_mask.pyx":270 * return objs * * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< @@ -7481,12 +6854,10 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_cnts.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frUncompressedRLE", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frUncompressedRLE", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; @@ -7500,7 +6871,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( return __pyx_r; } -/* "thirdparty/pycocotools/_mask.pyx":288 +/* "libs/datasets/pycocotools/_mask.pyx":288 * return objs * * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< @@ -7509,12 +6880,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_20frUncompressedRLE( */ /* Python wrapper */ -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_10thirdparty_11pycocotools_5_mask_23frPyObjects = {"frPyObjects", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_23frPyObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_4libs_8datasets_11pycocotools_5_mask_23frPyObjects = {"frPyObjects", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_23frPyObjects, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_4libs_8datasets_11pycocotools_5_mask_23frPyObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_pyobj = 0; PyObject *__pyx_v_h = 0; PyObject *__pyx_v_w = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("frPyObjects (wrapper)", 0); @@ -7539,16 +6913,16 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects(PyObje case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, 1); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, 2); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frPyObjects") < 0)) __PYX_ERR(0, 288, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "frPyObjects") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -7563,20 +6937,20 @@ static PyObject *__pyx_pw_10thirdparty_11pycocotools_5_mask_23frPyObjects(PyObje } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("frPyObjects", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPyObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frPyObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(__pyx_self, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w); + __pyx_r = __pyx_pf_4libs_8datasets_11pycocotools_5_mask_22frPyObjects(__pyx_self, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pyobj, PyObject *__pyx_v_h, PyObject *__pyx_v_w) { +static PyObject *__pyx_pf_4libs_8datasets_11pycocotools_5_mask_22frPyObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pyobj, PyObject *__pyx_v_h, PyObject *__pyx_v_w) { PyObject *__pyx_v_objs = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations @@ -7584,38 +6958,40 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; + Py_ssize_t __pyx_t_5; PyObject *__pyx_t_6 = NULL; int __pyx_t_7; - Py_ssize_t __pyx_t_8; - int __pyx_t_9; - PyObject *__pyx_t_10 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("frPyObjects", 0); - /* "thirdparty/pycocotools/_mask.pyx":290 + /* "libs/datasets/pycocotools/_mask.pyx":290 * def frPyObjects(pyobj, h, w): * # encode rle from a list of python objects * if type(pyobj) == np.ndarray: # <<<<<<<<<<<<<< * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) == 4: */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 290, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 290, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)__pyx_ptype_5numpy_ndarray), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":291 + /* "libs/datasets/pycocotools/_mask.pyx":291 * # encode rle from a list of python objects * if type(pyobj) == np.ndarray: * objs = frBbox(pyobj, h, w) # <<<<<<<<<<<<<< * elif type(pyobj) == list and len(pyobj[0]) == 4: * objs = frBbox(pyobj, h, w) */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 291, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); @@ -7625,46 +7001,28 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 291, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (__pyx_t_4) { - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; - } - __Pyx_INCREF(__pyx_v_pyobj); - __Pyx_GIVEREF(__pyx_v_pyobj); - PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_pyobj); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_objs = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":290 + /* "libs/datasets/pycocotools/_mask.pyx":290 * def frPyObjects(pyobj, h, w): * # encode rle from a list of python objects * if type(pyobj) == np.ndarray: # <<<<<<<<<<<<<< @@ -7674,42 +7032,42 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":292 + /* "libs/datasets/pycocotools/_mask.pyx":292 * if type(pyobj) == np.ndarray: * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) == 4: # <<<<<<<<<<<<<< * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) > 4: */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 292, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_7) { } else { __pyx_t_2 = __pyx_t_7; goto __pyx_L4_bool_binop_done; } - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_t_5 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_7 = ((__pyx_t_8 == 4) != 0); + __pyx_t_7 = ((__pyx_t_5 == 4) != 0); __pyx_t_2 = __pyx_t_7; __pyx_L4_bool_binop_done:; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":293 + /* "libs/datasets/pycocotools/_mask.pyx":293 * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) == 4: * objs = frBbox(pyobj, h, w) # <<<<<<<<<<<<<< * elif type(pyobj) == list and len(pyobj[0]) > 4: * objs = frPoly(pyobj, h, w) */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 293, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_6 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); @@ -7719,46 +7077,28 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 293, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (__pyx_t_6) { - __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; - } - __Pyx_INCREF(__pyx_v_pyobj); - __Pyx_GIVEREF(__pyx_v_pyobj); - PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_v_pyobj); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 293, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + if (__pyx_t_6) { + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_objs = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":292 + /* "libs/datasets/pycocotools/_mask.pyx":292 * if type(pyobj) == np.ndarray: * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) == 4: # <<<<<<<<<<<<<< @@ -7768,42 +7108,42 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":294 + /* "libs/datasets/pycocotools/_mask.pyx":294 * elif type(pyobj) == list and len(pyobj[0]) == 4: * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) > 4: # <<<<<<<<<<<<<< * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_7) { } else { __pyx_t_2 = __pyx_t_7; goto __pyx_L6_bool_binop_done; } - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_t_5 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_7 = ((__pyx_t_8 > 4) != 0); + __pyx_t_7 = ((__pyx_t_5 > 4) != 0); __pyx_t_2 = __pyx_t_7; __pyx_L6_bool_binop_done:; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":295 + /* "libs/datasets/pycocotools/_mask.pyx":295 * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) > 4: * objs = frPoly(pyobj, h, w) # <<<<<<<<<<<<<< * elif type(pyobj) == list and type(pyobj[0]) == dict \ * and 'counts' in pyobj[0] and 'size' in pyobj[0]: */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frPoly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 295, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frPoly); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); @@ -7813,46 +7153,28 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 295, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 295, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - } else - #endif - { - __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 295, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (__pyx_t_4) { - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; - } - __Pyx_INCREF(__pyx_v_pyobj); - __Pyx_GIVEREF(__pyx_v_pyobj); - PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_pyobj); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 295, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_objs = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":294 + /* "libs/datasets/pycocotools/_mask.pyx":294 * elif type(pyobj) == list and len(pyobj[0]) == 4: * objs = frBbox(pyobj, h, w) * elif type(pyobj) == list and len(pyobj[0]) > 4: # <<<<<<<<<<<<<< @@ -7862,15 +7184,15 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":296 + /* "libs/datasets/pycocotools/_mask.pyx":296 * elif type(pyobj) == list and len(pyobj[0]) > 4: * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< * and 'counts' in pyobj[0] and 'size' in pyobj[0]: * objs = frUncompressedRLE(pyobj, h, w) */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_7) { } else { @@ -7878,26 +7200,26 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L8_bool_binop_done; } - /* "thirdparty/pycocotools/_mask.pyx":297 + /* "libs/datasets/pycocotools/_mask.pyx":297 * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ * and 'counts' in pyobj[0] and 'size' in pyobj[0]: # <<<<<<<<<<<<<< * objs = frUncompressedRLE(pyobj, h, w) * # encode rle from single python object */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); - /* "thirdparty/pycocotools/_mask.pyx":296 + /* "libs/datasets/pycocotools/_mask.pyx":296 * elif type(pyobj) == list and len(pyobj[0]) > 4: * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< * and 'counts' in pyobj[0] and 'size' in pyobj[0]: * objs = frUncompressedRLE(pyobj, h, w) */ - __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_t_1)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_t_1)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { } else { @@ -7905,32 +7227,32 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L8_bool_binop_done; } - /* "thirdparty/pycocotools/_mask.pyx":297 + /* "libs/datasets/pycocotools/_mask.pyx":297 * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ * and 'counts' in pyobj[0] and 'size' in pyobj[0]: # <<<<<<<<<<<<<< * objs = frUncompressedRLE(pyobj, h, w) * # encode rle from single python object */ - __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_3); - __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_counts, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_counts, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_9 = (__pyx_t_7 != 0); - if (__pyx_t_9) { + __pyx_t_8 = (__pyx_t_7 != 0); + if (__pyx_t_8) { } else { - __pyx_t_2 = __pyx_t_9; + __pyx_t_2 = __pyx_t_8; goto __pyx_L8_bool_binop_done; } - __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_pyobj, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_3); - __pyx_t_9 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_size, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_t_8 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_size, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_7 = (__pyx_t_9 != 0); + __pyx_t_7 = (__pyx_t_8 != 0); __pyx_t_2 = __pyx_t_7; __pyx_L8_bool_binop_done:; - /* "thirdparty/pycocotools/_mask.pyx":296 + /* "libs/datasets/pycocotools/_mask.pyx":296 * elif type(pyobj) == list and len(pyobj[0]) > 4: * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< @@ -7939,18 +7261,18 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON */ if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":298 + /* "libs/datasets/pycocotools/_mask.pyx":298 * elif type(pyobj) == list and type(pyobj[0]) == dict \ * and 'counts' in pyobj[0] and 'size' in pyobj[0]: * objs = frUncompressedRLE(pyobj, h, w) # <<<<<<<<<<<<<< * # encode rle from single python object * elif type(pyobj) == list and len(pyobj) == 4: */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frUncompressedRLE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 298, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frUncompressedRLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); @@ -7960,46 +7282,28 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_3); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_pyobj, __pyx_v_h, __pyx_v_w}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_3); - } else - #endif - { - __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 298, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (__pyx_t_6) { - __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; - } - __Pyx_INCREF(__pyx_v_pyobj); - __Pyx_GIVEREF(__pyx_v_pyobj); - PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_v_pyobj); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + if (__pyx_t_6) { + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; } + __Pyx_INCREF(__pyx_v_pyobj); + __Pyx_GIVEREF(__pyx_v_pyobj); + PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_v_pyobj); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_objs = __pyx_t_3; __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":296 + /* "libs/datasets/pycocotools/_mask.pyx":296 * elif type(pyobj) == list and len(pyobj[0]) > 4: * objs = frPoly(pyobj, h, w) * elif type(pyobj) == list and type(pyobj[0]) == dict \ # <<<<<<<<<<<<<< @@ -8009,44 +7313,44 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":300 + /* "libs/datasets/pycocotools/_mask.pyx":300 * objs = frUncompressedRLE(pyobj, h, w) * # encode rle from single python object * elif type(pyobj) == list and len(pyobj) == 4: # <<<<<<<<<<<<<< * objs = frBbox([pyobj], h, w)[0] * elif type(pyobj) == list and len(pyobj) > 4: */ - __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 300, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { } else { __pyx_t_2 = __pyx_t_7; goto __pyx_L12_bool_binop_done; } - __pyx_t_8 = PyObject_Length(__pyx_v_pyobj); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 300, __pyx_L1_error) - __pyx_t_7 = ((__pyx_t_8 == 4) != 0); + __pyx_t_5 = PyObject_Length(__pyx_v_pyobj); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((__pyx_t_5 == 4) != 0); __pyx_t_2 = __pyx_t_7; __pyx_L12_bool_binop_done:; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":301 + /* "libs/datasets/pycocotools/_mask.pyx":301 * # encode rle from single python object * elif type(pyobj) == list and len(pyobj) == 4: * objs = frBbox([pyobj], h, w)[0] # <<<<<<<<<<<<<< * elif type(pyobj) == list and len(pyobj) > 4: * objs = frPoly([pyobj], h, w)[0] */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 301, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frBbox); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error) + __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_pyobj); __Pyx_GIVEREF(__pyx_v_pyobj); PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_pyobj); __pyx_t_6 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); @@ -8056,51 +7360,31 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_t_4, __pyx_v_h, __pyx_v_w}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_t_4, __pyx_v_h, __pyx_v_w}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else - #endif - { - __pyx_t_10 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 301, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - if (__pyx_t_6) { - __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6); __pyx_t_6 = NULL; - } - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_5, __pyx_t_4); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_9 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_6) { + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_6); __pyx_t_6 = NULL; } + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_5, __pyx_t_4); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_9, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_9, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 301, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_objs = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":300 + /* "libs/datasets/pycocotools/_mask.pyx":300 * objs = frUncompressedRLE(pyobj, h, w) * # encode rle from single python object * elif type(pyobj) == list and len(pyobj) == 4: # <<<<<<<<<<<<<< @@ -8110,44 +7394,44 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":302 + /* "libs/datasets/pycocotools/_mask.pyx":302 * elif type(pyobj) == list and len(pyobj) == 4: * objs = frBbox([pyobj], h, w)[0] * elif type(pyobj) == list and len(pyobj) > 4: # <<<<<<<<<<<<<< * objs = frPoly([pyobj], h, w)[0] * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: */ - __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 302, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 302, __pyx_L1_error) + __pyx_t_1 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyList_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_7) { } else { __pyx_t_2 = __pyx_t_7; goto __pyx_L14_bool_binop_done; } - __pyx_t_8 = PyObject_Length(__pyx_v_pyobj); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 302, __pyx_L1_error) - __pyx_t_7 = ((__pyx_t_8 > 4) != 0); + __pyx_t_5 = PyObject_Length(__pyx_v_pyobj); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((__pyx_t_5 > 4) != 0); __pyx_t_2 = __pyx_t_7; __pyx_L14_bool_binop_done:; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":303 + /* "libs/datasets/pycocotools/_mask.pyx":303 * objs = frBbox([pyobj], h, w)[0] * elif type(pyobj) == list and len(pyobj) > 4: * objs = frPoly([pyobj], h, w)[0] # <<<<<<<<<<<<<< * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: * objs = frUncompressedRLE([pyobj], h, w)[0] */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frPoly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 303, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_frPoly); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 303, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); + __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_v_pyobj); __Pyx_GIVEREF(__pyx_v_pyobj); - PyList_SET_ITEM(__pyx_t_10, 0, __pyx_v_pyobj); + PyList_SET_ITEM(__pyx_t_9, 0, __pyx_v_pyobj); __pyx_t_4 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); @@ -8157,51 +7441,31 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_t_10, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 303, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[4] = {__pyx_t_4, __pyx_t_10, __pyx_v_h, __pyx_v_w}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 303, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - } else - #endif - { - __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 303, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (__pyx_t_4) { - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; - } - __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_t_10); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_10 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 303, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 303, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_objs = __pyx_t_3; + __pyx_t_6 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; + } + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_t_9); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_9 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_objs = __pyx_t_3; __pyx_t_3 = 0; - /* "thirdparty/pycocotools/_mask.pyx":302 + /* "libs/datasets/pycocotools/_mask.pyx":302 * elif type(pyobj) == list and len(pyobj) == 4: * objs = frBbox([pyobj], h, w)[0] * elif type(pyobj) == list and len(pyobj) > 4: # <<<<<<<<<<<<<< @@ -8211,105 +7475,85 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":304 + /* "libs/datasets/pycocotools/_mask.pyx":304 * elif type(pyobj) == list and len(pyobj) > 4: * objs = frPoly([pyobj], h, w)[0] * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: # <<<<<<<<<<<<<< * objs = frUncompressedRLE([pyobj], h, w)[0] * else: */ - __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 304, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(((PyObject *)Py_TYPE(__pyx_v_pyobj)), ((PyObject *)(&PyDict_Type)), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { } else { __pyx_t_2 = __pyx_t_7; goto __pyx_L16_bool_binop_done; } - __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_counts, __pyx_v_pyobj, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 304, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_7 != 0); - if (__pyx_t_9) { + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_counts, __pyx_v_pyobj, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = (__pyx_t_7 != 0); + if (__pyx_t_8) { } else { - __pyx_t_2 = __pyx_t_9; + __pyx_t_2 = __pyx_t_8; goto __pyx_L16_bool_binop_done; } - __pyx_t_9 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_size, __pyx_v_pyobj, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 304, __pyx_L1_error) - __pyx_t_7 = (__pyx_t_9 != 0); + __pyx_t_8 = (__Pyx_PySequence_ContainsTF(__pyx_n_s_size, __pyx_v_pyobj, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = (__pyx_t_8 != 0); __pyx_t_2 = __pyx_t_7; __pyx_L16_bool_binop_done:; if (__pyx_t_2) { - /* "thirdparty/pycocotools/_mask.pyx":305 + /* "libs/datasets/pycocotools/_mask.pyx":305 * objs = frPoly([pyobj], h, w)[0] * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: * objs = frUncompressedRLE([pyobj], h, w)[0] # <<<<<<<<<<<<<< * else: * raise Exception('input type is not supported.') */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frUncompressedRLE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_frUncompressedRLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = PyList_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_t_6 = PyList_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_INCREF(__pyx_v_pyobj); __Pyx_GIVEREF(__pyx_v_pyobj); PyList_SET_ITEM(__pyx_t_6, 0, __pyx_v_pyobj); - __pyx_t_10 = NULL; + __pyx_t_9 = NULL; __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { - __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_1); - if (likely(__pyx_t_10)) { + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); - __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); __pyx_t_5 = 1; } } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_t_6, __pyx_v_h, __pyx_v_w}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { - PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_t_6, __pyx_v_h, __pyx_v_w}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 3+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (__pyx_t_10) { - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10); __pyx_t_10 = NULL; - } - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_t_6); - __Pyx_INCREF(__pyx_v_h); - __Pyx_GIVEREF(__pyx_v_h); - PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); - __Pyx_INCREF(__pyx_v_w); - __Pyx_GIVEREF(__pyx_v_w); - PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); - __pyx_t_6 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } + __pyx_t_4 = PyTuple_New(3+__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + if (__pyx_t_9) { + __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_9); __pyx_t_9 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_5, __pyx_t_6); + __Pyx_INCREF(__pyx_v_h); + __Pyx_GIVEREF(__pyx_v_h); + PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_5, __pyx_v_h); + __Pyx_INCREF(__pyx_v_w); + __Pyx_GIVEREF(__pyx_v_w); + PyTuple_SET_ITEM(__pyx_t_4, 2+__pyx_t_5, __pyx_v_w); + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_objs = __pyx_t_1; __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":304 + /* "libs/datasets/pycocotools/_mask.pyx":304 * elif type(pyobj) == list and len(pyobj) > 4: * objs = frPoly([pyobj], h, w)[0] * elif type(pyobj) == dict and 'counts' in pyobj and 'size' in pyobj: # <<<<<<<<<<<<<< @@ -8319,22 +7563,22 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON goto __pyx_L3; } - /* "thirdparty/pycocotools/_mask.pyx":307 + /* "libs/datasets/pycocotools/_mask.pyx":307 * objs = frUncompressedRLE([pyobj], h, w)[0] * else: * raise Exception('input type is not supported.') # <<<<<<<<<<<<<< * return objs */ /*else*/ { - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])), __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 307, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_Exception, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 307, __pyx_L1_error) + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L3:; - /* "thirdparty/pycocotools/_mask.pyx":308 + /* "libs/datasets/pycocotools/_mask.pyx":308 * else: * raise Exception('input type is not supported.') * return objs # <<<<<<<<<<<<<< @@ -8344,7 +7588,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __pyx_r = __pyx_v_objs; goto __pyx_L0; - /* "thirdparty/pycocotools/_mask.pyx":288 + /* "libs/datasets/pycocotools/_mask.pyx":288 * return objs * * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< @@ -8358,8 +7602,8 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("thirdparty.pycocotools._mask.frPyObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("libs.datasets.pycocotools._mask.frPyObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_objs); @@ -8368,7 +7612,7 @@ static PyObject *__pyx_pf_10thirdparty_11pycocotools_5_mask_22frPyObjects(CYTHON return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":197 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -8409,13 +7653,16 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P int __pyx_t_5; PyObject *__pyx_t_6 = NULL; char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getbuffer__", 0); if (__pyx_v_info != NULL) { __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":203 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":203 * # of flags * * if info == NULL: return # <<<<<<<<<<<<<< @@ -8428,7 +7675,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L0; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":206 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":206 * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -8437,7 +7684,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":207 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":207 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -8446,7 +7693,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":209 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":209 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -8455,7 +7702,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -8465,7 +7712,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":212 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":212 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< @@ -8474,7 +7721,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_copy_shape = 1; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":211 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -8484,7 +7731,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":214 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":214 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< @@ -8496,7 +7743,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L4:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -8510,7 +7757,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L6_bool_binop_done; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":217 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":217 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -8521,7 +7768,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L6_bool_binop_done:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -8530,20 +7777,20 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":218 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 218, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 218, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":216 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -8552,7 +7799,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -8566,7 +7813,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9_bool_binop_done; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":221 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":221 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -8577,7 +7824,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L9_bool_binop_done:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -8586,20 +7833,20 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":222 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 222, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 222, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":220 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -8608,7 +7855,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":224 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":224 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -8617,7 +7864,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":225 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -8626,7 +7873,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":226 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< @@ -8636,7 +7883,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (__pyx_v_copy_shape != 0); if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":229 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< @@ -8645,7 +7892,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":230 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":230 * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -8654,7 +7901,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":231 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -8665,7 +7912,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_i = __pyx_t_5; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":232 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -8674,7 +7921,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":233 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -8684,7 +7931,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":226 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":226 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< @@ -8694,7 +7941,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L11; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":235 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -8704,7 +7951,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":236 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -8715,7 +7962,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L11:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":237 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -8724,7 +7971,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":238 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":238 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -8733,7 +7980,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":239 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":239 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -8742,7 +7989,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":242 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -8751,7 +7998,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":243 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -8763,7 +8010,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":246 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< @@ -8772,7 +8019,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< @@ -8790,7 +8037,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_L15_bool_binop_done:; if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":250 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< @@ -8803,7 +8050,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = Py_None; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< @@ -8813,7 +8060,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L14; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":253 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< @@ -8829,7 +8076,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L14:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":255 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< @@ -8839,7 +8086,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0); if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":256 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":256 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< @@ -8849,7 +8096,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":257 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -8869,7 +8116,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L20_next_or:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":258 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":258 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -8886,7 +8133,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L19_bool_binop_done:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":257 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -8895,20 +8142,20 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":259 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 259, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 259, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":257 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -8917,7 +8164,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":260 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -8926,10 +8173,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ switch (__pyx_v_t) { case NPY_BYTE: - __pyx_v_f = ((char *)"b"); + __pyx_v_f = __pyx_k_b; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":261 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -8937,10 +8184,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_USHORT: f = "H" */ case NPY_UBYTE: - __pyx_v_f = ((char *)"B"); + __pyx_v_f = __pyx_k_B; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":262 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -8948,10 +8195,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_INT: f = "i" */ case NPY_SHORT: - __pyx_v_f = ((char *)"h"); + __pyx_v_f = __pyx_k_h; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":263 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -8959,10 +8206,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_UINT: f = "I" */ case NPY_USHORT: - __pyx_v_f = ((char *)"H"); + __pyx_v_f = __pyx_k_H; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":264 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -8970,10 +8217,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_LONG: f = "l" */ case NPY_INT: - __pyx_v_f = ((char *)"i"); + __pyx_v_f = __pyx_k_i; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":265 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -8981,10 +8228,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_ULONG: f = "L" */ case NPY_UINT: - __pyx_v_f = ((char *)"I"); + __pyx_v_f = __pyx_k_I; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":266 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -8992,10 +8239,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_LONGLONG: f = "q" */ case NPY_LONG: - __pyx_v_f = ((char *)"l"); + __pyx_v_f = __pyx_k_l; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -9003,10 +8250,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_ULONGLONG: f = "Q" */ case NPY_ULONG: - __pyx_v_f = ((char *)"L"); + __pyx_v_f = __pyx_k_L; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -9014,10 +8261,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_FLOAT: f = "f" */ case NPY_LONGLONG: - __pyx_v_f = ((char *)"q"); + __pyx_v_f = __pyx_k_q; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -9025,10 +8272,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_DOUBLE: f = "d" */ case NPY_ULONGLONG: - __pyx_v_f = ((char *)"Q"); + __pyx_v_f = __pyx_k_Q; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -9036,10 +8283,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_LONGDOUBLE: f = "g" */ case NPY_FLOAT: - __pyx_v_f = ((char *)"f"); + __pyx_v_f = __pyx_k_f; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -9047,10 +8294,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_CFLOAT: f = "Zf" */ case NPY_DOUBLE: - __pyx_v_f = ((char *)"d"); + __pyx_v_f = __pyx_k_d; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -9058,10 +8305,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_CDOUBLE: f = "Zd" */ case NPY_LONGDOUBLE: - __pyx_v_f = ((char *)"g"); + __pyx_v_f = __pyx_k_g; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -9069,10 +8316,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_CLONGDOUBLE: f = "Zg" */ case NPY_CFLOAT: - __pyx_v_f = ((char *)"Zf"); + __pyx_v_f = __pyx_k_Zf; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -9080,10 +8327,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * elif t == NPY_OBJECT: f = "O" */ case NPY_CDOUBLE: - __pyx_v_f = ((char *)"Zd"); + __pyx_v_f = __pyx_k_Zd; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -9091,10 +8338,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * else: */ case NPY_CLONGDOUBLE: - __pyx_v_f = ((char *)"Zg"); + __pyx_v_f = __pyx_k_Zg; break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -9102,37 +8349,37 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ case NPY_OBJECT: - __pyx_v_f = ((char *)"O"); + __pyx_v_f = __pyx_k_O; break; default: - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * info.format = f * return */ - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) + __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_6, 0, 0, 0); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __PYX_ERR(1, 278, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} break; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":279 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -9141,7 +8388,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":280 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -9151,7 +8398,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":255 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< @@ -9160,7 +8407,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":282 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -9170,7 +8417,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)malloc(0xFF)); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -9179,7 +8426,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":284 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -9188,17 +8435,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":285 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":285 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< * info.format + _buffer_format_string_len, * &offset) */ - __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) __PYX_ERR(1, 285, __pyx_L1_error) + __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_7; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -9208,7 +8455,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":197 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":197 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -9240,7 +8487,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":290 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -9264,7 +8511,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -9274,7 +8521,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":292 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< @@ -9283,7 +8530,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ free(__pyx_v_info->format); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -9292,7 +8539,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":293 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -9302,7 +8549,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":294 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< @@ -9311,7 +8558,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ free(__pyx_v_info->strides); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":293 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -9320,7 +8567,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":290 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -9332,7 +8579,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -9344,9 +8591,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":771 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":771 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -9354,13 +8604,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 771, __pyx_L1_error) + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":770 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -9379,7 +8629,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -9391,9 +8641,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":774 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":774 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -9401,13 +8654,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":773 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -9426,7 +8679,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":776 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -9438,9 +8691,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":777 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -9448,13 +8704,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -9473,7 +8729,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":779 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -9485,9 +8741,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":780 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":780 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -9495,13 +8754,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -9520,7 +8779,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":782 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -9532,9 +8791,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":783 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -9542,13 +8804,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -9567,7 +8829,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":785 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -9594,9 +8856,12 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx int __pyx_t_7; long __pyx_t_8; char *__pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":790 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -9605,7 +8870,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":791 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -9614,7 +8879,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -9623,21 +8888,21 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_v_descr->names == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(1, 794, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 794, __pyx_L1_error) + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 794, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); #endif __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":795 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":795 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -9646,15 +8911,15 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_v_descr->fields == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 795, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 795, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_3); - if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 795, __pyx_L1_error) + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":796 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -9663,7 +8928,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (likely(__pyx_v_fields != Py_None)) { PyObject* sequence = __pyx_v_fields; - #if !CYTHON_COMPILING_IN_PYPY + #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); @@ -9671,59 +8936,59 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(1, 796, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 796, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 796, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); #endif } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 796, __pyx_L1_error) + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ - __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 798, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 798, __pyx_L1_error) + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 798, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (__pyx_t_6) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 799, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 799, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":798 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -9732,7 +8997,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -9752,7 +9017,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":802 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -9769,7 +9034,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -9778,20 +9043,20 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (__pyx_t_6) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 803, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 803, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -9800,7 +9065,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":813 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -9808,15 +9073,15 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * f += 1 */ while (1) { - __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":814 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -9825,7 +9090,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":815 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":815 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -9834,7 +9099,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":816 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":816 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -9845,7 +9110,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":818 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":818 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -9855,7 +9120,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":820 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -9865,19 +9130,19 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":821 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":821 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") */ - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 821, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":822 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":822 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -9887,20 +9152,20 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (__pyx_t_6) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 823, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 823, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":822 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":822 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -9909,252 +9174,252 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":826 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 826, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 826, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 826, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 98; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":827 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 827, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 66; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":828 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":828 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 828, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 828, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 828, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x68; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":829 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 829, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 829, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 829, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 72; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":830 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":830 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 830, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 830, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 830, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x69; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":831 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 831, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 831, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 831, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 73; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":832 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 832, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 832, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 832, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x6C; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":833 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 833, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 833, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 833, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 76; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":834 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 834, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 834, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x71; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":835 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":835 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 835, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 835, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 835, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 81; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":836 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":836 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 836, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 836, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 836, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x66; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":837 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 837, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 837, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 837, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x64; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":838 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 838, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 838, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 838, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x67; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":839 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 839, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 839, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 839, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; @@ -10163,18 +9428,18 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 840, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 840, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 840, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; @@ -10183,18 +9448,18 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 841, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 841, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 841, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; @@ -10203,25 +9468,25 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 842, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 842, __pyx_L1_error) + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 842, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 79; goto __pyx_L15; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -10229,23 +9494,23 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * else: */ /*else*/ { - __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 844, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 844, __pyx_L1_error) + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L15:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":845 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -10254,7 +9519,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":820 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -10264,7 +9529,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":849 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -10272,12 +9537,12 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * */ /*else*/ { - __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) __PYX_ERR(1, 849, __pyx_L1_error) + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_9; } __pyx_L13:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -10287,7 +9552,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":850 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -10297,7 +9562,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -10322,7 +9587,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -10337,7 +9602,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":968 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":968 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -10348,7 +9613,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":969 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":969 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -10357,7 +9622,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":968 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":968 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -10367,7 +9632,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":971 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":971 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -10377,7 +9642,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":972 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":972 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -10388,7 +9653,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":973 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":973 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -10397,7 +9662,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":974 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -10406,7 +9671,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -10418,7 +9683,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976 +/* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -10432,7 +9697,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -10442,7 +9707,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":978 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":978 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -10454,7 +9719,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; goto __pyx_L0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -10463,12 +9728,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":980 * return None * else: * return arr.base # <<<<<<<<<<<<<< - * - * */ /*else*/ { __Pyx_XDECREF(__pyx_r); @@ -10477,7 +9740,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":976 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -10492,397 +9755,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":985 - * # Versions of the import_* functions which are more suitable for - * # Cython code. - * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< - * try: - * _import_array() - */ - -static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - __Pyx_RefNannySetupContext("import_array", 0); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":986 - * # Cython code. - * cdef inline int import_array() except -1: - * try: # <<<<<<<<<<<<<< - * _import_array() - * except Exception: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":987 - * cdef inline int import_array() except -1: - * try: - * _import_array() # <<<<<<<<<<<<<< - * except Exception: - * raise ImportError("numpy.core.multiarray failed to import") - */ - __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 987, __pyx_L3_error) - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":986 - * # Cython code. - * cdef inline int import_array() except -1: - * try: # <<<<<<<<<<<<<< - * _import_array() - * except Exception: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L10_try_end; - __pyx_L3_error:; - __Pyx_PyThreadState_assign - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":988 - * try: - * _import_array() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.multiarray failed to import") - * - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 988, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":989 - * _import_array() - * except Exception: - * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_umath() except -1: - */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 989, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 989, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":986 - * # Cython code. - * cdef inline int import_array() except -1: - * try: # <<<<<<<<<<<<<< - * _import_array() - * except Exception: - */ - __Pyx_PyThreadState_assign - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L10_try_end:; - } - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":985 - * # Versions of the import_* functions which are more suitable for - * # Cython code. - * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< - * try: - * _import_array() - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":991 - * raise ImportError("numpy.core.multiarray failed to import") - * - * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - -static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - __Pyx_RefNannySetupContext("import_umath", 0); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":992 - * - * cdef inline int import_umath() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":993 - * cdef inline int import_umath() except -1: - * try: - * _import_umath() # <<<<<<<<<<<<<< - * except Exception: - * raise ImportError("numpy.core.umath failed to import") - */ - __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 993, __pyx_L3_error) - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":992 - * - * cdef inline int import_umath() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L10_try_end; - __pyx_L3_error:; - __Pyx_PyThreadState_assign - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":994 - * try: - * _import_umath() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.umath failed to import") - * - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 994, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":995 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_ufunc() except -1: - */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 995, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 995, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":992 - * - * cdef inline int import_umath() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - __Pyx_PyThreadState_assign - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L10_try_end:; - } - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":991 - * raise ImportError("numpy.core.multiarray failed to import") - * - * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":997 - * raise ImportError("numpy.core.umath failed to import") - * - * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - -static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - __Pyx_RefNannySetupContext("import_ufunc", 0); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":998 - * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":999 - * cdef inline int import_ufunc() except -1: - * try: - * _import_umath() # <<<<<<<<<<<<<< - * except Exception: - * raise ImportError("numpy.core.umath failed to import") - */ - __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 999, __pyx_L3_error) - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":998 - * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L10_try_end; - __pyx_L3_error:; - __Pyx_PyThreadState_assign - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":1000 - * try: - * _import_umath() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.umath failed to import") - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1000, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":1001 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1001, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 1001, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":998 - * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: - */ - __Pyx_PyThreadState_assign - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L10_try_end:; - } - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":997 - * raise ImportError("numpy.core.umath failed to import") - * - * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs(PyTypeObject *t, PyObject *a, PyObject *k) { +static PyObject *__pyx_tp_new_4libs_8datasets_11pycocotools_5_mask_RLEs(PyTypeObject *t, PyObject *a, PyObject *k) { PyObject *o; if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); @@ -10890,14 +9763,13 @@ static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs(PyTypeObjec o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; - if (unlikely(__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_1__cinit__(o, a, k) < 0)) goto bad; + if (unlikely(__pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_1__cinit__(o, a, k) < 0)) { + Py_DECREF(o); o = 0; + } return o; - bad: - Py_DECREF(o); o = 0; - return NULL; } -static void __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_RLEs(PyObject *o) { +static void __pyx_tp_dealloc_4libs_8datasets_11pycocotools_5_mask_RLEs(PyObject *o) { #if PY_VERSION_HEX >= 0x030400a1 if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { if (PyObject_CallFinalizerFromDealloc(o)) return; @@ -10907,33 +9779,33 @@ static void __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_RLEs(PyObject *o) PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); ++Py_REFCNT(o); - __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_3__dealloc__(o); + __pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_3__dealloc__(o); --Py_REFCNT(o); PyErr_Restore(etype, eval, etb); } (*Py_TYPE(o)->tp_free)(o); } -static PyObject *__pyx_tp_getattro_10thirdparty_11pycocotools_5_mask_RLEs(PyObject *o, PyObject *n) { +static PyObject *__pyx_tp_getattro_4libs_8datasets_11pycocotools_5_mask_RLEs(PyObject *o, PyObject *n) { PyObject *v = PyObject_GenericGetAttr(o, n); if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); - v = __pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__(o, n); + v = __pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_5__getattr__(o, n); } return v; } -static PyMethodDef __pyx_methods_10thirdparty_11pycocotools_5_mask_RLEs[] = { - {"__getattr__", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_4RLEs_5__getattr__, METH_O|METH_COEXIST, 0}, +static PyMethodDef __pyx_methods_4libs_8datasets_11pycocotools_5_mask_RLEs[] = { + {"__getattr__", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_4RLEs_5__getattr__, METH_O|METH_COEXIST, 0}, {0, 0, 0, 0} }; -static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs = { +static PyTypeObject __pyx_type_4libs_8datasets_11pycocotools_5_mask_RLEs = { PyVarObject_HEAD_INIT(0, 0) - "thirdparty.pycocotools._mask.RLEs", /*tp_name*/ - sizeof(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_RLEs), /*tp_basicsize*/ + "libs.datasets.pycocotools._mask.RLEs", /*tp_name*/ + sizeof(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_RLEs), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_dealloc*/ + __pyx_tp_dealloc_4libs_8datasets_11pycocotools_5_mask_RLEs, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -10950,7 +9822,7 @@ static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs = { 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ - __pyx_tp_getattro_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_getattro*/ + __pyx_tp_getattro_4libs_8datasets_11pycocotools_5_mask_RLEs, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ @@ -10961,7 +9833,7 @@ static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - __pyx_methods_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_methods*/ + __pyx_methods_4libs_8datasets_11pycocotools_5_mask_RLEs, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ @@ -10971,7 +9843,7 @@ static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs = { 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ - __pyx_tp_new_10thirdparty_11pycocotools_5_mask_RLEs, /*tp_new*/ + __pyx_tp_new_4libs_8datasets_11pycocotools_5_mask_RLEs, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ @@ -10986,7 +9858,7 @@ static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs = { #endif }; -static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks(PyTypeObject *t, PyObject *a, PyObject *k) { +static PyObject *__pyx_tp_new_4libs_8datasets_11pycocotools_5_mask_Masks(PyTypeObject *t, PyObject *a, PyObject *k) { PyObject *o; if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); @@ -10994,14 +9866,13 @@ static PyObject *__pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks(PyTypeObje o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; - if (unlikely(__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_1__cinit__(o, a, k) < 0)) goto bad; + if (unlikely(__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5Masks_1__cinit__(o, a, k) < 0)) { + Py_DECREF(o); o = 0; + } return o; - bad: - Py_DECREF(o); o = 0; - return NULL; } -static void __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_Masks(PyObject *o) { +static void __pyx_tp_dealloc_4libs_8datasets_11pycocotools_5_mask_Masks(PyObject *o) { #if PY_VERSION_HEX >= 0x030400a1 if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { if (PyObject_CallFinalizerFromDealloc(o)) return; @@ -11010,17 +9881,17 @@ static void __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_Masks(PyObject *o (*Py_TYPE(o)->tp_free)(o); } -static PyMethodDef __pyx_methods_10thirdparty_11pycocotools_5_mask_Masks[] = { - {"__array__", (PyCFunction)__pyx_pw_10thirdparty_11pycocotools_5_mask_5Masks_3__array__, METH_NOARGS, 0}, +static PyMethodDef __pyx_methods_4libs_8datasets_11pycocotools_5_mask_Masks[] = { + {"__array__", (PyCFunction)__pyx_pw_4libs_8datasets_11pycocotools_5_mask_5Masks_3__array__, METH_NOARGS, 0}, {0, 0, 0, 0} }; -static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_Masks = { +static PyTypeObject __pyx_type_4libs_8datasets_11pycocotools_5_mask_Masks = { PyVarObject_HEAD_INIT(0, 0) - "thirdparty.pycocotools._mask.Masks", /*tp_name*/ - sizeof(struct __pyx_obj_10thirdparty_11pycocotools_5_mask_Masks), /*tp_basicsize*/ + "libs.datasets.pycocotools._mask.Masks", /*tp_name*/ + sizeof(struct __pyx_obj_4libs_8datasets_11pycocotools_5_mask_Masks), /*tp_basicsize*/ 0, /*tp_itemsize*/ - __pyx_tp_dealloc_10thirdparty_11pycocotools_5_mask_Masks, /*tp_dealloc*/ + __pyx_tp_dealloc_4libs_8datasets_11pycocotools_5_mask_Masks, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -11048,7 +9919,7 @@ static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_Masks = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - __pyx_methods_10thirdparty_11pycocotools_5_mask_Masks, /*tp_methods*/ + __pyx_methods_4libs_8datasets_11pycocotools_5_mask_Masks, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ @@ -11058,7 +9929,7 @@ static PyTypeObject __pyx_type_10thirdparty_11pycocotools_5_mask_Masks = { 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ - __pyx_tp_new_10thirdparty_11pycocotools_5_mask_Masks, /*tp_new*/ + __pyx_tp_new_4libs_8datasets_11pycocotools_5_mask_Masks, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ @@ -11097,10 +9968,10 @@ static struct PyModuleDef __pyx_moduledef = { static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_n_s_Exception, __pyx_k_Exception, sizeof(__pyx_k_Exception), 0, 0, 1, 1}, {&__pyx_n_s_F, __pyx_k_F, sizeof(__pyx_k_F), 0, 0, 1, 1}, {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, - {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, {&__pyx_n_s_N, __pyx_k_N, sizeof(__pyx_k_N), 0, 0, 1, 1}, {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, {&__pyx_n_s_PYTHON_VERSION, __pyx_k_PYTHON_VERSION, sizeof(__pyx_k_PYTHON_VERSION), 0, 0, 1, 1}, @@ -11137,7 +10008,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_frUncompressedRLE, __pyx_k_frUncompressedRLE, sizeof(__pyx_k_frUncompressedRLE), 0, 0, 1, 1}, {&__pyx_n_s_gt, __pyx_k_gt, sizeof(__pyx_k_gt), 0, 0, 1, 1}, {&__pyx_n_s_h, __pyx_k_h, sizeof(__pyx_k_h), 0, 0, 1, 1}, - {&__pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_k_home_shang_Work_camus_thirdpart, sizeof(__pyx_k_home_shang_Work_camus_thirdpart), 0, 0, 1, 0}, + {&__pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_k_home_rojana_workspace_FastMaskR, sizeof(__pyx_k_home_rojana_workspace_FastMaskR), 0, 0, 1, 0}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_kp_s_input_data_type_not_allowed, __pyx_k_input_data_type_not_allowed, sizeof(__pyx_k_input_data_type_not_allowed), 0, 0, 1, 0}, @@ -11155,6 +10026,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_isrle, __pyx_k_isrle, sizeof(__pyx_k_isrle), 0, 0, 1, 1}, {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, {&__pyx_n_s_len, __pyx_k_len, sizeof(__pyx_k_len), 0, 0, 1, 1}, + {&__pyx_n_s_libs_datasets_pycocotools__mask, __pyx_k_libs_datasets_pycocotools__mask, sizeof(__pyx_k_libs_datasets_pycocotools__mask), 0, 0, 1, 1}, {&__pyx_kp_s_list_input_can_be_bounding_box_N, __pyx_k_list_input_can_be_bounding_box_N, sizeof(__pyx_k_list_input_can_be_bounding_box_N), 0, 0, 1, 0}, {&__pyx_n_s_m, __pyx_k_m, sizeof(__pyx_k_m), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, @@ -11167,8 +10039,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, {&__pyx_n_s_np_poly, __pyx_k_np_poly, sizeof(__pyx_k_np_poly), 0, 0, 1, 1}, {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, - {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, - {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, {&__pyx_kp_s_numpy_ndarray_input_is_only_for, __pyx_k_numpy_ndarray_input_is_only_for, sizeof(__pyx_k_numpy_ndarray_input_is_only_for), 0, 0, 1, 0}, {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, {&__pyx_n_s_objs, __pyx_k_objs, sizeof(__pyx_k_objs), 0, 0, 1, 1}, @@ -11187,7 +10057,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_thirdparty_pycocotools__mask, __pyx_k_thirdparty_pycocotools__mask, sizeof(__pyx_k_thirdparty_pycocotools__mask), 0, 0, 1, 1}, {&__pyx_n_s_toBbox, __pyx_k_toBbox, sizeof(__pyx_k_toBbox), 0, 0, 1, 1}, {&__pyx_n_s_toString, __pyx_k_toString, sizeof(__pyx_k_toString), 0, 0, 1, 1}, {&__pyx_n_s_tsungyi, __pyx_k_tsungyi, sizeof(__pyx_k_tsungyi), 0, 0, 1, 1}, @@ -11203,12 +10072,12 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 67, __pyx_L1_error) - __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 73, __pyx_L1_error) - __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(0, 124, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 218, __pyx_L1_error) - __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 799, __pyx_L1_error) - __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 989, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_Exception = __Pyx_GetBuiltinName(__pyx_n_s_Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; @@ -11218,403 +10087,372 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "thirdparty/pycocotools/_mask.pyx":126 + /* "libs/datasets/pycocotools/_mask.pyx":126 * for i, obj in enumerate(rleObjs): * if PYTHON_VERSION == 2: * py_string = str(obj['counts']).encode('utf8') # <<<<<<<<<<<<<< * elif PYTHON_VERSION == 3: * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_n_s_utf8); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 126, __pyx_L1_error) + __pyx_tuple_ = PyTuple_Pack(1, __pyx_n_s_utf8); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "thirdparty/pycocotools/_mask.pyx":130 + /* "libs/datasets/pycocotools/_mask.pyx":130 * py_string = str.encode(obj['counts']) if type(obj['counts']) == str else obj['counts'] * else: * raise Exception('Python version must be 2 or 3') # <<<<<<<<<<<<<< * c_string = py_string * rleFrString( &Rs._R[i], c_string, obj['size'][0], obj['size'][1] ) */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Python_version_must_be_2_or_3); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 130, __pyx_L1_error) + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Python_version_must_be_2_or_3); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "thirdparty/pycocotools/_mask.pyx":154 + /* "libs/datasets/pycocotools/_mask.pyx":154 * def merge(rleObjs, intersect=0): * cdef RLEs Rs = _frString(rleObjs) * cdef RLEs R = RLEs(1) # <<<<<<<<<<<<<< * rleMerge(Rs._R, R._R, Rs._n, intersect) * obj = _toString(R)[0] */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 154, __pyx_L1_error) + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "thirdparty/pycocotools/_mask.pyx":180 + /* "libs/datasets/pycocotools/_mask.pyx":180 * # check if it's Nx4 bbox * if not len(objs.shape) == 2 or not objs.shape[1] == 4: * raise Exception('numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension') # <<<<<<<<<<<<<< * objs = objs.astype(np.double) * elif type(objs) == list: */ - __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_ndarray_input_is_only_for); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 180, __pyx_L1_error) + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_ndarray_input_is_only_for); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "thirdparty/pycocotools/_mask.pyx":193 + /* "libs/datasets/pycocotools/_mask.pyx":193 * objs = _frString(objs) * else: * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') # <<<<<<<<<<<<<< * else: * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_list_input_can_be_bounding_box_N); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 193, __pyx_L1_error) + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_list_input_can_be_bounding_box_N); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "thirdparty/pycocotools/_mask.pyx":195 + /* "libs/datasets/pycocotools/_mask.pyx":195 * raise Exception('list input can be bounding box (Nx4) or RLEs ([RLE])') * else: * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') # <<<<<<<<<<<<<< * return objs * 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): */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_unrecognized_type_The_following); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 195, __pyx_L1_error) + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_unrecognized_type_The_following); if (unlikely(!__pyx_tuple__6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "thirdparty/pycocotools/_mask.pyx":172 + /* "libs/datasets/pycocotools/_mask.pyx":172 * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): * def _preproc(objs): # <<<<<<<<<<<<<< * if len(objs) == 0: * return objs */ - __pyx_tuple__7 = PyTuple_Pack(4, __pyx_n_s_objs, __pyx_n_s_isbox, __pyx_n_s_isrle, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 172, __pyx_L1_error) + __pyx_tuple__7 = PyTuple_Pack(4, __pyx_n_s_objs, __pyx_n_s_isbox, __pyx_n_s_isrle, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_preproc, 172, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 172, __pyx_L1_error) + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_preproc, 172, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":197 + /* "libs/datasets/pycocotools/_mask.pyx":197 * raise Exception('unrecognized type. The following type: RLEs (rle), np.ndarray (box), and list (box) are supported.') * return objs * 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): # <<<<<<<<<<<<<< * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): */ - __pyx_tuple__9 = PyTuple_Pack(6, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 197, __pyx_L1_error) + __pyx_tuple__9 = PyTuple_Pack(6, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); - __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(6, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_rleIou, 197, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 197, __pyx_L1_error) + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(6, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_rleIou, 197, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":199 + /* "libs/datasets/pycocotools/_mask.pyx":199 * 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): * rleIou( dt._R, gt._R, m, n, iscrowd.data, _iou.data ) * 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): # <<<<<<<<<<<<<< * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): */ - __pyx_tuple__11 = PyTuple_Pack(6, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 199, __pyx_L1_error) + __pyx_tuple__11 = PyTuple_Pack(6, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); - __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(6, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_bbIou, 199, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 199, __pyx_L1_error) + __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(6, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_bbIou, 199, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":201 + /* "libs/datasets/pycocotools/_mask.pyx":201 * 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): * bbIou( dt.data, gt.data, m, n, iscrowd.data, _iou.data ) * def _len(obj): # <<<<<<<<<<<<<< * cdef siz N = 0 * if type(obj) == RLEs: */ - __pyx_tuple__13 = PyTuple_Pack(2, __pyx_n_s_obj, __pyx_n_s_N); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 201, __pyx_L1_error) + __pyx_tuple__13 = PyTuple_Pack(2, __pyx_n_s_obj, __pyx_n_s_N); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); - __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_len, 201, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 201, __pyx_L1_error) + __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_len, 201, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":221 + /* "libs/datasets/pycocotools/_mask.pyx":221 * return [] * if not type(dt) == type(gt): * raise Exception('The dt and gt should have the same data type, either RLEs, list or np.ndarray') # <<<<<<<<<<<<<< * * # define local variables */ - __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_The_dt_and_gt_should_have_the_sa); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 221, __pyx_L1_error) + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_The_dt_and_gt_should_have_the_sa); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__15); __Pyx_GIVEREF(__pyx_tuple__15); - /* "thirdparty/pycocotools/_mask.pyx":232 + /* "libs/datasets/pycocotools/_mask.pyx":232 * _iouFun = _bbIou * else: * raise Exception('input data type not allowed.') # <<<<<<<<<<<<<< * _iou = malloc(m*n* sizeof(double)) * iou = np.zeros((m*n, ), dtype=np.double) */ - __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_input_data_type_not_allowed); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 232, __pyx_L1_error) + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_input_data_type_not_allowed); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); - /* "thirdparty/pycocotools/_mask.pyx":277 + /* "libs/datasets/pycocotools/_mask.pyx":277 * objs = [] * for i in range(n): * Rs = RLEs(1) # <<<<<<<<<<<<<< * cnts = np.array(ucRles[i]['counts'], dtype=np.uint32) * # time for malloc can be saved here but it's fine */ - __pyx_tuple__17 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 277, __pyx_L1_error) + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__17); __Pyx_GIVEREF(__pyx_tuple__17); - /* "thirdparty/pycocotools/_mask.pyx":307 + /* "libs/datasets/pycocotools/_mask.pyx":307 * objs = frUncompressedRLE([pyobj], h, w)[0] * else: * raise Exception('input type is not supported.') # <<<<<<<<<<<<<< * return objs */ - __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_input_type_is_not_supported); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 307, __pyx_L1_error) + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_input_type_is_not_supported); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":218 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":218 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ - __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 218, __pyx_L1_error) + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__19)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":222 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ - __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 222, __pyx_L1_error) + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__20); __Pyx_GIVEREF(__pyx_tuple__20); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":259 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ - __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 259, __pyx_L1_error) + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__21)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__21); __Pyx_GIVEREF(__pyx_tuple__21); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":799 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ - __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 799, __pyx_L1_error) + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__22)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__22); __Pyx_GIVEREF(__pyx_tuple__22); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":803 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ - __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 803, __pyx_L1_error) + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__23)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":823 + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ - __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 823, __pyx_L1_error) + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__24)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__24); __Pyx_GIVEREF(__pyx_tuple__24); - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":989 - * _import_array() - * except Exception: - * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_umath() except -1: - */ - __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 989, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__25); - __Pyx_GIVEREF(__pyx_tuple__25); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":995 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * - * cdef inline int import_ufunc() except -1: - */ - __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(1, 995, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__26); - __Pyx_GIVEREF(__pyx_tuple__26); - - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":1001 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - */ - __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(1, 1001, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__27); - __Pyx_GIVEREF(__pyx_tuple__27); - - /* "thirdparty/pycocotools/_mask.pyx":103 + /* "libs/datasets/pycocotools/_mask.pyx":103 * * # internal conversion from Python RLEs object to compressed RLE format * def _toString(RLEs Rs): # <<<<<<<<<<<<<< * cdef siz n = Rs.n * cdef bytes py_string */ - __pyx_tuple__28 = PyTuple_Pack(6, __pyx_n_s_Rs, __pyx_n_s_n, __pyx_n_s_py_string, __pyx_n_s_c_string, __pyx_n_s_objs, __pyx_n_s_i); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 103, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__28); - __Pyx_GIVEREF(__pyx_tuple__28); - __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_toString, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 103, __pyx_L1_error) + __pyx_tuple__25 = PyTuple_Pack(6, __pyx_n_s_Rs, __pyx_n_s_n, __pyx_n_s_py_string, __pyx_n_s_c_string, __pyx_n_s_objs, __pyx_n_s_i); if (unlikely(!__pyx_tuple__25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_toString, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":119 + /* "libs/datasets/pycocotools/_mask.pyx":119 * * # internal conversion from compressed RLE format to Python RLEs object * def _frString(rleObjs): # <<<<<<<<<<<<<< * cdef siz n = len(rleObjs) * Rs = RLEs(n) */ - __pyx_tuple__30 = PyTuple_Pack(7, __pyx_n_s_rleObjs, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_py_string, __pyx_n_s_c_string, __pyx_n_s_i, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 119, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__30); - __Pyx_GIVEREF(__pyx_tuple__30); - __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(1, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frString, 119, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_tuple__27 = PyTuple_Pack(7, __pyx_n_s_rleObjs, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_py_string, __pyx_n_s_c_string, __pyx_n_s_i, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); + __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(1, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_frString, 119, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":137 + /* "libs/datasets/pycocotools/_mask.pyx":137 * # encode mask to RLEs objects * # list of RLE string can be generated by RLEs member function * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] * cdef RLEs Rs = RLEs(n) */ - __pyx_tuple__32 = PyTuple_Pack(6, __pyx_n_s_mask, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 137, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__32); - __Pyx_GIVEREF(__pyx_tuple__32); - __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_encode, 137, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 137, __pyx_L1_error) + __pyx_tuple__29 = PyTuple_Pack(6, __pyx_n_s_mask, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__29)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_encode, 137, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":145 + /* "libs/datasets/pycocotools/_mask.pyx":145 * * # decode mask from compressed list of RLE string or RLEs object * def decode(rleObjs): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n */ - __pyx_tuple__34 = PyTuple_Pack(6, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_masks); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 145, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__34); - __Pyx_GIVEREF(__pyx_tuple__34); - __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_decode, 145, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(0, 145, __pyx_L1_error) + __pyx_tuple__31 = PyTuple_Pack(6, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_masks); if (unlikely(!__pyx_tuple__31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__31); + __Pyx_GIVEREF(__pyx_tuple__31); + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_decode, 145, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":152 + /* "libs/datasets/pycocotools/_mask.pyx":152 * return np.array(masks) * * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * cdef RLEs R = RLEs(1) */ - __pyx_tuple__36 = PyTuple_Pack(5, __pyx_n_s_rleObjs, __pyx_n_s_intersect, __pyx_n_s_Rs, __pyx_n_s_R, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 152, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__36); - __Pyx_GIVEREF(__pyx_tuple__36); - __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(2, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_merge, 152, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_tuple__33 = PyTuple_Pack(5, __pyx_n_s_rleObjs, __pyx_n_s_intersect, __pyx_n_s_Rs, __pyx_n_s_R, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__33); + __Pyx_GIVEREF(__pyx_tuple__33); + __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(2, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_merge, 152, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":159 + /* "libs/datasets/pycocotools/_mask.pyx":159 * return obj * * def area(rleObjs): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * cdef uint* _a = malloc(Rs._n* sizeof(uint)) */ - __pyx_tuple__38 = PyTuple_Pack(5, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_a, __pyx_n_s_shape, __pyx_n_s_a_2); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 159, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__38); - __Pyx_GIVEREF(__pyx_tuple__38); - __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_area, 159, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_tuple__35 = PyTuple_Pack(5, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_a, __pyx_n_s_shape, __pyx_n_s_a_2); if (unlikely(!__pyx_tuple__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__35); + __Pyx_GIVEREF(__pyx_tuple__35); + __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_area, 159, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":171 + /* "libs/datasets/pycocotools/_mask.pyx":171 * * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< * def _preproc(objs): * if len(objs) == 0: */ - __pyx_tuple__40 = PyTuple_Pack(18, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_pyiscrowd, __pyx_n_s_preproc, __pyx_n_s_preproc, __pyx_n_s_rleIou, __pyx_n_s_rleIou, __pyx_n_s_bbIou, __pyx_n_s_bbIou, __pyx_n_s_len, __pyx_n_s_len, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou, __pyx_n_s_shape, __pyx_n_s_iouFun, __pyx_n_s_iou_2); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 171, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__40); - __Pyx_GIVEREF(__pyx_tuple__40); - __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(3, 0, 18, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_iou_2, 171, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 171, __pyx_L1_error) + __pyx_tuple__37 = PyTuple_Pack(18, __pyx_n_s_dt, __pyx_n_s_gt, __pyx_n_s_pyiscrowd, __pyx_n_s_preproc, __pyx_n_s_preproc, __pyx_n_s_rleIou, __pyx_n_s_rleIou, __pyx_n_s_bbIou, __pyx_n_s_bbIou, __pyx_n_s_len, __pyx_n_s_len, __pyx_n_s_iscrowd, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_iou, __pyx_n_s_shape, __pyx_n_s_iouFun, __pyx_n_s_iou_2); if (unlikely(!__pyx_tuple__37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__37); + __Pyx_GIVEREF(__pyx_tuple__37); + __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(3, 0, 18, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_iou_2, 171, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":241 + /* "libs/datasets/pycocotools/_mask.pyx":241 * return iou.reshape((m,n), order='F') * * def toBbox( rleObjs ): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * cdef siz n = Rs.n */ - __pyx_tuple__42 = PyTuple_Pack(6, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_n, __pyx_n_s_bb_2, __pyx_n_s_shape, __pyx_n_s_bb); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 241, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__42); - __Pyx_GIVEREF(__pyx_tuple__42); - __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_toBbox, 241, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 241, __pyx_L1_error) + __pyx_tuple__39 = PyTuple_Pack(6, __pyx_n_s_rleObjs, __pyx_n_s_Rs, __pyx_n_s_n, __pyx_n_s_bb_2, __pyx_n_s_shape, __pyx_n_s_bb); if (unlikely(!__pyx_tuple__39)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); + __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_toBbox, 241, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":253 + /* "libs/datasets/pycocotools/_mask.pyx":253 * return bb * * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< * cdef siz n = bb.shape[0] * Rs = RLEs(n) */ - __pyx_tuple__44 = PyTuple_Pack(6, __pyx_n_s_bb, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__44); - __Pyx_GIVEREF(__pyx_tuple__44); - __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__44, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frBbox, 253, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_tuple__41 = PyTuple_Pack(6, __pyx_n_s_bb, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__41)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__41); + __Pyx_GIVEREF(__pyx_tuple__41); + __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(3, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_frBbox, 253, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":260 + /* "libs/datasets/pycocotools/_mask.pyx":260 * return objs * * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< * cdef np.ndarray[np.double_t, ndim=1] np_poly * n = len(poly) */ - __pyx_tuple__46 = PyTuple_Pack(9, __pyx_n_s_poly, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_np_poly, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_i, __pyx_n_s_p, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(0, 260, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__46); - __Pyx_GIVEREF(__pyx_tuple__46); - __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(3, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frPoly, 260, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(0, 260, __pyx_L1_error) + __pyx_tuple__43 = PyTuple_Pack(9, __pyx_n_s_poly, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_np_poly, __pyx_n_s_n, __pyx_n_s_Rs, __pyx_n_s_i, __pyx_n_s_p, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__43)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__43); + __Pyx_GIVEREF(__pyx_tuple__43); + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(3, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__43, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_frPoly, 260, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":270 + /* "libs/datasets/pycocotools/_mask.pyx":270 * return objs * * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< * cdef np.ndarray[np.uint32_t, ndim=1] cnts * cdef RLE R */ - __pyx_tuple__48 = PyTuple_Pack(11, __pyx_n_s_ucRles, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_cnts, __pyx_n_s_R, __pyx_n_s_data, __pyx_n_s_n, __pyx_n_s_objs, __pyx_n_s_i, __pyx_n_s_Rs, __pyx_n_s_j); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(0, 270, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__48); - __Pyx_GIVEREF(__pyx_tuple__48); - __pyx_codeobj__49 = (PyObject*)__Pyx_PyCode_New(3, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__48, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frUncompressedRLE, 270, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__49)) __PYX_ERR(0, 270, __pyx_L1_error) + __pyx_tuple__45 = PyTuple_Pack(11, __pyx_n_s_ucRles, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_cnts, __pyx_n_s_R, __pyx_n_s_data, __pyx_n_s_n, __pyx_n_s_objs, __pyx_n_s_i, __pyx_n_s_Rs, __pyx_n_s_j); if (unlikely(!__pyx_tuple__45)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__45); + __Pyx_GIVEREF(__pyx_tuple__45); + __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(3, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_frUncompressedRLE, 270, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":288 + /* "libs/datasets/pycocotools/_mask.pyx":288 * return objs * * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< * # encode rle from a list of python objects * if type(pyobj) == np.ndarray: */ - __pyx_tuple__50 = PyTuple_Pack(4, __pyx_n_s_pyobj, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(0, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__50); - __Pyx_GIVEREF(__pyx_tuple__50); - __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__50, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_shang_Work_camus_thirdpart, __pyx_n_s_frPyObjects, 288, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(0, 288, __pyx_L1_error) + __pyx_tuple__47 = PyTuple_Pack(4, __pyx_n_s_pyobj, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_objs); if (unlikely(!__pyx_tuple__47)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__47); + __Pyx_GIVEREF(__pyx_tuple__47); + __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_rojana_workspace_FastMaskR, __pyx_n_s_frPyObjects, 288, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -11623,12 +10461,12 @@ static int __Pyx_InitCachedConstants(void) { } static int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; @@ -11644,7 +10482,9 @@ PyMODINIT_FUNC PyInit__mask(void) { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; - int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); @@ -11656,24 +10496,23 @@ PyMODINIT_FUNC PyInit__mask(void) } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__mask(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ @@ -11688,46 +10527,46 @@ PyMODINIT_FUNC PyInit__mask(void) #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif - if (__pyx_module_is_main_thirdparty__pycocotools___mask) { - if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__pyx_module_is_main_libs__datasets__pycocotools___mask) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if PY_MAJOR_VERSION >= 3 { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "thirdparty.pycocotools._mask")) { - if (unlikely(PyDict_SetItemString(modules, "thirdparty.pycocotools._mask", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!PyDict_GetItemString(modules, "libs.datasets.pycocotools._mask")) { + if (unlikely(PyDict_SetItemString(modules, "libs.datasets.pycocotools._mask", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ - if (PyType_Ready(&__pyx_type_10thirdparty_11pycocotools_5_mask_RLEs) < 0) __PYX_ERR(0, 56, __pyx_L1_error) - __pyx_type_10thirdparty_11pycocotools_5_mask_RLEs.tp_print = 0; - if (PyObject_SetAttrString(__pyx_m, "RLEs", (PyObject *)&__pyx_type_10thirdparty_11pycocotools_5_mask_RLEs) < 0) __PYX_ERR(0, 56, __pyx_L1_error) - __pyx_ptype_10thirdparty_11pycocotools_5_mask_RLEs = &__pyx_type_10thirdparty_11pycocotools_5_mask_RLEs; - if (PyType_Ready(&__pyx_type_10thirdparty_11pycocotools_5_mask_Masks) < 0) __PYX_ERR(0, 77, __pyx_L1_error) - __pyx_type_10thirdparty_11pycocotools_5_mask_Masks.tp_print = 0; - if (PyObject_SetAttrString(__pyx_m, "Masks", (PyObject *)&__pyx_type_10thirdparty_11pycocotools_5_mask_Masks) < 0) __PYX_ERR(0, 77, __pyx_L1_error) - __pyx_ptype_10thirdparty_11pycocotools_5_mask_Masks = &__pyx_type_10thirdparty_11pycocotools_5_mask_Masks; + if (PyType_Ready(&__pyx_type_4libs_8datasets_11pycocotools_5_mask_RLEs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_type_4libs_8datasets_11pycocotools_5_mask_RLEs.tp_print = 0; + if (PyObject_SetAttrString(__pyx_m, "RLEs", (PyObject *)&__pyx_type_4libs_8datasets_11pycocotools_5_mask_RLEs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_RLEs = &__pyx_type_4libs_8datasets_11pycocotools_5_mask_RLEs; + if (PyType_Ready(&__pyx_type_4libs_8datasets_11pycocotools_5_mask_Masks) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_type_4libs_8datasets_11pycocotools_5_mask_Masks.tp_print = 0; + if (PyObject_SetAttrString(__pyx_m, "Masks", (PyObject *)&__pyx_type_4libs_8datasets_11pycocotools_5_mask_Masks) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_4libs_8datasets_11pycocotools_5_mask_Masks = &__pyx_type_4libs_8datasets_11pycocotools_5_mask_Masks; /*--- Type import code ---*/ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", #if CYTHON_COMPILING_IN_PYPY @@ -11735,239 +10574,239 @@ PyMODINIT_FUNC PyInit__mask(void) #else sizeof(PyHeapTypeObject), #endif - 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(2, 9, __pyx_L1_error) - __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(1, 155, __pyx_L1_error) - __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(1, 168, __pyx_L1_error) - __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(1, 172, __pyx_L1_error) - __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(1, 181, __pyx_L1_error) - __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(1, 861, __pyx_L1_error) + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif - /* "thirdparty/pycocotools/_mask.pyx":11 + /* "libs/datasets/pycocotools/_mask.pyx":11 * #************************************************************************** * * __author__ = 'tsungyi' # <<<<<<<<<<<<<< * * import sys */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_author, __pyx_n_s_tsungyi) < 0) __PYX_ERR(0, 11, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_author, __pyx_n_s_tsungyi) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /* "thirdparty/pycocotools/_mask.pyx":13 + /* "libs/datasets/pycocotools/_mask.pyx":13 * __author__ = 'tsungyi' * * import sys # <<<<<<<<<<<<<< * PYTHON_VERSION = sys.version_info[0] * */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_sys, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_sys, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) __PYX_ERR(0, 13, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":14 + /* "libs/datasets/pycocotools/_mask.pyx":14 * * import sys * PYTHON_VERSION = sys.version_info[0] # <<<<<<<<<<<<<< * * # import both Python-level and C-level symbols of Numpy */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 14, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_version_info); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_version_info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 14, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYTHON_VERSION, __pyx_t_1) < 0) __PYX_ERR(0, 14, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PYTHON_VERSION, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":18 + /* "libs/datasets/pycocotools/_mask.pyx":18 * # import both Python-level and C-level symbols of Numpy * # the API uses Numpy to interface C and Python * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np * from libc.stdlib cimport malloc, free */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":23 + /* "libs/datasets/pycocotools/_mask.pyx":23 * * # intialized Numpy. must do. * np.import_array() # <<<<<<<<<<<<<< * * # import numpy C function */ - __pyx_t_3 = __pyx_f_5numpy_import_array(); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 23, __pyx_L1_error) + import_array(); - /* "thirdparty/pycocotools/_mask.pyx":103 + /* "libs/datasets/pycocotools/_mask.pyx":103 * * # internal conversion from Python RLEs object to compressed RLE format * def _toString(RLEs Rs): # <<<<<<<<<<<<<< * cdef siz n = Rs.n * cdef bytes py_string */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_1_toString, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_1_toString, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_toString, __pyx_t_1) < 0) __PYX_ERR(0, 103, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_toString, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":119 + /* "libs/datasets/pycocotools/_mask.pyx":119 * * # internal conversion from compressed RLE format to Python RLEs object * def _frString(rleObjs): # <<<<<<<<<<<<<< * cdef siz n = len(rleObjs) * Rs = RLEs(n) */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_3_frString, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_3_frString, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_frString, __pyx_t_1) < 0) __PYX_ERR(0, 119, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frString, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":137 + /* "libs/datasets/pycocotools/_mask.pyx":137 * # encode mask to RLEs objects * # list of RLE string can be generated by RLEs member function * def encode(np.ndarray[np.uint8_t, ndim=3, mode='fortran'] mask): # <<<<<<<<<<<<<< * h, w, n = mask.shape[0], mask.shape[1], mask.shape[2] * cdef RLEs Rs = RLEs(n) */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_5encode, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_5encode, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_encode, __pyx_t_1) < 0) __PYX_ERR(0, 137, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_encode, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":145 + /* "libs/datasets/pycocotools/_mask.pyx":145 * * # decode mask from compressed list of RLE string or RLEs object * def decode(rleObjs): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * h, w, n = Rs._R[0].h, Rs._R[0].w, Rs._n */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_7decode, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_7decode, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode, __pyx_t_1) < 0) __PYX_ERR(0, 145, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_decode, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":152 + /* "libs/datasets/pycocotools/_mask.pyx":152 * return np.array(masks) * * def merge(rleObjs, intersect=0): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * cdef RLEs R = RLEs(1) */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_9merge, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_9merge, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_merge, __pyx_t_1) < 0) __PYX_ERR(0, 152, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_merge, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":159 + /* "libs/datasets/pycocotools/_mask.pyx":159 * return obj * * def area(rleObjs): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * cdef uint* _a = malloc(Rs._n* sizeof(uint)) */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_11area, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_11area, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_area, __pyx_t_1) < 0) __PYX_ERR(0, 159, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_area, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":171 + /* "libs/datasets/pycocotools/_mask.pyx":171 * * # iou computation. support function overload (RLEs-RLEs and bbox-bbox). * def iou( dt, gt, pyiscrowd ): # <<<<<<<<<<<<<< * def _preproc(objs): * if len(objs) == 0: */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_13iou, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_13iou, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_iou_2, __pyx_t_1) < 0) __PYX_ERR(0, 171, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_iou_2, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":241 + /* "libs/datasets/pycocotools/_mask.pyx":241 * return iou.reshape((m,n), order='F') * * def toBbox( rleObjs ): # <<<<<<<<<<<<<< * cdef RLEs Rs = _frString(rleObjs) * cdef siz n = Rs.n */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_15toBbox, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_15toBbox, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_toBbox, __pyx_t_1) < 0) __PYX_ERR(0, 241, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_toBbox, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":253 + /* "libs/datasets/pycocotools/_mask.pyx":253 * return bb * * def frBbox(np.ndarray[np.double_t, ndim=2] bb, siz h, siz w ): # <<<<<<<<<<<<<< * cdef siz n = bb.shape[0] * Rs = RLEs(n) */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_17frBbox, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_17frBbox, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_frBbox, __pyx_t_1) < 0) __PYX_ERR(0, 253, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frBbox, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":260 + /* "libs/datasets/pycocotools/_mask.pyx":260 * return objs * * def frPoly( poly, siz h, siz w ): # <<<<<<<<<<<<<< * cdef np.ndarray[np.double_t, ndim=1] np_poly * n = len(poly) */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_19frPoly, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 260, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_19frPoly, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_frPoly, __pyx_t_1) < 0) __PYX_ERR(0, 260, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frPoly, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":270 + /* "libs/datasets/pycocotools/_mask.pyx":270 * return objs * * def frUncompressedRLE(ucRles, siz h, siz w): # <<<<<<<<<<<<<< * cdef np.ndarray[np.uint32_t, ndim=1] cnts * cdef RLE R */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_21frUncompressedRLE, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 270, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_21frUncompressedRLE, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_frUncompressedRLE, __pyx_t_1) < 0) __PYX_ERR(0, 270, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frUncompressedRLE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":288 + /* "libs/datasets/pycocotools/_mask.pyx":288 * return objs * * def frPyObjects(pyobj, h, w): # <<<<<<<<<<<<<< * # encode rle from a list of python objects * if type(pyobj) == np.ndarray: */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10thirdparty_11pycocotools_5_mask_23frPyObjects, NULL, __pyx_n_s_thirdparty_pycocotools__mask); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 288, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4libs_8datasets_11pycocotools_5_mask_23frPyObjects, NULL, __pyx_n_s_libs_datasets_pycocotools__mask); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_frPyObjects, __pyx_t_1) < 0) __PYX_ERR(0, 288, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_frPyObjects, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "thirdparty/pycocotools/_mask.pyx":1 + /* "libs/datasets/pycocotools/_mask.pyx":1 * # distutils: language = c # <<<<<<<<<<<<<< * # distutils: sources = ./common/maskApi.c * */ - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../../anaconda2/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":997 - * raise ImportError("numpy.core.umath failed to import") + /* "../../../../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr * - * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None */ /*--- Wrapped vars code ---*/ @@ -11978,11 +10817,11 @@ PyMODINIT_FUNC PyInit__mask(void) __Pyx_XDECREF(__pyx_t_2); if (__pyx_m) { if (__pyx_d) { - __Pyx_AddTraceback("init thirdparty.pycocotools._mask", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_AddTraceback("init libs.datasets.pycocotools._mask", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init thirdparty.pycocotools._mask"); + PyErr_SetString(PyExc_ImportError, "init libs.datasets.pycocotools._mask"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); @@ -11994,7 +10833,6 @@ PyMODINIT_FUNC PyInit__mask(void) } /* --- Runtime support code --- */ -/* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; @@ -12011,7 +10849,6 @@ static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { } #endif -/* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { @@ -12025,7 +10862,6 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { return result; } -/* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) @@ -12039,7 +10875,6 @@ static void __Pyx_RaiseDoubleKeywordsError( #endif } -/* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], @@ -12141,7 +10976,6 @@ static int __Pyx_ParseOptionalKeywords( return -1; } -/* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, @@ -12167,7 +11001,6 @@ static void __Pyx_RaiseArgtupleInvalid( (num_expected == 1) ? "" : "s", num_found); } -/* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY return PyObject_RichCompareBool(s1, s2, equals); @@ -12205,7 +11038,6 @@ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int eq #endif } -/* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY return PyObject_RichCompareBool(s1, s2, equals); @@ -12289,7 +11121,6 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #endif } -/* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; @@ -12309,10 +11140,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg } #endif -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; @@ -12322,22 +11153,27 @@ static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObjec Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); +#else + PyErr_Restore(type, value, tb); +#endif } -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; -} +#else + PyErr_Fetch(type, value, tb); #endif +} -/* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { - __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; @@ -12376,7 +11212,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, goto raise_error; } } - __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: @@ -12496,8 +11331,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject } #endif -/* ExtTypeTest */ - static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; @@ -12509,8 +11343,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject return 0; } -/* ArgTypeTest */ - static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { +static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); @@ -12536,8 +11369,11 @@ static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, in return 0; } -/* PyIntBinop */ - #if !CYTHON_COMPILING_IN_PYPY +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" +#endif + +#if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(op1))) { @@ -12550,14 +11386,12 @@ static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED return PyLong_Type.tp_as_number->nb_add(op1, op2); } #endif - #if CYTHON_USE_PYLONG_INTERNALS + #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3 if (likely(PyLong_CheckExact(op1))) { const long b = intval; long a, x; -#ifdef HAVE_LONG_LONG const PY_LONG_LONG llb = intval; PY_LONG_LONG lla, llx; -#endif const digit* digits = ((PyLongObject*)op1)->ob_digit; const Py_ssize_t size = Py_SIZE(op1); if (likely(__Pyx_sst_abs(size) <= 1)) { @@ -12569,74 +11403,58 @@ static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); break; -#ifdef HAVE_LONG_LONG } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); goto long_long; -#endif } case 2: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); break; -#ifdef HAVE_LONG_LONG } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); goto long_long; -#endif } case -3: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); break; -#ifdef HAVE_LONG_LONG } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); goto long_long; -#endif } case 3: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); break; -#ifdef HAVE_LONG_LONG } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); goto long_long; -#endif } case -4: if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); break; -#ifdef HAVE_LONG_LONG } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); goto long_long; -#endif } case 4: if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); break; -#ifdef HAVE_LONG_LONG } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); goto long_long; -#endif } default: return PyLong_Type.tp_as_number->nb_add(op1, op2); } } x = a + b; return PyLong_FromLong(x); -#ifdef HAVE_LONG_LONG long_long: llx = lla + llb; return PyLong_FromLongLong(llx); -#endif - - } #endif if (PyFloat_CheckExact(op1)) { @@ -12652,8 +11470,7 @@ static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED } #endif -/* PyIntBinop */ - #if !CYTHON_COMPILING_IN_PYPY +#if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { if (op1 == op2) { Py_RETURN_TRUE; @@ -12669,7 +11486,7 @@ static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED } } #endif - #if CYTHON_USE_PYLONG_INTERNALS + #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3 if (likely(PyLong_CheckExact(op1))) { const long b = intval; long a; @@ -12737,10 +11554,9 @@ static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED } #endif -/* GetModuleGlobalName */ - static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON result = PyDict_GetItem(__pyx_d, name); if (likely(result)) { Py_INCREF(result); @@ -12755,166 +11571,26 @@ static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED return result; } -/* PyCFunctionFastCall */ - #if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs, NULL); -} -#endif // CYTHON_FAST_PYCCALL - -/* PyFunctionFastCall */ - #if CYTHON_FAST_PYCALL -#include "frameobject.h" -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = PyThreadState_GET(); - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; - } - fastlocals = f->f_localsplus; - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif // CPython < 3.6 -#endif // CYTHON_FAST_PYCALL - -/* PyObjectCallMethO */ - #if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); } return result; } #endif -/* PyObjectCallOneArg */ - #if CYTHON_COMPILING_IN_CPYTHON +#if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); @@ -12926,11 +11602,6 @@ static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif #ifdef __Pyx_CyFunction_USED if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { #else @@ -12938,10 +11609,6 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec #endif if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif } } return __Pyx__PyObject_CallOneArg(func, arg); @@ -12957,8 +11624,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec } #endif -/* GetItemInt */ - static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); @@ -12968,7 +11634,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); @@ -12983,7 +11649,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); @@ -12998,7 +11664,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS +#if CYTHON_COMPILING_IN_CPYTHON if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { @@ -13022,9 +11688,10 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, if (likely(l >= 0)) { i += l; } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_Clear(); + else return NULL; - PyErr_Clear(); } } return m->sq_item(o, i); @@ -13038,8 +11705,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } -/* BufferFormatCheck */ - static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { +static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { unsigned int n = 1; return *(unsigned char*)(&n) != 0; } @@ -13588,8 +12254,7 @@ static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { __Pyx_ReleaseBuffer(info); } -/* FetchCommonType */ - static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { PyObject* fake_module; PyTypeObject* cached_type = NULL; fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); @@ -13627,8 +12292,7 @@ static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { goto done; } -/* CythonFunction */ - static PyObject * +static PyObject * __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure) { if (unlikely(op->func_doc == NULL)) { @@ -13785,7 +12449,7 @@ __Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { PyObject *res = op->defaults_getter((PyObject *) op); if (unlikely(!res)) return -1; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + #if CYTHON_COMPILING_IN_CPYTHON op->defaults_tuple = PyTuple_GET_ITEM(res, 0); Py_INCREF(op->defaults_tuple); op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); @@ -13983,7 +12647,7 @@ __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_XDECREF(pydefaults[i]); - PyObject_Free(m->defaults); + PyMem_Free(m->defaults); m->defaults = NULL; } return 0; @@ -14044,9 +12708,11 @@ __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) PyString_AsString(op->func_qualname), (void *)op); #endif } -static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { +#if CYTHON_COMPILING_IN_PYPY +static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = f->m_ml->ml_meth; + PyObject *self = f->m_self; Py_ssize_t size; switch (f->m_ml->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { case METH_VARARGS: @@ -14092,32 +12758,11 @@ static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, Py f->m_ml->ml_name); return NULL; } -static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { - return __Pyx_CyFunction_CallMethod(func, ((PyCFunctionObject*)func)->m_self, arg, kw); -} -static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { - PyObject *result; - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; - if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { - Py_ssize_t argc; - PyObject *new_args; - PyObject *self; - argc = PyTuple_GET_SIZE(args); - new_args = PyTuple_GetSlice(args, 1, argc); - if (unlikely(!new_args)) - return NULL; - self = PyTuple_GetItem(args, 0); - if (unlikely(!self)) { - Py_DECREF(new_args); - return NULL; - } - result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); - Py_DECREF(new_args); - } else { - result = __Pyx_CyFunction_Call(func, args, kw); - } - return result; +#else +static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { + return PyCFunction_Call(func, arg, kw); } +#endif static PyTypeObject __pyx_CyFunctionType_type = { PyVarObject_HEAD_INIT(0, 0) "cython_function_or_method", @@ -14137,7 +12782,7 @@ static PyTypeObject __pyx_CyFunctionType_type = { 0, 0, 0, - __Pyx_CyFunction_CallAsMethod, + __Pyx_CyFunction_Call, 0, 0, 0, @@ -14179,6 +12824,9 @@ static PyTypeObject __pyx_CyFunctionType_type = { #endif }; static int __pyx_CyFunction_init(void) { +#if !CYTHON_COMPILING_IN_PYPY + __pyx_CyFunctionType_type.tp_call = PyCFunction_Call; +#endif __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); if (__pyx_CyFunctionType == NULL) { return -1; @@ -14187,7 +12835,7 @@ static int __pyx_CyFunction_init(void) { } static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults = PyObject_Malloc(size); + m->defaults = PyMem_Malloc(size); if (!m->defaults) return PyErr_NoMemory(); memset(m->defaults, 0, size); @@ -14210,141 +12858,39 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, Py Py_INCREF(dict); } -/* BufferFallbackError */ - static void __Pyx_RaiseBufferFallbackError(void) { +static void __Pyx_RaiseBufferFallbackError(void) { PyErr_SetString(PyExc_ValueError, "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!"); } -/* None */ - static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { Py_ssize_t q = a / b; Py_ssize_t r = a - q*b; q -= ((r != 0) & ((r ^ b) < 0)); return q; } -/* BufferIndexError */ - static void __Pyx_RaiseBufferIndexError(int axis) { +static void __Pyx_RaiseBufferIndexError(int axis) { PyErr_Format(PyExc_IndexError, "Out of bounds on buffer access (axis %d)", axis); } -/* RaiseTooManyValuesToUnpack */ - static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } -/* RaiseNeedMoreValuesToUnpack */ - static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } -/* RaiseNoneIterError */ - static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } -/* SaveResetException */ - #if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -#endif - -/* PyErrExceptionMatches */ - #if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) { - PyObject *exc_type = tstate->curexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; - return PyErr_GivenExceptionMatches(exc_type, err); -} -#endif - -/* GetException */ - #if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { -#endif - PyObject *local_type, *local_value, *local_tb; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* Import */ - static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; @@ -14417,8 +12963,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) return module; } -/* CodeObjectCache */ - static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; @@ -14497,8 +13042,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { Py_INCREF(code_object); } -/* AddTraceback */ - #include "compile.h" +#include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( @@ -14571,7 +13115,7 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); @@ -14599,8 +13143,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { #endif - /* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { @@ -14608,18 +13151,14 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif } } { @@ -14630,8 +13169,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { } } -/* CIntFromPyVerify */ - #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) @@ -14652,454 +13190,229 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return (target_type) value;\ } -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_siz(siz value) { +static CYTHON_INLINE siz __Pyx_PyInt_As_siz(PyObject *x) { const siz neg_one = (siz) -1, const_zero = (siz) 0; const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { if (sizeof(siz) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(siz) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(siz) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(siz) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(siz) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif + __PYX_VERIFY_RETURN_INT(siz, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (siz) val; } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(siz), - little, !is_unsigned); - } -} - -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value) { - const Py_intptr_t neg_one = (Py_intptr_t) -1, const_zero = (Py_intptr_t) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(Py_intptr_t) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(Py_intptr_t) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(Py_intptr_t) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } else #endif - } - } else { - if (sizeof(Py_intptr_t) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(Py_intptr_t) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (siz) 0; + case 1: __PYX_VERIFY_RETURN_INT(siz, digit, digits[0]) + case 2: + if (8 * sizeof(siz) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) >= 2 * PyLong_SHIFT) { + return (siz) (((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(siz) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) >= 3 * PyLong_SHIFT) { + return (siz) (((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(siz) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) >= 4 * PyLong_SHIFT) { + return (siz) (((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + } + } + break; + } #endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(Py_intptr_t), - little, !is_unsigned); - } -} - -/* Declarations */ - #if CYTHON_CCOMPLEX - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - return ::std::complex< float >(x, y); - } - #else - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - return x + y*(__pyx_t_float_complex)_Complex_I; - } - #endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } #else - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - __pyx_t_float_complex z; - z.real = x; - z.imag = y; - return z; - } + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (siz) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } #endif - -/* Arithmetic */ - #if CYTHON_CCOMPLEX -#else - static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - return (a.real == b.real) && (a.imag == b.imag); - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - if (b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabsf(b.real) >= fabsf(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - float r = b.imag / b.real; - float s = 1.0 / (b.real + b.imag * r); - return __pyx_t_float_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + if (sizeof(siz) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(siz) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) } } else { - float r = b.real / b.imag; - float s = 1.0 / (b.imag + b.real * r); - return __pyx_t_float_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); - } - } - #else - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - if (b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); - } else { - float denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_float_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); - } - } - #endif - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { - __pyx_t_float_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; - } - static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { - return (a.real == 0) && (a.imag == 0); - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { - __pyx_t_float_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; - } - #if 1 - static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrtf(z.real*z.real + z.imag*z.imag); - #else - return hypotf(z.real, z.imag); - #endif - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - float r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - float denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; - } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(a, a); - case 3: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(z, a); - case 4: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = powf(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2f(0, -1); - } - } else { - r = __Pyx_c_abs_float(a); - theta = atan2f(a.imag, a.real); +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (siz) 0; + case -1: __PYX_VERIFY_RETURN_INT(siz, sdigit, -(sdigit) digits[0]) + case 1: __PYX_VERIFY_RETURN_INT(siz, digit, +digits[0]) + case -2: + if (8 * sizeof(siz) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + return (siz) (((siz)-1)*(((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(siz) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + return (siz) ((((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + return (siz) (((siz)-1)*(((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(siz) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + return (siz) ((((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 4 * PyLong_SHIFT) { + return (siz) (((siz)-1)*(((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(siz) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(siz) - 1 > 4 * PyLong_SHIFT) { + return (siz) ((((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + } + } + break; } - lnr = logf(r); - z_r = expf(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cosf(z_theta); - z.imag = z_r * sinf(z_theta); - return z; - } - #endif #endif - -/* Declarations */ - #if CYTHON_CCOMPLEX - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return ::std::complex< double >(x, y); - } - #else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return x + y*(__pyx_t_double_complex)_Complex_I; - } - #endif -#else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - __pyx_t_double_complex z; - z.real = x; - z.imag = y; - return z; - } -#endif - -/* Arithmetic */ - #if CYTHON_CCOMPLEX -#else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - return (a.real == b.real) && (a.imag == b.imag); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabs(b.real) >= fabs(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - double r = b.imag / b.real; - double s = 1.0 / (b.real + b.imag * r); - return __pyx_t_double_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + if (sizeof(siz) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, long, PyLong_AsLong(x)) + } else if (sizeof(siz) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(siz, PY_LONG_LONG, PyLong_AsLongLong(x)) } - } else { - double r = b.real / b.imag; - double s = 1.0 / (b.imag + b.real * r); - return __pyx_t_double_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } - } - #else - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else { - double denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_double_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); - } - } - #endif - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; - } - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { - return (a.real == 0) && (a.imag == 0); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; - } - #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrt(z.real*z.real + z.imag*z.imag); - #else - return hypot(z.real, z.imag); - #endif - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - double r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - double denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; - } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(a, a); - case 3: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, a); - case 4: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = pow(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2(0, -1); - } - } else { - r = __Pyx_c_abs_double(a); - theta = atan2(a.imag, a.real); + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + siz val; + PyObject *v = __Pyx_PyNumber_Int(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; } - lnr = log(r); - z_r = exp(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cos(z_theta); - z.imag = z_r * sin(z_theta); - return z; - } - #endif -#endif - -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { - const int neg_one = (int) -1, const_zero = (int) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); #endif + return (siz) -1; } + } else { + siz val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (siz) -1; + val = __Pyx_PyInt_As_siz(tmp); + Py_DECREF(tmp); + return val; } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to siz"); + return (siz) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to siz"); + return (siz) -1; } -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { - const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_siz(siz value) { + const siz neg_one = (siz) -1, const_zero = (siz) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { - if (sizeof(enum NPY_TYPES) < sizeof(long)) { + if (sizeof(siz) < sizeof(long)) { return PyInt_FromLong((long) value); - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + } else if (sizeof(siz) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + } else if (sizeof(siz) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif } } else { - if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + if (sizeof(siz) <= sizeof(long)) { return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + } else if (sizeof(siz) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + return _PyLong_FromByteArray(bytes, sizeof(siz), little, !is_unsigned); } } -/* CIntFromPy */ - static CYTHON_INLINE siz __Pyx_PyInt_As_siz(PyObject *x) { - const siz neg_one = (siz) -1, const_zero = (siz) 0; +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { + const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { - if (sizeof(siz) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(siz, long, PyInt_AS_LONG(x)) + if (sizeof(size_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } - return (siz) val; + return (size_t) val; } } else #endif @@ -15108,32 +13421,32 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { - case 0: return (siz) 0; - case 1: __PYX_VERIFY_RETURN_INT(siz, digit, digits[0]) + case 0: return (size_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) case 2: - if (8 * sizeof(siz) > 1 * PyLong_SHIFT) { + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) >= 2 * PyLong_SHIFT) { - return (siz) (((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { + return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; case 3: - if (8 * sizeof(siz) > 2 * PyLong_SHIFT) { + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) >= 3 * PyLong_SHIFT) { - return (siz) (((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { + return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; case 4: - if (8 * sizeof(siz) > 3 * PyLong_SHIFT) { + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) >= 4 * PyLong_SHIFT) { - return (siz) (((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0])); + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { + return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; @@ -15147,87 +13460,83 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) - return (siz) -1; + return (size_t) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif - if (sizeof(siz) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(siz, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(siz) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(siz, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif + if (sizeof(size_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { - case 0: return (siz) 0; - case -1: __PYX_VERIFY_RETURN_INT(siz, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(siz, digit, +digits[0]) + case 0: return (size_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, -(sdigit) digits[0]) + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) case -2: - if (8 * sizeof(siz) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { - return (siz) (((siz)-1)*(((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 2: - if (8 * sizeof(siz) > 1 * PyLong_SHIFT) { + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { - return (siz) ((((((siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case -3: - if (8 * sizeof(siz) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { - return (siz) (((siz)-1)*(((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 3: - if (8 * sizeof(siz) > 2 * PyLong_SHIFT) { + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { - return (siz) ((((((((siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case -4: - if (8 * sizeof(siz) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) - 1 > 4 * PyLong_SHIFT) { - return (siz) (((siz)-1)*(((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 4: - if (8 * sizeof(siz) > 3 * PyLong_SHIFT) { + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(siz, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(siz) - 1 > 4 * PyLong_SHIFT) { - return (siz) ((((((((((siz)digits[3]) << PyLong_SHIFT) | (siz)digits[2]) << PyLong_SHIFT) | (siz)digits[1]) << PyLong_SHIFT) | (siz)digits[0]))); + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; } #endif - if (sizeof(siz) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(siz, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(siz) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(siz, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif + if (sizeof(size_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) + } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) } } { @@ -15235,8 +13544,8 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else - siz val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); + size_t val; + PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; @@ -15255,40 +13564,65 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return val; } #endif - return (siz) -1; + return (size_t) -1; } } else { - siz val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (siz) -1; - val = __Pyx_PyInt_As_siz(tmp); + size_t val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (size_t) -1; + val = __Pyx_PyInt_As_size_t(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, - "value too large to convert to siz"); - return (siz) -1; + "value too large to convert to size_t"); + return (size_t) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to siz"); - return (siz) -1; + "can't convert negative value to size_t"); + return (size_t) -1; } -/* CIntFromPy */ - static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { - const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_Py_intptr_t(Py_intptr_t value) { + const Py_intptr_t neg_one = (Py_intptr_t) -1, const_zero = (Py_intptr_t) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(Py_intptr_t) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(Py_intptr_t) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(Py_intptr_t) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(Py_intptr_t) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(Py_intptr_t) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(Py_intptr_t), + little, !is_unsigned); + } +} + +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { - if (sizeof(size_t) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } - return (size_t) val; + return (int) val; } } else #endif @@ -15297,32 +13631,32 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { - case 0: return (size_t) 0; - case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: - if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { - return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: - if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { - return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: - if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { - return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; @@ -15336,87 +13670,83 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) - return (size_t) -1; + return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif - if (sizeof(size_t) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { - case 0: return (size_t) 0; - case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) digits[0]) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: - if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { - return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: - if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { - return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: - if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { - return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: - if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { - return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: - if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { - return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: - if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { - return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif - if (sizeof(size_t) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) } } { @@ -15424,8 +13754,8 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else - size_t val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); + int val; + PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; @@ -15443,218 +13773,320 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { if (likely(!ret)) return val; } -#endif - return (size_t) -1; +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(a, a); + case 3: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, a); + case 4: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_absf(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(a, a); + case 3: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, a); + case 4: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_abs(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; } - } else { - size_t val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (size_t) -1; - val = __Pyx_PyInt_As_size_t(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to size_t"); - return (size_t) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to size_t"); - return (size_t) -1; -} + #endif +#endif -/* CIntFromPy */ - static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { + if (is_unsigned) { if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); } } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; } -/* CIntFromPy */ - static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 @@ -15721,17 +14153,15 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) digits[0]) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { @@ -15791,10 +14221,8 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif } } { @@ -15803,7 +14231,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); + PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; @@ -15826,7 +14254,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { } } else { long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); @@ -15842,8 +14270,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return (long) -1; } -/* CheckBinaryVersion */ - static int __Pyx_check_binary_version(void) { +static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); @@ -15858,8 +14285,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return 0; } -/* ModuleImport */ - #ifndef __PYX_HAVE_RT_ImportModule +#ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; @@ -15876,8 +14302,7 @@ static PyObject *__Pyx_ImportModule(const char *name) { } #endif -/* TypeImport */ - #ifndef __PYX_HAVE_RT_ImportType +#ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict) @@ -15923,14 +14348,14 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class #endif if (!strict && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", - module_name, class_name, basicsize, size); + "%s.%s size changed, may indicate binary incompatibility", + module_name, class_name); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } else if ((size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, - "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", - module_name, class_name, basicsize, size); + "%.200s.%.200s has the wrong size, try recompiling", + module_name, class_name); goto bad; } return (PyTypeObject *)result; @@ -15941,8 +14366,7 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class } #endif -/* InitStrings */ - static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { @@ -16042,10 +14466,8 @@ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; -#endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 @@ -16054,9 +14476,8 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { if (PyLong_Check(x)) #endif return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 +#if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); @@ -16065,14 +14486,11 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { name = "long"; res = PyNumber_Long(x); } - #else +#else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } - #endif -#else - res = PyNumber_Int(x); #endif if (res) { #if PY_MAJOR_VERSION < 3 diff --git a/libs/layers/__init__.py b/libs/layers/__init__.py index 76c8060..1a34fb9 100644 --- a/libs/layers/__init__.py +++ b/libs/layers/__init__.py @@ -12,6 +12,7 @@ from .wrapper import roi_encoder from .wrapper import mask_decoder from .wrapper import mask_encoder +from .wrapper import mask_encoder_ from .wrapper import sample_wrapper as sample_rpn_outputs from .wrapper import sample_with_gt_wrapper as sample_rpn_outputs_with_gt from .wrapper import gen_all_anchors diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index 08a8521..e98d418 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -48,7 +48,7 @@ def encode(gt_boxes, all_anchors, height, width, stride): total_anchors = all_anchors.shape[0] # labels = np.zeros((anchors.shape[0], ), dtype=np.float32) - labels = np.empty((anchors.shape[0], ), dtype=np.float32) + labels = np.empty((anchors.shape[0], ), dtype=np.int32) labels.fill(-1) if gt_boxes.size > 0: @@ -133,7 +133,7 @@ def encode(gt_boxes, all_anchors, height, width, stride): if gt_boxes.size > 0: bbox_targets = _compute_targets(anchors, gt_boxes[gt_assignment, :]) bbox_inside_weights = np.zeros((total_anchors, 4), dtype=np.float32) - bbox_inside_weights[labels == 1, :] = 0.1 + bbox_inside_weights[labels == 1, :] = 1.0#0.1 # # mapping to whole outputs # labels = _unmap(labels, total_anchors, inds_inside, fill=-1) diff --git a/libs/layers/crop.py b/libs/layers/crop.py index a8e66ba..48f0c49 100644 --- a/libs/layers/crop.py +++ b/libs/layers/crop.py @@ -59,16 +59,18 @@ def crop_(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pool """ with tf.name_scope(scope): # - boxes = boxes / (stride + 0.0) + boxes_bf = boxes + # boxes = boxes / (stride + 0.0) boxes = tf.reshape(boxes, [-1, 4]) # normalize the boxes and swap x y dimensions shape = tf.shape(images) boxes = tf.reshape(boxes, [-1, 2]) # to (x, y) + xs = boxes[:, 0] ys = boxes[:, 1] - xs = xs / tf.cast(shape[2], tf.float32) - ys = ys / tf.cast(shape[1], tf.float32) + xs = xs / tf.cast(iw, tf.float32)#tf.cast(shape[2], tf.float32) + ys = ys / tf.cast(ih, tf.float32)#tf.cast(shape[1], tf.float32) boxes = tf.concat([ys[:, tf.newaxis], xs[:, tf.newaxis]], axis=1) boxes = tf.reshape(boxes, [-1, 4]) # to (y1, x1, y2, x2) @@ -84,5 +86,5 @@ def crop_(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pool return [tf.image.crop_and_resize(images, boxes, batch_inds, [pooled_height, pooled_width], method='bilinear', - name='Crop')] + [boxes] + name='Crop')] + [boxes] + [boxes_bf] + [shape] + [[ih,iw]] diff --git a/libs/layers/inst.py b/libs/layers/inst.py index 3163c0d..3c60622 100644 --- a/libs/layers/inst.py +++ b/libs/layers/inst.py @@ -62,6 +62,8 @@ def inference(boxes, classes, prob, class_agnostic=True): prob = prob[keeps, :] print("after nms:", len(classes)) + # quick fix for tensorflow error when no bbox presents + #@TODO if len(classes) is 0: scores = np.zeros((1,81)) boxes = np.array([[0.0,0.0,2.0,2.0]]) diff --git a/libs/layers/mask.py b/libs/layers/mask.py index ddd6f75..af9a5c8 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -8,9 +8,18 @@ import libs.boxes.cython_bbox as cython_bbox import libs.configs.config_v1 as cfg from libs.logs.log import LOG +import logging from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes _DEBUG = False +def log(file_name='log'): + logger = logging.getLogger(__name__) + logger.setLevel(logging.INFO) + handler = logging.FileHandler(file_name+'.log') + handler.setLevel(logging.INFO) + logger.addHandler(handler) + return logger + def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): """Encode masks groundtruth into learnable targets Sample some exmaples @@ -58,10 +67,9 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): # labels = labels[inds].astype(np.int32) # gt_assignment = gt_assignment[inds] - # ignore rois with overlaps between fg_threshold and bg_threshold # mask are only defined on positive rois - ignore_inds = np.where((max_overlaps < cfg.FLAGS.fg_threshold))[0] - labels[ignore_inds] = -1 + # ignore_inds = np.where((max_overlaps < cfg.FLAGS.mask_threshold))[0] + # labels[ignore_inds] = -1 mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.int32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) @@ -71,7 +79,7 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): for i in keep_inds: roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], int(roi[1]):int(roi[3])+1, int(roi[0]):int(roi[2])+1] - cropped = cv2.resize(cropped, (mask_width, mask_height), interpolation=cv2.INTER_NEAREST) + cropped = cv2.resize(cropped, (mask_width, mask_height))#INTER_NEAREST mask_targets[i, :, :, int(labels[i])] = cropped mask_inside_weights[i, :, :, int(labels[i])] = 1 @@ -83,6 +91,88 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) return labels, mask_targets, mask_inside_weights +def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): + """Encode masks groundtruth into learnable targets + Sample some exmaples + + Params + ------ + gt_masks: image_height x image_width {0, 1} matrix, of shape (G, imh, imw) + gt_boxes: ground-truth boxes of shape (G, 5), each raw is [x1, y1, x2, y2, class] + rois: the bounding boxes of shape (N, 4), + ## scores: scores of shape (N, 1) + num_classes; K + mask_height, mask_width: height and width of output masks + + Returns + ------- + # rois: boxes sampled for cropping masks, of shape (M, 4) + labels: class-ids of shape (M, 1) + mask_targets: learning targets of shape (M, pooled_height, pooled_width, K) in {0, 1} values + mask_inside_weights: of shape (M, pooled_height, pooled_width, K) in {0, 1}Í indicating which mask is sampled + """ + total_masks = rois.shape[0] + if gt_boxes.size > 0: + # B x G + overlaps = cython_bbox.bbox_overlaps( + np.ascontiguousarray(rois[:, 0:4], dtype=np.float), + np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) + gt_assignment = overlaps.argmax(axis=1) # shape is N + max_overlaps = overlaps[np.arange(len(gt_assignment)), gt_assignment] # N + # note: this will assign every rois with a positive label + # labels = gt_boxes[gt_assignment, 4] # N + labels = np.zeros((total_masks, ), np.int32) + labels[:] = -1 + + # sample positive rois which intersection is more than 0.5 + keep_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] + num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) + if keep_inds.size > 0 and num_masks < keep_inds.size: + keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) + LOG('Masks: %d of %d rois are considered positive mask. Number of masks %d'\ + %(num_masks, rois.shape[0], gt_masks.shape[0])) + + labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] + + # rois = rois[inds] + # labels = labels[inds].astype(np.int32) + # gt_assignment = gt_assignment[inds] + + # ignore rois with overlaps between fg_threshold and bg_threshold + # mask are only defined on positive rois + + + # ignore_inds = np.where((max_overlaps < cfg.FLAGS.fg_threshold))[0] + # labels[ignore_inds] = -1 + + mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) + mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) + rois [rois < 0] = 0 + + # TODO: speed bottleneck? + #logger=log() + for i in keep_inds: + roi = rois[i, :4] + #logger.info("""roi %d: %s""" % (i, roi)) + cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] + cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR)#INTER_NEAREST + + mask_targets[i, :, :, labels[i]] = cropped + #logger.info("""cropped %s""" % (cropped)) + mask_inside_weights[i, :, :, labels[i]] = 1 + # print("in mask.py rois: ", roi) + mask_rois = rois[:, :4] + # print("in mask.py rois2: ") + # print(mask_rois) + else: + # there is no gt + labels = np.zeros((total_masks, ), np.int32) + labels[:] = -1 + mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) + mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) + mask_rois = np.zeros((total_masks, 4), dtype=np.float32) + return labels, mask_targets, mask_inside_weights, mask_rois + def decode(mask_targets, rois, classes, ih, iw): """Decode outputs into final masks Params @@ -107,7 +197,7 @@ def decode(mask_targets, rois, classes, ih, iw): mask = mask_targets[i, :, :, k] h, w = rois[i, 3] - rois[i, 1] + 1, rois[i, 2] - rois[i, 0] + 1 x, y = rois[i, 0], rois[i, 1] - mask = cv2.resize(mask, (w, h), interpolation=cv2.INTER_NEAREST) + mask = cv2.resize(mask, (w, h))#INTER_NEAREST mask *= k # paint @@ -130,7 +220,7 @@ def decode(mask_targets, rois, classes, ih, iw): W, H = 200, 200 M = 50 - gt_masks = np.zeros((2, H, W), dtype=np.int32) + gt_masks = np.zeros((2, H, W), dtype=np.float32) gt_masks[0, 50:150, 50:150] = 1 gt_masks[1, 100:150, 50:150] = 1 gt_boxes = np.asarray( diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 824c5b7..888c445 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -41,7 +41,7 @@ def encode(gt_boxes, rois, num_classes): max_overlaps = overlaps[np.arange(rois.shape[0]), gt_assignment] # note: this will assign every rois with a positive label # labels = gt_boxes[gt_assignment, 4] - labels = np.zeros([num_rois], dtype=np.float32) + labels = np.zeros([num_rois], dtype=np.int32) labels[:] = -1 # if _DEBUG: @@ -53,17 +53,17 @@ def encode(gt_boxes, rois, num_classes): fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) if fg_inds.size > 0 and fg_rois < fg_inds.size: fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) - labels[fg_inds] = gt_boxes[gt_assignment[fg_inds], 4] + labels[fg_inds] = gt_boxes[gt_assignment[fg_inds], 4] # TODO: sampling strategy bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 64) + bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 128-fg_rois)#64 if bg_inds.size > 0 and bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) labels[bg_inds] = 0 # ignore rois with overlaps between fg_threshold and bg_threshold - ignore_inds = np.where(((max_overlaps > cfg.FLAGS.bg_threshold) &\ + ignore_inds = np.where(((max_overlaps >= cfg.FLAGS.bg_threshold) &\ (max_overlaps < cfg.FLAGS.fg_threshold)))[0] labels[ignore_inds] = -1 @@ -88,10 +88,10 @@ def encode(gt_boxes, rois, num_classes): else: # there is no gt - labels = np.zeros((num_rois, ), np.float32) + labels = np.zeros((num_rois, ), np.int32) bbox_targets = np.zeros((num_rois, 4 * num_classes), np.float32) bbox_inside_weights = np.zeros((num_rois, 4 * num_classes), np.float32) - bg_rois = min(int(cfg.FLAGS.rois_per_image * (1 - cfg.FLAGS.fg_roi_fraction)), 64) + bg_rois = min(int(cfg.FLAGS.rois_per_image * (1 - cfg.FLAGS.fg_roi_fraction)), 128)#64 if bg_rois < num_rois: bg_inds = np.arange(num_rois) diff --git a/libs/layers/sample.py b/libs/layers/sample.py index b0a3da2..d08639e 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -120,7 +120,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, # TODO: sampling strategy bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 8)#64 + bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 128)#64 if bg_inds.size > 0 and bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) @@ -128,7 +128,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, #print(gt_boxes[np.argmax(overlaps[fg_inds],axis=1),4]) else: bg_inds = np.arange(boxes.shape[0]) - bg_rois = min(int(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction)), 8)#64 + bg_rois = min(int(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction)), 128)#64 if bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 990c1d1..df6f0fe 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -21,7 +21,7 @@ def anchor_encoder(gt_boxes, all_anchors, height, width, stride, scope='AnchorEn labels, bbox_targets, bbox_inside_weights = \ tf.py_func(anchor.encode, [gt_boxes, all_anchors, height, width, stride], - [tf.float32, tf.float32, tf.float32]) + [tf.int32, tf.float32, tf.float32]) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') @@ -55,7 +55,7 @@ def roi_encoder(gt_boxes, rois, num_classes, scope='ROIEncoder'): labels, bbox_targets, bbox_inside_weights, max_overlaps = \ tf.py_func(roi.encode, [gt_boxes, rois, num_classes], - [tf.float32, tf.float32, tf.float32, tf.float32] + [tf.int32, tf.float32, tf.float32, tf.float32] ) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') @@ -98,6 +98,23 @@ def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, return labels, mask_targets, mask_inside_weights +def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): + + with tf.name_scope(scope) as sc: + labels, mask_targets, mask_inside_weights, mask_rois = \ + tf.py_func(mask.encode_, + [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width], + [tf.int32, tf.float32, tf.float32, tf.float32]) + labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') + mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') + mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') + labels = tf.reshape(labels, (-1,)) + mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) + mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) + mask_rois = tf.reshape(mask_rois,(-1, 4)) + + return labels, mask_targets, mask_inside_weights, mask_rois + def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): with tf.name_scope(scope) as sc: diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index e2630dc..13578e3 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -12,6 +12,7 @@ from libs.layers import roi_encoder from libs.layers import roi_decoder from libs.layers import mask_encoder +from libs.layers import mask_encoder_ from libs.layers import mask_decoder from libs.layers import gen_all_anchors from libs.layers import ROIAlign @@ -23,7 +24,7 @@ from libs.layers import inst_inference from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input -_TRAIN_MASK = True +_BN = False # mapping each stage to its' tensor features _networks_map = { @@ -43,13 +44,15 @@ def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, activation_fn=None, batch_norm_decay=0.997, batch_norm_epsilon=1e-5, - batch_norm_scale=True): + batch_norm_scale=True, + is_training=True): batch_norm_params = { 'decay': batch_norm_decay, 'epsilon': batch_norm_epsilon, 'scale': batch_norm_scale, 'updates_collections': tf.GraphKeys.UPDATE_OPS, + 'is_training': is_training } with slim.arg_scope( @@ -69,15 +72,16 @@ def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_f [slim.conv2d, slim.conv2d_transpose], padding='SAME', weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), + weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), activation_fn=activation_fn, - normalizer_fn=normalizer_fn,) as arg_sc: + normalizer_fn=normalizer_fn,): with slim.arg_scope( [slim.fully_connected], weights_regularizer=slim.l2_regularizer(weight_decay), weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=activation_fn, - normalizer_fn=normalizer_fn) as arg_sc: + normalizer_fn=normalizer_fn): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: return arg_sc def my_sigmoid(x): @@ -157,7 +161,7 @@ def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): tf.concat(values=[scores, new_scores], axis=0), \ tf.concat(values=[batch_inds, new_batch_inds], axis=0) -def build_pyramid(net_name, end_points, bilinear=True): +def build_pyramid(net_name, end_points, bilinear=True, is_training=True): """build pyramid features from a typical network, assume each stage is 2 time larger than its top feature Returns: @@ -169,8 +173,11 @@ def build_pyramid(net_name, end_points, bilinear=True): else: pyramid_map = net_name # pyramid['inputs'] = end_points['inputs'] - #arg_scope = _extra_conv_arg_scope() - arg_scope = _extra_conv_arg_scope_with_bn() + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # with tf.variable_scope('pyramid'): with slim.arg_scope(arg_scope): @@ -209,8 +216,10 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g 7. Build losses """ outputs = {} - #arg_scope = _extra_conv_arg_scope(activation_fn=None) - arg_scope = _extra_conv_arg_scope_with_bn(activation_fn=None) + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) my_sigmoid = None with slim.arg_scope(arg_scope): with tf.variable_scope('pyramid'): @@ -273,7 +282,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g p = 'P%d'%i splitted_rois = assigned_rois[i-2] batch_inds = assigned_batch_inds[i-2] - cropped, boxes_in_crop = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, + cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) cropped_rois.append(cropped) ordered_rois.append(splitted_rois) @@ -281,7 +290,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g cropped_rois = tf.concat(values=cropped_rois, axis=0) ordered_rois = tf.concat(values=ordered_rois, axis=0) - #pyramid_feature = tf.concat(values=pyramid_feature, axis=0) + pyramid_feature = tf.concat(values=pyramid_feature, axis=0) outputs['ordered_rois'] = ordered_rois @@ -328,8 +337,13 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g splitted_classes = assigned_classes[i-2] splitted_prob = assigned_prob[i-2] batch_inds = assigned_batch_inds[i-2] - cropped, boxes_in_crop = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, + cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) + # if i is 3: + # outputs['tmp_0'] = boxes_after_crop + # outputs['tmp_1'] = boxes_before_crop + # outputs['tmp_2'] = ihiw + # outputs['tmp_3'] = py_shape cropped_rois.append(cropped) ordered_inst_boxes.append(splitted_rois) ordered_inst_classes.append(splitted_classes) @@ -355,6 +369,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g # add a mask, given the predicted boxes and classes outputs['mask'] = {'mask':m, 'cls': classes, 'score': scores} + outputs['mask']['final_mask'] = tf.nn.sigmoid(m) return outputs @@ -390,8 +405,10 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, refine_batch_pos = [] mask_batch_pos = [] - #arg_scope = _extra_conv_arg_scope(activation_fn=None) - arg_scope = _extra_conv_arg_scope_with_bn(activation_fn=None) + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) with slim.arg_scope(arg_scope): with tf.variable_scope('pyramid'): @@ -500,7 +517,7 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) refined_cls_losses.append(refined_cls_loss) - outputs['tmp_3'] = labels + # outputs['tmp_3'] = labels outputs['tmp_4'] = classes # outputs['tmp_0'] = outputs['ordered_rois'] @@ -515,14 +532,15 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # mask_shape = tf.shape(masks) # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) - labels, mask_targets, mask_inside_weights = \ - mask_encoder(gt_masks, gt_boxes, ordered_rois, num_classes, 28, 28, scope='MaskEncoder') - labels, masks, mask_targets, mask_inside_weights = \ + labels, mask_targets, mask_inside_weights, mask_rois = \ + mask_encoder_(gt_masks, gt_boxes, ordered_rois, num_classes, 28, 28, scope='MaskEncoder') + labels, masks, mask_targets, mask_inside_weights, mask_rois = \ _filter_negative_samples(tf.reshape(labels, [-1]), [ tf.reshape(labels, [-1]), - masks, - mask_targets, - mask_inside_weights, + tf.reshape(masks, [-1, 28, 28, num_classes]), + tf.reshape(mask_targets, [-1, 28, 28, num_classes]), + tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), + tf.reshape(mask_rois, [-1, 4]) ]) # _, frac_ = _get_valid_sample_fraction(labels) mask_batch.append( @@ -536,6 +554,13 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) # NOTE: w/o competition between classes. + outputs['tmp_0'] = mask_rois + outputs['tmp_1'] = labels + outputs['tmp_2'] = tf.nn.sigmoid(masks) + outputs['tmp_3'] = mask_targets + # outputs['tmp_0'] = mask_rois + # outputs['tmp_1'] = mask_targets + # outputs['tmp_2'] = labels mask_targets = tf.cast(mask_targets, tf.float32) mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) mask_loss = tf.reduce_mean(mask_loss) @@ -574,7 +599,7 @@ def build(end_points, image_height, image_width, pyramid_map, gt_masks, loss_weights=[0.5, 0.5, 1.0, 0.5, 0.1]): - pyramid = build_pyramid(pyramid_map, end_points) + pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) for p in pyramid: print (p) diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index e517553..3414037 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -22,8 +22,12 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la m = np.transpose(m,(0,3,1,2)) if bbox is not None: for i, box in enumerate(bbox): - if label is not None: + if label is not None and not np.all(box==0): if prob is not None: + # print("prob") + # print(prob.shape) + # print("label") + # print(label.shape) if ((prob[i,label[i]] > vis_th) or (vis_all is True)) and ((ignore_bg is True) and (label[i] > 0)) : if gt_label is not None: if gt_label is not None and len(iou) > 1: @@ -35,7 +39,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la else: color = '#0000ff' else: - text = cat_id_to_cls_name(label[i]) + ' : ' + str(prob[i][label[i]])[:4] + text = cat_id_to_cls_name(label[i]) + ' : ' + str(i)#+ str(prob[i][label[i]])[:4] draw.text((2+bbox[i,0], 2+bbox[i,1]), text, fill=color) if _DEBUG is True: @@ -44,7 +48,6 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la if mask is not None: # print("mask number: ",i) - # print(box) box = np.floor(box).astype('uint16') bbox_w = box[2]-box[0] bbox_h = box[3]-box[1] @@ -53,7 +56,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la color_img = Image.fromarray(color_img.astype('uint8')).convert('RGBA') #color_img = Image.new("RGBA", (bbox_w,bbox_h), np.random.rand(1,3) * 255 ) # print(bbox_w, bbox_h, i, label[i], bbox.shape) - resized_m = imresize(m[i][label[i]], [bbox_h, bbox_w], interp='nearest') + resized_m = imresize(m[i][label[i]], [bbox_h, bbox_w], interp='bilinear') #label[i] resized_m[resized_m >= 128] = 128 resized_m[resized_m < 128] = 0 resized_m = Image.fromarray(resized_m.astype('uint8'), 'L') diff --git a/train/test.py b/train/test.py index ed1e420..5dec0eb 100644 --- a/train/test.py +++ b/train/test.py @@ -1,3 +1,329 @@ +# #!/usr/bin/env python +# # coding=utf-8 +# from __future__ import absolute_import +# from __future__ import division +# from __future__ import print_function + +# import functools +# import os, sys +# import time +# import numpy as np +# import tensorflow as tf +# import tensorflow.contrib.slim as slim +# from time import gmtime, strftime + +# sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) +# import libs.configs.config_v1 as cfg +# import libs.datasets.dataset_factory as datasets +# import libs.nets.nets_factory as network + +# import libs.preprocessings.coco_v1 as coco_preprocess +# import libs.nets.pyramid_network as pyramid_network +# import libs.nets.resnet_v1 as resnet_v1 + +# from train.train_utils import _configure_learning_rate, _configure_optimizer, \ +# _get_variables_to_train, _get_init_fn, get_var_list_to_restore + +# from PIL import Image, ImageFont, ImageDraw, ImageEnhance +# from libs.datasets import download_and_convert_coco +# from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox + +# FLAGS = tf.app.flags.FLAGS +# resnet50 = resnet_v1.resnet_v1_50 + +# def solve(global_step): +# """add solver to losses""" +# # learning reate +# lr = _configure_learning_rate(82783, global_step) +# optimizer = _configure_optimizer(lr) +# tf.summary.scalar('learning_rate', 0.0) + +# # compute and apply gradient +# losses = tf.get_collection(tf.GraphKeys.LOSSES) +# regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) +# regular_loss = tf.add_n(regular_losses) +# out_loss = tf.add_n(losses) +# total_loss = tf.add_n(losses + regular_losses) + +# tf.summary.scalar('total_loss', total_loss) +# tf.summary.scalar('out_loss', out_loss) +# tf.summary.scalar('regular_loss', regular_loss) + +# update_ops = [] +# variables_to_train = _get_variables_to_train() +# # update_op = optimizer.minimize(total_loss) +# gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) +# grad_updates = optimizer.apply_gradients(gradients, +# global_step=global_step) +# update_ops.append(grad_updates) + +# # update moving mean and variance +# if FLAGS.update_bn: +# update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) +# update_bn = tf.group(*update_bns) +# update_ops.append(update_bn) + +# return tf.group(*update_ops) + +# def restore(sess): +# """choose which param to restore""" +# if FLAGS.restore_previous_if_exists: +# try: +# checkpoint_path = tf.train.latest_checkpoint(FLAGS.train_dir) +# ########### +# restorer = tf.train.Saver() +# ########### + +# ########### +# # not_restore = [ 'pyramid/fully_connected/weights:0', +# # 'pyramid/fully_connected/biases:0', +# # 'pyramid/fully_connected/weights:0', +# # 'pyramid/fully_connected_1/biases:0', +# # 'pyramid/fully_connected_1/weights:0', +# # 'pyramid/fully_connected_2/weights:0', +# # 'pyramid/fully_connected_2/biases:0', +# # 'pyramid/fully_connected_3/weights:0', +# # 'pyramid/fully_connected_3/biases:0', +# # 'pyramid/Conv/weights:0', +# # 'pyramid/Conv/biases:0', +# # 'pyramid/Conv_1/weights:0', +# # 'pyramid/Conv_1/biases:0', +# # 'pyramid/Conv_2/weights:0', +# # 'pyramid/Conv_2/biases:0', +# # 'pyramid/Conv_3/weights:0', +# # 'pyramid/Conv_3/biases:0', +# # 'pyramid/Conv2d_transpose/weights:0', +# # 'pyramid/Conv2d_transpose/biases:0', +# # 'pyramid/Conv_4/weights:0', +# # 'pyramid/Conv_4/biases:0', +# # 'pyramid/fully_connected/weights/Momentum:0', +# # 'pyramid/fully_connected/biases/Momentum:0', +# # 'pyramid/fully_connected/weights/Momentum:0', +# # 'pyramid/fully_connected_1/biases/Momentum:0', +# # 'pyramid/fully_connected_1/weights/Momentum:0', +# # 'pyramid/fully_connected_2/weights/Momentum:0', +# # 'pyramid/fully_connected_2/biases/Momentum:0', +# # 'pyramid/fully_connected_3/weights/Momentum:0', +# # 'pyramid/fully_connected_3/biases/Momentum:0', +# # 'pyramid/Conv/weights/Momentum:0', +# # 'pyramid/Conv/biases/Momentum:0', +# # 'pyramid/Conv_1/weights/Momentum:0', +# # 'pyramid/Conv_1/biases/Momentum:0', +# # 'pyramid/Conv_2/weights/Momentum:0', +# # 'pyramid/Conv_2/biases/Momentum:0', +# # 'pyramid/Conv_3/weights/Momentum:0', +# # 'pyramid/Conv_3/biases/Momentum:0', +# # 'pyramid/Conv2d_transpose/weights/Momentum:0', +# # 'pyramid/Conv2d_transpose/biases/Momentum:0', +# # 'pyramid/Conv_4/weights/Momentum:0', +# # 'pyramid/Conv_4/biases/Momentum:0',] +# # vars_to_restore = [v for v in tf.all_variables()if v.name not in not_restore] +# # restorer = tf.train.Saver(vars_to_restore) +# # for var in vars_to_restore: +# # print ('restoring ', var.name) +# ############ + +# restorer.restore(sess, checkpoint_path) +# print ('restored previous model %s from %s'\ +# %(checkpoint_path, FLAGS.train_dir)) +# time.sleep(2) +# return +# except: +# print ('--restore_previous_if_exists is set, but failed to restore in %s %s'\ +# % (FLAGS.train_dir, checkpoint_path)) +# time.sleep(2) + +# if FLAGS.pretrained_model: +# if tf.gfile.IsDirectory(FLAGS.pretrained_model): +# checkpoint_path = tf.train.latest_checkpoint(FLAGS.pretrained_model) +# else: +# checkpoint_path = FLAGS.pretrained_model + +# if FLAGS.checkpoint_exclude_scopes is None: +# FLAGS.checkpoint_exclude_scopes='pyramid' +# if FLAGS.checkpoint_include_scopes is None: +# FLAGS.checkpoint_include_scopes='resnet_v1_50' + +# vars_to_restore = get_var_list_to_restore() +# for var in vars_to_restore: +# print ('restoring ', var.name) + +# try: +# restorer = tf.train.Saver(vars_to_restore) +# restorer.restore(sess, checkpoint_path) +# print ('Restored %d(%d) vars from %s' %( +# len(vars_to_restore), len(tf.global_variables()), +# checkpoint_path )) +# except: +# print ('Checking your params %s' %(checkpoint_path)) +# raise + +# def train(): +# """The main function that runs training""" + +# ## data +# image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ +# datasets.get_dataset(FLAGS.dataset_name, +# FLAGS.dataset_split_name, +# FLAGS.dataset_dir, +# FLAGS.im_batch, +# is_training=False) + +# data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, +# dtypes=( +# image.dtype, ih.dtype, iw.dtype, +# gt_boxes.dtype, gt_masks.dtype, +# num_instances.dtype, img_id.dtype)) +# enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) +# data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) +# tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) +# (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() +# im_shape = tf.shape(image) +# image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) + +# ## network +# logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, +# weight_decay=FLAGS.weight_decay, is_training=False) +# outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, +# num_classes=81, +# base_anchors=9, +# is_training=False, +# gt_boxes=gt_boxes, gt_masks=gt_masks, +# ) + +# input_image = end_points['input'] +# final_box = outputs['final_boxes']['box'] +# final_cls = outputs['final_boxes']['cls'] +# final_prob = outputs['final_boxes']['prob'] +# final_rpn_box = outputs['final_boxes']['rpn_box'] +# final_mask = outputs['mask']['final_mask'] + +# ############################# +# tmp_0 = outputs['mask']['final_mask'] +# tmp_1 = outputs['mask']['final_mask'] +# tmp_2 = outputs['mask']['final_mask'] +# tmp_3 = outputs['mask']['final_mask'] +# tmp_4 = outputs['mask']['final_mask'] + +# # tmp_0 = outputs['tmp_0'] +# # tmp_1 = outputs['tmp_1'] +# # tmp_2 = outputs['tmp_2'] +# # tmp_3 = outputs['tmp_3'] +# # tmp_4 = outputs['tmp_4'] +# ############################ + + +# ## solvers +# global_step = slim.create_global_step() + +# cropped_rois = tf.get_collection('__CROPPED__')[0] +# transposed = tf.get_collection('__TRANSPOSED__')[0] + +# gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9) +# sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) +# init_op = tf.group( +# tf.global_variables_initializer(), +# tf.local_variables_initializer() +# ) +# sess.run(init_op) + +# summary_op = tf.summary.merge_all() +# logdir = os.path.join(FLAGS.train_dir, strftime('%Y%m%d%H%M%S', gmtime())) +# if not os.path.exists(logdir): +# os.makedirs(logdir) +# summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph) + +# ## restore +# restore(sess) + +# ## main loop +# coord = tf.train.Coordinator() +# threads = [] +# # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) +# for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): +# threads.extend(qr.create_threads(sess, coord=coord, daemon=True, +# start=True)) + +# tf.train.start_queue_runners(sess=sess, coord=coord) +# saver = tf.train.Saver(max_to_keep=20) + +# for step in range(FLAGS.max_iters): + +# start_time = time.time() + +# img_id_str, \ +# gt_boxesnp, \ +# input_imagenp, final_boxnp, final_clsnp, final_probnp, final_rpn_boxnp, final_masknp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ +# sess.run([img_id] + +# [gt_boxes] + +# [input_image] + [final_box] + [final_cls] + [final_prob] + [final_rpn_box] + [final_mask] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) + +# duration_time = time.time() - start_time + +# if step % 1 == 0: +# print ( """iter %d: image-id:%07d, time:%.3f(sec), """ +# """instances: %d, """ + +# % (step, img_id_str, duration_time, +# gt_boxesnp.shape[0])) + +# draw_bbox(step, +# np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), +# name='test_est', +# bbox=final_boxnp, +# label=final_clsnp, +# prob=final_probnp, +# mask=final_masknp, +# vis_all=True +# ) + +# # draw_bbox(step, +# # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), +# # name='train_roi', +# # bbox=final_rpn_boxnp, +# # label=final_clsnp, +# # prob=final_probnp, +# # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), +# # iou=final_max_overlapsnp +# # ) + +# # draw_bbox(step, +# # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), +# # name='train_msk', +# # bbox=tmp_0np, +# # label=tmp_2np, +# # prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, +# # mask=tmp_1np, +# # vis_all=True +# # ) + +# # draw_bbox(step, +# # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), +# # name='train_gt', +# # bbox=gtnp[:,0:4], +# # label=np.asarray(gtnp[:,4], dtype=np.uint8), +# # ) + +# # print ("labels") +# # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) +# # print ("classes") +# # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + + +# if coord.should_stop(): +# coord.request_stop() +# coord.join(threads) + + +# if __name__ == '__main__': +# train() + + + + + + + #!/usr/bin/env python # coding=utf-8 from __future__ import absolute_import @@ -137,9 +463,8 @@ def test(): outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, base_anchors=9, - is_training=False, - gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) + is_training=True, + gt_boxes=gt_boxes, gt_masks=gt_masks,) input_image = end_points['input'] final_box = outputs['final_boxes']['box'] @@ -154,6 +479,12 @@ def test(): tmp_2 = outputs['mask']['mask'] tmp_3 = outputs['mask']['mask'] tmp_4 = outputs['mask']['mask'] + + # tmp_0 = outputs['tmp_0'] + # tmp_1 = outputs['tmp_1'] + # tmp_2 = outputs['tmp_2'] + # tmp_3 = outputs['tmp_3'] + # tmp_4 = outputs['tmp_4'] ############################ @@ -212,9 +543,10 @@ def test(): gt_boxesnp.shape[0])) # print("tmp") - # print(np.asarray(tmp_0np).shape) - # print(np.asarray(tmp_1np).shape) - # print(np.asarray(tmp_2np).shape) + # print(np.asarray(tmp_0np)) + # print(np.asarray(tmp_1np)) + # print(np.asarray(tmp_2np)) + # print(np.asarray(tmp_3np)) # print ("labels") # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) @@ -266,20 +598,6 @@ def test(): # print (cat_id_to_cls_name(np.unique(np.asarray(final_clsnp)))) #print (cat_id_to_cls_name(np.unique(np.argmax(np.array(final_clsnp),axis=1)))) - - if step % 100 == 0: - summary_str = sess.run(summary_op) - summary_writer.add_summary(summary_str, step) - summary_writer.flush() - - if (step % 10000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: - checkpoint_path = os.path.join(FLAGS.train_dir, - FLAGS.dataset_name + '_' + FLAGS.network + '_model.ckpt') - saver.save(sess, checkpoint_path, global_step=step) - - if coord.should_stop(): - coord.request_stop() - coord.join(threads) if __name__ == '__main__': diff --git a/train/train.py b/train/train.py index e2b0cb0..4c63d41 100644 --- a/train/train.py +++ b/train/train.py @@ -10,6 +10,7 @@ import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim +import logging from time import gmtime, strftime sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) @@ -157,6 +158,15 @@ def restore(sess): except: print ('Checking your params %s' %(checkpoint_path)) raise + +def log(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.INFO) + handler = logging.FileHandler('log.log') + handler.setLevel(logging.INFO) + logger.addHandler(handler) + return logger + def train(): """The main function that runs training""" @@ -168,7 +178,7 @@ def train(): FLAGS.dataset_dir, FLAGS.im_batch, is_training=True) - + logger = log() data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, dtypes=( image.dtype, ih.dtype, iw.dtype, @@ -189,7 +199,8 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) + loss_weights=[1.0, 1.0, 1.0, 1.0, 1.0]) + #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) total_loss = outputs['total_loss'] @@ -204,7 +215,7 @@ def train(): final_gt_cls = outputs['final_boxes']['gt_cls'] final_rpn_box = outputs['final_boxes']['rpn_box'] final_max_overlaps = outputs['final_boxes']['max_overlaps'] - final_mask = outputs['mask']['mask'] + final_mask = outputs['mask']['mask']#outputs['mask']['final_mask'] gt = outputs['gt'] ############################# @@ -214,9 +225,9 @@ def train(): tmp_3 = outputs['losses'] tmp_4 = outputs['losses'] - # tmp_0 = outputs['tmp_0'] - #tmp_1 = outputs['tmp_1'] - #tmp_2 = outputs['tmp_2'] + tmp_0 = outputs['tmp_0'] + tmp_1 = outputs['tmp_1'] + tmp_2 = outputs['tmp_2'] tmp_3 = outputs['tmp_3'] tmp_4 = outputs['tmp_4'] ############################ @@ -229,7 +240,7 @@ def train(): cropped_rois = tf.get_collection('__CROPPED__')[0] transposed = tf.get_collection('__TRANSPOSED__')[0] - gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9) + gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) init_op = tf.group( tf.global_variables_initializer(), @@ -274,7 +285,7 @@ def train(): duration_time = time.time() - start_time if step % 1 == 0: - print ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ + logger.info ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ """total-loss %.4f(%.4f, %.4f, %.6f, %.4f, %.4f), """ """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" @@ -287,6 +298,19 @@ def train(): # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) # print ("classes") # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + # print ("mask rois before filter") + # print (np.array(tmp_0np)) + # print (np.array(tmp_1np)) + # print (np.array(tmp_2np)) + # print (np.array(tmp_3np)) + # print ("mask rois after filter") + # print (np.array(tmp_0np).shape) + # print (np.array(tmp_2np).shape) + # print (np.array(tmp_1np).shape) + # print ("mask rois after filter") + # print ((final_masknp).shape) + # print (np.max(final_masknp)) + # print (np.min(final_masknp)) #print ("iw", np.asanyarray(tmp_4np)) #if np.asarray(tmp_3np[3]).shape[0]>=1: @@ -311,40 +335,68 @@ def train(): # print ("p4:",np.asarray(tmp_3np[2]).shape[0]) # print ("p3:",np.asarray(tmp_3np[1]).shape[0]) # print ("p2:",np.asarray(tmp_3np[0]).shape[0]) - if step % 10 == 0: - draw_bbox(step, - np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - name='train_est', - bbox=final_rpn_boxnp, - label=final_clsnp, - prob=final_probnp, - mask=final_masknp, - gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), - iou=final_max_overlapsnp, - vis_all=True - ) + if step % 50 == 0: + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='train_est', + # bbox=final_rpn_boxnp, + # label=final_clsnp, + # prob=final_probnp, + # mask=final_masknp, + # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), + # iou=final_max_overlapsnp, + # vis_all=True + # ) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - name='train_roi', - bbox=final_rpn_boxnp, - label=final_clsnp, - prob=final_probnp, - gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), - iou=final_max_overlapsnp - ) + name='train_est', + bbox=tmp_0np, + label=tmp_1np, + prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, + mask=tmp_2np, + vis_all=True) + + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='train_roi', + # bbox=final_rpn_boxnp, + # label=final_clsnp, + # prob=final_probnp, + # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), + # iou=final_max_overlapsnp + # ) + + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='train_msk', + # bbox=tmp_0np, + # label=tmp_2np, + # prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, + # mask=tmp_1np, + # vis_all=True + # ) + + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='train_gt', + # bbox=gtnp[:,0:4], + # label=np.asarray(gtnp[:,4], dtype=np.uint8), + # ) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_gt', - bbox=gtnp[:,0:4], - label=np.asarray(gtnp[:,4], dtype=np.uint8), - ) + bbox=tmp_0np, + label=tmp_1np, + prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, + mask=tmp_3np, + vis_all=True) - print ("labels") - print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) - print ("classes") - print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + # logger.info ("labels") + # logger.info (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) + # logger.info ("classes") + # logger.info (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) if np.isnan(tot_loss) or np.isinf(tot_loss): print (gt_boxesnp) diff --git a/unit_test/resnet50_test.py b/unit_test/resnet50_test.py index fa4496b..1c6f97a 100644 --- a/unit_test/resnet50_test.py +++ b/unit_test/resnet50_test.py @@ -36,7 +36,7 @@ image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ coco.read('./data/coco/records/coco_train2014_00000-of-00040.tfrecord') with tf.control_dependencies([image, gt_boxes, gt_masks]): - image, gt_boxes, gt_masks = coco_preprocess.preprocess_image(image, gt_boxes, gt_masks, is_training=True) + image, gt_boxes, gt_masks = coco_preprocess.preprocess_image(image, gt_boxes, gt_masks, is_training=False) ## network with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=0.0001)): @@ -55,7 +55,7 @@ summaries.add(tf.summary.histogram('pyramid/hist/' + p, pyramid[p])) summaries.add(tf.summary.scalar('pyramid/means/'+ p, tf.reduce_mean(tf.abs(pyramid[p])))) - outputs = pyramid_network.build_heads(pyramid, ih, iw, num_classes=81, base_anchors=9, is_training=True, gt_boxes=gt_boxes) + outputs = pyramid_network.build_heads(pyramid, ih, iw, num_classes=81, base_anchors=9, is_training=False, gt_boxes=gt_boxes) ## losses loss, losses, batch_info = pyramid_network.build_losses(pyramid, outputs, From 9b94db98f0d1468e8d9547eaf17ffaa284b426b0 Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 17 Jul 2017 16:12:49 +0900 Subject: [PATCH 03/35] remove some comments --- libs/datasets/download_and_convert_coco.py | 95 ---------------------- libs/layers/crop.py | 5 +- libs/layers/mask.py | 16 +--- libs/layers/wrapper.py | 48 ----------- libs/nets/pyramid_network.py | 18 +--- train/train.py | 69 +--------------- 6 files changed, 7 insertions(+), 244 deletions(-) diff --git a/libs/datasets/download_and_convert_coco.py b/libs/datasets/download_and_convert_coco.py index 92ff6d9..3d0ec94 100644 --- a/libs/datasets/download_and_convert_coco.py +++ b/libs/datasets/download_and_convert_coco.py @@ -64,101 +64,6 @@ def _progress(count, block_size, total_size): f.extractall(dataset_dir) print('Successfully extracted') -def _cat_id_to_cls_name(catId): - cls_name = np.array([ "background", - "person", - "bicycle", - "car", - "motorcycle", - "airplane", - "bus", - "train", - "truck", - "boat", - "traffic_light", - "fire_hydrant", - "street_sign", - "stop_sign", - "parking_meter", - "bench", - "bird", - "cat", - "dog", - "horse", - "sheep", - "cow", - "elephant", - "bear", - "zebra", - "giraffe", - "hat", - "backpack", - "umbrella", - "shoe", - "eye_glasses", - "hand_bag", - "tie", - "suitcase", - "frisbee", - "skis", - "snowboard", - "sports_ball", - "kite", - "baseball_bat", - "baseball_glove", - "skateboard", - "surfboard", - "tennis_racket", - "bottle", - "plate", - "wine_glass", - "cup", - "fork", - "knife", - "spoon", - "bowl", - "banana", - "apple", - "sandwich", - "orange", - "broccoli", - "carrot", - "hot_dog", - "pizza", - "donut", - "cake", - "chair", - "couch", - "potted_plant", - "bed", - "mirror", - "dining_table", - "window", - "desk", - "toilet", - "door", - "tv", - "laptop", - "mouse", - "remote", - "keyboard", - "cell_phone", - "microwave", - "oven", - "toaster", - "sink", - "refrigerator", - "blender", - "book", - "clock", - "vase", - "scissors", - "teddy_bear", - "hair_dryer", - "toothbrush", - "hair_brush"]) - return cls_name[catId] - def _real_id_to_cat_id(catId): """Note coco has 80 classes, but the catId ranges from 1 to 90!""" real_id_to_cat_id = \ diff --git a/libs/layers/crop.py b/libs/layers/crop.py index 48f0c49..1b314c8 100644 --- a/libs/layers/crop.py +++ b/libs/layers/crop.py @@ -60,7 +60,6 @@ def crop_(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pool with tf.name_scope(scope): # boxes_bf = boxes - # boxes = boxes / (stride + 0.0) boxes = tf.reshape(boxes, [-1, 4]) # normalize the boxes and swap x y dimensions @@ -69,8 +68,8 @@ def crop_(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pool xs = boxes[:, 0] ys = boxes[:, 1] - xs = xs / tf.cast(iw, tf.float32)#tf.cast(shape[2], tf.float32) - ys = ys / tf.cast(ih, tf.float32)#tf.cast(shape[1], tf.float32) + xs = xs / tf.cast(iw, tf.float32) + ys = ys / tf.cast(ih, tf.float32) boxes = tf.concat([ys[:, tf.newaxis], xs[:, tf.newaxis]], axis=1) boxes = tf.reshape(boxes, [-1, 4]) # to (y1, x1, y2, x2) diff --git a/libs/layers/mask.py b/libs/layers/mask.py index af9a5c8..ba054c3 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -79,7 +79,7 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): for i in keep_inds: roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], int(roi[1]):int(roi[3])+1, int(roi[0]):int(roi[2])+1] - cropped = cv2.resize(cropped, (mask_width, mask_height))#INTER_NEAREST + cropped = cv2.resize(cropped, (mask_width, mask_height), interpolation=cv2.INTER_NEAREST) mask_targets[i, :, :, int(labels[i])] = cropped mask_inside_weights[i, :, :, int(labels[i])] = 1 @@ -133,17 +133,7 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): %(num_masks, rois.shape[0], gt_masks.shape[0])) labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] - - # rois = rois[inds] - # labels = labels[inds].astype(np.int32) - # gt_assignment = gt_assignment[inds] - - # ignore rois with overlaps between fg_threshold and bg_threshold - # mask are only defined on positive rois - - - # ignore_inds = np.where((max_overlaps < cfg.FLAGS.fg_threshold))[0] - # labels[ignore_inds] = -1 + mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) @@ -197,7 +187,7 @@ def decode(mask_targets, rois, classes, ih, iw): mask = mask_targets[i, :, :, k] h, w = rois[i, 3] - rois[i, 1] + 1, rois[i, 2] - rois[i, 0] + 1 x, y = rois[i, 0], rois[i, 1] - mask = cv2.resize(mask, (w, h))#INTER_NEAREST + mask = cv2.resize(mask, (w, h)) mask *= k # paint diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index df6f0fe..791d54f 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -196,54 +196,6 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] -def assign_boxes_(gt_boxes, tensors, layers, scope='AssignGTBoxes'): - - with tf.name_scope(scope) as sc: - min_k = layers[0] - max_k = layers[-1] - assigned_layers = \ - tf.py_func(assign.assign_boxes, - [ gt_boxes, min_k, max_k ], - tf.int32) - assigned_layers = tf.reshape(assigned_layers, [-1]) - - assigned_tensors = [] - for t in tensors: - split_tensors = [] - for l in layers: - tf.cast(l, tf.int32) - inds = tf.where(tf.equal(assigned_layers, l)) - inds = tf.reshape(inds, [-1]) - split_tensors.append(tf.gather(t, inds)) - assigned_tensors.append(split_tensors) - - return assigned_tensors + [assigned_layers] - -# def assign_boxes_(gt_boxes, tensors, layers, scope='AssignGTBoxes'): - -# with tf.name_scope(scope) as sc: -# min_k = layers[0] -# max_k = layers[-1] -# assigned_layers = \ -# tf.py_func(assign.assign_boxes, -# [ gt_boxes, min_k, max_k ], -# tf.int32) -# assigned_layers = tf.reshape(assigned_layers, [-1]) - -# assigned_tensors = [] -# for t in tensors: -# split_tensors = [] -# for l in layers: -# tf.cast(l, tf.int32) -# inds = tf.where(tf.equal(assigned_layers, l)) -# inds = tf.reshape(inds, [-1]) -# split_tensors.append(tf.gather(t, inds)) -# assigned_tensors.append(split_tensors) - -# ordered_cropped_rois = tf.concat([assigned_tensors[0][3],assigned_tensors[0][2],assigned_tensors[0][1],assigned_tensors[0][0]],0) - -# return [ordered_cropped_rois] + assigned_tensors + [assigned_layers] - def inst_inference(final_boxes, classes, cls2_prob, scope='instInference'): with tf.name_scope(scope) as sc: inst_boxes, inst_classes, inst_prob, batch_inds = \ diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 13578e3..7f72679 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -20,7 +20,6 @@ from libs.layers import sample_rpn_outputs from libs.layers import sample_rpn_outputs_with_gt from libs.layers import assign_boxes -from libs.layers import assign_boxes_ from libs.layers import inst_inference from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input @@ -318,9 +317,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g cls2_prob = tf.nn.softmax(cls2) final_boxes, classes, scores = \ roi_decoder(box, cls2_prob, ordered_rois, ih, iw) - - ## for testing, maskrcnn takes refined boxes as inputs if not is_training: @@ -339,11 +336,6 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g batch_inds = assigned_batch_inds[i-2] cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) - # if i is 3: - # outputs['tmp_0'] = boxes_after_crop - # outputs['tmp_1'] = boxes_before_crop - # outputs['tmp_2'] = ihiw - # outputs['tmp_3'] = py_shape cropped_rois.append(cropped) ordered_inst_boxes.append(splitted_rois) ordered_inst_classes.append(splitted_classes) @@ -520,12 +512,6 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # outputs['tmp_3'] = labels outputs['tmp_4'] = classes - # outputs['tmp_0'] = outputs['ordered_rois'] - # outputs['tmp_1'] = outputs['pyramid_feature'] - # outputs['tmp_2'] = tf.transpose(outputs['roi']['cropped_rois'],[0,3,1,2]) - # outputs['tmp_3'] = outputs['assigned_rois'] - - ### mask loss # mask of shape (N, h, w, num_classes) masks = outputs['mask']['mask'] @@ -558,9 +544,7 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, outputs['tmp_1'] = labels outputs['tmp_2'] = tf.nn.sigmoid(masks) outputs['tmp_3'] = mask_targets - # outputs['tmp_0'] = mask_rois - # outputs['tmp_1'] = mask_targets - # outputs['tmp_2'] = labels + mask_targets = tf.cast(mask_targets, tf.float32) mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) mask_loss = tf.reduce_mean(mask_loss) diff --git a/train/train.py b/train/train.py index 4c63d41..040eeed 100644 --- a/train/train.py +++ b/train/train.py @@ -294,47 +294,7 @@ def train(): gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch)) - # print ("labels") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) - # print ("classes") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) - # print ("mask rois before filter") - # print (np.array(tmp_0np)) - # print (np.array(tmp_1np)) - # print (np.array(tmp_2np)) - # print (np.array(tmp_3np)) - # print ("mask rois after filter") - # print (np.array(tmp_0np).shape) - # print (np.array(tmp_2np).shape) - # print (np.array(tmp_1np).shape) - # print ("mask rois after filter") - # print ((final_masknp).shape) - # print (np.max(final_masknp)) - # print (np.min(final_masknp)) - - #print ("iw", np.asanyarray(tmp_4np)) - #if np.asarray(tmp_3np[3]).shape[0]>=1: - #print ("ordered_rois") - #print (np.asarray(tmp_0np)[0]) - #print ("pyramid_feature") - #print ("p5",np.asarray(tmp_1np[0]).shape) - #print (np.asarray(tmp_1np[0][0][0])) - - #print ("real_pyramid") - #print (np.asarray(tmp_4np).shape) - #print (np.asarray(tmp_4np)[0][0]) - #print ("p4",np.asanyarray(tmp_1np[1]).shape) - #print ("p3",np.asanyarray(tmp_1np[2]).shape) - #print ("p2",np.asanyarray(tmp_1np[3]).shape) - - #print ("cropped_rois") - #print (np.asarray(tmp_2np).shape) - #print (np.asarray(tmp_2np)[0][0]) - # print ("assigned_layer_num") - # print ("p5:",np.asarray(tmp_3np[3]).shape[0]) - # print ("p4:",np.asarray(tmp_3np[2]).shape[0]) - # print ("p3:",np.asarray(tmp_3np[1]).shape[0]) - # print ("p2:",np.asarray(tmp_3np[0]).shape[0]) + if step % 50 == 0: # draw_bbox(step, # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), @@ -357,33 +317,6 @@ def train(): mask=tmp_2np, vis_all=True) - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='train_roi', - # bbox=final_rpn_boxnp, - # label=final_clsnp, - # prob=final_probnp, - # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), - # iou=final_max_overlapsnp - # ) - - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='train_msk', - # bbox=tmp_0np, - # label=tmp_2np, - # prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, - # mask=tmp_1np, - # vis_all=True - # ) - - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='train_gt', - # bbox=gtnp[:,0:4], - # label=np.asarray(gtnp[:,4], dtype=np.uint8), - # ) - draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_gt', From ab1195bc4842965388ad4cb4f6140c914f0f6416 Mon Sep 17 00:00:00 2001 From: souryuu Date: Wed, 19 Jul 2017 17:19:45 +0900 Subject: [PATCH 04/35] Changes in a network - remove batch normalization in the layers before loss Fixed some mask issues - temporary fixed inaccurate gt_mask from cv crop and resize - change gt_mask from int to float - smoothen mask by cv INTER_CUBIC Misc. - match all rois and their target (manually checked through indexs) --- libs/layers/__init__.py | 1 - libs/layers/anchor.py | 10 ++- libs/layers/mask.py | 108 ++++++++++++++++++++++++++++-- libs/layers/roi.py | 4 +- libs/layers/sample.py | 16 +++-- libs/layers/wrapper.py | 124 +++++++++++++++++++++++++++-------- libs/nets/pyramid_network.py | 113 +++++++++++++++++++++++-------- train/train.py | 12 +++- 8 files changed, 315 insertions(+), 73 deletions(-) diff --git a/libs/layers/__init__.py b/libs/layers/__init__.py index 1a34fb9..b60ad26 100644 --- a/libs/layers/__init__.py +++ b/libs/layers/__init__.py @@ -17,7 +17,6 @@ from .wrapper import sample_with_gt_wrapper as sample_rpn_outputs_with_gt from .wrapper import gen_all_anchors from .wrapper import assign_boxes -from .wrapper import assign_boxes_ from .crop import crop as ROIAlign from .crop import crop_ as ROIAlign_ from .wrapper import inst_inference diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index e98d418..ccd10a2 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -13,7 +13,7 @@ _DEBUG = False -def encode(gt_boxes, all_anchors, height, width, stride): +def encode(gt_boxes, all_anchors, height, width, stride, indexs): """Matching and Encoding groundtruth into learning targets Sampling @@ -141,10 +141,12 @@ def encode(gt_boxes, all_anchors, height, width, stride): # bbox_inside_weights = _unmap(bbox_inside_weights, total_anchors, inds_inside, fill=0) labels = labels.reshape((1, height, width, -1)) + indexs = indexs.reshape((1, height, width, -1)) bbox_targets = bbox_targets.reshape((1, height, width, -1)) bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) - return labels, bbox_targets, bbox_inside_weights + + return labels, bbox_targets, bbox_inside_weights, indexs def decode(boxes, scores, all_anchors, ih, iw): """Decode outputs into boxes @@ -169,13 +171,15 @@ def decode(boxes, scores, all_anchors, ih, iw): scores = scores.reshape((-1, 2)) assert scores.shape[0] == boxes.shape[0] == all_anchors.shape[0], \ 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0],boxes.shape[0],all_anchors.reshape[0]) + index = np.arange(scores.shape[0]).astype(np.int32) boxes = bbox_transform_inv(all_anchors, boxes) classes = np.argmax(scores, axis=1) scores = scores[:, 1] final_boxes = boxes final_boxes = clip_boxes(final_boxes, (ih, iw)) classes = classes.astype(np.int32) - return final_boxes, classes, scores + + return final_boxes, classes, scores, index def sample(boxes, scores, ih, iw, is_training): """ diff --git a/libs/layers/mask.py b/libs/layers/mask.py index ba054c3..7b83591 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -10,6 +10,7 @@ from libs.logs.log import LOG import logging from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes +import tensorflow as tf _DEBUG = False def log(file_name='log'): @@ -91,7 +92,7 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) return labels, mask_targets, mask_inside_weights -def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): +def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): """Encode masks groundtruth into learnable targets Sample some exmaples @@ -133,7 +134,6 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): %(num_masks, rois.shape[0], gt_masks.shape[0])) labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] - mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) @@ -142,10 +142,37 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): # TODO: speed bottleneck? #logger=log() for i in keep_inds: + + gt_height = gt_masks.shape[1] + gt_width = gt_masks.shape[2] + enlarged_width = mask_width*50 + enlarged_height = mask_height*50 + roi = rois[i, :4] #logger.info("""roi %d: %s""" % (i, roi)) - cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] - cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR)#INTER_NEAREST + cropped = gt_masks[gt_assignment[i], :, :] + # print("start") + # print(cropped.shape) + cropped = cv2.resize(cropped.astype(np.float32), (enlarged_width.astype(np.float32), enlarged_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) + # print(cropped.shape) + cropped = cropped[ int(round(roi[1]*enlarged_height/float(gt_height))) : int(round(roi[3]*enlarged_height/float(gt_height))), + int(round(roi[0]*enlarged_width /float(gt_width ))) : int(round(roi[2]*enlarged_width /float(gt_width ))) + ] + # print(cropped.shape) + cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) + # print(cropped.shape) + # print("=====") + + + # roi = rois[i, :4] + # #logger.info("""roi %d: %s""" % (i, roi)) + # enlarged_width = (mask_width*50.0).astype(np.float32) + # enlarged_height = (mask_height*50.0).astype(np.float32) + + # cropped = gt_masks[gt_assignment[i], :, :] + # cropped = cv2.resize(cropped, (enlarged_width, enlarged_height), interpolation=cv2.INTER_LINEAR) + # cropped = cropped[int(round(roi[1]/*enlarged_height)):int(round(roi[3]*enlarged_height)), int(round(roi[0]*enlarged_width)):int(round(roi[2]*enlarged_width))] + # cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) mask_targets[i, :, :, labels[i]] = cropped #logger.info("""cropped %s""" % (cropped)) @@ -161,7 +188,78 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) mask_rois = np.zeros((total_masks, 4), dtype=np.float32) - return labels, mask_targets, mask_inside_weights, mask_rois + return labels, mask_targets, mask_inside_weights, mask_rois, indexs + +# def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): +# """Encode masks groundtruth into learnable targets +# Sample some exmaples + +# Params +# ------ +# gt_masks: image_height x image_width {0, 1} matrix, of shape (G, imh, imw) +# gt_boxes: ground-truth boxes of shape (G, 5), each raw is [x1, y1, x2, y2, class] +# rois: the bounding boxes of shape (N, 4), +# ## scores: scores of shape (N, 1) +# num_classes; K +# mask_height, mask_width: height and width of output masks + +# Returns +# ------- +# # rois: boxes sampled for cropping masks, of shape (M, 4) +# labels: class-ids of shape (M, 1) +# mask_targets: learning targets of shape (M, pooled_height, pooled_width, K) in {0, 1} values +# mask_inside_weights: of shape (M, pooled_height, pooled_width, K) in {0, 1}Í indicating which mask is sampled +# """ +# total_masks = rois.shape[0] +# if gt_boxes.size > 0: +# # B x G +# overlaps = cython_bbox.bbox_overlaps( +# np.ascontiguousarray(rois[:, 0:4], dtype=np.float), +# np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) +# gt_assignment = overlaps.argmax(axis=1) # shape is N +# max_overlaps = overlaps[np.arange(len(gt_assignment)), gt_assignment] # N +# # note: this will assign every rois with a positive label +# # labels = gt_boxes[gt_assignment, 4] # N +# labels = np.zeros((total_masks, ), np.int32) +# labels[:] = -1 + +# # sample positive rois which intersection is more than 0.5 +# keep_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] +# num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) +# if keep_inds.size > 0 and num_masks < keep_inds.size: +# keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) +# LOG('Masks: %d of %d rois are considered positive mask. Number of masks %d'\ +# %(num_masks, rois.shape[0], gt_masks.shape[0])) + +# labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] + +# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) +# mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) +# rois [rois < 0] = 0 + +# # TODO: speed bottleneck? +# #logger=log() +# for i in keep_inds: +# roi = rois[i, :4] +# #logger.info("""roi %d: %s""" % (i, roi)) +# cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] +# cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) + +# mask_targets[i, :, :, labels[i]] = cropped +# #logger.info("""cropped %s""" % (cropped)) +# mask_inside_weights[i, :, :, labels[i]] = 1 +# # print("in mask.py rois: ", roi) +# mask_rois = rois[:, :4] +# # print("in mask.py rois2: ") +# # print(mask_rois) +# else: +# # there is no gt +# labels = np.zeros((total_masks, ), np.int32) +# labels[:] = -1 +# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) +# mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) +# mask_rois = np.zeros((total_masks, 4), dtype=np.float32) +# return labels, mask_targets, mask_inside_weights, mask_rois, indexs def decode(mask_targets, rois, classes, ih, iw): """Decode outputs into final masks diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 888c445..466bee3 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -13,7 +13,7 @@ _DEBUG = False -def encode(gt_boxes, rois, num_classes): +def encode(gt_boxes, rois, num_classes, indexs): """Matching and Encoding groundtruth boxes (gt_boxes) into learning targets to boxes Sampling Parameters @@ -99,7 +99,7 @@ def encode(gt_boxes, rois, num_classes): labels[ignore_inds] = -1 max_overlaps = labels - return labels, bbox_targets, bbox_inside_weights, max_overlaps.astype(np.float32) + return labels, bbox_targets, bbox_inside_weights, max_overlaps.astype(np.float32), indexs def decode(boxes, scores, rois, ih, iw): """Decode prediction targets into boxes and only keep only one boxes of greatest possibility for each rois diff --git a/libs/layers/sample.py b/libs/layers/sample.py index d08639e..735adc2 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -13,7 +13,7 @@ _DEBUG=False -def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False): +def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False): """Sample boxes according to scores and some learning strategies assuming the first class is background Params: @@ -41,11 +41,13 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False): keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] + indexs = indexs[keeps] # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) boxes = boxes[keeps, :] scores = scores[keeps] + indexs = indexs[keeps] # filter with scores order = scores.ravel().argsort()[::-1] @@ -53,6 +55,7 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False): order = order[:pre_nms_top_n] boxes = boxes[order, :] scores = scores[order] + indexs = indexs[order] # filter with nms det = np.hstack((boxes, scores)).astype(np.float32) @@ -61,7 +64,8 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False): if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] boxes = boxes[keeps, :] - scores = scores[keeps] + scores = scores[keeps].astype(np.float32) + indexs = indexs[keeps] batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) # # random sample boxes @@ -77,11 +81,11 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False): # ws = boxes[:, 2] - boxes[:, 0] # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' - return boxes, scores.astype(np.float32), batch_inds + return boxes, scores, batch_inds, indexs -def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, only_positive=False): +def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): """sample boxes for refined output""" - boxes, scores, batch_inds = sample_rpn_outputs(boxes, scores, is_training, only_positive) + boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training, only_positive) if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( @@ -138,7 +142,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds],\ - boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds] + boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[keep_inds] def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 791d54f..2c9c05c 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -15,57 +15,70 @@ from . import inst from libs.boxes.anchor import anchors_plane -def anchor_encoder(gt_boxes, all_anchors, height, width, stride, scope='AnchorEncoder'): +def anchor_encoder(gt_boxes, all_anchors, height, width, stride, indexs, scope='AnchorEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights = \ + labels, bbox_targets, bbox_inside_weights, indexs = \ tf.py_func(anchor.encode, - [gt_boxes, all_anchors, height, width, stride], - [tf.int32, tf.float32, tf.float32]) + [gt_boxes, all_anchors, height, width, stride, indexs], + [tf.int32, tf.float32, tf.float32, tf.int32]) + labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') + + labels = tf.reshape(labels, (1, height, width, -1)) + indexs = tf.reshape(indexs, (1, height, width, -1)) bbox_targets = tf.reshape(bbox_targets, (1, height, width, -1)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (1, height, width, -1)) + - return labels, bbox_targets, bbox_inside_weights + return labels, bbox_targets, bbox_inside_weights, indexs def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): with tf.name_scope(scope) as sc: - final_boxes, classes, scores = \ + final_boxes, classes, scores, indexs = \ tf.py_func(anchor.decode, [boxes, scores, all_anchors, ih, iw], - [tf.float32, tf.int32, tf.float32]) + [tf.float32, tf.int32, tf.float32, tf.int32]) + + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') + + indexs = tf.reshape(indexs, (-1, )) final_boxes = tf.reshape(final_boxes, (-1, 4)) classes = tf.reshape(classes, (-1, )) scores = tf.reshape(scores, (-1, )) - return final_boxes, classes, scores + return final_boxes, classes, scores, indexs -def roi_encoder(gt_boxes, rois, num_classes, scope='ROIEncoder'): +def roi_encoder(gt_boxes, rois, num_classes, indexs, scope='ROIEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights, max_overlaps = \ + labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs = \ tf.py_func(roi.encode, - [gt_boxes, rois, num_classes], - [tf.int32, tf.float32, tf.float32, tf.float32] + [gt_boxes, rois, num_classes, indexs], + [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32] ) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='indexs') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') + labels = tf.reshape(labels, (-1, )) + indexs = tf.reshape(indexs, (-1, )) bbox_targets = tf.reshape(bbox_targets, (-1, num_classes * 4)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (-1, num_classes * 4)) max_overlaps = tf.reshape(max_overlaps,(-1, )) - return labels, bbox_targets, bbox_inside_weights, max_overlaps + return labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): @@ -98,22 +111,48 @@ def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, return labels, mask_targets, mask_inside_weights -def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): +# def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): + +# with tf.name_scope(scope) as sc: +# labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ +# tf.py_func(mask.encode_, +# [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], +# [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) + +# labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') +# indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') +# mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') +# mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') + +# labels = tf.reshape(labels, (-1,)) +# indexs = tf.reshape(indexs, (-1,)) +# mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) +# mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) +# mask_rois = tf.reshape(mask_rois,(-1, 4)) + +# return labels, mask_targets, mask_inside_weights, mask_rois, indexs + +def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): with tf.name_scope(scope) as sc: - labels, mask_targets, mask_inside_weights, mask_rois = \ + labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ tf.py_func(mask.encode_, - [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width], - [tf.int32, tf.float32, tf.float32, tf.float32]) + [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], + [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) + labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') + mask_rois = tf.convert_to_tensor(mask_rois, name='mask_rois') + labels = tf.reshape(labels, (-1,)) + indexs = tf.reshape(indexs, (-1,)) mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) mask_rois = tf.reshape(mask_rois,(-1, 4)) - return labels, mask_targets, mask_inside_weights, mask_rois + return labels, mask_targets, mask_inside_weights, mask_rois, indexs def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): @@ -128,37 +167,41 @@ def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): return Mask -def sample_wrapper(boxes, scores, is_training=True, scope='SampleBoxes'): +def sample_wrapper(boxes, scores, indexs, is_training=True, scope='SampleBoxes'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds = \ + boxes, scores, batch_inds, indexs = \ tf.py_func(sample.sample_rpn_outputs, - [boxes, scores, is_training], - [tf.float32, tf.float32, tf.int32]) + [boxes, scores, indexs, is_training], + [tf.float32, tf.float32, tf.int32, tf.int32]) boxes = tf.convert_to_tensor(boxes, name='Boxes') scores = tf.convert_to_tensor(scores, name='Scores') batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + indexs = tf.convert_to_tensor(indexs, name='Indexs') + boxes = tf.reshape(boxes, (-1, 4)) batch_inds = tf.reshape(batch_inds, [-1]) + indexs = tf.reshape(indexs, [-1]) - return boxes, scores, batch_inds + return boxes, scores, batch_inds, indexs -def sample_with_gt_wrapper(boxes, scores, gt_boxes, is_training=True, scope='SampleBoxesWithGT'): +def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, scope='SampleBoxesWithGT'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds = \ + boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds, indexs = \ tf.py_func(sample.sample_rpn_outputs_wrt_gt_boxes, - [boxes, scores, gt_boxes, is_training], - [tf.float32, tf.float32, tf.int32, tf.float32, tf.float32, tf.int32]) + [boxes, scores, gt_boxes, indexs, is_training], + [tf.float32, tf.float32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) boxes = tf.convert_to_tensor(boxes, name='Boxes') scores = tf.convert_to_tensor(scores, name='Scores') batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + indexs = tf.convert_to_tensor(indexs, name='Indexs') mask_boxes = tf.convert_to_tensor(mask_boxes, name='MaskBoxes') mask_scores = tf.convert_to_tensor(mask_scores, name='MaskScores') mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='MaskBatchInds') - return boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds + return boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds, indexs def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): @@ -196,6 +239,31 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] +# def assign_boxes_(gt_boxes, tensors, layers, scope='AssignGTBoxes'): + +# with tf.name_scope(scope) as sc: +# min_k = layers[0] +# max_k = layers[-1] +# assigned_layers = \ +# tf.py_func(assign.assign_boxes, +# [ gt_boxes, min_k, max_k ], +# tf.int32) +# assigned_layers = tf.reshape(assigned_layers, [-1]) + +# assigned_tensors = [] +# for t in tensors: +# split_tensors = [] +# for l in layers: +# tf.cast(l, tf.int32) +# inds = tf.where(tf.equal(assigned_layers, l)) +# inds = tf.reshape(inds, [-1]) +# split_tensors.append(tf.gather(t, inds)) +# assigned_tensors.append(split_tensors) + +# ordered_cropped_rois = tf.concat([assigned_tensors[0][3],assigned_tensors[0][2],assigned_tensors[0][1],assigned_tensors[0][0]],0) + +# return [ordered_cropped_rois] + assigned_tensors + [assigned_layers] + def inst_inference(final_boxes, classes, cls2_prob, scope='instInference'): with tf.name_scope(scope) as sc: inst_boxes, inst_classes, inst_prob, batch_inds = \ diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 7f72679..bf91c22 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -23,7 +23,7 @@ from libs.layers import inst_inference from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input -_BN = False +_BN = True # mapping each stage to its' tensor features _networks_map = { @@ -72,7 +72,7 @@ def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_f padding='SAME', weights_regularizer=slim.l2_regularizer(weight_decay), weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), - activation_fn=activation_fn, + activation_fn=tf.nn.relu, normalizer_fn=normalizer_fn,): with slim.arg_scope( [slim.fully_connected], @@ -219,7 +219,6 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - my_sigmoid = None with slim.arg_scope(arg_scope): with tf.variable_scope('pyramid'): # for p in pyramid: @@ -233,9 +232,9 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g height, width = shape[1], shape[2] rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=my_sigmoid) + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.01)) + weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] print("anchor_scales = " , anchor_scales) @@ -247,20 +246,42 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] + rpn_boxes = tf.concat(values=rpn_boxes, axis=0) rpn_clses = tf.concat(values=rpn_clses, axis=0) rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - outputs['rpn']['box'] = rpn_boxes - outputs['rpn']['cls'] = rpn_clses - outputs['rpn']['anchor'] = rpn_anchors # outputs['rpn'] = {'box': rpn_boxes, 'cls': rpn_clses, 'anchor': rpn_anchors} rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rois, roi_clses, scores, = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + rois, roi_clses, scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + + outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] + for i in range(4, 1, -1): + p = 'P%d'%i + outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] + + # outputs['tmp_1'] = tf.reduce_prod(tf.shape(outputs['rpn']['P3']['cls']))#outputs['rpn']['P5']['index'] + # outputs['tmp_2'] = outputs['rpn']['P2']['index'] + + outputs['rpn']['box'] = rpn_boxes + outputs['rpn']['cls'] = rpn_clses + outputs['rpn']['anchor'] = rpn_anchors + outputs['rpn']['rois'] = rois + + outputs['tmp_4'] = rpn_clses + + # outputs['tmp_0'] = rois + # outputs['tmp_1'] = rpn_boxes + # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) + # outputs['tmp_1'] = outputs['rpn']['P5']['index']# tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P4']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P3']['box'], [-1, 4]))[0]+ tf.shape(tf.reshape(outputs['rpn']['P2']['box'], [-1, 4]))[0] + # outputs['tmp_2'] = outputs['rpn']['P4']['index'] + # outputs['tmp_3'] = outputs['rpn']['P3']['index'] + # outputs['tmp_4'] = outputs['rpn']['P2']['index'] + if is_training is True: - rois, scores, batch_inds, mask_rois, mask_scores, mask_batch_inds = \ - sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, is_training=is_training) + rois, scores, batch_inds, mask_rois, mask_scores, mask_batch_inds, indexs = \ + sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) else: rois, scores, batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) @@ -268,31 +289,39 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g outputs['roi'] = {'box': rois, 'score': scores} ## cropping regions - [assigned_rois, assigned_batch_inds, assigned_layer_inds] = \ - assign_boxes(rois, [rois, batch_inds], [2, 3, 4, 5]) + [assigned_rois, assigned_batch_inds, assign_indexs, assigned_layer_inds] = \ + assign_boxes(rois, [rois, batch_inds, indexs], [2, 3, 4, 5]) outputs['assigned_rois'] = assigned_rois + outputs['assign_indexs'] = assign_indexs outputs['assigned_layer_inds'] = assigned_layer_inds cropped_rois = [] ordered_rois = [] + ordered_index = [] pyramid_feature = [] for i in range(5, 1, -1): p = 'P%d'%i splitted_rois = assigned_rois[i-2] batch_inds = assigned_batch_inds[i-2] + index = assign_indexs[i-2] cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) cropped_rois.append(cropped) ordered_rois.append(splitted_rois) + ordered_index.append(index) pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) cropped_rois = tf.concat(values=cropped_rois, axis=0) ordered_rois = tf.concat(values=ordered_rois, axis=0) + ordered_index = tf.concat(values=ordered_index, axis=0) pyramid_feature = tf.concat(values=pyramid_feature, axis=0) + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index outputs['ordered_rois'] = ordered_rois + outputs['ordered_index'] = ordered_index outputs['pyramid_feature'] = pyramid_feature outputs['roi']['cropped_rois'] = cropped_rois @@ -306,9 +335,9 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, + cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) - box = slim.fully_connected(refine, num_classes*4, activation_fn=my_sigmoid, + box = slim.fully_connected(refine, num_classes*4, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) outputs['refined'] = {'box': box, 'cls': cls2} @@ -357,7 +386,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g # to 28 x 28 m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) tf.add_to_collection('__TRANSPOSED__', m) - m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None) + m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) # add a mask, given the predicted boxes and classes outputs['mask'] = {'mask':m, 'cls': classes, 'score': scores} @@ -423,14 +452,16 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) all_anchors = outputs['rpn'][p]['anchor'] - labels, bbox_targets, bbox_inside_weights = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, scope='AnchorEncoder') + all_indexs = outputs['rpn'][p]['index'] + labels, bbox_targets, bbox_inside_weights, all_indexs = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') boxes = outputs['rpn'][p]['box'] classes = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - labels, classes, boxes, bbox_targets, bbox_inside_weights = \ + labels, all_indexs, classes, boxes, bbox_targets, bbox_inside_weights = \ _filter_negative_samples(tf.reshape(labels, [-1]), [ tf.reshape(labels, [-1]), + tf.reshape(all_indexs, [-1]), tf.reshape(classes, [-1, 2]), tf.reshape(boxes, [-1, 4]), tf.reshape(bbox_targets, [-1, 4]), @@ -445,6 +476,10 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.reduce_sum(tf.cast( tf.greater_equal(labels, 1), tf.float32 ))) + # if i is 2: + # outputs['tmp_3'] = classes + # outputs['tmp_4'] = all_indexs + rpn_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) @@ -462,30 +497,40 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) rpn_cls_losses.append(rpn_cls_loss) + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + ### refined loss # 1. encode ground truth # 2. compute distances - ordered_rois = outputs['ordered_rois'] + ordered_rois_refined = outputs['ordered_rois'] + ordered_index_refined = outputs['ordered_index'] #rois = outputs['roi']['box'] boxes = outputs['refined']['box'] classes = outputs['refined']['cls'] - labels, bbox_targets, bbox_inside_weights, max_overlaps = \ - roi_encoder(gt_boxes, ordered_rois, num_classes, scope='ROIEncoder') + labels, bbox_targets, bbox_inside_weights, max_overlaps, ordered_index_refined = \ + roi_encoder(gt_boxes, ordered_rois_refined, num_classes, ordered_index_refined, scope='ROIEncoder') outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) outputs['final_boxes']['max_overlaps'] = max_overlaps outputs['gt'] = gt_boxes - labels, classes, boxes, bbox_targets, bbox_inside_weights = \ + + labels, ordered_index_refined, ordered_rois_refined, classes, boxes, bbox_targets, bbox_inside_weights = \ _filter_negative_samples(tf.reshape(labels, [-1]),[ tf.reshape(labels, [-1]), + tf.reshape(ordered_index_refined, [-1]), + tf.reshape(ordered_rois_refined, [-1, 4]), tf.reshape(classes, [-1, num_classes]), tf.reshape(boxes, [-1, num_classes * 4]), tf.reshape(bbox_targets, [-1, num_classes * 4]), tf.reshape(bbox_inside_weights, [-1, num_classes * 4]) ] ) + + # outputs['tmp_3'] = ordered_rois_refined + # outputs['tmp_4'] = ordered_index_refined # frac, frac_ = _get_valid_sample_fraction(labels, 1) refine_batch.append( tf.reduce_sum(tf.cast( @@ -510,25 +555,38 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, refined_cls_losses.append(refined_cls_loss) # outputs['tmp_3'] = labels - outputs['tmp_4'] = classes + # outputs['tmp_4'] = classes ### mask loss # mask of shape (N, h, w, num_classes) masks = outputs['mask']['mask'] + + ordered_rois_mask = outputs['ordered_rois'] + ordered_index_mask = outputs['ordered_index'] # mask_shape = tf.shape(masks) # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) - labels, mask_targets, mask_inside_weights, mask_rois = \ - mask_encoder_(gt_masks, gt_boxes, ordered_rois, num_classes, 28, 28, scope='MaskEncoder') - labels, masks, mask_targets, mask_inside_weights, mask_rois = \ + labels, mask_targets, mask_inside_weights, mask_rois, ordered_index_mask= \ + mask_encoder_(gt_masks, gt_boxes, ordered_rois_mask, num_classes, 28, 28, ordered_index_mask,scope='MaskEncoder') + + labels, ordered_index_mask, ordered_rois_mask, masks, mask_targets, mask_inside_weights, mask_rois = \ _filter_negative_samples(tf.reshape(labels, [-1]), [ tf.reshape(labels, [-1]), + tf.reshape(ordered_index_mask, [-1]), + tf.reshape(ordered_rois_mask, [-1, 4]), tf.reshape(masks, [-1, 28, 28, num_classes]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), tf.reshape(mask_rois, [-1, 4]) ]) # _, frac_ = _get_valid_sample_fraction(labels) + + # outputs['tmp_0'] = labels + # outputs['tmp_1'] = mask_targets + # outputs['tmp_2'] = mask_inside_weights + # outputs['tmp_3'] = mask_rois + # outputs['tmp_4'] = ordered_index_mask + mask_batch.append( tf.reduce_sum(tf.cast( tf.greater_equal(labels, 0), tf.float32 @@ -540,6 +598,7 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) # NOTE: w/o competition between classes. + outputs['tmp_0'] = mask_rois outputs['tmp_1'] = labels outputs['tmp_2'] = tf.nn.sigmoid(masks) diff --git a/train/train.py b/train/train.py index 040eeed..1dcf585 100644 --- a/train/train.py +++ b/train/train.py @@ -199,7 +199,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1.0, 1.0, 1.0, 1.0, 1.0]) + loss_weights=[1.0, 0.1, 1.0, 0.1, 0.1]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) @@ -293,6 +293,15 @@ def train(): tot_loss, rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch)) + # logger.info (np.array(tmp_0np).shape) + # logger.info (np.array(tmp_1np).shape) + # logger.info (np.array(tmp_2np).shape) + # logger.info (np.array(tmp_3np).shape) + # logger.info (np.array(tmp_4np).shape) + # logger.info (np.amax(np.array(tmp_4np))) + # logger.info (np.amin(np.array(tmp_4np))) + + #logger.info (np.array_equal(np.array(tmp_0np)[np.array(tmp_4np)], np.array(tmp_3np))) if step % 50 == 0: @@ -331,6 +340,7 @@ def train(): # logger.info ("classes") # logger.info (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + if np.isnan(tot_loss) or np.isinf(tot_loss): print (gt_boxesnp) raise From 702fae81b0462765e47f4250643c267b77613e6c Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 24 Jul 2017 10:24:03 +0900 Subject: [PATCH 05/35] Changed training mask sampling method and IoU threshold --- libs/configs/config_v1.py | 6 +- libs/layers/sample.py | 97 ++-- libs/layers/wrapper.py | 7 +- libs/nets/pyramid_network.py | 178 ++++--- libs/nets/pyramid_network_abort.py | 720 ++++++++++++++++++++++++++++ libs/nets/pyramid_network_backup.py | 682 ++++++++++++++++++++++++++ train/train.py | 40 +- 7 files changed, 1604 insertions(+), 126 deletions(-) create mode 100644 libs/nets/pyramid_network_abort.py create mode 100644 libs/nets/pyramid_network_backup.py diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index b4f7e46..dbb8c86 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.001, +tf.app.flags.DEFINE_float('learning_rate', 0.0002, 'Initial learning rate.') tf.app.flags.DEFINE_float( @@ -276,7 +276,7 @@ 'Number of rpn anchors that should be sampled after nms') tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 200, + 'post_nms_inst_n', 300, "Number of inst after NMS") tf.app.flags.DEFINE_float( @@ -299,7 +299,7 @@ 'mask_threshold', 0.50, 'Least intersection of a positive mask') tf.app.flags.DEFINE_integer( - 'masks_per_image', 128, + 'masks_per_image', 512, 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_float( diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 735adc2..10aa070 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -20,6 +20,7 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F boxes: of shape (..., Ax4), each entry is [x1, y1, x2, y2], the last axis has k*4 dims scores: of shape (..., A), probs of fg, in [0, 1] """ + min_size = cfg.FLAGS.min_size rpn_nms_threshold = cfg.FLAGS.rpn_nms_threshold pre_nms_top_n = cfg.FLAGS.pre_nms_top_n @@ -35,19 +36,26 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores.reshape((-1, 1)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' + # print ("boxes : ") + # print (scores.size) + # filter backgrounds # Hope this will filter most of background anchors, since a argsort is too slow.. - if only_positive: + #if only_positive: + if True: keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] indexs = indexs[keeps] - + # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) boxes = boxes[keeps, :] scores = scores[keeps] indexs = indexs[keeps] + + # print ("after_size : ") + # print (scores.size) # filter with scores order = scores.ravel().argsort()[::-1] @@ -57,9 +65,16 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores[order] indexs = indexs[order] + # print ("after_pre_nms_score : ") + # print (scores.size) + # print (np.amin(scores)) + # filter with nms det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, rpn_nms_threshold) + + # print ("after_nms : ") + # print (len(keeps)) if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] @@ -68,6 +83,9 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F indexs = indexs[keeps] batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) + # print ("after_post_nms_score : ") + # print (scores.size) + # # random sample boxes ## try early sample later # fg_inds = np.where(scores > 0.5)[0] @@ -94,42 +112,55 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training gt_assignment = overlaps.argmax(axis=1) # B max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] - if _DEBUG and np.argmax(overlaps[fg_inds],axis=1).size < gt_boxes.size/5.0: - print("gt_size") - print(gt_boxes) - gt_height = (gt_boxes[:,2]-gt_boxes[:,0]) - gt_width = (gt_boxes[:,3]-gt_boxes[:,1]) - gt_dim = np.vstack((gt_height, gt_width)) - print(np.transpose(gt_dim)) - #print(gt_height) - #print(gt_width) - - print('SAMPLE: %d after overlaps by %s' % (len(fg_inds),cfg.FLAGS.fg_threshold)) - print("detected object no.") - print(np.argmax(overlaps[fg_inds],axis=1)) - print("total object") - print(gt_boxes.size/5.0) - - mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] - if mask_fg_inds.size > cfg.FLAGS.masks_per_image: - mask_fg_inds = np.random.choice(mask_fg_inds, size=cfg.FLAGS.masks_per_image, replace=False) + # print("after_compair with gt") + # print(fg_inds.size) if True: gt_argmax_overlaps = overlaps.argmax(axis=0) # G fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) - fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) - if fg_inds.size > 0 and fg_rois < fg_inds.size: - fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) - - # TODO: sampling strategy - bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 128)#64 - if bg_inds.size > 0 and bg_rois < bg_inds.size: - bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) + # print("after_force with gt") + # print(fg_inds.size) + # if _DEBUG and np.argmax(overlaps[fg_inds],axis=1).size < gt_boxes.size/5.0: + # print("gt_size") + # print(gt_boxes) + # gt_height = (gt_boxes[:,2]-gt_boxes[:,0]) + # gt_width = (gt_boxes[:,3]-gt_boxes[:,1]) + # gt_dim = np.vstack((gt_height, gt_width)) + # print(np.transpose(gt_dim)) + # #print(gt_height) + # #print(gt_width) + + # print('SAMPLE: %d after overlaps by %s' % (len(fg_inds),cfg.FLAGS.fg_threshold)) + # print("detected object no.") + # print(np.argmax(overlaps[fg_inds],axis=1)) + # print("total object") + # print(gt_boxes.size/5.0) + + mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] + # print("after_compair with mask_gt") + # print(mask_fg_inds.size) + + if mask_fg_inds.size > cfg.FLAGS.masks_per_image: + mask_fg_inds = np.random.choice(mask_fg_inds, size=cfg.FLAGS.masks_per_image, replace=False) + # print("after_mask_per_img") + # print(mask_fg_inds.size) + + fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) + if fg_inds.size > 0 and fg_rois < fg_inds.size: + fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) + + # TODO: sampling strategy + bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] + bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 128)#64 + if bg_inds.size > 0 and bg_rois < bg_inds.size: + bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) keep_inds = np.append(fg_inds, bg_inds) #print(gt_boxes[np.argmax(overlaps[fg_inds],axis=1),4]) + print(mask_fg_inds.size) + if mask_fg_inds.size is 0: + mask_fg_inds = keep_inds else: bg_inds = np.arange(boxes.shape[0]) bg_rois = min(int(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction)), 128)#64 @@ -137,12 +168,12 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) keep_inds = bg_inds - mask_fg_inds = np.arange(0) + mask_fg_inds = bg_inds - return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds],\ - boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[keep_inds] + return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ + boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 2c9c05c..27a0d19 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -188,10 +188,10 @@ def sample_wrapper(boxes, scores, indexs, is_training=True, scope='SampleBoxes') def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, scope='SampleBoxesWithGT'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds, indexs = \ + boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs = \ tf.py_func(sample.sample_rpn_outputs_wrt_gt_boxes, [boxes, scores, gt_boxes, indexs, is_training], - [tf.float32, tf.float32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) + [tf.float32, tf.float32, tf.int32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) boxes = tf.convert_to_tensor(boxes, name='Boxes') scores = tf.convert_to_tensor(scores, name='Scores') batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') @@ -200,8 +200,9 @@ def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, sc mask_boxes = tf.convert_to_tensor(mask_boxes, name='MaskBoxes') mask_scores = tf.convert_to_tensor(mask_scores, name='MaskScores') mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='MaskBatchInds') + mask_indexs = tf.convert_to_tensor(mask_indexs, name='Indexs') - return boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds, indexs + return boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index bf91c22..c4e4151 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -269,8 +269,6 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g outputs['rpn']['anchor'] = rpn_anchors outputs['rpn']['rois'] = rois - outputs['tmp_4'] = rpn_clses - # outputs['tmp_0'] = rois # outputs['tmp_1'] = rpn_boxes # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) @@ -280,57 +278,57 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g # outputs['tmp_4'] = outputs['rpn']['P2']['index'] if is_training is True: - rois, scores, batch_inds, mask_rois, mask_scores, mask_batch_inds, indexs = \ + rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) else: - rois, scores, batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) + rcnn_rois, rcnn_scores, rcnn_batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) - outputs['roi'] = {'box': rois, 'score': scores} + outputs['roi'] = {'box': rcnn_rois, 'score': rcnn_scores} - ## cropping regions - [assigned_rois, assigned_batch_inds, assign_indexs, assigned_layer_inds] = \ - assign_boxes(rois, [rois, batch_inds, indexs], [2, 3, 4, 5]) + ## cropping regions for refined network + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assign_indexs, rcnn_assigned_layer_inds] = \ + assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) - outputs['assigned_rois'] = assigned_rois - outputs['assign_indexs'] = assign_indexs - outputs['assigned_layer_inds'] = assigned_layer_inds + outputs['rcnn_assigned_rois'] = rcnn_assigned_rois + outputs['rcnn_assign_indexs'] = rcnn_assign_indexs + outputs['rcnn_assigned_layer_inds'] = rcnn_assigned_layer_inds - cropped_rois = [] - ordered_rois = [] - ordered_index = [] - pyramid_feature = [] + rcnn_cropped_rois = [] + rcnn_ordered_rois = [] + rcnn_ordered_index = [] + rcnn_pyramid_feature = [] for i in range(5, 1, -1): p = 'P%d'%i - splitted_rois = assigned_rois[i-2] - batch_inds = assigned_batch_inds[i-2] - index = assign_indexs[i-2] - cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, + rcnn_splitted_roi = rcnn_assigned_rois[i-2] + rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] + rcnn_index = rcnn_assign_indexs[i-2] + rcnn_cropped, rcnn_boxes_after_crop, rcnn_boxes_before_crop, rcnn_py_shape, rcnn_ihiw = ROIAlign_(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) - cropped_rois.append(cropped) - ordered_rois.append(splitted_rois) - ordered_index.append(index) - pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) + rcnn_cropped_rois.append(rcnn_cropped) + rcnn_ordered_rois.append(rcnn_splitted_roi) + rcnn_ordered_index.append(rcnn_index) + rcnn_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - cropped_rois = tf.concat(values=cropped_rois, axis=0) - ordered_rois = tf.concat(values=ordered_rois, axis=0) - ordered_index = tf.concat(values=ordered_index, axis=0) - pyramid_feature = tf.concat(values=pyramid_feature, axis=0) + rcnn_cropped_rois = tf.concat(values=rcnn_cropped_rois, axis=0) + rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) + rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) + rcnn_pyramid_feature = tf.concat(values=rcnn_pyramid_feature, axis=0) # outputs['tmp_3'] = ordered_rois # outputs['tmp_4'] = ordered_index - outputs['ordered_rois'] = ordered_rois - outputs['ordered_index'] = ordered_index - outputs['pyramid_feature'] = pyramid_feature + outputs['rcnn_ordered_rois'] = rcnn_ordered_rois + outputs['rcnn_ordered_index'] = rcnn_ordered_index + outputs['rcnn_pyramid_feature'] = rcnn_pyramid_feature - outputs['roi']['cropped_rois'] = cropped_rois - tf.add_to_collection('__CROPPED__', cropped_rois) + outputs['roi']['rcnn_cropped_rois'] = rcnn_cropped_rois + tf.add_to_collection('__CROPPED__', rcnn_cropped_rois) ## refine head # to 7 x 7 - cropped_regions = slim.max_pool2d(cropped_rois, [3, 3], stride=2, padding='SAME') - refine = slim.flatten(cropped_regions) + rcnn_cropped_regions = slim.max_pool2d(rcnn_cropped_rois, [3, 3], stride=2, padding='SAME') + refine = slim.flatten(rcnn_cropped_regions) refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) @@ -345,18 +343,58 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g ## decode refine net outputs cls2_prob = tf.nn.softmax(cls2) final_boxes, classes, scores = \ - roi_decoder(box, cls2_prob, ordered_rois, ih, iw) + roi_decoder(box, cls2_prob, rcnn_ordered_rois, ih, iw) + if is_training: + #outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} + + [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ + assign_boxes(mask_rois, [mask_rois, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) + # [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ + # assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) + + outputs['mask_assigned_rois'] = mask_assigned_rois + outputs['mask_assign_indexs'] = mask_assign_indexs + outputs['mask_assigned_layer_inds'] = mask_assigned_layer_inds + + mask_cropped_rois = [] + mask_ordered_rois = [] + mask_ordered_index = [] + mask_pyramid_feature = [] + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assign_indexs[i-2] + mask_cropped, mask_boxes_after_crop, mask_boxes_before_crop, mask_py_shape, mask_ihiw = ROIAlign_(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_rois.append(mask_cropped) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_index.append(mask_index) + mask_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) + + mask_cropped_rois = tf.concat(values=mask_cropped_rois, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_index = tf.concat(values=mask_ordered_index, axis=0) + mask_pyramid_feature = tf.concat(values=mask_pyramid_feature, axis=0) + + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + + outputs['mask_ordered_rois'] = mask_ordered_rois + outputs['mask_ordered_index'] = mask_ordered_index + outputs['mask_pyramid_feature'] = mask_pyramid_feature + + outputs['roi']['mask_cropped_rois'] = mask_cropped_rois + else: ## for testing, maskrcnn takes refined boxes as inputs - if not is_training: - inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) - cropped_rois = [] - ordered_inst_boxes = [] - ordered_inst_classes = [] - ordered_inst_prob = [] + mask_cropped_rois = [] + mask_ordered_rois = [] + mask_ordered_classes = [] + mask_ordered_prob = [] for i in range(5, 1, -1): p = 'P%d'%i splitted_rois = assigned_rois[i-2] @@ -365,22 +403,20 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g batch_inds = assigned_batch_inds[i-2] cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) - cropped_rois.append(cropped) - ordered_inst_boxes.append(splitted_rois) - ordered_inst_classes.append(splitted_classes) - ordered_inst_prob.append(splitted_prob) + mask_cropped_rois.append(cropped) + mask_ordered_rois.append(splitted_rois) + mask_ordered_classes.append(splitted_classes) + mask_ordered_prob.append(splitted_prob) - cropped_rois = tf.concat(values=cropped_rois, axis=0) - ordered_inst_boxes = tf.concat(values=ordered_inst_boxes, axis=0) - ordered_inst_classes = tf.concat(values=ordered_inst_classes, axis=0) - ordered_inst_prob = tf.concat(values=ordered_inst_prob, axis=0) - outputs['final_boxes'] = {'box': ordered_inst_boxes, 'cls': ordered_inst_classes, 'prob': ordered_inst_prob, 'rpn_box': ordered_rois} - else: - outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} - + mask_cropped_rois = tf.concat(values=cropped_rois, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_classes = tf.concat(values=mask_ordered_classes, axis=0) + mask_ordered_prob = tf.concat(values=mask_ordered_prob, axis=0) + outputs['final_boxes'] = {'box': mask_ordered_rois, 'cls': mask_ordered_rois, 'prob': mask_ordered_rois, 'rpn_box': mask_ordered_rois} + ## mask head - m = cropped_rois + m = mask_cropped_rois for _ in range(4): m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) # to 28 x 28 @@ -389,7 +425,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) # add a mask, given the predicted boxes and classes - outputs['mask'] = {'mask':m, 'cls': classes, 'score': scores} + outputs['mask'] = {'mask':m} outputs['mask']['final_mask'] = tf.nn.sigmoid(m) return outputs @@ -504,25 +540,25 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, ### refined loss # 1. encode ground truth # 2. compute distances - ordered_rois_refined = outputs['ordered_rois'] - ordered_index_refined = outputs['ordered_index'] + rcnn_ordered_rois = outputs['rcnn_ordered_rois'] + rcnn_ordered_index = outputs['rcnn_ordered_index'] #rois = outputs['roi']['box'] boxes = outputs['refined']['box'] classes = outputs['refined']['cls'] - labels, bbox_targets, bbox_inside_weights, max_overlaps, ordered_index_refined = \ - roi_encoder(gt_boxes, ordered_rois_refined, num_classes, ordered_index_refined, scope='ROIEncoder') + labels, bbox_targets, bbox_inside_weights, max_overlaps, rcnn_ordered_index = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) outputs['final_boxes']['max_overlaps'] = max_overlaps outputs['gt'] = gt_boxes - labels, ordered_index_refined, ordered_rois_refined, classes, boxes, bbox_targets, bbox_inside_weights = \ + labels, rcnn_ordered_index, rcnn_ordered_rois, classes, boxes, bbox_targets, bbox_inside_weights = \ _filter_negative_samples(tf.reshape(labels, [-1]),[ tf.reshape(labels, [-1]), - tf.reshape(ordered_index_refined, [-1]), - tf.reshape(ordered_rois_refined, [-1, 4]), + tf.reshape(rcnn_ordered_index, [-1]), + tf.reshape(rcnn_ordered_rois, [-1, 4]), tf.reshape(classes, [-1, num_classes]), tf.reshape(boxes, [-1, num_classes * 4]), tf.reshape(bbox_targets, [-1, num_classes * 4]), @@ -554,26 +590,26 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) refined_cls_losses.append(refined_cls_loss) - # outputs['tmp_3'] = labels - # outputs['tmp_4'] = classes + outputs['tmp_5'] = labels + outputs['tmp_4'] = classes ### mask loss # mask of shape (N, h, w, num_classes) masks = outputs['mask']['mask'] - ordered_rois_mask = outputs['ordered_rois'] - ordered_index_mask = outputs['ordered_index'] + mask_ordered_rois = outputs['mask_ordered_rois'] + mask_ordered_index = outputs['mask_ordered_index'] # mask_shape = tf.shape(masks) # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) - labels, mask_targets, mask_inside_weights, mask_rois, ordered_index_mask= \ - mask_encoder_(gt_masks, gt_boxes, ordered_rois_mask, num_classes, 28, 28, ordered_index_mask,scope='MaskEncoder') + labels, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index= \ + mask_encoder_(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_index,scope='MaskEncoder') - labels, ordered_index_mask, ordered_rois_mask, masks, mask_targets, mask_inside_weights, mask_rois = \ + labels, mask_ordered_index, mask_ordered_rois, masks, mask_targets, mask_inside_weights, mask_rois = \ _filter_negative_samples(tf.reshape(labels, [-1]), [ tf.reshape(labels, [-1]), - tf.reshape(ordered_index_mask, [-1]), - tf.reshape(ordered_rois_mask, [-1, 4]), + tf.reshape(mask_ordered_index, [-1]), + tf.reshape(mask_ordered_rois, [-1, 4]), tf.reshape(masks, [-1, 28, 28, num_classes]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), diff --git a/libs/nets/pyramid_network_abort.py b/libs/nets/pyramid_network_abort.py new file mode 100644 index 0000000..c4e4151 --- /dev/null +++ b/libs/nets/pyramid_network_abort.py @@ -0,0 +1,720 @@ +# coding=utf-8 +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +import tensorflow.contrib.slim as slim + +from libs.boxes.roi import roi_cropping +from libs.layers import anchor_encoder +from libs.layers import anchor_decoder +from libs.layers import roi_encoder +from libs.layers import roi_decoder +from libs.layers import mask_encoder +from libs.layers import mask_encoder_ +from libs.layers import mask_decoder +from libs.layers import gen_all_anchors +from libs.layers import ROIAlign +from libs.layers import ROIAlign_ +from libs.layers import sample_rpn_outputs +from libs.layers import sample_rpn_outputs_with_gt +from libs.layers import assign_boxes +from libs.layers import inst_inference +from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input + +_BN = True + +# mapping each stage to its' tensor features +_networks_map = { + 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + }, + 'resnet101': {'C1': '', 'C2': '', + 'C3': '', 'C4': '', + 'C5': '', + } +} + +def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, + activation_fn=None, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True, + is_training=True): + + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': tf.GraphKeys.UPDATE_OPS, + 'is_training': is_training + } + + with slim.arg_scope( + [slim.conv2d], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=tf.nn.relu, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params): + with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): + + with slim.arg_scope( + [slim.conv2d, slim.conv2d_transpose], + padding='SAME', + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), + activation_fn=tf.nn.relu, + normalizer_fn=normalizer_fn,): + with slim.arg_scope( + [slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), + activation_fn=activation_fn, + normalizer_fn=normalizer_fn): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def my_sigmoid(x): + """add an active function for the box output layer, which is linear around 0""" + return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 + +def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): + """Smooth L1 loss + Returns + ------ + dist: element-wise distance, as the same shape of x, y + """ + deltas = x - y + with tf.name_scope(name=name) as scope: + deltas_abs = tf.abs(deltas) + smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) + return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ + (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) + +def _get_valid_sample_fraction(labels, p=0): + """return fraction of non-negative examples, the ignored examples have been marked as negative""" + num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) + num_example = tf.cast(tf.size(labels), tf.float32) + frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, + lambda: tf.cast(0, tf.float32)) + frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, + lambda: tf.cast(0, tf.float32)) + return frac, frac_ + + +def _filter_negative_samples(labels, tensors): + """keeps only samples with none-negative labels + Params: + ----- + labels: of shape (N,) + tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number + + Returns: + ----- + tensors: filtered tensors + """ + # return tensors + keeps = tf.where(tf.greater_equal(labels, 0)) + keeps = tf.reshape(keeps, [-1]) + + filtered = [] + for t in tensors: + tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) + f = tf.gather(t, keeps) + filtered.append(f) + + return filtered + +def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): + ws = gt_boxes[:, 2] - gt_boxes[:, 0] + hs = gt_boxes[:, 3] - gt_boxes[:, 1] + shape = tf.shape(gt_boxes)[0] + jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) + jitter = tf.reshape(jitter, [-1]) + ws_offset = ws * jitter + hs_offset = hs * jitter + x1s = gt_boxes[:, 0] + ws_offset + x2s = gt_boxes[:, 2] + ws_offset + y1s = gt_boxes[:, 1] + hs_offset + y2s = gt_boxes[:, 3] + hs_offset + boxes = tf.concat( + values=[ + x1s[:, tf.newaxis], + y1s[:, tf.newaxis], + x2s[:, tf.newaxis], + y2s[:, tf.newaxis]], + axis=1) + new_scores = tf.ones([shape], tf.float32) + new_batch_inds = tf.zeros([shape], tf.int32) + + return tf.concat(values=[rois, boxes], axis=0), \ + tf.concat(values=[scores, new_scores], axis=0), \ + tf.concat(values=[batch_inds, new_batch_inds], axis=0) + +def build_pyramid(net_name, end_points, bilinear=True, is_training=True): + """build pyramid features from a typical network, + assume each stage is 2 time larger than its top feature + Returns: + returns several endpoints + """ + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + # pyramid['inputs'] = end_points['inputs'] + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): + + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + + pyramid['P%d'%(c)] = s + + return pyramid + +def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): + """Build the 3-way outputs, i.e., class, box and mask in the pyramid + Algo + ---- + For each layer: + 1. Build anchor layer + 2. Process the results of anchor layer, decode the output into rois + 3. Sample rois + 4. Build roi layer + 5. Process the results of roi layer, decode the output into boxes + 6. Build the mask layer + 7. Build losses + """ + outputs = {} + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + # for p in pyramid: + outputs['rpn'] = {} + for i in range(5, 1, -1): + p = 'P%d'%i + stride = 2 ** i + + ## rpn head + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) + box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) + cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) + + anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + print("anchor_scales = " , anchor_scales) + all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} + + ## gather all rois + # print (outputs['rpn']) + rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] + rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] + rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] + + rpn_boxes = tf.concat(values=rpn_boxes, axis=0) + rpn_clses = tf.concat(values=rpn_clses, axis=0) + rpn_anchors = tf.concat(values=rpn_anchors, axis=0) + + # outputs['rpn'] = {'box': rpn_boxes, 'cls': rpn_clses, 'anchor': rpn_anchors} + + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) + rois, roi_clses, scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + + outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] + for i in range(4, 1, -1): + p = 'P%d'%i + outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] + + # outputs['tmp_1'] = tf.reduce_prod(tf.shape(outputs['rpn']['P3']['cls']))#outputs['rpn']['P5']['index'] + # outputs['tmp_2'] = outputs['rpn']['P2']['index'] + + outputs['rpn']['box'] = rpn_boxes + outputs['rpn']['cls'] = rpn_clses + outputs['rpn']['anchor'] = rpn_anchors + outputs['rpn']['rois'] = rois + + # outputs['tmp_0'] = rois + # outputs['tmp_1'] = rpn_boxes + # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) + # outputs['tmp_1'] = outputs['rpn']['P5']['index']# tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P4']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P3']['box'], [-1, 4]))[0]+ tf.shape(tf.reshape(outputs['rpn']['P2']['box'], [-1, 4]))[0] + # outputs['tmp_2'] = outputs['rpn']['P4']['index'] + # outputs['tmp_3'] = outputs['rpn']['P3']['index'] + # outputs['tmp_4'] = outputs['rpn']['P2']['index'] + + if is_training is True: + rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) + else: + rcnn_rois, rcnn_scores, rcnn_batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) + + + outputs['roi'] = {'box': rcnn_rois, 'score': rcnn_scores} + + ## cropping regions for refined network + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assign_indexs, rcnn_assigned_layer_inds] = \ + assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) + + outputs['rcnn_assigned_rois'] = rcnn_assigned_rois + outputs['rcnn_assign_indexs'] = rcnn_assign_indexs + outputs['rcnn_assigned_layer_inds'] = rcnn_assigned_layer_inds + + rcnn_cropped_rois = [] + rcnn_ordered_rois = [] + rcnn_ordered_index = [] + rcnn_pyramid_feature = [] + for i in range(5, 1, -1): + p = 'P%d'%i + rcnn_splitted_roi = rcnn_assigned_rois[i-2] + rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] + rcnn_index = rcnn_assign_indexs[i-2] + rcnn_cropped, rcnn_boxes_after_crop, rcnn_boxes_before_crop, rcnn_py_shape, rcnn_ihiw = ROIAlign_(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + rcnn_cropped_rois.append(rcnn_cropped) + rcnn_ordered_rois.append(rcnn_splitted_roi) + rcnn_ordered_index.append(rcnn_index) + rcnn_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) + + rcnn_cropped_rois = tf.concat(values=rcnn_cropped_rois, axis=0) + rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) + rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) + rcnn_pyramid_feature = tf.concat(values=rcnn_pyramid_feature, axis=0) + + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + + outputs['rcnn_ordered_rois'] = rcnn_ordered_rois + outputs['rcnn_ordered_index'] = rcnn_ordered_index + outputs['rcnn_pyramid_feature'] = rcnn_pyramid_feature + + outputs['roi']['rcnn_cropped_rois'] = rcnn_cropped_rois + tf.add_to_collection('__CROPPED__', rcnn_cropped_rois) + + ## refine head + # to 7 x 7 + rcnn_cropped_regions = slim.max_pool2d(rcnn_cropped_rois, [3, 3], stride=2, padding='SAME') + refine = slim.flatten(rcnn_cropped_regions) + refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) + refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) + refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) + refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) + cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + box = slim.fully_connected(refine, num_classes*4, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + + outputs['refined'] = {'box': box, 'cls': cls2} + + ## decode refine net outputs + cls2_prob = tf.nn.softmax(cls2) + final_boxes, classes, scores = \ + roi_decoder(box, cls2_prob, rcnn_ordered_rois, ih, iw) + + if is_training: + #outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} + + [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ + assign_boxes(mask_rois, [mask_rois, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) + # [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ + # assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) + + outputs['mask_assigned_rois'] = mask_assigned_rois + outputs['mask_assign_indexs'] = mask_assign_indexs + outputs['mask_assigned_layer_inds'] = mask_assigned_layer_inds + + mask_cropped_rois = [] + mask_ordered_rois = [] + mask_ordered_index = [] + mask_pyramid_feature = [] + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assign_indexs[i-2] + mask_cropped, mask_boxes_after_crop, mask_boxes_before_crop, mask_py_shape, mask_ihiw = ROIAlign_(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_rois.append(mask_cropped) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_index.append(mask_index) + mask_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) + + mask_cropped_rois = tf.concat(values=mask_cropped_rois, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_index = tf.concat(values=mask_ordered_index, axis=0) + mask_pyramid_feature = tf.concat(values=mask_pyramid_feature, axis=0) + + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + + outputs['mask_ordered_rois'] = mask_ordered_rois + outputs['mask_ordered_index'] = mask_ordered_index + outputs['mask_pyramid_feature'] = mask_pyramid_feature + + outputs['roi']['mask_cropped_rois'] = mask_cropped_rois + else: + ## for testing, maskrcnn takes refined boxes as inputs + inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) + [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) + + mask_cropped_rois = [] + mask_ordered_rois = [] + mask_ordered_classes = [] + mask_ordered_prob = [] + for i in range(5, 1, -1): + p = 'P%d'%i + splitted_rois = assigned_rois[i-2] + splitted_classes = assigned_classes[i-2] + splitted_prob = assigned_prob[i-2] + batch_inds = assigned_batch_inds[i-2] + cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_rois.append(cropped) + mask_ordered_rois.append(splitted_rois) + mask_ordered_classes.append(splitted_classes) + mask_ordered_prob.append(splitted_prob) + + + mask_cropped_rois = tf.concat(values=cropped_rois, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_classes = tf.concat(values=mask_ordered_classes, axis=0) + mask_ordered_prob = tf.concat(values=mask_ordered_prob, axis=0) + outputs['final_boxes'] = {'box': mask_ordered_rois, 'cls': mask_ordered_rois, 'prob': mask_ordered_rois, 'rpn_box': mask_ordered_rois} + + ## mask head + m = mask_cropped_rois + for _ in range(4): + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) + # to 28 x 28 + m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) + tf.add_to_collection('__TRANSPOSED__', m) + m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) + + # add a mask, given the predicted boxes and classes + outputs['mask'] = {'mask':m} + outputs['mask']['final_mask'] = tf.nn.sigmoid(m) + + return outputs + +def build_losses(pyramid, outputs, gt_boxes, gt_masks, + num_classes, base_anchors, + rpn_box_lw =1.0, rpn_cls_lw = 1.0, + refined_box_lw=1.0, refined_cls_lw=1.0, + mask_lw=1.0): + """Building 3-way output losses, totally 5 losses + Params: + ------ + outputs: output of build_heads + gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] + gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] + *_lw: loss weight of rpn, refined and mask losses + + Returns: + ------- + l: a loss tensor + """ + + # losses for pyramid + losses = [] + rpn_box_losses, rpn_cls_losses = [], [] + refined_box_losses, refined_cls_losses = [], [] + mask_losses = [] + + # watch some info during training + rpn_batch = [] + refine_batch = [] + mask_batch = [] + rpn_batch_pos = [] + refine_batch_pos = [] + mask_batch_pos = [] + + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + + ## assigning gt_boxes + [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) + + ## build losses for PFN + + for i in range(5, 1, -1): + p = 'P%d' % i + stride = 2 ** i + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + + splitted_gt_boxes = assigned_gt_boxes[i-2] + + ### rpn losses + # 1. encode ground truth + # 2. compute distances + # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + all_anchors = outputs['rpn'][p]['anchor'] + all_indexs = outputs['rpn'][p]['index'] + labels, bbox_targets, bbox_inside_weights, all_indexs = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') + boxes = outputs['rpn'][p]['box'] + classes = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) + + labels, all_indexs, classes, boxes, bbox_targets, bbox_inside_weights = \ + _filter_negative_samples(tf.reshape(labels, [-1]), [ + tf.reshape(labels, [-1]), + tf.reshape(all_indexs, [-1]), + tf.reshape(classes, [-1, 2]), + tf.reshape(boxes, [-1, 4]), + tf.reshape(bbox_targets, [-1, 4]), + tf.reshape(bbox_inside_weights, [-1, 4]) + ]) + # _, frac_ = _get_valid_sample_fraction(labels) + rpn_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 0), tf.float32 + ))) + rpn_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 1), tf.float32 + ))) + # if i is 2: + # outputs['tmp_3'] = classes + # outputs['tmp_4'] = all_indexs + + rpn_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) + rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) + rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) + rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) + rpn_box_losses.append(rpn_box_loss) + + # NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses + # BUT these examples still count when computing the average of softmax_cross_entropy, + # the loss become smaller by a factor (None_negtive_labels / all_labels) + # the BEST practise still should be gathering all none-negative examples + labels = slim.one_hot_encoding(labels, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros + rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) + rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) + rpn_cls_losses.append(rpn_cls_loss) + + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + + + ### refined loss + # 1. encode ground truth + # 2. compute distances + rcnn_ordered_rois = outputs['rcnn_ordered_rois'] + rcnn_ordered_index = outputs['rcnn_ordered_index'] + #rois = outputs['roi']['box'] + + boxes = outputs['refined']['box'] + classes = outputs['refined']['cls'] + + labels, bbox_targets, bbox_inside_weights, max_overlaps, rcnn_ordered_index = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') + + outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) + outputs['final_boxes']['max_overlaps'] = max_overlaps + outputs['gt'] = gt_boxes + + labels, rcnn_ordered_index, rcnn_ordered_rois, classes, boxes, bbox_targets, bbox_inside_weights = \ + _filter_negative_samples(tf.reshape(labels, [-1]),[ + tf.reshape(labels, [-1]), + tf.reshape(rcnn_ordered_index, [-1]), + tf.reshape(rcnn_ordered_rois, [-1, 4]), + tf.reshape(classes, [-1, num_classes]), + tf.reshape(boxes, [-1, num_classes * 4]), + tf.reshape(bbox_targets, [-1, num_classes * 4]), + tf.reshape(bbox_inside_weights, [-1, num_classes * 4]) + ] ) + + # outputs['tmp_3'] = ordered_rois_refined + # outputs['tmp_4'] = ordered_index_refined + # frac, frac_ = _get_valid_sample_fraction(labels, 1) + refine_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 0), tf.float32 + ))) + refine_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 1), tf.float32 + ))) + + refined_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) + refined_box_loss = tf.reshape(refined_box_loss, [-1, 4]) + refined_box_loss = tf.reduce_sum(refined_box_loss, axis=1) + refined_box_loss = refined_box_lw * tf.reduce_mean(refined_box_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, refined_box_loss) + refined_box_losses.append(refined_box_loss) + + labels = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) + refined_cls_loss = refined_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) + refined_cls_loss = tf.reduce_mean(refined_cls_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) + refined_cls_losses.append(refined_cls_loss) + + outputs['tmp_5'] = labels + outputs['tmp_4'] = classes + + ### mask loss + # mask of shape (N, h, w, num_classes) + masks = outputs['mask']['mask'] + + mask_ordered_rois = outputs['mask_ordered_rois'] + mask_ordered_index = outputs['mask_ordered_index'] + # mask_shape = tf.shape(masks) + # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], + # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) + labels, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index= \ + mask_encoder_(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_index,scope='MaskEncoder') + + labels, mask_ordered_index, mask_ordered_rois, masks, mask_targets, mask_inside_weights, mask_rois = \ + _filter_negative_samples(tf.reshape(labels, [-1]), [ + tf.reshape(labels, [-1]), + tf.reshape(mask_ordered_index, [-1]), + tf.reshape(mask_ordered_rois, [-1, 4]), + tf.reshape(masks, [-1, 28, 28, num_classes]), + tf.reshape(mask_targets, [-1, 28, 28, num_classes]), + tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), + tf.reshape(mask_rois, [-1, 4]) + ]) + # _, frac_ = _get_valid_sample_fraction(labels) + + # outputs['tmp_0'] = labels + # outputs['tmp_1'] = mask_targets + # outputs['tmp_2'] = mask_inside_weights + # outputs['tmp_3'] = mask_rois + # outputs['tmp_4'] = ordered_index_mask + + mask_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 0), tf.float32 + ))) + mask_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 1), tf.float32 + ))) + # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) + # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) + # NOTE: w/o competition between classes. + + outputs['tmp_0'] = mask_rois + outputs['tmp_1'] = labels + outputs['tmp_2'] = tf.nn.sigmoid(masks) + outputs['tmp_3'] = mask_targets + + mask_targets = tf.cast(mask_targets, tf.float32) + mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) + mask_loss = tf.reduce_mean(mask_loss) + mask_loss = tf.cond(tf.greater(tf.size(labels), 0), lambda: mask_loss, lambda: tf.constant(0.0)) + tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) + mask_losses.append(mask_loss) + + rpn_box_losses = tf.add_n(rpn_box_losses) + rpn_cls_losses = tf.add_n(rpn_cls_losses) + refined_box_losses = tf.add_n(refined_box_losses) + refined_cls_losses = tf.add_n(refined_cls_losses) + mask_losses = tf.add_n(mask_losses) + losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] + total_loss = tf.add_n(losses) + + rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) + refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) + mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) + rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) + refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) + mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) + + return total_loss, losses, [rpn_batch_pos, rpn_batch, \ + refine_batch_pos, refine_batch, \ + mask_batch_pos, mask_batch] + +def decode_output(outputs): + """decode outputs into boxes and masks""" + return [], [], [] + +def build(end_points, image_height, image_width, pyramid_map, + num_classes, + base_anchors, + is_training, + gt_boxes, + gt_masks, + loss_weights=[0.5, 0.5, 1.0, 0.5, 0.1]): + + pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + + for p in pyramid: + print (p) + + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training, gt_boxes=gt_boxes) + + if is_training: + loss, losses, batch_info = build_losses(pyramid, outputs, + gt_boxes, gt_masks, + num_classes=num_classes, base_anchors=base_anchors, + rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], + refined_box_lw=loss_weights[2], refined_cls_lw=loss_weights[3], + mask_lw=loss_weights[4]) + + outputs['losses'] = losses + outputs['total_loss'] = loss + outputs['batch_info'] = batch_info + + ## just decode outputs into readable prediction + pred_boxes, pred_classes, pred_masks = decode_output(outputs) + outputs['pred_boxes'] = pred_boxes + outputs['pred_classes'] = pred_classes + outputs['pred_masks'] = pred_masks + + # image and gt visualization + visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) + + # rpn visualization + visualize_bb(end_points["input"], outputs['roi']["box"], name="rpn_bb_visualization") + + # final network visualization + first_mask = outputs['mask']['mask'][:1] + first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) + + visualize_final_predictions(outputs['final_boxes']["box"], end_points["input"], first_mask) + + return outputs diff --git a/libs/nets/pyramid_network_backup.py b/libs/nets/pyramid_network_backup.py new file mode 100644 index 0000000..c80807c --- /dev/null +++ b/libs/nets/pyramid_network_backup.py @@ -0,0 +1,682 @@ +# coding=utf-8 +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +import tensorflow.contrib.slim as slim + +from libs.boxes.roi import roi_cropping +from libs.layers import anchor_encoder +from libs.layers import anchor_decoder +from libs.layers import roi_encoder +from libs.layers import roi_decoder +from libs.layers import mask_encoder +from libs.layers import mask_encoder_ +from libs.layers import mask_decoder +from libs.layers import gen_all_anchors +from libs.layers import ROIAlign +from libs.layers import ROIAlign_ +from libs.layers import sample_rpn_outputs +from libs.layers import sample_rpn_outputs_with_gt +from libs.layers import assign_boxes +from libs.layers import inst_inference +from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input + +_BN = True + +# mapping each stage to its' tensor features +_networks_map = { + 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + }, + 'resnet101': {'C1': '', 'C2': '', + 'C3': '', 'C4': '', + 'C5': '', + } +} + +def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, + activation_fn=None, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True, + is_training=True): + + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': tf.GraphKeys.UPDATE_OPS, + 'is_training': is_training + } + + with slim.arg_scope( + [slim.conv2d], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=tf.nn.relu, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params): + with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): + + with slim.arg_scope( + [slim.conv2d, slim.conv2d_transpose], + padding='SAME', + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), + activation_fn=tf.nn.relu, + normalizer_fn=normalizer_fn,): + with slim.arg_scope( + [slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), + activation_fn=activation_fn, + normalizer_fn=normalizer_fn): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def my_sigmoid(x): + """add an active function for the box output layer, which is linear around 0""" + return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 + +def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): + """Smooth L1 loss + Returns + ------ + dist: element-wise distance, as the same shape of x, y + """ + deltas = x - y + with tf.name_scope(name=name) as scope: + deltas_abs = tf.abs(deltas) + smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) + return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ + (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) + +def _get_valid_sample_fraction(labels, p=0): + """return fraction of non-negative examples, the ignored examples have been marked as negative""" + num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) + num_example = tf.cast(tf.size(labels), tf.float32) + frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, + lambda: tf.cast(0, tf.float32)) + frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, + lambda: tf.cast(0, tf.float32)) + return frac, frac_ + + +def _filter_negative_samples(labels, tensors): + """keeps only samples with none-negative labels + Params: + ----- + labels: of shape (N,) + tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number + + Returns: + ----- + tensors: filtered tensors + """ + # return tensors + keeps = tf.where(tf.greater_equal(labels, 0)) + keeps = tf.reshape(keeps, [-1]) + + filtered = [] + for t in tensors: + tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) + f = tf.gather(t, keeps) + filtered.append(f) + + return filtered + +def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): + ws = gt_boxes[:, 2] - gt_boxes[:, 0] + hs = gt_boxes[:, 3] - gt_boxes[:, 1] + shape = tf.shape(gt_boxes)[0] + jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) + jitter = tf.reshape(jitter, [-1]) + ws_offset = ws * jitter + hs_offset = hs * jitter + x1s = gt_boxes[:, 0] + ws_offset + x2s = gt_boxes[:, 2] + ws_offset + y1s = gt_boxes[:, 1] + hs_offset + y2s = gt_boxes[:, 3] + hs_offset + boxes = tf.concat( + values=[ + x1s[:, tf.newaxis], + y1s[:, tf.newaxis], + x2s[:, tf.newaxis], + y2s[:, tf.newaxis]], + axis=1) + new_scores = tf.ones([shape], tf.float32) + new_batch_inds = tf.zeros([shape], tf.int32) + + return tf.concat(values=[rois, boxes], axis=0), \ + tf.concat(values=[scores, new_scores], axis=0), \ + tf.concat(values=[batch_inds, new_batch_inds], axis=0) + +def build_pyramid(net_name, end_points, bilinear=True, is_training=True): + """build pyramid features from a typical network, + assume each stage is 2 time larger than its top feature + Returns: + returns several endpoints + """ + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + # pyramid['inputs'] = end_points['inputs'] + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): + + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + + pyramid['P%d'%(c)] = s + + return pyramid + +def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): + """Build the 3-way outputs, i.e., class, box and mask in the pyramid + Algo + ---- + For each layer: + 1. Build anchor layer + 2. Process the results of anchor layer, decode the output into rois + 3. Sample rois + 4. Build roi layer + 5. Process the results of roi layer, decode the output into boxes + 6. Build the mask layer + 7. Build losses + """ + outputs = {} + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + # for p in pyramid: + outputs['rpn'] = {} + for i in range(5, 1, -1): + p = 'P%d'%i + stride = 2 ** i + + ## rpn head + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) + box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) + cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) + + anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + print("anchor_scales = " , anchor_scales) + all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} + + ## gather all rois + # print (outputs['rpn']) + rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] + rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] + rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] + + rpn_boxes = tf.concat(values=rpn_boxes, axis=0) + rpn_clses = tf.concat(values=rpn_clses, axis=0) + rpn_anchors = tf.concat(values=rpn_anchors, axis=0) + + # outputs['rpn'] = {'box': rpn_boxes, 'cls': rpn_clses, 'anchor': rpn_anchors} + + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) + rois, roi_clses, scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + + outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] + for i in range(4, 1, -1): + p = 'P%d'%i + outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] + + # outputs['tmp_1'] = tf.reduce_prod(tf.shape(outputs['rpn']['P3']['cls']))#outputs['rpn']['P5']['index'] + # outputs['tmp_2'] = outputs['rpn']['P2']['index'] + + outputs['rpn']['box'] = rpn_boxes + outputs['rpn']['cls'] = rpn_clses + outputs['rpn']['anchor'] = rpn_anchors + outputs['rpn']['rois'] = rois + + # outputs['tmp_0'] = rois + # outputs['tmp_1'] = rpn_boxes + # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) + # outputs['tmp_1'] = outputs['rpn']['P5']['index']# tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P4']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P3']['box'], [-1, 4]))[0]+ tf.shape(tf.reshape(outputs['rpn']['P2']['box'], [-1, 4]))[0] + # outputs['tmp_2'] = outputs['rpn']['P4']['index'] + # outputs['tmp_3'] = outputs['rpn']['P3']['index'] + # outputs['tmp_4'] = outputs['rpn']['P2']['index'] + + if is_training is True: + rois, scores, batch_inds, indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) + else: + rois, scores, batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) + + + outputs['roi'] = {'box': rois, 'score': scores} + + ## cropping regions + [assigned_rois, assigned_batch_inds, assign_indexs, assigned_layer_inds] = \ + assign_boxes(rois, [rois, batch_inds, indexs], [2, 3, 4, 5]) + + outputs['assigned_rois'] = assigned_rois + outputs['assign_indexs'] = assign_indexs + outputs['assigned_layer_inds'] = assigned_layer_inds + + cropped_rois = [] + ordered_rois = [] + ordered_index = [] + pyramid_feature = [] + for i in range(5, 1, -1): + p = 'P%d'%i + splitted_rois = assigned_rois[i-2] + batch_inds = assigned_batch_inds[i-2] + index = assign_indexs[i-2] + cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + cropped_rois.append(cropped) + ordered_rois.append(splitted_rois) + ordered_index.append(index) + pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) + + cropped_rois = tf.concat(values=cropped_rois, axis=0) + ordered_rois = tf.concat(values=ordered_rois, axis=0) + ordered_index = tf.concat(values=ordered_index, axis=0) + pyramid_feature = tf.concat(values=pyramid_feature, axis=0) + + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + + outputs['ordered_rois'] = ordered_rois + outputs['ordered_index'] = ordered_index + outputs['pyramid_feature'] = pyramid_feature + + outputs['roi']['cropped_rois'] = cropped_rois + tf.add_to_collection('__CROPPED__', cropped_rois) + + ## refine head + # to 7 x 7 + cropped_regions = slim.max_pool2d(cropped_rois, [3, 3], stride=2, padding='SAME') + refine = slim.flatten(cropped_regions) + refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) + refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) + refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) + refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) + cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + box = slim.fully_connected(refine, num_classes*4, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + + outputs['refined'] = {'box': box, 'cls': cls2} + + ## decode refine net outputs + cls2_prob = tf.nn.softmax(cls2) + final_boxes, classes, scores = \ + roi_decoder(box, cls2_prob, ordered_rois, ih, iw) + + ## for testing, maskrcnn takes refined boxes as inputs + if not is_training: + + inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) + [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) + + cropped_rois = [] + ordered_inst_boxes = [] + ordered_inst_classes = [] + ordered_inst_prob = [] + for i in range(5, 1, -1): + p = 'P%d'%i + splitted_rois = assigned_rois[i-2] + splitted_classes = assigned_classes[i-2] + splitted_prob = assigned_prob[i-2] + batch_inds = assigned_batch_inds[i-2] + cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + cropped_rois.append(cropped) + ordered_inst_boxes.append(splitted_rois) + ordered_inst_classes.append(splitted_classes) + ordered_inst_prob.append(splitted_prob) + + + cropped_rois = tf.concat(values=cropped_rois, axis=0) + ordered_inst_boxes = tf.concat(values=ordered_inst_boxes, axis=0) + ordered_inst_classes = tf.concat(values=ordered_inst_classes, axis=0) + ordered_inst_prob = tf.concat(values=ordered_inst_prob, axis=0) + outputs['final_boxes'] = {'box': ordered_inst_boxes, 'cls': ordered_inst_classes, 'prob': ordered_inst_prob, 'rpn_box': ordered_rois} + else: + outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} + + ## mask head + m = cropped_rois + for _ in range(4): + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) + # to 28 x 28 + m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) + tf.add_to_collection('__TRANSPOSED__', m) + m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) + + # add a mask, given the predicted boxes and classes + outputs['mask'] = {'mask':m, 'cls': classes, 'score': scores} + outputs['mask']['final_mask'] = tf.nn.sigmoid(m) + + return outputs + +def build_losses(pyramid, outputs, gt_boxes, gt_masks, + num_classes, base_anchors, + rpn_box_lw =1.0, rpn_cls_lw = 1.0, + refined_box_lw=1.0, refined_cls_lw=1.0, + mask_lw=1.0): + """Building 3-way output losses, totally 5 losses + Params: + ------ + outputs: output of build_heads + gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] + gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] + *_lw: loss weight of rpn, refined and mask losses + + Returns: + ------- + l: a loss tensor + """ + + # losses for pyramid + losses = [] + rpn_box_losses, rpn_cls_losses = [], [] + refined_box_losses, refined_cls_losses = [], [] + mask_losses = [] + + # watch some info during training + rpn_batch = [] + refine_batch = [] + mask_batch = [] + rpn_batch_pos = [] + refine_batch_pos = [] + mask_batch_pos = [] + + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + + ## assigning gt_boxes + [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) + + ## build losses for PFN + + for i in range(5, 1, -1): + p = 'P%d' % i + stride = 2 ** i + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + + splitted_gt_boxes = assigned_gt_boxes[i-2] + + ### rpn losses + # 1. encode ground truth + # 2. compute distances + # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + all_anchors = outputs['rpn'][p]['anchor'] + all_indexs = outputs['rpn'][p]['index'] + labels, bbox_targets, bbox_inside_weights, all_indexs = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') + boxes = outputs['rpn'][p]['box'] + classes = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) + + labels, all_indexs, classes, boxes, bbox_targets, bbox_inside_weights = \ + _filter_negative_samples(tf.reshape(labels, [-1]), [ + tf.reshape(labels, [-1]), + tf.reshape(all_indexs, [-1]), + tf.reshape(classes, [-1, 2]), + tf.reshape(boxes, [-1, 4]), + tf.reshape(bbox_targets, [-1, 4]), + tf.reshape(bbox_inside_weights, [-1, 4]) + ]) + # _, frac_ = _get_valid_sample_fraction(labels) + rpn_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 0), tf.float32 + ))) + rpn_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 1), tf.float32 + ))) + # if i is 2: + # outputs['tmp_3'] = classes + # outputs['tmp_4'] = all_indexs + + rpn_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) + rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) + rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) + rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) + rpn_box_losses.append(rpn_box_loss) + + # NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses + # BUT these examples still count when computing the average of softmax_cross_entropy, + # the loss become smaller by a factor (None_negtive_labels / all_labels) + # the BEST practise still should be gathering all none-negative examples + labels = slim.one_hot_encoding(labels, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros + rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) + rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) + rpn_cls_losses.append(rpn_cls_loss) + + # outputs['tmp_3'] = ordered_rois + # outputs['tmp_4'] = ordered_index + + + ### refined loss + # 1. encode ground truth + # 2. compute distances + ordered_rois_refined = outputs['ordered_rois'] + ordered_index_refined = outputs['ordered_index'] + #rois = outputs['roi']['box'] + + boxes = outputs['refined']['box'] + classes = outputs['refined']['cls'] + + labels, bbox_targets, bbox_inside_weights, max_overlaps, ordered_index_refined = \ + roi_encoder(gt_boxes, ordered_rois_refined, num_classes, ordered_index_refined, scope='ROIEncoder') + + outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) + outputs['final_boxes']['max_overlaps'] = max_overlaps + outputs['gt'] = gt_boxes + + labels, ordered_index_refined, ordered_rois_refined, classes, boxes, bbox_targets, bbox_inside_weights = \ + _filter_negative_samples(tf.reshape(labels, [-1]),[ + tf.reshape(labels, [-1]), + tf.reshape(ordered_index_refined, [-1]), + tf.reshape(ordered_rois_refined, [-1, 4]), + tf.reshape(classes, [-1, num_classes]), + tf.reshape(boxes, [-1, num_classes * 4]), + tf.reshape(bbox_targets, [-1, num_classes * 4]), + tf.reshape(bbox_inside_weights, [-1, num_classes * 4]) + ] ) + + # outputs['tmp_3'] = ordered_rois_refined + # outputs['tmp_4'] = ordered_index_refined + # frac, frac_ = _get_valid_sample_fraction(labels, 1) + refine_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 0), tf.float32 + ))) + refine_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 1), tf.float32 + ))) + + refined_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) + refined_box_loss = tf.reshape(refined_box_loss, [-1, 4]) + refined_box_loss = tf.reduce_sum(refined_box_loss, axis=1) + refined_box_loss = refined_box_lw * tf.reduce_mean(refined_box_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, refined_box_loss) + refined_box_losses.append(refined_box_loss) + + labels = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) + refined_cls_loss = refined_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) + refined_cls_loss = tf.reduce_mean(refined_cls_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) + refined_cls_losses.append(refined_cls_loss) + + outputs['tmp_5'] = labels + outputs['tmp_4'] = classes + + ### mask loss + # mask of shape (N, h, w, num_classes) + masks = outputs['mask']['mask'] + + ordered_rois_mask = outputs['ordered_rois'] + ordered_index_mask = outputs['ordered_index'] + # mask_shape = tf.shape(masks) + # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], + # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) + labels, mask_targets, mask_inside_weights, mask_rois, ordered_index_mask= \ + mask_encoder_(gt_masks, gt_boxes, ordered_rois_mask, num_classes, 28, 28, ordered_index_mask,scope='MaskEncoder') + + labels, ordered_index_mask, ordered_rois_mask, masks, mask_targets, mask_inside_weights, mask_rois = \ + _filter_negative_samples(tf.reshape(labels, [-1]), [ + tf.reshape(labels, [-1]), + tf.reshape(ordered_index_mask, [-1]), + tf.reshape(ordered_rois_mask, [-1, 4]), + tf.reshape(masks, [-1, 28, 28, num_classes]), + tf.reshape(mask_targets, [-1, 28, 28, num_classes]), + tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), + tf.reshape(mask_rois, [-1, 4]) + ]) + # _, frac_ = _get_valid_sample_fraction(labels) + + # outputs['tmp_0'] = labels + # outputs['tmp_1'] = mask_targets + # outputs['tmp_2'] = mask_inside_weights + # outputs['tmp_3'] = mask_rois + # outputs['tmp_4'] = ordered_index_mask + + mask_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 0), tf.float32 + ))) + mask_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(labels, 1), tf.float32 + ))) + # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) + # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) + # NOTE: w/o competition between classes. + + outputs['tmp_0'] = mask_rois + outputs['tmp_1'] = labels + outputs['tmp_2'] = tf.nn.sigmoid(masks) + outputs['tmp_3'] = mask_targets + + mask_targets = tf.cast(mask_targets, tf.float32) + mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) + mask_loss = tf.reduce_mean(mask_loss) + mask_loss = tf.cond(tf.greater(tf.size(labels), 0), lambda: mask_loss, lambda: tf.constant(0.0)) + tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) + mask_losses.append(mask_loss) + + rpn_box_losses = tf.add_n(rpn_box_losses) + rpn_cls_losses = tf.add_n(rpn_cls_losses) + refined_box_losses = tf.add_n(refined_box_losses) + refined_cls_losses = tf.add_n(refined_cls_losses) + mask_losses = tf.add_n(mask_losses) + losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] + total_loss = tf.add_n(losses) + + rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) + refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) + mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) + rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) + refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) + mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) + + return total_loss, losses, [rpn_batch_pos, rpn_batch, \ + refine_batch_pos, refine_batch, \ + mask_batch_pos, mask_batch] + +def decode_output(outputs): + """decode outputs into boxes and masks""" + return [], [], [] + +def build(end_points, image_height, image_width, pyramid_map, + num_classes, + base_anchors, + is_training, + gt_boxes, + gt_masks, + loss_weights=[0.5, 0.5, 1.0, 0.5, 0.1]): + + pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + + for p in pyramid: + print (p) + + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training, gt_boxes=gt_boxes) + + if is_training: + loss, losses, batch_info = build_losses(pyramid, outputs, + gt_boxes, gt_masks, + num_classes=num_classes, base_anchors=base_anchors, + rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], + refined_box_lw=loss_weights[2], refined_cls_lw=loss_weights[3], + mask_lw=loss_weights[4]) + + outputs['losses'] = losses + outputs['total_loss'] = loss + outputs['batch_info'] = batch_info + + ## just decode outputs into readable prediction + pred_boxes, pred_classes, pred_masks = decode_output(outputs) + outputs['pred_boxes'] = pred_boxes + outputs['pred_classes'] = pred_classes + outputs['pred_masks'] = pred_masks + + # image and gt visualization + visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) + + # rpn visualization + visualize_bb(end_points["input"], outputs['roi']["box"], name="rpn_bb_visualization") + + # final network visualization + first_mask = outputs['mask']['mask'][:1] + first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) + + visualize_final_predictions(outputs['final_boxes']["box"], end_points["input"], first_mask) + + return outputs diff --git a/train/train.py b/train/train.py index 1dcf585..f703fe3 100644 --- a/train/train.py +++ b/train/train.py @@ -199,7 +199,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1.0, 0.1, 1.0, 0.1, 0.1]) + loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) @@ -224,12 +224,14 @@ def train(): tmp_2 = outputs['losses'] tmp_3 = outputs['losses'] tmp_4 = outputs['losses'] + tmp_5 = outputs['losses'] tmp_0 = outputs['tmp_0'] tmp_1 = outputs['tmp_1'] tmp_2 = outputs['tmp_2'] tmp_3 = outputs['tmp_3'] tmp_4 = outputs['tmp_4'] + tmp_5 = outputs['tmp_5'] ############################ @@ -276,16 +278,16 @@ def train(): rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, \ gt_boxesnp, \ rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch, \ - input_imagenp, final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ + input_imagenp, final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np= \ sess.run([update_op, total_loss, regular_loss, img_id] + losses + [gt_boxes] + batch_info + - [input_image] + [final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) + [input_image] + [final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5]) duration_time = time.time() - start_time if step % 1 == 0: - logger.info ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ + print ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ """total-loss %.4f(%.4f, %.4f, %.6f, %.4f, %.4f), """ """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" @@ -293,15 +295,21 @@ def train(): tot_loss, rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch)) - # logger.info (np.array(tmp_0np).shape) - # logger.info (np.array(tmp_1np).shape) - # logger.info (np.array(tmp_2np).shape) - # logger.info (np.array(tmp_3np).shape) - # logger.info (np.array(tmp_4np).shape) - # logger.info (np.amax(np.array(tmp_4np))) - # logger.info (np.amin(np.array(tmp_4np))) + # print (np.array(tmp_0np).shape) + # print (np.array(tmp_1np).shape) + # print (np.array(tmp_2np).shape) + # print (np.array(tmp_3np).shape) + # print (np.array(tmp_4np).shape) + # print (np.amax(np.array(tmp_4np))) + # print (np.amin(np.array(tmp_4np))) - #logger.info (np.array_equal(np.array(tmp_0np)[np.array(tmp_4np)], np.array(tmp_3np))) + #print (np.array_equal(np.array(tmp_0np)[np.array(tmp_4np)], np.array(tmp_3np))) + #print (np.array(tmp_3np)) + + print ("labels") + print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_5np),axis=1)))) + print ("classes") + print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) if step % 50 == 0: @@ -335,10 +343,10 @@ def train(): mask=tmp_3np, vis_all=True) - # logger.info ("labels") - # logger.info (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) - # logger.info ("classes") - # logger.info (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + # print ("labels") + # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) + # print ("classes") + # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) if np.isnan(tot_loss) or np.isinf(tot_loss): From f5658d60a5f181728c58ab54e11e83c9501e1fb5 Mon Sep 17 00:00:00 2001 From: souryuu Date: Fri, 28 Jul 2017 10:08:12 +0900 Subject: [PATCH 06/35] fixed some indention --- libs/configs/config_v1.py | 2 +- libs/layers/mask.py | 23 +--------------- libs/layers/roi.py | 2 -- libs/layers/wrapper.py | 28 ++++++++++---------- libs/nets/pyramid_network.py | 45 +++++++++++++++---------------- train/train.py | 51 +++++++++++++++--------------------- 6 files changed, 60 insertions(+), 91 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index dbb8c86..4aab6b8 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.0002, +tf.app.flags.DEFINE_float('learning_rate', 0.002, 'Initial learning rate.') tf.app.flags.DEFINE_float( diff --git a/libs/layers/mask.py b/libs/layers/mask.py index 7b83591..4212800 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -8,18 +8,10 @@ import libs.boxes.cython_bbox as cython_bbox import libs.configs.config_v1 as cfg from libs.logs.log import LOG -import logging from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes import tensorflow as tf _DEBUG = False -def log(file_name='log'): - logger = logging.getLogger(__name__) - logger.setLevel(logging.INFO) - handler = logging.FileHandler(file_name+'.log') - handler.setLevel(logging.INFO) - logger.addHandler(handler) - return logger def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): """Encode masks groundtruth into learnable targets @@ -59,8 +51,6 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) if keep_inds.size > 0 and num_masks < keep_inds.size: keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) - LOG('Masks: %d of %d rois are considered positive mask. Number of masks %d'\ - %(num_masks, rois.shape[0], gt_masks.shape[0])) labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] @@ -130,8 +120,6 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) if keep_inds.size > 0 and num_masks < keep_inds.size: keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) - LOG('Masks: %d of %d rois are considered positive mask. Number of masks %d'\ - %(num_masks, rois.shape[0], gt_masks.shape[0])) labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] @@ -140,7 +128,6 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde rois [rois < 0] = 0 # TODO: speed bottleneck? - #logger=log() for i in keep_inds: gt_height = gt_masks.shape[1] @@ -149,7 +136,6 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde enlarged_height = mask_height*50 roi = rois[i, :4] - #logger.info("""roi %d: %s""" % (i, roi)) cropped = gt_masks[gt_assignment[i], :, :] # print("start") # print(cropped.shape) @@ -165,7 +151,6 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde # roi = rois[i, :4] - # #logger.info("""roi %d: %s""" % (i, roi)) # enlarged_width = (mask_width*50.0).astype(np.float32) # enlarged_height = (mask_height*50.0).astype(np.float32) @@ -175,7 +160,6 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde # cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) mask_targets[i, :, :, labels[i]] = cropped - #logger.info("""cropped %s""" % (cropped)) mask_inside_weights[i, :, :, labels[i]] = 1 # print("in mask.py rois: ", roi) mask_rois = rois[:, :4] @@ -228,9 +212,7 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde # num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) # if keep_inds.size > 0 and num_masks < keep_inds.size: # keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) -# LOG('Masks: %d of %d rois are considered positive mask. Number of masks %d'\ -# %(num_masks, rois.shape[0], gt_masks.shape[0])) - +# # labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] # mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) @@ -238,15 +220,12 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde # rois [rois < 0] = 0 # # TODO: speed bottleneck? -# #logger=log() # for i in keep_inds: # roi = rois[i, :4] -# #logger.info("""roi %d: %s""" % (i, roi)) # cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] # cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) # mask_targets[i, :, :, labels[i]] = cropped -# #logger.info("""cropped %s""" % (cropped)) # mask_inside_weights[i, :, :, labels[i]] = 1 # # print("in mask.py rois: ", roi) # mask_rois = rois[:, :4] diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 466bee3..a2a3286 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -79,8 +79,6 @@ def encode(gt_boxes, rois, num_classes, indexs): print ('cfg.FLAGS.bg_threshold:', cfg.FLAGS.bg_threshold) # print (max_overlaps) - LOG('ROIEncoder: %d positive rois, %d negative rois' % (len(fg_inds), len(bg_inds))) - bbox_targets, bbox_inside_weights = _compute_targets( rois[keep_inds, 0:4], gt_boxes[gt_assignment[keep_inds], :4], labels[keep_inds], num_classes) bbox_targets = _unmap(bbox_targets, num_rois, keep_inds, 0) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 27a0d19..704f338 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -35,7 +35,7 @@ def anchor_encoder(gt_boxes, all_anchors, height, width, stride, indexs, scope=' bbox_inside_weights = tf.reshape(bbox_inside_weights, (1, height, width, -1)) - return labels, bbox_targets, bbox_inside_weights, indexs + return labels, bbox_targets, bbox_inside_weights, indexs def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): @@ -56,7 +56,7 @@ def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): classes = tf.reshape(classes, (-1, )) scores = tf.reshape(scores, (-1, )) - return final_boxes, classes, scores, indexs + return final_boxes, classes, scores, indexs def roi_encoder(gt_boxes, rois, num_classes, indexs, scope='ROIEncoder'): @@ -78,7 +78,7 @@ def roi_encoder(gt_boxes, rois, num_classes, indexs, scope='ROIEncoder'): bbox_inside_weights = tf.reshape(bbox_inside_weights, (-1, num_classes * 4)) max_overlaps = tf.reshape(max_overlaps,(-1, )) - return labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs + return labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): @@ -93,7 +93,7 @@ def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): scores = tf.convert_to_tensor(scores, name='scores') final_boxes = tf.reshape(final_boxes, (-1, 4)) - return final_boxes, classes, scores + return final_boxes, classes, scores def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): @@ -109,7 +109,7 @@ def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) - return labels, mask_targets, mask_inside_weights + return labels, mask_targets, mask_inside_weights # def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): @@ -152,7 +152,7 @@ def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) mask_rois = tf.reshape(mask_rois,(-1, 4)) - return labels, mask_targets, mask_inside_weights, mask_rois, indexs + return labels, mask_targets, mask_inside_weights, mask_rois, indexs def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): @@ -164,7 +164,7 @@ def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): Mask = tf.convert_to_tensor(Mask, name='MaskImage') Mask = tf.reshape(Mask, (ih, iw)) - return Mask + return Mask def sample_wrapper(boxes, scores, indexs, is_training=True, scope='SampleBoxes'): @@ -183,7 +183,7 @@ def sample_wrapper(boxes, scores, indexs, is_training=True, scope='SampleBoxes') batch_inds = tf.reshape(batch_inds, [-1]) indexs = tf.reshape(indexs, [-1]) - return boxes, scores, batch_inds, indexs + return boxes, scores, batch_inds, indexs def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, scope='SampleBoxesWithGT'): @@ -202,7 +202,7 @@ def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, sc mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='MaskBatchInds') mask_indexs = tf.convert_to_tensor(mask_indexs, name='Indexs') - return boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs + return boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): @@ -272,9 +272,9 @@ def inst_inference(final_boxes, classes, cls2_prob, scope='instInference'): [final_boxes, classes, cls2_prob], [tf.float32, tf.int32, tf.float32, tf.int32]) - inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') - inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') - inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') + inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') + inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') + batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file + return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index c4e4151..ca5f843 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -219,6 +219,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with slim.arg_scope(arg_scope): with tf.variable_scope('pyramid'): # for p in pyramid: @@ -428,12 +429,12 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g outputs['mask'] = {'mask':m} outputs['mask']['final_mask'] = tf.nn.sigmoid(m) - return outputs + return outputs def build_losses(pyramid, outputs, gt_boxes, gt_masks, num_classes, base_anchors, - rpn_box_lw =1.0, rpn_cls_lw = 1.0, - refined_box_lw=1.0, refined_cls_lw=1.0, + rpn_box_lw =0.1, rpn_cls_lw = 0.1, + refined_box_lw=1.0, refined_cls_lw=0.1, mask_lw=1.0): """Building 3-way output losses, totally 5 losses Params: @@ -647,24 +648,24 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) mask_losses.append(mask_loss) - rpn_box_losses = tf.add_n(rpn_box_losses) - rpn_cls_losses = tf.add_n(rpn_cls_losses) - refined_box_losses = tf.add_n(refined_box_losses) - refined_cls_losses = tf.add_n(refined_cls_losses) - mask_losses = tf.add_n(mask_losses) - losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] - total_loss = tf.add_n(losses) - - rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) - refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) - mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) - rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) - refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) - mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) - - return total_loss, losses, [rpn_batch_pos, rpn_batch, \ - refine_batch_pos, refine_batch, \ - mask_batch_pos, mask_batch] + rpn_box_losses = tf.add_n(rpn_box_losses) + rpn_cls_losses = tf.add_n(rpn_cls_losses) + refined_box_losses = tf.add_n(refined_box_losses) + refined_cls_losses = tf.add_n(refined_cls_losses) + mask_losses = tf.add_n(mask_losses) + losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] + total_loss = tf.add_n(losses) + + rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) + refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) + mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) + rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) + refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) + mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) + + return total_loss, losses, [rpn_batch_pos, rpn_batch, \ + refine_batch_pos, refine_batch, \ + mask_batch_pos, mask_batch] def decode_output(outputs): """decode outputs into boxes and masks""" @@ -676,7 +677,7 @@ def build(end_points, image_height, image_width, pyramid_map, is_training, gt_boxes, gt_masks, - loss_weights=[0.5, 0.5, 1.0, 0.5, 0.1]): + loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) diff --git a/train/train.py b/train/train.py index f703fe3..119387a 100644 --- a/train/train.py +++ b/train/train.py @@ -10,7 +10,7 @@ import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim -import logging + from time import gmtime, strftime sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) @@ -159,18 +159,9 @@ def restore(sess): print ('Checking your params %s' %(checkpoint_path)) raise -def log(): - logger = logging.getLogger(__name__) - logger.setLevel(logging.INFO) - handler = logging.FileHandler('log.log') - handler.setLevel(logging.INFO) - logger.addHandler(handler) - return logger - def train(): """The main function that runs training""" - ## data image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ datasets.get_dataset(FLAGS.dataset_name, @@ -178,7 +169,7 @@ def train(): FLAGS.dataset_dir, FLAGS.im_batch, is_training=True) - logger = log() + data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, dtypes=( image.dtype, ih.dtype, iw.dtype, @@ -199,7 +190,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]) + loss_weights=[1, 1, 1000.0, 10.0, 100.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) @@ -209,22 +200,22 @@ def train(): regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) input_image = end_points['input'] - final_box = outputs['final_boxes']['box'] - final_cls = outputs['final_boxes']['cls'] - final_prob = outputs['final_boxes']['prob'] - final_gt_cls = outputs['final_boxes']['gt_cls'] - final_rpn_box = outputs['final_boxes']['rpn_box'] - final_max_overlaps = outputs['final_boxes']['max_overlaps'] - final_mask = outputs['mask']['mask']#outputs['mask']['final_mask'] - gt = outputs['gt'] + # final_box = outputs['final_boxes']['box'] + # final_cls = outputs['final_boxes']['cls'] + # final_prob = outputs['final_boxes']['prob'] + # final_gt_cls = outputs['final_boxes']['gt_cls'] + # final_rpn_box = outputs['final_boxes']['rpn_box'] + # final_max_overlaps = outputs['final_boxes']['max_overlaps'] + # final_mask = outputs['mask']['mask']#outputs['mask']['final_mask'] + # gt = outputs['gt'] ############################# - tmp_0 = outputs['losses'] - tmp_1 = outputs['losses'] - tmp_2 = outputs['losses'] - tmp_3 = outputs['losses'] - tmp_4 = outputs['losses'] - tmp_5 = outputs['losses'] + # tmp_0 = outputs['losses'] + # tmp_1 = outputs['losses'] + # tmp_2 = outputs['losses'] + # tmp_3 = outputs['losses'] + # tmp_4 = outputs['losses'] + # tmp_5 = outputs['losses'] tmp_0 = outputs['tmp_0'] tmp_1 = outputs['tmp_1'] @@ -278,13 +269,14 @@ def train(): rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, \ gt_boxesnp, \ rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch, \ - input_imagenp, final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np= \ + input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np= \ sess.run([update_op, total_loss, regular_loss, img_id] + losses + [gt_boxes] + batch_info + - [input_image] + [final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5]) - + [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5]) + # final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, + #[final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + duration_time = time.time() - start_time if step % 1 == 0: print ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ @@ -311,7 +303,6 @@ def train(): print ("classes") print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) - if step % 50 == 0: # draw_bbox(step, # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), From 93523f4c42789a497c122fbfd18a9cdae52649c9 Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 31 Jul 2017 14:37:06 +0900 Subject: [PATCH 07/35] clean up variable names and comments --- libs/configs/config_v1.py | 2 +- libs/layers/__init__.py | 2 - libs/layers/crop.py | 46 +--- libs/layers/mask.py | 94 +------- libs/layers/wrapper.py | 45 +--- libs/nets/pyramid_network.py | 402 ++++++++++++++--------------------- train/train.py | 89 +++----- 7 files changed, 197 insertions(+), 483 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 4aab6b8..dbb8c86 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.002, +tf.app.flags.DEFINE_float('learning_rate', 0.0002, 'Initial learning rate.') tf.app.flags.DEFINE_float( diff --git a/libs/layers/__init__.py b/libs/layers/__init__.py index b60ad26..d0bbc61 100644 --- a/libs/layers/__init__.py +++ b/libs/layers/__init__.py @@ -12,11 +12,9 @@ from .wrapper import roi_encoder from .wrapper import mask_decoder from .wrapper import mask_encoder -from .wrapper import mask_encoder_ from .wrapper import sample_wrapper as sample_rpn_outputs from .wrapper import sample_with_gt_wrapper as sample_rpn_outputs_with_gt from .wrapper import gen_all_anchors from .wrapper import assign_boxes from .crop import crop as ROIAlign -from .crop import crop_ as ROIAlign_ from .wrapper import inst_inference diff --git a/libs/layers/crop.py b/libs/layers/crop.py index 1b314c8..cd18deb 100644 --- a/libs/layers/crop.py +++ b/libs/layers/crop.py @@ -4,7 +4,7 @@ import tensorflow as tf -def crop(images, boxes, batch_inds, stride = 1, pooled_height = 7, pooled_width = 7, scope='ROIAlign'): +def crop(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pooled_width = 7, scope='ROIAlign'): """Cropping areas of features into fixed size Params: -------- @@ -18,48 +18,6 @@ def crop(images, boxes, batch_inds, stride = 1, pooled_height = 7, pooled_width """ with tf.name_scope(scope): # - boxes = boxes / (stride + 0.0) - boxes = tf.reshape(boxes, [-1, 4]) - - # normalize the boxes and swap x y dimensions - shape = tf.shape(images) - boxes = tf.reshape(boxes, [-1, 2]) # to (x, y) - xs = boxes[:, 0] - ys = boxes[:, 1] - xs = xs / tf.cast(shape[2], tf.float32) - ys = ys / tf.cast(shape[1], tf.float32) - boxes = tf.concat([ys[:, tf.newaxis], xs[:, tf.newaxis]], axis=1) - boxes = tf.reshape(boxes, [-1, 4]) # to (y1, x1, y2, x2) - - # if batch_inds is False: - # num_boxes = tf.shape(boxes)[0] - # batch_inds = tf.zeros([num_boxes], dtype=tf.int32, name='batch_inds') - # batch_inds = boxes[:, 0] * 0 - # batch_inds = tf.cast(batch_inds, tf.int32) - - # assert_op = tf.Assert(tf.greater(tf.shape(images)[0], tf.reduce_max(batch_inds)), [images, batch_inds]) - assert_op = tf.Assert(tf.greater(tf.size(images), 0), [images, batch_inds]) - with tf.control_dependencies([assert_op, images, batch_inds]): - return tf.image.crop_and_resize(images, boxes, batch_inds, - [pooled_height, pooled_width], - method='bilinear', - name='Crop') - -def crop_(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pooled_width = 7, scope='ROIAlign'): - """Cropping areas of features into fixed size - Params: - -------- - images: a 4-d Tensor of shape (N, H, W, C) - boxes: rois in the original image, of shape (N, ..., 4), [x1, y1, x2, y2] - batch_inds: - - Returns: - -------- - A Tensor of shape (N, pooled_height, pooled_width, C) - """ - with tf.name_scope(scope): - # - boxes_bf = boxes boxes = tf.reshape(boxes, [-1, 4]) # normalize the boxes and swap x y dimensions @@ -85,5 +43,5 @@ def crop_(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pool return [tf.image.crop_and_resize(images, boxes, batch_inds, [pooled_height, pooled_width], method='bilinear', - name='Crop')] + [boxes] + [boxes_bf] + [shape] + [[ih,iw]] + name='Crop')] + [boxes] + [shape] + [[ih,iw]] diff --git a/libs/layers/mask.py b/libs/layers/mask.py index 4212800..d4b5597 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -13,76 +13,7 @@ _DEBUG = False -def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): - """Encode masks groundtruth into learnable targets - Sample some exmaples - - Params - ------ - gt_masks: image_height x image_width {0, 1} matrix, of shape (G, imh, imw) - gt_boxes: ground-truth boxes of shape (G, 5), each raw is [x1, y1, x2, y2, class] - rois: the bounding boxes of shape (N, 4), - ## scores: scores of shape (N, 1) - num_classes; K - mask_height, mask_width: height and width of output masks - - Returns - ------- - # rois: boxes sampled for cropping masks, of shape (M, 4) - labels: class-ids of shape (M, 1) - mask_targets: learning targets of shape (M, pooled_height, pooled_width, K) in {0, 1} values - mask_inside_weights: of shape (M, pooled_height, pooled_width, K) in {0, 1}Í indicating which mask is sampled - """ - total_masks = rois.shape[0] - if gt_boxes.size > 0: - # B x G - overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(rois[:, 0:4], dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) - gt_assignment = overlaps.argmax(axis=1) # shape is N - max_overlaps = overlaps[np.arange(len(gt_assignment)), gt_assignment] # N - # note: this will assign every rois with a positive label - # labels = gt_boxes[gt_assignment, 4] # N - labels = np.zeros((total_masks, ), np.float32) - labels[:] = -1 - - # sample positive rois which intersection is more than 0.5 - keep_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] - num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) - if keep_inds.size > 0 and num_masks < keep_inds.size: - keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) - - labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] - - # rois = rois[inds] - # labels = labels[inds].astype(np.int32) - # gt_assignment = gt_assignment[inds] - - # mask are only defined on positive rois - # ignore_inds = np.where((max_overlaps < cfg.FLAGS.mask_threshold))[0] - # labels[ignore_inds] = -1 - - mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.int32) - mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) - rois [rois < 0] = 0 - - # TODO: speed bottleneck? - for i in keep_inds: - roi = rois[i, :4] - cropped = gt_masks[gt_assignment[i], int(roi[1]):int(roi[3])+1, int(roi[0]):int(roi[2])+1] - cropped = cv2.resize(cropped, (mask_width, mask_height), interpolation=cv2.INTER_NEAREST) - - mask_targets[i, :, :, int(labels[i])] = cropped - mask_inside_weights[i, :, :, int(labels[i])] = 1 - else: - # there is no gt - labels = np.zeros((total_masks, ), np.float32) - labels[:] = -1 - mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.int32) - mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) - return labels, mask_targets, mask_inside_weights - -def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): +def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): """Encode masks groundtruth into learnable targets Sample some exmaples @@ -128,6 +59,7 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde rois [rois < 0] = 0 # TODO: speed bottleneck? + # TODO: mask ground truth accuracy check for i in keep_inds: gt_height = gt_masks.shape[1] @@ -137,34 +69,16 @@ def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, inde roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], :, :] - # print("start") - # print(cropped.shape) cropped = cv2.resize(cropped.astype(np.float32), (enlarged_width.astype(np.float32), enlarged_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) - # print(cropped.shape) cropped = cropped[ int(round(roi[1]*enlarged_height/float(gt_height))) : int(round(roi[3]*enlarged_height/float(gt_height))), int(round(roi[0]*enlarged_width /float(gt_width ))) : int(round(roi[2]*enlarged_width /float(gt_width ))) ] - # print(cropped.shape) cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) - # print(cropped.shape) - # print("=====") - - # roi = rois[i, :4] - # enlarged_width = (mask_width*50.0).astype(np.float32) - # enlarged_height = (mask_height*50.0).astype(np.float32) - - # cropped = gt_masks[gt_assignment[i], :, :] - # cropped = cv2.resize(cropped, (enlarged_width, enlarged_height), interpolation=cv2.INTER_LINEAR) - # cropped = cropped[int(round(roi[1]/*enlarged_height)):int(round(roi[3]*enlarged_height)), int(round(roi[0]*enlarged_width)):int(round(roi[2]*enlarged_width))] - # cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) - mask_targets[i, :, :, labels[i]] = cropped - mask_inside_weights[i, :, :, labels[i]] = 1 - # print("in mask.py rois: ", roi) + mask_inside_weights[i, :, :, labels[i]] = 1.0 + mask_rois = rois[:, :4] - # print("in mask.py rois2: ") - # print(mask_rois) else: # there is no gt labels = np.zeros((total_masks, ), np.int32) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 704f338..4a8d661 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -95,22 +95,6 @@ def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): return final_boxes, classes, scores -def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): - - with tf.name_scope(scope) as sc: - labels, mask_targets, mask_inside_weights = \ - tf.py_func(mask.encode, - [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width], - [tf.float32, tf.int32, tf.float32]) - labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') - mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') - mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') - labels = tf.reshape(labels, (-1,)) - mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) - mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) - - return labels, mask_targets, mask_inside_weights - # def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): # with tf.name_scope(scope) as sc: @@ -132,11 +116,11 @@ def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, # return labels, mask_targets, mask_inside_weights, mask_rois, indexs -def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): +def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): with tf.name_scope(scope) as sc: labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ - tf.py_func(mask.encode_, + tf.py_func(mask.encode, [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) @@ -240,31 +224,6 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] -# def assign_boxes_(gt_boxes, tensors, layers, scope='AssignGTBoxes'): - -# with tf.name_scope(scope) as sc: -# min_k = layers[0] -# max_k = layers[-1] -# assigned_layers = \ -# tf.py_func(assign.assign_boxes, -# [ gt_boxes, min_k, max_k ], -# tf.int32) -# assigned_layers = tf.reshape(assigned_layers, [-1]) - -# assigned_tensors = [] -# for t in tensors: -# split_tensors = [] -# for l in layers: -# tf.cast(l, tf.int32) -# inds = tf.where(tf.equal(assigned_layers, l)) -# inds = tf.reshape(inds, [-1]) -# split_tensors.append(tf.gather(t, inds)) -# assigned_tensors.append(split_tensors) - -# ordered_cropped_rois = tf.concat([assigned_tensors[0][3],assigned_tensors[0][2],assigned_tensors[0][1],assigned_tensors[0][0]],0) - -# return [ordered_cropped_rois] + assigned_tensors + [assigned_layers] - def inst_inference(final_boxes, classes, cls2_prob, scope='instInference'): with tf.name_scope(scope) as sc: inst_boxes, inst_classes, inst_prob, batch_inds = \ diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index ca5f843..cd963d7 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -12,11 +12,9 @@ from libs.layers import roi_encoder from libs.layers import roi_decoder from libs.layers import mask_encoder -from libs.layers import mask_encoder_ from libs.layers import mask_decoder from libs.layers import gen_all_anchors from libs.layers import ROIAlign -from libs.layers import ROIAlign_ from libs.layers import sample_rpn_outputs from libs.layers import sample_rpn_outputs_with_gt from libs.layers import assign_boxes @@ -219,16 +217,16 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - + with slim.arg_scope(arg_scope): with tf.variable_scope('pyramid'): - # for p in pyramid: + ### for p in pyramid outputs['rpn'] = {} for i in range(5, 1, -1): p = 'P%d'%i stride = 2 ** i - ## rpn head + ### rpn head shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) @@ -242,199 +240,142 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g all_anchors = gen_all_anchors(height, width, stride, anchor_scales) outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - ## gather all rois - # print (outputs['rpn']) + ### gather all rois rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] - rpn_boxes = tf.concat(values=rpn_boxes, axis=0) rpn_clses = tf.concat(values=rpn_clses, axis=0) rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - - # outputs['rpn'] = {'box': rpn_boxes, 'cls': rpn_clses, 'anchor': rpn_anchors} rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rois, roi_clses, scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] for i in range(4, 1, -1): p = 'P%d'%i outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] - # outputs['tmp_1'] = tf.reduce_prod(tf.shape(outputs['rpn']['P3']['cls']))#outputs['rpn']['P5']['index'] - # outputs['tmp_2'] = outputs['rpn']['P2']['index'] - - outputs['rpn']['box'] = rpn_boxes - outputs['rpn']['cls'] = rpn_clses - outputs['rpn']['anchor'] = rpn_anchors - outputs['rpn']['rois'] = rois - - # outputs['tmp_0'] = rois - # outputs['tmp_1'] = rpn_boxes - # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) - # outputs['tmp_1'] = outputs['rpn']['P5']['index']# tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P4']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P3']['box'], [-1, 4]))[0]+ tf.shape(tf.reshape(outputs['rpn']['P2']['box'], [-1, 4]))[0] - # outputs['tmp_2'] = outputs['rpn']['P4']['index'] - # outputs['tmp_3'] = outputs['rpn']['P3']['index'] - # outputs['tmp_4'] = outputs['rpn']['P2']['index'] + outputs['rpn_boxes'] = rpn_boxes + outputs['rpn_clses'] = rpn_clses + outputs['rpn_anchor'] = rpn_anchors + outputs['rpn_final_boxes'] = rpn_final_boxes + outputs['rpn_final_clses'] = rpn_final_clses + outputs['rpn_final_scores'] = rpn_final_scores + outputs['rpn_indexs'] = indexs if is_training is True: + ### for training, rcnn and maskrcnn take rpn boxes as inputs rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training) else: - rcnn_rois, rcnn_scores, rcnn_batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) - + ### for testing, rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs + ### @TODO Fix testing by is_training=False. Something wrong with "network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=False)" + pass + # rcnn_rois, rcnn_scores, rcnn_batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) - outputs['roi'] = {'box': rcnn_rois, 'score': rcnn_scores} - - ## cropping regions for refined network - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assign_indexs, rcnn_assigned_layer_inds] = \ + ### assign pyramid layer indexs to rcnn network's ROIs + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) - outputs['rcnn_assigned_rois'] = rcnn_assigned_rois - outputs['rcnn_assign_indexs'] = rcnn_assign_indexs - outputs['rcnn_assigned_layer_inds'] = rcnn_assigned_layer_inds - - rcnn_cropped_rois = [] + ### crop features from pyramid for rcnn network + rcnn_cropped_features = [] rcnn_ordered_rois = [] rcnn_ordered_index = [] - rcnn_pyramid_feature = [] for i in range(5, 1, -1): p = 'P%d'%i rcnn_splitted_roi = rcnn_assigned_rois[i-2] rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] - rcnn_index = rcnn_assign_indexs[i-2] - rcnn_cropped, rcnn_boxes_after_crop, rcnn_boxes_before_crop, rcnn_py_shape, rcnn_ihiw = ROIAlign_(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, + rcnn_index = rcnn_assigned_indexs[i-2] + rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) - rcnn_cropped_rois.append(rcnn_cropped) + rcnn_cropped_features.append(rcnn_cropped_feature) rcnn_ordered_rois.append(rcnn_splitted_roi) rcnn_ordered_index.append(rcnn_index) - rcnn_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - rcnn_cropped_rois = tf.concat(values=rcnn_cropped_rois, axis=0) + rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) - rcnn_pyramid_feature = tf.concat(values=rcnn_pyramid_feature, axis=0) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - outputs['rcnn_ordered_rois'] = rcnn_ordered_rois - outputs['rcnn_ordered_index'] = rcnn_ordered_index - outputs['rcnn_pyramid_feature'] = rcnn_pyramid_feature - outputs['roi']['rcnn_cropped_rois'] = rcnn_cropped_rois - tf.add_to_collection('__CROPPED__', rcnn_cropped_rois) - - ## refine head + ### rcnn head # to 7 x 7 - rcnn_cropped_regions = slim.max_pool2d(rcnn_cropped_rois, [3, 3], stride=2, padding='SAME') - refine = slim.flatten(rcnn_cropped_regions) - refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) - refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) - refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, normalizer_fn=None, + rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') + rcnn = slim.flatten(rcnn) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu) + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu) + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) - box = slim.fully_connected(refine, num_classes*4, activation_fn=None, normalizer_fn=None, + rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + rcnn_scores = tf.nn.softmax(rcnn_clses) - outputs['refined'] = {'box': box, 'cls': cls2} - - ## decode refine net outputs - cls2_prob = tf.nn.softmax(cls2) - final_boxes, classes, scores = \ - roi_decoder(box, cls2_prob, rcnn_ordered_rois, ih, iw) + ### decode rcnn network final outputs + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) + + outputs['rcnn_ordered_rois'] = rcnn_ordered_rois + outputs['rcnn_ordered_index'] = rcnn_ordered_index + outputs['rcnn_cropped_features'] = rcnn_cropped_features + tf.add_to_collection('__CROPPED__', rcnn_cropped_features) + outputs['rcnn_boxes'] = rcnn_boxes + outputs['rcnn_clses'] = rcnn_clses + outputs['rcnn_scores'] = rcnn_scores + outputs['rcnn_final_boxes'] = rcnn_final_boxes + outputs['rcnn_final_clses'] = rcnn_final_classes + outputs['rcnn_final_scores'] = rcnn_final_scores + ### assign pyramid layer indexs to mask network's ROIs if is_training: - #outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} - - [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ + [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ assign_boxes(mask_rois, [mask_rois, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) - # [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ - # assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) - - outputs['mask_assigned_rois'] = mask_assigned_rois - outputs['mask_assign_indexs'] = mask_assign_indexs - outputs['mask_assigned_layer_inds'] = mask_assigned_layer_inds - mask_cropped_rois = [] + mask_cropped_features = [] mask_ordered_rois = [] mask_ordered_index = [] - mask_pyramid_feature = [] + ### crop features from pyramid for mask network for i in range(5, 1, -1): p = 'P%d'%i mask_splitted_roi = mask_assigned_rois[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assign_indexs[i-2] - mask_cropped, mask_boxes_after_crop, mask_boxes_before_crop, mask_py_shape, mask_ihiw = ROIAlign_(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + mask_index = mask_assigned_indexs[i-2] + mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) - mask_cropped_rois.append(mask_cropped) + mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) mask_ordered_index.append(mask_index) - mask_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - mask_cropped_rois = tf.concat(values=mask_cropped_rois, axis=0) + mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) mask_ordered_index = tf.concat(values=mask_ordered_index, axis=0) - mask_pyramid_feature = tf.concat(values=mask_pyramid_feature, axis=0) - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_index'] = mask_ordered_index - outputs['mask_pyramid_feature'] = mask_pyramid_feature - - outputs['roi']['mask_cropped_rois'] = mask_cropped_rois else: - ## for testing, maskrcnn takes refined boxes as inputs - inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) - [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) - - mask_cropped_rois = [] - mask_ordered_rois = [] - mask_ordered_classes = [] - mask_ordered_prob = [] - for i in range(5, 1, -1): - p = 'P%d'%i - splitted_rois = assigned_rois[i-2] - splitted_classes = assigned_classes[i-2] - splitted_prob = assigned_prob[i-2] - batch_inds = assigned_batch_inds[i-2] - cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_rois.append(cropped) - mask_ordered_rois.append(splitted_rois) - mask_ordered_classes.append(splitted_classes) - mask_ordered_prob.append(splitted_prob) - - - mask_cropped_rois = tf.concat(values=cropped_rois, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_classes = tf.concat(values=mask_ordered_classes, axis=0) - mask_ordered_prob = tf.concat(values=mask_ordered_prob, axis=0) - outputs['final_boxes'] = {'box': mask_ordered_rois, 'cls': mask_ordered_rois, 'prob': mask_ordered_rois, 'rpn_box': mask_ordered_rois} + ### for testing, maskrcnn takes rcnn boxes as inputs + ### @TODO Fix testing by is_training=False. Something wrong with "network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=False)" + pass - ## mask head - m = mask_cropped_rois + ### mask head + m = mask_cropped_features for _ in range(4): m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) # to 28 x 28 m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) tf.add_to_collection('__TRANSPOSED__', m) m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) - - # add a mask, given the predicted boxes and classes - outputs['mask'] = {'mask':m} - outputs['mask']['final_mask'] = tf.nn.sigmoid(m) + + outputs['mask_ordered_rois'] = mask_ordered_rois + outputs['mask_ordered_index'] = mask_ordered_index + outputs['mask_cropped_features'] = mask_cropped_features + outputs['mask_mask'] = m + outputs['mask_final_mask'] = tf.nn.sigmoid(m) + ### @TODO add a mask, given the predicted boxes and classes return outputs def build_losses(pyramid, outputs, gt_boxes, gt_masks, num_classes, base_anchors, rpn_box_lw =0.1, rpn_cls_lw = 0.1, - refined_box_lw=1.0, refined_cls_lw=0.1, + rcnn_box_lw=1.0, rcnn_cls_lw=0.1, mask_lw=1.0): """Building 3-way output losses, totally 5 losses Params: @@ -442,7 +383,7 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, outputs: output of build_heads gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] - *_lw: loss weight of rpn, refined and mask losses + *_lw: loss weight of rpn, rcnn and mask losses Returns: ------- @@ -452,15 +393,15 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # losses for pyramid losses = [] rpn_box_losses, rpn_cls_losses = [], [] - refined_box_losses, refined_cls_losses = [], [] + rcnn_box_losses, rcnn_cls_losses = [], [] mask_losses = [] # watch some info during training rpn_batch = [] - refine_batch = [] + rcnn_batch = [] mask_batch = [] rpn_batch_pos = [] - refine_batch_pos = [] + rcnn_batch_pos = [] mask_batch_pos = [] if _BN is True: @@ -474,7 +415,6 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) ## build losses for PFN - for i in range(5, 1, -1): p = 'P%d' % i stride = 2 ** i @@ -490,181 +430,159 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) all_anchors = outputs['rpn'][p]['anchor'] all_indexs = outputs['rpn'][p]['index'] - labels, bbox_targets, bbox_inside_weights, all_indexs = \ + rpn_boxes = outputs['rpn'][p]['box'] + rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) + + rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') - boxes = outputs['rpn'][p]['box'] - classes = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - labels, all_indexs, classes, boxes, bbox_targets, bbox_inside_weights = \ - _filter_negative_samples(tf.reshape(labels, [-1]), [ - tf.reshape(labels, [-1]), + rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ + _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ + tf.reshape(rpn_clses_target, [-1]), tf.reshape(all_indexs, [-1]), - tf.reshape(classes, [-1, 2]), - tf.reshape(boxes, [-1, 4]), - tf.reshape(bbox_targets, [-1, 4]), - tf.reshape(bbox_inside_weights, [-1, 4]) + tf.reshape(rpn_clses, [-1, 2]), + tf.reshape(rpn_boxes, [-1, 4]), + tf.reshape(rpn_boxes_target, [-1, 4]), + tf.reshape(rpn_boxes_inside_weight, [-1, 4]) ]) - # _, frac_ = _get_valid_sample_fraction(labels) + rpn_batch.append( tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 + tf.greater_equal(rpn_clses_target, 0), tf.float32 ))) rpn_batch_pos.append( tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 + tf.greater_equal(rpn_clses_target, 1), tf.float32 ))) - # if i is 2: - # outputs['tmp_3'] = classes - # outputs['tmp_4'] = all_indexs - rpn_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) + rpn_box_loss = rpn_boxes_inside_weight * _smooth_l1_dist(rpn_boxes, rpn_boxes_target) rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) rpn_box_losses.append(rpn_box_loss) - # NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses + ### NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses # BUT these examples still count when computing the average of softmax_cross_entropy, # the loss become smaller by a factor (None_negtive_labels / all_labels) # the BEST practise still should be gathering all none-negative examples - labels = slim.one_hot_encoding(labels, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros - rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) + rpn_clses_target = slim.one_hot_encoding(rpn_clses_target, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros + rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rpn_clses_target, logits=rpn_clses) rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) rpn_cls_losses.append(rpn_cls_loss) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - ### refined loss + ### rcnn losses # 1. encode ground truth # 2. compute distances rcnn_ordered_rois = outputs['rcnn_ordered_rois'] rcnn_ordered_index = outputs['rcnn_ordered_index'] - #rois = outputs['roi']['box'] - - boxes = outputs['refined']['box'] - classes = outputs['refined']['cls'] + rcnn_boxes = outputs['rcnn_boxes'] + rcnn_clses = outputs['rcnn_clses'] - labels, bbox_targets, bbox_inside_weights, max_overlaps, rcnn_ordered_index = \ + rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') - outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) - outputs['final_boxes']['max_overlaps'] = max_overlaps - outputs['gt'] = gt_boxes - - labels, rcnn_ordered_index, rcnn_ordered_rois, classes, boxes, bbox_targets, bbox_inside_weights = \ - _filter_negative_samples(tf.reshape(labels, [-1]),[ - tf.reshape(labels, [-1]), + rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ + tf.reshape(rcnn_clses_target, [-1]), tf.reshape(rcnn_ordered_index, [-1]), tf.reshape(rcnn_ordered_rois, [-1, 4]), - tf.reshape(classes, [-1, num_classes]), - tf.reshape(boxes, [-1, num_classes * 4]), - tf.reshape(bbox_targets, [-1, num_classes * 4]), - tf.reshape(bbox_inside_weights, [-1, num_classes * 4]) + tf.reshape(rcnn_clses, [-1, num_classes]), + tf.reshape(rcnn_boxes, [-1, num_classes * 4]), + tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), + tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) ] ) - # outputs['tmp_3'] = ordered_rois_refined - # outputs['tmp_4'] = ordered_index_refined - # frac, frac_ = _get_valid_sample_fraction(labels, 1) - refine_batch.append( + rcnn_batch.append( tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 + tf.greater_equal(rcnn_clses_target, 0), tf.float32 ))) - refine_batch_pos.append( + rcnn_batch_pos.append( tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 + tf.greater_equal(rcnn_clses_target, 1), tf.float32 ))) - refined_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) - refined_box_loss = tf.reshape(refined_box_loss, [-1, 4]) - refined_box_loss = tf.reduce_sum(refined_box_loss, axis=1) - refined_box_loss = refined_box_lw * tf.reduce_mean(refined_box_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, refined_box_loss) - refined_box_losses.append(refined_box_loss) + rcnn_box_loss = rcnn_boxes_inside_weight * _smooth_l1_dist(rcnn_boxes, rcnn_boxes_target) + rcnn_box_loss = tf.reshape(rcnn_box_loss, [-1, 4]) + rcnn_box_loss = tf.reduce_sum(rcnn_box_loss, axis=1) + rcnn_box_loss = rcnn_box_lw * tf.reduce_mean(rcnn_box_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_box_loss) + rcnn_box_losses.append(rcnn_box_loss) - labels = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) - refined_cls_loss = refined_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) - refined_cls_loss = tf.reduce_mean(refined_cls_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) - refined_cls_losses.append(refined_cls_loss) + rcnn_clses_target = slim.one_hot_encoding(rcnn_clses_target, num_classes, on_value=1.0, off_value=0.0) + rcnn_cls_loss = rcnn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rcnn_clses_target, logits=rcnn_clses) + rcnn_cls_loss = tf.reduce_mean(rcnn_cls_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) + rcnn_cls_losses.append(rcnn_cls_loss) - outputs['tmp_5'] = labels - outputs['tmp_4'] = classes + outputs['training_rcnn_clses_target'] = rcnn_clses_target + outputs['training_rcnn_clses'] = rcnn_clses ### mask loss # mask of shape (N, h, w, num_classes) - masks = outputs['mask']['mask'] - mask_ordered_rois = outputs['mask_ordered_rois'] mask_ordered_index = outputs['mask_ordered_index'] - # mask_shape = tf.shape(masks) - # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], - # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) - labels, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index= \ - mask_encoder_(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_index,scope='MaskEncoder') - - labels, mask_ordered_index, mask_ordered_rois, masks, mask_targets, mask_inside_weights, mask_rois = \ - _filter_negative_samples(tf.reshape(labels, [-1]), [ - tf.reshape(labels, [-1]), - tf.reshape(mask_ordered_index, [-1]), - tf.reshape(mask_ordered_rois, [-1, 4]), - tf.reshape(masks, [-1, 28, 28, num_classes]), + masks = outputs['mask_mask'] + + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index= \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_index,scope='MaskEncoder') + + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index, masks = \ + _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ + tf.reshape(mask_clses_target, [-1]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), - tf.reshape(mask_rois, [-1, 4]) + tf.reshape(mask_rois, [-1, 4]), + tf.reshape(mask_ordered_index, [-1]), + tf.reshape(masks, [-1, 28, 28, num_classes]), ]) - # _, frac_ = _get_valid_sample_fraction(labels) - - # outputs['tmp_0'] = labels - # outputs['tmp_1'] = mask_targets - # outputs['tmp_2'] = mask_inside_weights - # outputs['tmp_3'] = mask_rois - # outputs['tmp_4'] = ordered_index_mask mask_batch.append( tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 + tf.greater_equal(mask_clses_target, 0), tf.float32 ))) mask_batch_pos.append( tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 + tf.greater_equal(mask_clses_target, 1), tf.float32 ))) - # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) - # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) - # NOTE: w/o competition between classes. - - outputs['tmp_0'] = mask_rois - outputs['tmp_1'] = labels - outputs['tmp_2'] = tf.nn.sigmoid(masks) - outputs['tmp_3'] = mask_targets - - mask_targets = tf.cast(mask_targets, tf.float32) + ### NOTE: w/o competition between classes. mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) mask_loss = tf.reduce_mean(mask_loss) - mask_loss = tf.cond(tf.greater(tf.size(labels), 0), lambda: mask_loss, lambda: tf.constant(0.0)) + mask_loss = tf.cond(tf.greater(tf.size(mask_clses_target), 0), lambda: mask_loss, lambda: tf.constant(0.0)) tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) mask_losses.append(mask_loss) + outputs['training_mask_rois'] = mask_rois + outputs['training_mask_clses_target'] = mask_clses_target + outputs['training_mask_final_mask'] = tf.nn.sigmoid(masks) + outputs['training_mask_final_mask_target'] = mask_targets + rpn_box_losses = tf.add_n(rpn_box_losses) rpn_cls_losses = tf.add_n(rpn_cls_losses) - refined_box_losses = tf.add_n(refined_box_losses) - refined_cls_losses = tf.add_n(refined_cls_losses) + rcnn_box_losses = tf.add_n(rcnn_box_losses) + rcnn_cls_losses = tf.add_n(rcnn_cls_losses) mask_losses = tf.add_n(mask_losses) - losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] + losses = [rpn_box_losses, rpn_cls_losses, rcnn_box_losses, rcnn_cls_losses, mask_losses] total_loss = tf.add_n(losses) rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) - refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) + rcnn_batch = tf.cast(tf.add_n(rcnn_batch), tf.float32) mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) - refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) + rcnn_batch_pos = tf.cast(tf.add_n(rcnn_batch_pos), tf.float32) mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) + + ### for debuging + outputs['tmp_0'] = rpn_cls_losses + outputs['tmp_1'] = rpn_cls_losses + outputs['tmp_2'] = rpn_cls_losses + outputs['tmp_3'] = rpn_cls_losses + outputs['tmp_4'] = rpn_cls_losses + outputs['tmp_5'] = rpn_cls_losses return total_loss, losses, [rpn_batch_pos, rpn_batch, \ - refine_batch_pos, refine_batch, \ + rcnn_batch_pos, rcnn_batch, \ mask_batch_pos, mask_batch] def decode_output(outputs): @@ -693,7 +611,7 @@ def build(end_points, image_height, image_width, pyramid_map, gt_boxes, gt_masks, num_classes=num_classes, base_anchors=base_anchors, rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - refined_box_lw=loss_weights[2], refined_cls_lw=loss_weights[3], + rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], mask_lw=loss_weights[4]) outputs['losses'] = losses @@ -710,12 +628,12 @@ def build(end_points, image_height, image_width, pyramid_map, visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) # rpn visualization - visualize_bb(end_points["input"], outputs['roi']["box"], name="rpn_bb_visualization") + visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") - # final network visualization - first_mask = outputs['mask']['mask'][:1] - first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) + # mask network visualization + # first_mask = outputs['training_mask_final_mask'][:1] + # first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) - visualize_final_predictions(outputs['final_boxes']["box"], end_points["input"], first_mask) + # visualize_final_predictions(outputs['rcnn_final_boxes'], end_points["input"], first_mask) return outputs diff --git a/train/train.py b/train/train.py index 119387a..e9f1cc3 100644 --- a/train/train.py +++ b/train/train.py @@ -190,7 +190,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1, 1, 1000.0, 10.0, 100.0]) + loss_weights=[1.0, 1.0, 1000.0, 10.0, 100.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) @@ -198,25 +198,16 @@ def train(): losses = outputs['losses'] batch_info = outputs['batch_info'] regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) - input_image = end_points['input'] - # final_box = outputs['final_boxes']['box'] - # final_cls = outputs['final_boxes']['cls'] - # final_prob = outputs['final_boxes']['prob'] - # final_gt_cls = outputs['final_boxes']['gt_cls'] - # final_rpn_box = outputs['final_boxes']['rpn_box'] - # final_max_overlaps = outputs['final_boxes']['max_overlaps'] - # final_mask = outputs['mask']['mask']#outputs['mask']['final_mask'] - # gt = outputs['gt'] - ############################# - # tmp_0 = outputs['losses'] - # tmp_1 = outputs['losses'] - # tmp_2 = outputs['losses'] - # tmp_3 = outputs['losses'] - # tmp_4 = outputs['losses'] - # tmp_5 = outputs['losses'] + training_rcnn_clses = outputs['training_rcnn_clses'] + training_rcnn_clses_target = outputs['training_rcnn_clses_target'] + training_mask_rois = outputs['training_mask_rois'] + training_mask_clses_target = outputs['training_mask_clses_target'] + training_mask_final_mask = outputs['training_mask_final_mask'] + training_mask_final_mask_target = outputs['training_mask_final_mask_target'] + ############################# tmp_0 = outputs['tmp_0'] tmp_1 = outputs['tmp_1'] tmp_2 = outputs['tmp_2'] @@ -266,15 +257,17 @@ def train(): start_time = time.time() s_, tot_loss, reg_lossnp, img_id_str, \ - rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, \ + rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, \ gt_boxesnp, \ - rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch, \ - input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np= \ + rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch, \ + input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ + training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ sess.run([update_op, total_loss, regular_loss, img_id] + losses + [gt_boxes] + batch_info + - [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5]) + [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) # final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, #[final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + duration_time = time.time() - start_time @@ -284,62 +277,36 @@ def train(): """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" % (step, img_id_str, duration_time, reg_lossnp, - tot_loss, rpn_box_loss, rpn_cls_loss, refined_box_loss, refined_cls_loss, mask_loss, + tot_loss, rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, gt_boxesnp.shape[0], - rpn_batch_pos, rpn_batch, refine_batch_pos, refine_batch, mask_batch_pos, mask_batch)) + rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch)) # print (np.array(tmp_0np).shape) # print (np.array(tmp_1np).shape) - # print (np.array(tmp_2np).shape) - # print (np.array(tmp_3np).shape) - # print (np.array(tmp_4np).shape) - # print (np.amax(np.array(tmp_4np))) - # print (np.amin(np.array(tmp_4np))) - - #print (np.array_equal(np.array(tmp_0np)[np.array(tmp_4np)], np.array(tmp_3np))) - #print (np.array(tmp_3np)) - print ("labels") - print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_5np),axis=1)))) - print ("classes") - print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) + print ("target") + print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) + print ("predict") + print (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) if step % 50 == 0: - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='train_est', - # bbox=final_rpn_boxnp, - # label=final_clsnp, - # prob=final_probnp, - # mask=final_masknp, - # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), - # iou=final_max_overlapsnp, - # vis_all=True - # ) - draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_est', - bbox=tmp_0np, - label=tmp_1np, - prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, - mask=tmp_2np, + bbox=training_mask_roisnp, + label=training_mask_clses_targetnp, + prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + mask=training_mask_final_masknp, vis_all=True) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_gt', - bbox=tmp_0np, - label=tmp_1np, - prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, - mask=tmp_3np, + bbox=training_mask_roisnp, + label=training_mask_clses_targetnp, + prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + mask=training_mask_final_mask_targetnp, vis_all=True) - # print ("labels") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) - # print ("classes") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) - - if np.isnan(tot_loss) or np.isinf(tot_loss): print (gt_boxesnp) raise From 66898af1a686418ff71c92506da44b4d936dc95c Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 10:31:25 +0900 Subject: [PATCH 08/35] fixed test.py corrected mask losses in pyramid_network.py --- libs/configs/config_v1.py | 2 +- libs/layers/inst.py | 16 +- libs/layers/mask.py | 6 +- libs/layers/wrapper.py | 11 +- libs/nets/pyramid_network.py | 113 +++++---- train/test.py | 447 +++-------------------------------- train/train.py | 4 +- 7 files changed, 130 insertions(+), 469 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index dbb8c86..825ca78 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -284,7 +284,7 @@ 'NMS threshold in RPN') tf.app.flags.DEFINE_float( - 'inst_nms_threshold', 0.5, + 'inst_nms_threshold', 0.3, 'NMS threshold in inst inference') ################################## diff --git a/libs/layers/inst.py b/libs/layers/inst.py index 3c60622..1e6953a 100644 --- a/libs/layers/inst.py +++ b/libs/layers/inst.py @@ -13,7 +13,7 @@ _DEBUG=False -def inference(boxes, classes, prob, class_agnostic=True): +def inference(boxes, classes, prob, indexs, class_agnostic=True): min_size = cfg.FLAGS.min_size inst_nms_threshold = cfg.FLAGS.inst_nms_threshold @@ -23,11 +23,13 @@ def inference(boxes, classes, prob, class_agnostic=True): boxes = boxes.reshape((-1, 4)) scores = scores.reshape((-1, 1)) + indexs = indexs.reshape((-1, 1)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -36,6 +38,7 @@ def inference(boxes, classes, prob, class_agnostic=True): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -44,6 +47,7 @@ def inference(boxes, classes, prob, class_agnostic=True): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -57,6 +61,7 @@ def inference(boxes, classes, prob, class_agnostic=True): if post_nms_inst_n > 0: keeps = keeps[:post_nms_inst_n] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -65,16 +70,17 @@ def inference(boxes, classes, prob, class_agnostic=True): # quick fix for tensorflow error when no bbox presents #@TODO if len(classes) is 0: - scores = np.zeros((1,81)) - boxes = np.array([[0.0,0.0,2.0,2.0]]) + scores = np.zeros((1, 1)) + indexs = np.zeros((1, 1)) + boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([[0]]) else: raise "inference nms type error" - batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) + batch_inds = np.zeros([boxes.shape[0]]) - return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds + return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois diff --git a/libs/layers/mask.py b/libs/layers/mask.py index d4b5597..bc98e33 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -64,8 +64,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index gt_height = gt_masks.shape[1] gt_width = gt_masks.shape[2] - enlarged_width = mask_width*50 - enlarged_height = mask_height*50 + enlarged_width = mask_width*20 + enlarged_height = mask_height*20 roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], :, :] @@ -78,6 +78,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index mask_targets[i, :, :, labels[i]] = cropped mask_inside_weights[i, :, :, labels[i]] = 1.0 + + mask_rois = rois[:, :4] else: # there is no gt diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 4a8d661..2fd01c4 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -224,16 +224,17 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] -def inst_inference(final_boxes, classes, cls2_prob, scope='instInference'): +def inst_inference(final_boxes, classes, cls2_prob, indexs, scope='instInference'): with tf.name_scope(scope) as sc: - inst_boxes, inst_classes, inst_prob, batch_inds = \ + inst_boxes, inst_classes, inst_prob, batch_inds, inst_indexs = \ tf.py_func(inst.inference, - [final_boxes, classes, cls2_prob], - [tf.float32, tf.int32, tf.float32, tf.int32]) + [final_boxes, classes, cls2_prob, indexs], + [tf.float32, tf.int32, tf.float32, tf.int32, tf.int32]) inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + inst_indexs = tf.convert_to_tensor(inst_indexs, name='inst_indexs') - return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file + return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] + [inst_indexs] \ No newline at end of file diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index cd963d7..f4eeb81 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -59,9 +59,9 @@ def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, activation_fn=tf.nn.relu, normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params): - with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc + # with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): @@ -171,7 +171,8 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): pyramid_map = net_name # pyramid['inputs'] = end_points['inputs'] if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + arg_scope = _extra_conv_arg_scope_with_bn() + # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) # @@ -214,7 +215,8 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g """ outputs = {} if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + arg_scope = _extra_conv_arg_scope_with_bn() + # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) @@ -269,10 +271,8 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training) else: - ### for testing, rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - ### @TODO Fix testing by is_training=False. Something wrong with "network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=False)" - pass - # rcnn_rois, rcnn_scores, rcnn_batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) + ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs + rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs) ### assign pyramid layer indexs to rcnn network's ROIs [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ @@ -332,7 +332,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g mask_cropped_features = [] mask_ordered_rois = [] - mask_ordered_index = [] + mask_ordered_indexs = [] ### crop features from pyramid for mask network for i in range(5, 1, -1): p = 'P%d'%i @@ -343,17 +343,47 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_index.append(mask_index) + mask_ordered_indexs.append(mask_index) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_index = tf.concat(values=mask_ordered_index, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) else: - ### for testing, maskrcnn takes rcnn boxes as inputs - ### @TODO Fix testing by is_training=False. Something wrong with "network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=False)" - pass - + ### for testing, maskrcnn takes rcnn boxes as inputs + mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = inst_inference(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ + assign_boxes(mask_rois, [mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) + + mask_cropped_features = [] + mask_ordered_rois = [] + mask_ordered_indexs = [] + mask_ordered_clses = [] + mask_ordered_scores = [] + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_splitted_cls = mask_assigned_clses[i-2] + mask_splitted_score = mask_assigned_scores[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assign_indexs[i-2] + mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_features.append(mask_cropped_feature) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) + mask_ordered_clses.append(mask_splitted_cls) + mask_ordered_scores.append(mask_splitted_score) + + mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) + mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) + mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) + + outputs['mask_final_clses'] = mask_ordered_clses + outputs['mask_final_scores'] = mask_ordered_scores + ### mask head m = mask_cropped_features for _ in range(4): @@ -364,11 +394,10 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_index'] = mask_ordered_index + outputs['mask_ordered_indexs'] = mask_ordered_indexs outputs['mask_cropped_features'] = mask_cropped_features outputs['mask_mask'] = m outputs['mask_final_mask'] = tf.nn.sigmoid(m) - ### @TODO add a mask, given the predicted boxes and classes return outputs @@ -405,7 +434,8 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, mask_batch_pos = [] if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + arg_scope = _extra_conv_arg_scope_with_bn() + # arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) with slim.arg_scope(arg_scope): @@ -522,19 +552,19 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, ### mask loss # mask of shape (N, h, w, num_classes) mask_ordered_rois = outputs['mask_ordered_rois'] - mask_ordered_index = outputs['mask_ordered_index'] + mask_ordered_indexs = outputs['mask_ordered_indexs'] masks = outputs['mask_mask'] - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index= \ - mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_index,scope='MaskEncoder') + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index, masks = \ + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ tf.reshape(mask_clses_target, [-1]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), tf.reshape(mask_rois, [-1, 4]), - tf.reshape(mask_ordered_index, [-1]), + tf.reshape(mask_ordered_indexs, [-1]), tf.reshape(masks, [-1, 28, 28, num_classes]), ]) @@ -547,7 +577,8 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.greater_equal(mask_clses_target, 1), tf.float32 ))) ### NOTE: w/o competition between classes. - mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) + mask_loss = mask_inside_weights * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) + mask_loss = mask_lw * mask_loss mask_loss = tf.reduce_mean(mask_loss) mask_loss = tf.cond(tf.greater(tf.size(mask_clses_target), 0), lambda: mask_loss, lambda: tf.constant(0.0)) tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) @@ -606,31 +637,31 @@ def build(end_points, image_height, image_width, pyramid_map, build_heads(pyramid, image_height, image_width, num_classes, base_anchors, is_training=is_training, gt_boxes=gt_boxes) - if is_training: - loss, losses, batch_info = build_losses(pyramid, outputs, - gt_boxes, gt_masks, - num_classes=num_classes, base_anchors=base_anchors, - rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], - mask_lw=loss_weights[4]) + # if is_training: + loss, losses, batch_info = build_losses(pyramid, outputs, + gt_boxes, gt_masks, + num_classes=num_classes, base_anchors=base_anchors, + rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], + rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], + mask_lw=loss_weights[4]) - outputs['losses'] = losses - outputs['total_loss'] = loss - outputs['batch_info'] = batch_info + outputs['losses'] = losses + outputs['total_loss'] = loss + outputs['batch_info'] = batch_info - ## just decode outputs into readable prediction + ### just decode outputs into readable prediction pred_boxes, pred_classes, pred_masks = decode_output(outputs) outputs['pred_boxes'] = pred_boxes outputs['pred_classes'] = pred_classes outputs['pred_masks'] = pred_masks - # image and gt visualization - visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) + # ### image and gt visualization + # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) - # rpn visualization - visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") + # ### rpn visualization + # visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") - # mask network visualization + # ### mask network visualization # first_mask = outputs['training_mask_final_mask'][:1] # first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) diff --git a/train/test.py b/train/test.py index 5dec0eb..ef16c69 100644 --- a/train/test.py +++ b/train/test.py @@ -1,329 +1,3 @@ -# #!/usr/bin/env python -# # coding=utf-8 -# from __future__ import absolute_import -# from __future__ import division -# from __future__ import print_function - -# import functools -# import os, sys -# import time -# import numpy as np -# import tensorflow as tf -# import tensorflow.contrib.slim as slim -# from time import gmtime, strftime - -# sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) -# import libs.configs.config_v1 as cfg -# import libs.datasets.dataset_factory as datasets -# import libs.nets.nets_factory as network - -# import libs.preprocessings.coco_v1 as coco_preprocess -# import libs.nets.pyramid_network as pyramid_network -# import libs.nets.resnet_v1 as resnet_v1 - -# from train.train_utils import _configure_learning_rate, _configure_optimizer, \ -# _get_variables_to_train, _get_init_fn, get_var_list_to_restore - -# from PIL import Image, ImageFont, ImageDraw, ImageEnhance -# from libs.datasets import download_and_convert_coco -# from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox - -# FLAGS = tf.app.flags.FLAGS -# resnet50 = resnet_v1.resnet_v1_50 - -# def solve(global_step): -# """add solver to losses""" -# # learning reate -# lr = _configure_learning_rate(82783, global_step) -# optimizer = _configure_optimizer(lr) -# tf.summary.scalar('learning_rate', 0.0) - -# # compute and apply gradient -# losses = tf.get_collection(tf.GraphKeys.LOSSES) -# regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) -# regular_loss = tf.add_n(regular_losses) -# out_loss = tf.add_n(losses) -# total_loss = tf.add_n(losses + regular_losses) - -# tf.summary.scalar('total_loss', total_loss) -# tf.summary.scalar('out_loss', out_loss) -# tf.summary.scalar('regular_loss', regular_loss) - -# update_ops = [] -# variables_to_train = _get_variables_to_train() -# # update_op = optimizer.minimize(total_loss) -# gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) -# grad_updates = optimizer.apply_gradients(gradients, -# global_step=global_step) -# update_ops.append(grad_updates) - -# # update moving mean and variance -# if FLAGS.update_bn: -# update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) -# update_bn = tf.group(*update_bns) -# update_ops.append(update_bn) - -# return tf.group(*update_ops) - -# def restore(sess): -# """choose which param to restore""" -# if FLAGS.restore_previous_if_exists: -# try: -# checkpoint_path = tf.train.latest_checkpoint(FLAGS.train_dir) -# ########### -# restorer = tf.train.Saver() -# ########### - -# ########### -# # not_restore = [ 'pyramid/fully_connected/weights:0', -# # 'pyramid/fully_connected/biases:0', -# # 'pyramid/fully_connected/weights:0', -# # 'pyramid/fully_connected_1/biases:0', -# # 'pyramid/fully_connected_1/weights:0', -# # 'pyramid/fully_connected_2/weights:0', -# # 'pyramid/fully_connected_2/biases:0', -# # 'pyramid/fully_connected_3/weights:0', -# # 'pyramid/fully_connected_3/biases:0', -# # 'pyramid/Conv/weights:0', -# # 'pyramid/Conv/biases:0', -# # 'pyramid/Conv_1/weights:0', -# # 'pyramid/Conv_1/biases:0', -# # 'pyramid/Conv_2/weights:0', -# # 'pyramid/Conv_2/biases:0', -# # 'pyramid/Conv_3/weights:0', -# # 'pyramid/Conv_3/biases:0', -# # 'pyramid/Conv2d_transpose/weights:0', -# # 'pyramid/Conv2d_transpose/biases:0', -# # 'pyramid/Conv_4/weights:0', -# # 'pyramid/Conv_4/biases:0', -# # 'pyramid/fully_connected/weights/Momentum:0', -# # 'pyramid/fully_connected/biases/Momentum:0', -# # 'pyramid/fully_connected/weights/Momentum:0', -# # 'pyramid/fully_connected_1/biases/Momentum:0', -# # 'pyramid/fully_connected_1/weights/Momentum:0', -# # 'pyramid/fully_connected_2/weights/Momentum:0', -# # 'pyramid/fully_connected_2/biases/Momentum:0', -# # 'pyramid/fully_connected_3/weights/Momentum:0', -# # 'pyramid/fully_connected_3/biases/Momentum:0', -# # 'pyramid/Conv/weights/Momentum:0', -# # 'pyramid/Conv/biases/Momentum:0', -# # 'pyramid/Conv_1/weights/Momentum:0', -# # 'pyramid/Conv_1/biases/Momentum:0', -# # 'pyramid/Conv_2/weights/Momentum:0', -# # 'pyramid/Conv_2/biases/Momentum:0', -# # 'pyramid/Conv_3/weights/Momentum:0', -# # 'pyramid/Conv_3/biases/Momentum:0', -# # 'pyramid/Conv2d_transpose/weights/Momentum:0', -# # 'pyramid/Conv2d_transpose/biases/Momentum:0', -# # 'pyramid/Conv_4/weights/Momentum:0', -# # 'pyramid/Conv_4/biases/Momentum:0',] -# # vars_to_restore = [v for v in tf.all_variables()if v.name not in not_restore] -# # restorer = tf.train.Saver(vars_to_restore) -# # for var in vars_to_restore: -# # print ('restoring ', var.name) -# ############ - -# restorer.restore(sess, checkpoint_path) -# print ('restored previous model %s from %s'\ -# %(checkpoint_path, FLAGS.train_dir)) -# time.sleep(2) -# return -# except: -# print ('--restore_previous_if_exists is set, but failed to restore in %s %s'\ -# % (FLAGS.train_dir, checkpoint_path)) -# time.sleep(2) - -# if FLAGS.pretrained_model: -# if tf.gfile.IsDirectory(FLAGS.pretrained_model): -# checkpoint_path = tf.train.latest_checkpoint(FLAGS.pretrained_model) -# else: -# checkpoint_path = FLAGS.pretrained_model - -# if FLAGS.checkpoint_exclude_scopes is None: -# FLAGS.checkpoint_exclude_scopes='pyramid' -# if FLAGS.checkpoint_include_scopes is None: -# FLAGS.checkpoint_include_scopes='resnet_v1_50' - -# vars_to_restore = get_var_list_to_restore() -# for var in vars_to_restore: -# print ('restoring ', var.name) - -# try: -# restorer = tf.train.Saver(vars_to_restore) -# restorer.restore(sess, checkpoint_path) -# print ('Restored %d(%d) vars from %s' %( -# len(vars_to_restore), len(tf.global_variables()), -# checkpoint_path )) -# except: -# print ('Checking your params %s' %(checkpoint_path)) -# raise - -# def train(): -# """The main function that runs training""" - -# ## data -# image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ -# datasets.get_dataset(FLAGS.dataset_name, -# FLAGS.dataset_split_name, -# FLAGS.dataset_dir, -# FLAGS.im_batch, -# is_training=False) - -# data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, -# dtypes=( -# image.dtype, ih.dtype, iw.dtype, -# gt_boxes.dtype, gt_masks.dtype, -# num_instances.dtype, img_id.dtype)) -# enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) -# data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) -# tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) -# (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() -# im_shape = tf.shape(image) -# image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) - -# ## network -# logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, -# weight_decay=FLAGS.weight_decay, is_training=False) -# outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, -# num_classes=81, -# base_anchors=9, -# is_training=False, -# gt_boxes=gt_boxes, gt_masks=gt_masks, -# ) - -# input_image = end_points['input'] -# final_box = outputs['final_boxes']['box'] -# final_cls = outputs['final_boxes']['cls'] -# final_prob = outputs['final_boxes']['prob'] -# final_rpn_box = outputs['final_boxes']['rpn_box'] -# final_mask = outputs['mask']['final_mask'] - -# ############################# -# tmp_0 = outputs['mask']['final_mask'] -# tmp_1 = outputs['mask']['final_mask'] -# tmp_2 = outputs['mask']['final_mask'] -# tmp_3 = outputs['mask']['final_mask'] -# tmp_4 = outputs['mask']['final_mask'] - -# # tmp_0 = outputs['tmp_0'] -# # tmp_1 = outputs['tmp_1'] -# # tmp_2 = outputs['tmp_2'] -# # tmp_3 = outputs['tmp_3'] -# # tmp_4 = outputs['tmp_4'] -# ############################ - - -# ## solvers -# global_step = slim.create_global_step() - -# cropped_rois = tf.get_collection('__CROPPED__')[0] -# transposed = tf.get_collection('__TRANSPOSED__')[0] - -# gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9) -# sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) -# init_op = tf.group( -# tf.global_variables_initializer(), -# tf.local_variables_initializer() -# ) -# sess.run(init_op) - -# summary_op = tf.summary.merge_all() -# logdir = os.path.join(FLAGS.train_dir, strftime('%Y%m%d%H%M%S', gmtime())) -# if not os.path.exists(logdir): -# os.makedirs(logdir) -# summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph) - -# ## restore -# restore(sess) - -# ## main loop -# coord = tf.train.Coordinator() -# threads = [] -# # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) -# for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): -# threads.extend(qr.create_threads(sess, coord=coord, daemon=True, -# start=True)) - -# tf.train.start_queue_runners(sess=sess, coord=coord) -# saver = tf.train.Saver(max_to_keep=20) - -# for step in range(FLAGS.max_iters): - -# start_time = time.time() - -# img_id_str, \ -# gt_boxesnp, \ -# input_imagenp, final_boxnp, final_clsnp, final_probnp, final_rpn_boxnp, final_masknp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ -# sess.run([img_id] + -# [gt_boxes] + -# [input_image] + [final_box] + [final_cls] + [final_prob] + [final_rpn_box] + [final_mask] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) - -# duration_time = time.time() - start_time - -# if step % 1 == 0: -# print ( """iter %d: image-id:%07d, time:%.3f(sec), """ -# """instances: %d, """ - -# % (step, img_id_str, duration_time, -# gt_boxesnp.shape[0])) - -# draw_bbox(step, -# np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), -# name='test_est', -# bbox=final_boxnp, -# label=final_clsnp, -# prob=final_probnp, -# mask=final_masknp, -# vis_all=True -# ) - -# # draw_bbox(step, -# # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), -# # name='train_roi', -# # bbox=final_rpn_boxnp, -# # label=final_clsnp, -# # prob=final_probnp, -# # gt_label=np.argmax(np.asarray(final_gt_clsnp),axis=1), -# # iou=final_max_overlapsnp -# # ) - -# # draw_bbox(step, -# # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), -# # name='train_msk', -# # bbox=tmp_0np, -# # label=tmp_2np, -# # prob=np.zeros((tmp_2np.shape[0],81), dtype=np.float32)+1.0, -# # mask=tmp_1np, -# # vis_all=True -# # ) - -# # draw_bbox(step, -# # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), -# # name='train_gt', -# # bbox=gtnp[:,0:4], -# # label=np.asarray(gtnp[:,4], dtype=np.uint8), -# # ) - -# # print ("labels") -# # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) -# # print ("classes") -# # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) - - -# if coord.should_stop(): -# coord.request_stop() -# coord.join(threads) - - -# if __name__ == '__main__': -# train() - - - - - - - #!/usr/bin/env python # coding=utf-8 from __future__ import absolute_import @@ -443,17 +117,17 @@ def test(): FLAGS.dataset_split_name, FLAGS.dataset_dir, FLAGS.im_batch, - is_training=False) - - # data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, - # dtypes=( - # image.dtype, ih.dtype, iw.dtype, - # gt_boxes.dtype, gt_masks.dtype, - # num_instances.dtype, img_id.dtype)) - # enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) - # data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) - # tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) - # (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() + is_training=True) + + data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, + dtypes=( + image.dtype, ih.dtype, iw.dtype, + gt_boxes.dtype, gt_masks.dtype, + num_instances.dtype, img_id.dtype)) + enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) + data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) + tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) + (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() im_shape = tf.shape(image) image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) @@ -463,28 +137,23 @@ def test(): outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, base_anchors=9, - is_training=True, - gt_boxes=gt_boxes, gt_masks=gt_masks,) + is_training=False, + gt_boxes=gt_boxes, gt_masks=gt_masks, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) input_image = end_points['input'] - final_box = outputs['final_boxes']['box'] - final_cls = outputs['final_boxes']['cls'] - final_prob = outputs['final_boxes']['prob'] - final_rpn_box = outputs['final_boxes']['rpn_box'] - final_mask = outputs['mask']['mask'] + + testing_mask_rois = outputs['mask_ordered_rois'] + testing_mask_final_mask = outputs['mask_final_mask'] + testing_mask_final_clses = outputs['mask_final_clses'] + testing_mask_final_scores = outputs['mask_final_scores'] ############################# - tmp_0 = outputs['mask']['mask'] - tmp_1 = outputs['mask']['mask'] - tmp_2 = outputs['mask']['mask'] - tmp_3 = outputs['mask']['mask'] - tmp_4 = outputs['mask']['mask'] - - # tmp_0 = outputs['tmp_0'] - # tmp_1 = outputs['tmp_1'] - # tmp_2 = outputs['tmp_2'] - # tmp_3 = outputs['tmp_3'] - # tmp_4 = outputs['tmp_4'] + tmp_0 = outputs['tmp_0'] + tmp_1 = outputs['tmp_1'] + tmp_2 = outputs['tmp_2'] + tmp_3 = outputs['tmp_3'] + tmp_4 = outputs['tmp_4'] + tmp_5 = outputs['tmp_5'] ############################ @@ -495,7 +164,7 @@ def test(): cropped_rois = tf.get_collection('__CROPPED__')[0] transposed = tf.get_collection('__TRANSPOSED__')[0] - gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) + gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) init_op = tf.group( tf.global_variables_initializer(), @@ -529,10 +198,12 @@ def test(): img_id_str, \ gt_boxesnp, \ - input_imagenp, final_boxnp, final_clsnp, final_probnp, final_rpn_boxnp, final_masknp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np= \ - sess.run([img_id] + - [gt_boxes] + - [input_image] + [final_box] + [final_cls] + [final_prob] + [final_rpn_box] + [final_mask] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4]) + input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ + testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ + sess.run([img_id] + \ + [gt_boxes] + \ + [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + \ + [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) duration_time = time.time() - start_time if step % 1 == 0: @@ -542,62 +213,14 @@ def test(): % (step, img_id_str, duration_time, gt_boxesnp.shape[0])) - # print("tmp") - # print(np.asarray(tmp_0np)) - # print(np.asarray(tmp_1np)) - # print(np.asarray(tmp_2np)) - # print(np.asarray(tmp_3np)) - - # print ("labels") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(tmp_3np),axis=1)))[1:]) - # print ("classes") - # print (cat_id_to_cls_name(np.unique(np.argmax(np.array(tmp_4np),axis=1)))) - - #print ("iw", np.asanyarray(tmp_4np)) - #if np.asarray(tmp_3np[3]).shape[0]>=1: - #print ("ordered_rois") - #print (np.asarray(tmp_0np)[0]) - #print ("pyramid_feature") - #print ("p5",np.asarray(tmp_1np[0]).shape) - #print (np.asarray(tmp_1np[0][0][0])) - - #print ("real_pyramid") - #print (np.asarray(tmp_4np).shape) - #print (np.asarray(tmp_4np)[0][0]) - #print ("p4",np.asanyarray(tmp_1np[1]).shape) - #print ("p3",np.asanyarray(tmp_1np[2]).shape) - #print ("p2",np.asanyarray(tmp_1np[3]).shape) - - #print ("cropped_rois") - #print (np.asarray(tmp_2np).shape) - #print (np.asarray(tmp_2np)[0][0]) - # print ("assigned_layer_num") - # print ("p5:",np.asarray(tmp_3np[3]).shape[0]) - # print ("p4:",np.asarray(tmp_3np[2]).shape[0]) - # print ("p3:",np.asarray(tmp_3np[1]).shape[0]) - # print ("p2:",np.asarray(tmp_3np[0]).shape[0]) if step % 1 == 0: draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='test_est', - bbox=final_boxnp, - label=final_clsnp, - prob=final_probnp, - mask=final_masknp,) - - draw_bbox(step, - np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - name='test_roi', - bbox=final_boxnp, - label=final_clsnp, - prob=final_probnp, - ) - # print ("boxes") - # print (np.asarray(final_boxnp).shape) - # print ("classes") - # print (cat_id_to_cls_name(np.unique(np.asarray(final_clsnp)))) - #print (cat_id_to_cls_name(np.unique(np.argmax(np.array(final_clsnp),axis=1)))) - + bbox=testing_mask_roisnp, + label=testing_mask_final_clsesnp, + prob=testing_mask_final_scoresnp, + mask=testing_mask_final_masknp,) if __name__ == '__main__': diff --git a/train/train.py b/train/train.py index e9f1cc3..ba7d9c6 100644 --- a/train/train.py +++ b/train/train.py @@ -193,7 +193,6 @@ def train(): loss_weights=[1.0, 1.0, 1000.0, 10.0, 100.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) - total_loss = outputs['total_loss'] losses = outputs['losses'] batch_info = outputs['batch_info'] @@ -268,8 +267,7 @@ def train(): batch_info + [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) - # final_boxnp, final_clsnp, final_probnp, final_gt_clsnp, final_rpn_boxnp, final_max_overlapsnp, final_masknp, gtnp, - #[final_box] + [final_cls] + [final_prob] + [final_gt_cls] + [final_rpn_box] + [final_max_overlaps] + [final_mask] + [gt] + + duration_time = time.time() - start_time if step % 1 == 0: print ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ From 9c27716f0d794a197f298c5c4a2791e02ea8d505 Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 11:59:31 +0900 Subject: [PATCH 09/35] merged inst.py to sample.py changed some variable names --- libs/layers/__init__.py | 4 +- libs/layers/inst.py | 149 ----------------------------------- libs/layers/sample.py | 69 ++++++++++++++++ libs/layers/wrapper.py | 5 +- libs/nets/pyramid_network.py | 6 +- train/train.py | 2 +- 6 files changed, 77 insertions(+), 158 deletions(-) delete mode 100644 libs/layers/inst.py diff --git a/libs/layers/__init__.py b/libs/layers/__init__.py index d0bbc61..9bf3dfe 100644 --- a/libs/layers/__init__.py +++ b/libs/layers/__init__.py @@ -14,7 +14,7 @@ from .wrapper import mask_encoder from .wrapper import sample_wrapper as sample_rpn_outputs from .wrapper import sample_with_gt_wrapper as sample_rpn_outputs_with_gt +from .wrapper import sample_rcnn_outputs_wrapper as sample_rcnn_outputs from .wrapper import gen_all_anchors from .wrapper import assign_boxes -from .crop import crop as ROIAlign -from .wrapper import inst_inference +from .crop import crop as ROIAlign \ No newline at end of file diff --git a/libs/layers/inst.py b/libs/layers/inst.py deleted file mode 100644 index 1e6953a..0000000 --- a/libs/layers/inst.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf -import numpy as np - -import libs.configs.config_v1 as cfg -import libs.boxes.nms_wrapper as nms_wrapper -import libs.boxes.cython_bbox as cython_bbox -from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes -from libs.logs.log import LOG - -_DEBUG=False - -def inference(boxes, classes, prob, indexs, class_agnostic=True): - - min_size = cfg.FLAGS.min_size - inst_nms_threshold = cfg.FLAGS.inst_nms_threshold - post_nms_inst_n = cfg.FLAGS.post_nms_inst_n - if class_agnostic is True: - scores = prob[range(prob.shape[0]),classes] - - boxes = boxes.reshape((-1, 4)) - scores = scores.reshape((-1, 1)) - indexs = indexs.reshape((-1, 1)) - assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' - - # filter background - keeps = np.where(classes != 0)[0] - scores = scores[keeps] - indexs = indexs[keeps] - boxes = boxes[keeps, :] - classes = classes[keeps] - prob = prob[keeps, :] - print("after filter bg:", len(classes)) - - # filter minimum size - keeps = _filter_boxes(boxes, min_size=min_size) - scores = scores[keeps] - indexs = indexs[keeps] - boxes = boxes[keeps, :] - classes = classes[keeps] - prob = prob[keeps, :] - - - #filter with scores - keeps = np.where(scores > 0.5)[0] - scores = scores[keeps] - indexs = indexs[keeps] - boxes = boxes[keeps, :] - classes = classes[keeps] - prob = prob[keeps, :] - - # filter with nms - det = np.hstack((boxes, scores)).astype(np.float32) - keeps = nms_wrapper.nms(det, inst_nms_threshold) - - - # filter low score - if post_nms_inst_n > 0: - keeps = keeps[:post_nms_inst_n] - scores = scores[keeps] - indexs = indexs[keeps] - boxes = boxes[keeps, :] - classes = classes[keeps] - prob = prob[keeps, :] - print("after nms:", len(classes)) - - # quick fix for tensorflow error when no bbox presents - #@TODO - if len(classes) is 0: - scores = np.zeros((1, 1)) - indexs = np.zeros((1, 1)) - boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) - classes = np.array([[0]]) - - else: - raise "inference nms type error" - - batch_inds = np.zeros([boxes.shape[0]]) - - return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) - -def _jitter_boxes(boxes, jitter=0.1): - """ jitter the boxes before appending them into rois - """ - jittered_boxes = boxes.copy() - ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 - hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 - width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws - height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs - jittered_boxes[:, 0] += width_offset - jittered_boxes[:, 2] += width_offset - jittered_boxes[:, 1] += height_offset - jittered_boxes[:, 3] += height_offset - - return jittered_boxes - -def _filter_boxes(boxes, min_size): - """Remove all boxes with any side smaller than min_size.""" - ws = boxes[:, 2] - boxes[:, 0] + 1 - hs = boxes[:, 3] - boxes[:, 1] + 1 - keep = np.where((ws >= min_size) & (hs >= min_size))[0] - return keep - -def _apply_nms(boxes, scores, threshold = 0.5): - """After this only positive boxes are left - Applying this class-wise - """ - num_class = scores.shape[1] - assert boxes.shape[0] == scores.shape[0], \ - 'Shape dismatch {} vs {}'.format(boxes.shape, scores.shape) - - final_boxes = [] - final_scores = [] - for cls in np.arange(1, num_class): - cls_boxes = boxes[:, 4*cls: 4*cls+4] - cls_scores = scores[:, cls] - dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) - keep = nms_wrapper.nms(dets, thresh=0.3) - dets = dets[keep, :] - dets = dets[np.where(dets[:, 4] > threshold)] - final_boxes.append(dets[:, :4]) - final_scores.append(dets[:, 4]) - - final_boxes = np.vstack(final_boxes) - final_scores = np.vstack(final_scores) - - return final_boxes, final_scores - -if __name__ == '__main__': - import time - t = time.time() - - for i in range(10): - N = 200000 - boxes = np.random.randint(0, 50, (N, 2)) - s = np.random.randint(10, 40, (N, 2)) - s = boxes + s - boxes = np.hstack((boxes, s)) - - scores = np.random.rand(N, 1) - # scores_ = 1 - np.random.rand(N, 1) - # scores = np.hstack((scores, scores_)) - - boxes, scores = sample_rpn_outputs(boxes, scores, only_positive=False) - - print ('average time %f' % ((time.time() - t) / 10)) diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 10aa070..6664bf9 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -175,6 +175,75 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] +def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): + + min_size = cfg.FLAGS.min_size + inst_nms_threshold = cfg.FLAGS.inst_nms_threshold + post_nms_inst_n = cfg.FLAGS.post_nms_inst_n + if class_agnostic is True: + scores = prob[range(prob.shape[0]),classes] + + boxes = boxes.reshape((-1, 4)) + scores = scores.reshape((-1, 1)) + indexs = indexs.reshape((-1, 1)) + assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' + + # filter background + keeps = np.where(classes != 0)[0] + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + print("after filter bg:", len(classes)) + + # filter minimum size + keeps = _filter_boxes(boxes, min_size=min_size) + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + + #filter with scores + keeps = np.where(scores > 0.5)[0] + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + # filter with nms + det = np.hstack((boxes, scores)).astype(np.float32) + keeps = nms_wrapper.nms(det, inst_nms_threshold) + + + # filter low score + if post_nms_inst_n > 0: + keeps = keeps[:post_nms_inst_n] + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + print("after nms:", len(classes)) + + # quick fix for tensorflow error when no bbox presents + #@TODO + if len(classes) is 0: + scores = np.zeros((1, 1)) + indexs = np.zeros((1, 1)) + boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) + classes = np.array([[0]]) + + else: + raise "inference nms type error" + + batch_inds = np.zeros([boxes.shape[0]]) + + return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) + def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois """ diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 2fd01c4..4031f93 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -12,7 +12,6 @@ from . import mask from . import sample from . import assign -from . import inst from libs.boxes.anchor import anchors_plane def anchor_encoder(gt_boxes, all_anchors, height, width, stride, indexs, scope='AnchorEncoder'): @@ -224,10 +223,10 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] -def inst_inference(final_boxes, classes, cls2_prob, indexs, scope='instInference'): +def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, indexs, scope='instInference'): with tf.name_scope(scope) as sc: inst_boxes, inst_classes, inst_prob, batch_inds, inst_indexs = \ - tf.py_func(inst.inference, + tf.py_func(sample.sample_rcnn_outputs, [final_boxes, classes, cls2_prob, indexs], [tf.float32, tf.int32, tf.float32, tf.int32, tf.int32]) diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index f4eeb81..652ae56 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -17,8 +17,8 @@ from libs.layers import ROIAlign from libs.layers import sample_rpn_outputs from libs.layers import sample_rpn_outputs_with_gt +from libs.layers import sample_rcnn_outputs from libs.layers import assign_boxes -from libs.layers import inst_inference from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input _BN = True @@ -350,8 +350,8 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) else: - ### for testing, maskrcnn takes rcnn boxes as inputs - mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = inst_inference(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + ### for testing, mask network takes rcnn boxes as inputs + mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ assign_boxes(mask_rois, [mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) diff --git a/train/train.py b/train/train.py index ba7d9c6..638975e 100644 --- a/train/train.py +++ b/train/train.py @@ -190,7 +190,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1.0, 1.0, 1000.0, 10.0, 100.0]) + loss_weights=[1.0, 1.0, 200.0, 10.0, 100.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) total_loss = outputs['total_loss'] From 0b30a16008897d759b8d1686c9068e0b360e45d7 Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 12:02:45 +0900 Subject: [PATCH 10/35] merge to master --- libs/configs/config_v1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 825ca78..3c027fd 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.0002, +tf.app.flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.') tf.app.flags.DEFINE_float( From 01955192beeae3031a6e826e99e5726f62c1030c Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 14:29:50 +0900 Subject: [PATCH 11/35] clean up comments added color codes --- libs/datasets/coco.py | 2 +- libs/layers/mask.py | 1 - libs/layers/sample.py | 47 +- libs/nets/pyramid_network.py | 4 +- libs/nets/pyramid_network_abort.py | 720 ---------------------------- libs/nets/pyramid_network_backup.py | 682 -------------------------- libs/visualization/pil_utils.py | 26 +- 7 files changed, 28 insertions(+), 1454 deletions(-) delete mode 100644 libs/nets/pyramid_network_abort.py delete mode 100644 libs/nets/pyramid_network_backup.py diff --git a/libs/datasets/coco.py b/libs/datasets/coco.py index b87563d..464a8c5 100644 --- a/libs/datasets/coco.py +++ b/libs/datasets/coco.py @@ -95,7 +95,7 @@ def read(tfrecords_filename): if not isinstance(tfrecords_filename, list): tfrecords_filename = [tfrecords_filename] filename_queue = tf.train.string_input_producer( - tfrecords_filename, num_epochs=1)#100 + tfrecords_filename, num_epochs=100) options = tf.python_io.TFRecordOptions(TFRecordCompressionType.ZLIB) reader = tf.TFRecordReader(options=options) diff --git a/libs/layers/mask.py b/libs/layers/mask.py index bc98e33..109937d 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -9,7 +9,6 @@ import libs.configs.config_v1 as cfg from libs.logs.log import LOG from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes -import tensorflow as tf _DEBUG = False diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 6664bf9..1df561b 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -35,14 +35,10 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F boxes = boxes.reshape((-1, 4)) scores = scores.reshape((-1, 1)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' - - # print ("boxes : ") - # print (scores.size) # filter backgrounds # Hope this will filter most of background anchors, since a argsort is too slow.. - #if only_positive: - if True: + if only_positive: keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] @@ -53,9 +49,6 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F boxes = boxes[keeps, :] scores = scores[keeps] indexs = indexs[keeps] - - # print ("after_size : ") - # print (scores.size) # filter with scores order = scores.ravel().argsort()[::-1] @@ -65,16 +58,9 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores[order] indexs = indexs[order] - # print ("after_pre_nms_score : ") - # print (scores.size) - # print (np.amin(scores)) - # filter with nms det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, rpn_nms_threshold) - - # print ("after_nms : ") - # print (len(keeps)) if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] @@ -83,9 +69,6 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F indexs = indexs[keeps] batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) - # print ("after_post_nms_score : ") - # print (scores.size) - # # random sample boxes ## try early sample later # fg_inds = np.where(scores > 0.5)[0] @@ -112,39 +95,15 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training gt_assignment = overlaps.argmax(axis=1) # B max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] - # print("after_compair with gt") - # print(fg_inds.size) if True: gt_argmax_overlaps = overlaps.argmax(axis=0) # G fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) - # print("after_force with gt") - # print(fg_inds.size) - # if _DEBUG and np.argmax(overlaps[fg_inds],axis=1).size < gt_boxes.size/5.0: - # print("gt_size") - # print(gt_boxes) - # gt_height = (gt_boxes[:,2]-gt_boxes[:,0]) - # gt_width = (gt_boxes[:,3]-gt_boxes[:,1]) - # gt_dim = np.vstack((gt_height, gt_width)) - # print(np.transpose(gt_dim)) - # #print(gt_height) - # #print(gt_width) - - # print('SAMPLE: %d after overlaps by %s' % (len(fg_inds),cfg.FLAGS.fg_threshold)) - # print("detected object no.") - # print(np.argmax(overlaps[fg_inds],axis=1)) - # print("total object") - # print(gt_boxes.size/5.0) - mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] - # print("after_compair with mask_gt") - # print(mask_fg_inds.size) if mask_fg_inds.size > cfg.FLAGS.masks_per_image: mask_fg_inds = np.random.choice(mask_fg_inds, size=cfg.FLAGS.masks_per_image, replace=False) - # print("after_mask_per_img") - # print(mask_fg_inds.size) fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) if fg_inds.size > 0 and fg_rois < fg_inds.size: @@ -157,8 +116,6 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) keep_inds = np.append(fg_inds, bg_inds) - #print(gt_boxes[np.argmax(overlaps[fg_inds],axis=1),4]) - print(mask_fg_inds.size) if mask_fg_inds.size is 0: mask_fg_inds = keep_inds else: @@ -195,7 +152,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] - print("after filter bg:", len(classes)) # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) @@ -227,7 +183,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] - print("after nms:", len(classes)) # quick fix for tensorflow error when no bbox presents #@TODO diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 652ae56..6aaaaf8 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -269,10 +269,10 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g if is_training is True: ### for training, rcnn and maskrcnn take rpn boxes as inputs rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training) + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs) + rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) ### assign pyramid layer indexs to rcnn network's ROIs [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ diff --git a/libs/nets/pyramid_network_abort.py b/libs/nets/pyramid_network_abort.py deleted file mode 100644 index c4e4151..0000000 --- a/libs/nets/pyramid_network_abort.py +++ /dev/null @@ -1,720 +0,0 @@ -# coding=utf-8 -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf -import tensorflow.contrib.slim as slim - -from libs.boxes.roi import roi_cropping -from libs.layers import anchor_encoder -from libs.layers import anchor_decoder -from libs.layers import roi_encoder -from libs.layers import roi_decoder -from libs.layers import mask_encoder -from libs.layers import mask_encoder_ -from libs.layers import mask_decoder -from libs.layers import gen_all_anchors -from libs.layers import ROIAlign -from libs.layers import ROIAlign_ -from libs.layers import sample_rpn_outputs -from libs.layers import sample_rpn_outputs_with_gt -from libs.layers import assign_boxes -from libs.layers import inst_inference -from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input - -_BN = True - -# mapping each stage to its' tensor features -_networks_map = { - 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', - 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - }, - 'resnet101': {'C1': '', 'C2': '', - 'C3': '', 'C4': '', - 'C5': '', - } -} - -def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, - activation_fn=None, - batch_norm_decay=0.997, - batch_norm_epsilon=1e-5, - batch_norm_scale=True, - is_training=True): - - batch_norm_params = { - 'decay': batch_norm_decay, - 'epsilon': batch_norm_epsilon, - 'scale': batch_norm_scale, - 'updates_collections': tf.GraphKeys.UPDATE_OPS, - 'is_training': is_training - } - - with slim.arg_scope( - [slim.conv2d], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(), - activation_fn=tf.nn.relu, - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params): - with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): - - with slim.arg_scope( - [slim.conv2d, slim.conv2d_transpose], - padding='SAME', - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), - activation_fn=tf.nn.relu, - normalizer_fn=normalizer_fn,): - with slim.arg_scope( - [slim.fully_connected], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), - activation_fn=activation_fn, - normalizer_fn=normalizer_fn): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def my_sigmoid(x): - """add an active function for the box output layer, which is linear around 0""" - return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 - -def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): - """Smooth L1 loss - Returns - ------ - dist: element-wise distance, as the same shape of x, y - """ - deltas = x - y - with tf.name_scope(name=name) as scope: - deltas_abs = tf.abs(deltas) - smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) - return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ - (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) - -def _get_valid_sample_fraction(labels, p=0): - """return fraction of non-negative examples, the ignored examples have been marked as negative""" - num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) - num_example = tf.cast(tf.size(labels), tf.float32) - frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, - lambda: tf.cast(0, tf.float32)) - frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, - lambda: tf.cast(0, tf.float32)) - return frac, frac_ - - -def _filter_negative_samples(labels, tensors): - """keeps only samples with none-negative labels - Params: - ----- - labels: of shape (N,) - tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number - - Returns: - ----- - tensors: filtered tensors - """ - # return tensors - keeps = tf.where(tf.greater_equal(labels, 0)) - keeps = tf.reshape(keeps, [-1]) - - filtered = [] - for t in tensors: - tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) - f = tf.gather(t, keeps) - filtered.append(f) - - return filtered - -def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): - ws = gt_boxes[:, 2] - gt_boxes[:, 0] - hs = gt_boxes[:, 3] - gt_boxes[:, 1] - shape = tf.shape(gt_boxes)[0] - jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) - jitter = tf.reshape(jitter, [-1]) - ws_offset = ws * jitter - hs_offset = hs * jitter - x1s = gt_boxes[:, 0] + ws_offset - x2s = gt_boxes[:, 2] + ws_offset - y1s = gt_boxes[:, 1] + hs_offset - y2s = gt_boxes[:, 3] + hs_offset - boxes = tf.concat( - values=[ - x1s[:, tf.newaxis], - y1s[:, tf.newaxis], - x2s[:, tf.newaxis], - y2s[:, tf.newaxis]], - axis=1) - new_scores = tf.ones([shape], tf.float32) - new_batch_inds = tf.zeros([shape], tf.int32) - - return tf.concat(values=[rois, boxes], axis=0), \ - tf.concat(values=[scores, new_scores], axis=0), \ - tf.concat(values=[batch_inds, new_batch_inds], axis=0) - -def build_pyramid(net_name, end_points, bilinear=True, is_training=True): - """build pyramid features from a typical network, - assume each stage is 2 time larger than its top feature - Returns: - returns several endpoints - """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): - - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') - - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) - - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) - - pyramid['P%d'%(c)] = s - - return pyramid - -def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): - """Build the 3-way outputs, i.e., class, box and mask in the pyramid - Algo - ---- - For each layer: - 1. Build anchor layer - 2. Process the results of anchor layer, decode the output into rois - 3. Sample rois - 4. Build roi layer - 5. Process the results of roi layer, decode the output into boxes - 6. Build the mask layer - 7. Build losses - """ - outputs = {} - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - # for p in pyramid: - outputs['rpn'] = {} - for i in range(5, 1, -1): - p = 'P%d'%i - stride = 2 ** i - - ## rpn head - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) - box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) - cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - print("anchor_scales = " , anchor_scales) - all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - - ## gather all rois - # print (outputs['rpn']) - rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] - rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] - rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] - - rpn_boxes = tf.concat(values=rpn_boxes, axis=0) - rpn_clses = tf.concat(values=rpn_clses, axis=0) - rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - - # outputs['rpn'] = {'box': rpn_boxes, 'cls': rpn_clses, 'anchor': rpn_anchors} - - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rois, roi_clses, scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - - outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] - for i in range(4, 1, -1): - p = 'P%d'%i - outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] - - # outputs['tmp_1'] = tf.reduce_prod(tf.shape(outputs['rpn']['P3']['cls']))#outputs['rpn']['P5']['index'] - # outputs['tmp_2'] = outputs['rpn']['P2']['index'] - - outputs['rpn']['box'] = rpn_boxes - outputs['rpn']['cls'] = rpn_clses - outputs['rpn']['anchor'] = rpn_anchors - outputs['rpn']['rois'] = rois - - # outputs['tmp_0'] = rois - # outputs['tmp_1'] = rpn_boxes - # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) - # outputs['tmp_1'] = outputs['rpn']['P5']['index']# tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P4']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P3']['box'], [-1, 4]))[0]+ tf.shape(tf.reshape(outputs['rpn']['P2']['box'], [-1, 4]))[0] - # outputs['tmp_2'] = outputs['rpn']['P4']['index'] - # outputs['tmp_3'] = outputs['rpn']['P3']['index'] - # outputs['tmp_4'] = outputs['rpn']['P2']['index'] - - if is_training is True: - rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) - else: - rcnn_rois, rcnn_scores, rcnn_batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) - - - outputs['roi'] = {'box': rcnn_rois, 'score': rcnn_scores} - - ## cropping regions for refined network - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assign_indexs, rcnn_assigned_layer_inds] = \ - assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) - - outputs['rcnn_assigned_rois'] = rcnn_assigned_rois - outputs['rcnn_assign_indexs'] = rcnn_assign_indexs - outputs['rcnn_assigned_layer_inds'] = rcnn_assigned_layer_inds - - rcnn_cropped_rois = [] - rcnn_ordered_rois = [] - rcnn_ordered_index = [] - rcnn_pyramid_feature = [] - for i in range(5, 1, -1): - p = 'P%d'%i - rcnn_splitted_roi = rcnn_assigned_rois[i-2] - rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] - rcnn_index = rcnn_assign_indexs[i-2] - rcnn_cropped, rcnn_boxes_after_crop, rcnn_boxes_before_crop, rcnn_py_shape, rcnn_ihiw = ROIAlign_(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - rcnn_cropped_rois.append(rcnn_cropped) - rcnn_ordered_rois.append(rcnn_splitted_roi) - rcnn_ordered_index.append(rcnn_index) - rcnn_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - - rcnn_cropped_rois = tf.concat(values=rcnn_cropped_rois, axis=0) - rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) - rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) - rcnn_pyramid_feature = tf.concat(values=rcnn_pyramid_feature, axis=0) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - outputs['rcnn_ordered_rois'] = rcnn_ordered_rois - outputs['rcnn_ordered_index'] = rcnn_ordered_index - outputs['rcnn_pyramid_feature'] = rcnn_pyramid_feature - - outputs['roi']['rcnn_cropped_rois'] = rcnn_cropped_rois - tf.add_to_collection('__CROPPED__', rcnn_cropped_rois) - - ## refine head - # to 7 x 7 - rcnn_cropped_regions = slim.max_pool2d(rcnn_cropped_rois, [3, 3], stride=2, padding='SAME') - refine = slim.flatten(rcnn_cropped_regions) - refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) - refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) - refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) - box = slim.fully_connected(refine, num_classes*4, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) - - outputs['refined'] = {'box': box, 'cls': cls2} - - ## decode refine net outputs - cls2_prob = tf.nn.softmax(cls2) - final_boxes, classes, scores = \ - roi_decoder(box, cls2_prob, rcnn_ordered_rois, ih, iw) - - if is_training: - #outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} - - [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ - assign_boxes(mask_rois, [mask_rois, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) - # [mask_assigned_rois, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] = \ - # assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) - - outputs['mask_assigned_rois'] = mask_assigned_rois - outputs['mask_assign_indexs'] = mask_assign_indexs - outputs['mask_assigned_layer_inds'] = mask_assigned_layer_inds - - mask_cropped_rois = [] - mask_ordered_rois = [] - mask_ordered_index = [] - mask_pyramid_feature = [] - for i in range(5, 1, -1): - p = 'P%d'%i - mask_splitted_roi = mask_assigned_rois[i-2] - mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assign_indexs[i-2] - mask_cropped, mask_boxes_after_crop, mask_boxes_before_crop, mask_py_shape, mask_ihiw = ROIAlign_(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_rois.append(mask_cropped) - mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_index.append(mask_index) - mask_pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - - mask_cropped_rois = tf.concat(values=mask_cropped_rois, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_index = tf.concat(values=mask_ordered_index, axis=0) - mask_pyramid_feature = tf.concat(values=mask_pyramid_feature, axis=0) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_index'] = mask_ordered_index - outputs['mask_pyramid_feature'] = mask_pyramid_feature - - outputs['roi']['mask_cropped_rois'] = mask_cropped_rois - else: - ## for testing, maskrcnn takes refined boxes as inputs - inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) - [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) - - mask_cropped_rois = [] - mask_ordered_rois = [] - mask_ordered_classes = [] - mask_ordered_prob = [] - for i in range(5, 1, -1): - p = 'P%d'%i - splitted_rois = assigned_rois[i-2] - splitted_classes = assigned_classes[i-2] - splitted_prob = assigned_prob[i-2] - batch_inds = assigned_batch_inds[i-2] - cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_rois.append(cropped) - mask_ordered_rois.append(splitted_rois) - mask_ordered_classes.append(splitted_classes) - mask_ordered_prob.append(splitted_prob) - - - mask_cropped_rois = tf.concat(values=cropped_rois, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_classes = tf.concat(values=mask_ordered_classes, axis=0) - mask_ordered_prob = tf.concat(values=mask_ordered_prob, axis=0) - outputs['final_boxes'] = {'box': mask_ordered_rois, 'cls': mask_ordered_rois, 'prob': mask_ordered_rois, 'rpn_box': mask_ordered_rois} - - ## mask head - m = mask_cropped_rois - for _ in range(4): - m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - # to 28 x 28 - m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) - tf.add_to_collection('__TRANSPOSED__', m) - m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) - - # add a mask, given the predicted boxes and classes - outputs['mask'] = {'mask':m} - outputs['mask']['final_mask'] = tf.nn.sigmoid(m) - - return outputs - -def build_losses(pyramid, outputs, gt_boxes, gt_masks, - num_classes, base_anchors, - rpn_box_lw =1.0, rpn_cls_lw = 1.0, - refined_box_lw=1.0, refined_cls_lw=1.0, - mask_lw=1.0): - """Building 3-way output losses, totally 5 losses - Params: - ------ - outputs: output of build_heads - gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] - gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] - *_lw: loss weight of rpn, refined and mask losses - - Returns: - ------- - l: a loss tensor - """ - - # losses for pyramid - losses = [] - rpn_box_losses, rpn_cls_losses = [], [] - refined_box_losses, refined_cls_losses = [], [] - mask_losses = [] - - # watch some info during training - rpn_batch = [] - refine_batch = [] - mask_batch = [] - rpn_batch_pos = [] - refine_batch_pos = [] - mask_batch_pos = [] - - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - - ## assigning gt_boxes - [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) - - ## build losses for PFN - - for i in range(5, 1, -1): - p = 'P%d' % i - stride = 2 ** i - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - - splitted_gt_boxes = assigned_gt_boxes[i-2] - - ### rpn losses - # 1. encode ground truth - # 2. compute distances - # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - all_anchors = outputs['rpn'][p]['anchor'] - all_indexs = outputs['rpn'][p]['index'] - labels, bbox_targets, bbox_inside_weights, all_indexs = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') - boxes = outputs['rpn'][p]['box'] - classes = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - - labels, all_indexs, classes, boxes, bbox_targets, bbox_inside_weights = \ - _filter_negative_samples(tf.reshape(labels, [-1]), [ - tf.reshape(labels, [-1]), - tf.reshape(all_indexs, [-1]), - tf.reshape(classes, [-1, 2]), - tf.reshape(boxes, [-1, 4]), - tf.reshape(bbox_targets, [-1, 4]), - tf.reshape(bbox_inside_weights, [-1, 4]) - ]) - # _, frac_ = _get_valid_sample_fraction(labels) - rpn_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 - ))) - rpn_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 - ))) - # if i is 2: - # outputs['tmp_3'] = classes - # outputs['tmp_4'] = all_indexs - - rpn_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) - rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) - rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) - rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) - rpn_box_losses.append(rpn_box_loss) - - # NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses - # BUT these examples still count when computing the average of softmax_cross_entropy, - # the loss become smaller by a factor (None_negtive_labels / all_labels) - # the BEST practise still should be gathering all none-negative examples - labels = slim.one_hot_encoding(labels, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros - rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) - rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) - rpn_cls_losses.append(rpn_cls_loss) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - - ### refined loss - # 1. encode ground truth - # 2. compute distances - rcnn_ordered_rois = outputs['rcnn_ordered_rois'] - rcnn_ordered_index = outputs['rcnn_ordered_index'] - #rois = outputs['roi']['box'] - - boxes = outputs['refined']['box'] - classes = outputs['refined']['cls'] - - labels, bbox_targets, bbox_inside_weights, max_overlaps, rcnn_ordered_index = \ - roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') - - outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) - outputs['final_boxes']['max_overlaps'] = max_overlaps - outputs['gt'] = gt_boxes - - labels, rcnn_ordered_index, rcnn_ordered_rois, classes, boxes, bbox_targets, bbox_inside_weights = \ - _filter_negative_samples(tf.reshape(labels, [-1]),[ - tf.reshape(labels, [-1]), - tf.reshape(rcnn_ordered_index, [-1]), - tf.reshape(rcnn_ordered_rois, [-1, 4]), - tf.reshape(classes, [-1, num_classes]), - tf.reshape(boxes, [-1, num_classes * 4]), - tf.reshape(bbox_targets, [-1, num_classes * 4]), - tf.reshape(bbox_inside_weights, [-1, num_classes * 4]) - ] ) - - # outputs['tmp_3'] = ordered_rois_refined - # outputs['tmp_4'] = ordered_index_refined - # frac, frac_ = _get_valid_sample_fraction(labels, 1) - refine_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 - ))) - refine_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 - ))) - - refined_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) - refined_box_loss = tf.reshape(refined_box_loss, [-1, 4]) - refined_box_loss = tf.reduce_sum(refined_box_loss, axis=1) - refined_box_loss = refined_box_lw * tf.reduce_mean(refined_box_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, refined_box_loss) - refined_box_losses.append(refined_box_loss) - - labels = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) - refined_cls_loss = refined_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) - refined_cls_loss = tf.reduce_mean(refined_cls_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) - refined_cls_losses.append(refined_cls_loss) - - outputs['tmp_5'] = labels - outputs['tmp_4'] = classes - - ### mask loss - # mask of shape (N, h, w, num_classes) - masks = outputs['mask']['mask'] - - mask_ordered_rois = outputs['mask_ordered_rois'] - mask_ordered_index = outputs['mask_ordered_index'] - # mask_shape = tf.shape(masks) - # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], - # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) - labels, mask_targets, mask_inside_weights, mask_rois, mask_ordered_index= \ - mask_encoder_(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_index,scope='MaskEncoder') - - labels, mask_ordered_index, mask_ordered_rois, masks, mask_targets, mask_inside_weights, mask_rois = \ - _filter_negative_samples(tf.reshape(labels, [-1]), [ - tf.reshape(labels, [-1]), - tf.reshape(mask_ordered_index, [-1]), - tf.reshape(mask_ordered_rois, [-1, 4]), - tf.reshape(masks, [-1, 28, 28, num_classes]), - tf.reshape(mask_targets, [-1, 28, 28, num_classes]), - tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), - tf.reshape(mask_rois, [-1, 4]) - ]) - # _, frac_ = _get_valid_sample_fraction(labels) - - # outputs['tmp_0'] = labels - # outputs['tmp_1'] = mask_targets - # outputs['tmp_2'] = mask_inside_weights - # outputs['tmp_3'] = mask_rois - # outputs['tmp_4'] = ordered_index_mask - - mask_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 - ))) - mask_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 - ))) - # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) - # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) - # NOTE: w/o competition between classes. - - outputs['tmp_0'] = mask_rois - outputs['tmp_1'] = labels - outputs['tmp_2'] = tf.nn.sigmoid(masks) - outputs['tmp_3'] = mask_targets - - mask_targets = tf.cast(mask_targets, tf.float32) - mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) - mask_loss = tf.reduce_mean(mask_loss) - mask_loss = tf.cond(tf.greater(tf.size(labels), 0), lambda: mask_loss, lambda: tf.constant(0.0)) - tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) - mask_losses.append(mask_loss) - - rpn_box_losses = tf.add_n(rpn_box_losses) - rpn_cls_losses = tf.add_n(rpn_cls_losses) - refined_box_losses = tf.add_n(refined_box_losses) - refined_cls_losses = tf.add_n(refined_cls_losses) - mask_losses = tf.add_n(mask_losses) - losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] - total_loss = tf.add_n(losses) - - rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) - refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) - mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) - rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) - refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) - mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) - - return total_loss, losses, [rpn_batch_pos, rpn_batch, \ - refine_batch_pos, refine_batch, \ - mask_batch_pos, mask_batch] - -def decode_output(outputs): - """decode outputs into boxes and masks""" - return [], [], [] - -def build(end_points, image_height, image_width, pyramid_map, - num_classes, - base_anchors, - is_training, - gt_boxes, - gt_masks, - loss_weights=[0.5, 0.5, 1.0, 0.5, 0.1]): - - pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) - - for p in pyramid: - print (p) - - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - is_training=is_training, gt_boxes=gt_boxes) - - if is_training: - loss, losses, batch_info = build_losses(pyramid, outputs, - gt_boxes, gt_masks, - num_classes=num_classes, base_anchors=base_anchors, - rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - refined_box_lw=loss_weights[2], refined_cls_lw=loss_weights[3], - mask_lw=loss_weights[4]) - - outputs['losses'] = losses - outputs['total_loss'] = loss - outputs['batch_info'] = batch_info - - ## just decode outputs into readable prediction - pred_boxes, pred_classes, pred_masks = decode_output(outputs) - outputs['pred_boxes'] = pred_boxes - outputs['pred_classes'] = pred_classes - outputs['pred_masks'] = pred_masks - - # image and gt visualization - visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) - - # rpn visualization - visualize_bb(end_points["input"], outputs['roi']["box"], name="rpn_bb_visualization") - - # final network visualization - first_mask = outputs['mask']['mask'][:1] - first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) - - visualize_final_predictions(outputs['final_boxes']["box"], end_points["input"], first_mask) - - return outputs diff --git a/libs/nets/pyramid_network_backup.py b/libs/nets/pyramid_network_backup.py deleted file mode 100644 index c80807c..0000000 --- a/libs/nets/pyramid_network_backup.py +++ /dev/null @@ -1,682 +0,0 @@ -# coding=utf-8 -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf -import tensorflow.contrib.slim as slim - -from libs.boxes.roi import roi_cropping -from libs.layers import anchor_encoder -from libs.layers import anchor_decoder -from libs.layers import roi_encoder -from libs.layers import roi_decoder -from libs.layers import mask_encoder -from libs.layers import mask_encoder_ -from libs.layers import mask_decoder -from libs.layers import gen_all_anchors -from libs.layers import ROIAlign -from libs.layers import ROIAlign_ -from libs.layers import sample_rpn_outputs -from libs.layers import sample_rpn_outputs_with_gt -from libs.layers import assign_boxes -from libs.layers import inst_inference -from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input - -_BN = True - -# mapping each stage to its' tensor features -_networks_map = { - 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', - 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - }, - 'resnet101': {'C1': '', 'C2': '', - 'C3': '', 'C4': '', - 'C5': '', - } -} - -def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, - activation_fn=None, - batch_norm_decay=0.997, - batch_norm_epsilon=1e-5, - batch_norm_scale=True, - is_training=True): - - batch_norm_params = { - 'decay': batch_norm_decay, - 'epsilon': batch_norm_epsilon, - 'scale': batch_norm_scale, - 'updates_collections': tf.GraphKeys.UPDATE_OPS, - 'is_training': is_training - } - - with slim.arg_scope( - [slim.conv2d], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(), - activation_fn=tf.nn.relu, - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params): - with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): - - with slim.arg_scope( - [slim.conv2d, slim.conv2d_transpose], - padding='SAME', - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), - activation_fn=tf.nn.relu, - normalizer_fn=normalizer_fn,): - with slim.arg_scope( - [slim.fully_connected], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), - activation_fn=activation_fn, - normalizer_fn=normalizer_fn): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def my_sigmoid(x): - """add an active function for the box output layer, which is linear around 0""" - return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 - -def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): - """Smooth L1 loss - Returns - ------ - dist: element-wise distance, as the same shape of x, y - """ - deltas = x - y - with tf.name_scope(name=name) as scope: - deltas_abs = tf.abs(deltas) - smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) - return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ - (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) - -def _get_valid_sample_fraction(labels, p=0): - """return fraction of non-negative examples, the ignored examples have been marked as negative""" - num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) - num_example = tf.cast(tf.size(labels), tf.float32) - frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, - lambda: tf.cast(0, tf.float32)) - frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, - lambda: tf.cast(0, tf.float32)) - return frac, frac_ - - -def _filter_negative_samples(labels, tensors): - """keeps only samples with none-negative labels - Params: - ----- - labels: of shape (N,) - tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number - - Returns: - ----- - tensors: filtered tensors - """ - # return tensors - keeps = tf.where(tf.greater_equal(labels, 0)) - keeps = tf.reshape(keeps, [-1]) - - filtered = [] - for t in tensors: - tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) - f = tf.gather(t, keeps) - filtered.append(f) - - return filtered - -def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): - ws = gt_boxes[:, 2] - gt_boxes[:, 0] - hs = gt_boxes[:, 3] - gt_boxes[:, 1] - shape = tf.shape(gt_boxes)[0] - jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) - jitter = tf.reshape(jitter, [-1]) - ws_offset = ws * jitter - hs_offset = hs * jitter - x1s = gt_boxes[:, 0] + ws_offset - x2s = gt_boxes[:, 2] + ws_offset - y1s = gt_boxes[:, 1] + hs_offset - y2s = gt_boxes[:, 3] + hs_offset - boxes = tf.concat( - values=[ - x1s[:, tf.newaxis], - y1s[:, tf.newaxis], - x2s[:, tf.newaxis], - y2s[:, tf.newaxis]], - axis=1) - new_scores = tf.ones([shape], tf.float32) - new_batch_inds = tf.zeros([shape], tf.int32) - - return tf.concat(values=[rois, boxes], axis=0), \ - tf.concat(values=[scores, new_scores], axis=0), \ - tf.concat(values=[batch_inds, new_batch_inds], axis=0) - -def build_pyramid(net_name, end_points, bilinear=True, is_training=True): - """build pyramid features from a typical network, - assume each stage is 2 time larger than its top feature - Returns: - returns several endpoints - """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): - - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') - - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) - - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) - - pyramid['P%d'%(c)] = s - - return pyramid - -def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): - """Build the 3-way outputs, i.e., class, box and mask in the pyramid - Algo - ---- - For each layer: - 1. Build anchor layer - 2. Process the results of anchor layer, decode the output into rois - 3. Sample rois - 4. Build roi layer - 5. Process the results of roi layer, decode the output into boxes - 6. Build the mask layer - 7. Build losses - """ - outputs = {} - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - # for p in pyramid: - outputs['rpn'] = {} - for i in range(5, 1, -1): - p = 'P%d'%i - stride = 2 ** i - - ## rpn head - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) - box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) - cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - print("anchor_scales = " , anchor_scales) - all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - - ## gather all rois - # print (outputs['rpn']) - rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] - rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] - rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] - - rpn_boxes = tf.concat(values=rpn_boxes, axis=0) - rpn_clses = tf.concat(values=rpn_clses, axis=0) - rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - - # outputs['rpn'] = {'box': rpn_boxes, 'cls': rpn_clses, 'anchor': rpn_anchors} - - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rois, roi_clses, scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - - outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] - for i in range(4, 1, -1): - p = 'P%d'%i - outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] - - # outputs['tmp_1'] = tf.reduce_prod(tf.shape(outputs['rpn']['P3']['cls']))#outputs['rpn']['P5']['index'] - # outputs['tmp_2'] = outputs['rpn']['P2']['index'] - - outputs['rpn']['box'] = rpn_boxes - outputs['rpn']['cls'] = rpn_clses - outputs['rpn']['anchor'] = rpn_anchors - outputs['rpn']['rois'] = rois - - # outputs['tmp_0'] = rois - # outputs['tmp_1'] = rpn_boxes - # outputs['tmp_2'] = tf.reshape(rpn_clses, [-1, 2]) - # outputs['tmp_1'] = outputs['rpn']['P5']['index']# tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P4']['box'], [-1, 4]))[0] + tf.shape(tf.reshape(outputs['rpn']['P3']['box'], [-1, 4]))[0]+ tf.shape(tf.reshape(outputs['rpn']['P2']['box'], [-1, 4]))[0] - # outputs['tmp_2'] = outputs['rpn']['P4']['index'] - # outputs['tmp_3'] = outputs['rpn']['P3']['index'] - # outputs['tmp_4'] = outputs['rpn']['P2']['index'] - - if is_training is True: - rois, scores, batch_inds, indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - sample_rpn_outputs_with_gt(rois, rpn_probs[:, 1], gt_boxes, indexs, is_training=is_training) - else: - rois, scores, batch_inds = sample_rpn_outputs(rois, rpn_probs[:, 1]) - - - outputs['roi'] = {'box': rois, 'score': scores} - - ## cropping regions - [assigned_rois, assigned_batch_inds, assign_indexs, assigned_layer_inds] = \ - assign_boxes(rois, [rois, batch_inds, indexs], [2, 3, 4, 5]) - - outputs['assigned_rois'] = assigned_rois - outputs['assign_indexs'] = assign_indexs - outputs['assigned_layer_inds'] = assigned_layer_inds - - cropped_rois = [] - ordered_rois = [] - ordered_index = [] - pyramid_feature = [] - for i in range(5, 1, -1): - p = 'P%d'%i - splitted_rois = assigned_rois[i-2] - batch_inds = assigned_batch_inds[i-2] - index = assign_indexs[i-2] - cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - cropped_rois.append(cropped) - ordered_rois.append(splitted_rois) - ordered_index.append(index) - pyramid_feature.append(tf.transpose(pyramid[p],[0,3,1,2])) - - cropped_rois = tf.concat(values=cropped_rois, axis=0) - ordered_rois = tf.concat(values=ordered_rois, axis=0) - ordered_index = tf.concat(values=ordered_index, axis=0) - pyramid_feature = tf.concat(values=pyramid_feature, axis=0) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - outputs['ordered_rois'] = ordered_rois - outputs['ordered_index'] = ordered_index - outputs['pyramid_feature'] = pyramid_feature - - outputs['roi']['cropped_rois'] = cropped_rois - tf.add_to_collection('__CROPPED__', cropped_rois) - - ## refine head - # to 7 x 7 - cropped_regions = slim.max_pool2d(cropped_rois, [3, 3], stride=2, padding='SAME') - refine = slim.flatten(cropped_regions) - refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) - refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - refine = slim.fully_connected(refine, 1024, activation_fn=tf.nn.relu) - refine = slim.dropout(refine, keep_prob=0.75, is_training=is_training) - cls2 = slim.fully_connected(refine, num_classes, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) - box = slim.fully_connected(refine, num_classes*4, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) - - outputs['refined'] = {'box': box, 'cls': cls2} - - ## decode refine net outputs - cls2_prob = tf.nn.softmax(cls2) - final_boxes, classes, scores = \ - roi_decoder(box, cls2_prob, ordered_rois, ih, iw) - - ## for testing, maskrcnn takes refined boxes as inputs - if not is_training: - - inst_boxes, inst_classes, inst_prob, batch_inds = inst_inference(final_boxes, classes, cls2_prob) - [assigned_rois, assigned_classes, assigned_prob, assigned_batch_inds, assigned_layer_inds] = assign_boxes(inst_boxes, [inst_boxes, inst_classes, inst_prob, batch_inds], [2, 3, 4, 5]) - - cropped_rois = [] - ordered_inst_boxes = [] - ordered_inst_classes = [] - ordered_inst_prob = [] - for i in range(5, 1, -1): - p = 'P%d'%i - splitted_rois = assigned_rois[i-2] - splitted_classes = assigned_classes[i-2] - splitted_prob = assigned_prob[i-2] - batch_inds = assigned_batch_inds[i-2] - cropped, boxes_after_crop, boxes_before_crop, py_shape, ihiw = ROIAlign_(pyramid[p], splitted_rois, batch_inds, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - cropped_rois.append(cropped) - ordered_inst_boxes.append(splitted_rois) - ordered_inst_classes.append(splitted_classes) - ordered_inst_prob.append(splitted_prob) - - - cropped_rois = tf.concat(values=cropped_rois, axis=0) - ordered_inst_boxes = tf.concat(values=ordered_inst_boxes, axis=0) - ordered_inst_classes = tf.concat(values=ordered_inst_classes, axis=0) - ordered_inst_prob = tf.concat(values=ordered_inst_prob, axis=0) - outputs['final_boxes'] = {'box': ordered_inst_boxes, 'cls': ordered_inst_classes, 'prob': ordered_inst_prob, 'rpn_box': ordered_rois} - else: - outputs['final_boxes'] = {'box': final_boxes, 'cls': classes, 'prob': cls2_prob, 'rpn_box': ordered_rois} - - ## mask head - m = cropped_rois - for _ in range(4): - m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - # to 28 x 28 - m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) - tf.add_to_collection('__TRANSPOSED__', m) - m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) - - # add a mask, given the predicted boxes and classes - outputs['mask'] = {'mask':m, 'cls': classes, 'score': scores} - outputs['mask']['final_mask'] = tf.nn.sigmoid(m) - - return outputs - -def build_losses(pyramid, outputs, gt_boxes, gt_masks, - num_classes, base_anchors, - rpn_box_lw =1.0, rpn_cls_lw = 1.0, - refined_box_lw=1.0, refined_cls_lw=1.0, - mask_lw=1.0): - """Building 3-way output losses, totally 5 losses - Params: - ------ - outputs: output of build_heads - gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] - gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] - *_lw: loss weight of rpn, refined and mask losses - - Returns: - ------- - l: a loss tensor - """ - - # losses for pyramid - losses = [] - rpn_box_losses, rpn_cls_losses = [], [] - refined_box_losses, refined_cls_losses = [], [] - mask_losses = [] - - # watch some info during training - rpn_batch = [] - refine_batch = [] - mask_batch = [] - rpn_batch_pos = [] - refine_batch_pos = [] - mask_batch_pos = [] - - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - - ## assigning gt_boxes - [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) - - ## build losses for PFN - - for i in range(5, 1, -1): - p = 'P%d' % i - stride = 2 ** i - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - - splitted_gt_boxes = assigned_gt_boxes[i-2] - - ### rpn losses - # 1. encode ground truth - # 2. compute distances - # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - all_anchors = outputs['rpn'][p]['anchor'] - all_indexs = outputs['rpn'][p]['index'] - labels, bbox_targets, bbox_inside_weights, all_indexs = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') - boxes = outputs['rpn'][p]['box'] - classes = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - - labels, all_indexs, classes, boxes, bbox_targets, bbox_inside_weights = \ - _filter_negative_samples(tf.reshape(labels, [-1]), [ - tf.reshape(labels, [-1]), - tf.reshape(all_indexs, [-1]), - tf.reshape(classes, [-1, 2]), - tf.reshape(boxes, [-1, 4]), - tf.reshape(bbox_targets, [-1, 4]), - tf.reshape(bbox_inside_weights, [-1, 4]) - ]) - # _, frac_ = _get_valid_sample_fraction(labels) - rpn_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 - ))) - rpn_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 - ))) - # if i is 2: - # outputs['tmp_3'] = classes - # outputs['tmp_4'] = all_indexs - - rpn_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) - rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) - rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) - rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) - rpn_box_losses.append(rpn_box_loss) - - # NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses - # BUT these examples still count when computing the average of softmax_cross_entropy, - # the loss become smaller by a factor (None_negtive_labels / all_labels) - # the BEST practise still should be gathering all none-negative examples - labels = slim.one_hot_encoding(labels, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros - rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) - rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) - rpn_cls_losses.append(rpn_cls_loss) - - # outputs['tmp_3'] = ordered_rois - # outputs['tmp_4'] = ordered_index - - - ### refined loss - # 1. encode ground truth - # 2. compute distances - ordered_rois_refined = outputs['ordered_rois'] - ordered_index_refined = outputs['ordered_index'] - #rois = outputs['roi']['box'] - - boxes = outputs['refined']['box'] - classes = outputs['refined']['cls'] - - labels, bbox_targets, bbox_inside_weights, max_overlaps, ordered_index_refined = \ - roi_encoder(gt_boxes, ordered_rois_refined, num_classes, ordered_index_refined, scope='ROIEncoder') - - outputs['final_boxes']['gt_cls'] = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) - outputs['final_boxes']['max_overlaps'] = max_overlaps - outputs['gt'] = gt_boxes - - labels, ordered_index_refined, ordered_rois_refined, classes, boxes, bbox_targets, bbox_inside_weights = \ - _filter_negative_samples(tf.reshape(labels, [-1]),[ - tf.reshape(labels, [-1]), - tf.reshape(ordered_index_refined, [-1]), - tf.reshape(ordered_rois_refined, [-1, 4]), - tf.reshape(classes, [-1, num_classes]), - tf.reshape(boxes, [-1, num_classes * 4]), - tf.reshape(bbox_targets, [-1, num_classes * 4]), - tf.reshape(bbox_inside_weights, [-1, num_classes * 4]) - ] ) - - # outputs['tmp_3'] = ordered_rois_refined - # outputs['tmp_4'] = ordered_index_refined - # frac, frac_ = _get_valid_sample_fraction(labels, 1) - refine_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 - ))) - refine_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 - ))) - - refined_box_loss = bbox_inside_weights * _smooth_l1_dist(boxes, bbox_targets) - refined_box_loss = tf.reshape(refined_box_loss, [-1, 4]) - refined_box_loss = tf.reduce_sum(refined_box_loss, axis=1) - refined_box_loss = refined_box_lw * tf.reduce_mean(refined_box_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, refined_box_loss) - refined_box_losses.append(refined_box_loss) - - labels = slim.one_hot_encoding(labels, num_classes, on_value=1.0, off_value=0.0) - refined_cls_loss = refined_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=classes) - refined_cls_loss = tf.reduce_mean(refined_cls_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, refined_cls_loss) - refined_cls_losses.append(refined_cls_loss) - - outputs['tmp_5'] = labels - outputs['tmp_4'] = classes - - ### mask loss - # mask of shape (N, h, w, num_classes) - masks = outputs['mask']['mask'] - - ordered_rois_mask = outputs['ordered_rois'] - ordered_index_mask = outputs['ordered_index'] - # mask_shape = tf.shape(masks) - # masks = tf.reshape(masks, (mask_shape[0], mask_shape[1], - # mask_shape[2], tf.cast(mask_shape[3]/2, tf.int32), 2)) - labels, mask_targets, mask_inside_weights, mask_rois, ordered_index_mask= \ - mask_encoder_(gt_masks, gt_boxes, ordered_rois_mask, num_classes, 28, 28, ordered_index_mask,scope='MaskEncoder') - - labels, ordered_index_mask, ordered_rois_mask, masks, mask_targets, mask_inside_weights, mask_rois = \ - _filter_negative_samples(tf.reshape(labels, [-1]), [ - tf.reshape(labels, [-1]), - tf.reshape(ordered_index_mask, [-1]), - tf.reshape(ordered_rois_mask, [-1, 4]), - tf.reshape(masks, [-1, 28, 28, num_classes]), - tf.reshape(mask_targets, [-1, 28, 28, num_classes]), - tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), - tf.reshape(mask_rois, [-1, 4]) - ]) - # _, frac_ = _get_valid_sample_fraction(labels) - - # outputs['tmp_0'] = labels - # outputs['tmp_1'] = mask_targets - # outputs['tmp_2'] = mask_inside_weights - # outputs['tmp_3'] = mask_rois - # outputs['tmp_4'] = ordered_index_mask - - mask_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 0), tf.float32 - ))) - mask_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(labels, 1), tf.float32 - ))) - # mask_targets = slim.one_hot_encoding(mask_targets, 2, on_value=1.0, off_value=0.0) - # mask_binary_loss = mask_lw * tf.losses.softmax_cross_entropy(mask_targets, masks) - # NOTE: w/o competition between classes. - - outputs['tmp_0'] = mask_rois - outputs['tmp_1'] = labels - outputs['tmp_2'] = tf.nn.sigmoid(masks) - outputs['tmp_3'] = mask_targets - - mask_targets = tf.cast(mask_targets, tf.float32) - mask_loss = mask_lw * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) - mask_loss = tf.reduce_mean(mask_loss) - mask_loss = tf.cond(tf.greater(tf.size(labels), 0), lambda: mask_loss, lambda: tf.constant(0.0)) - tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) - mask_losses.append(mask_loss) - - rpn_box_losses = tf.add_n(rpn_box_losses) - rpn_cls_losses = tf.add_n(rpn_cls_losses) - refined_box_losses = tf.add_n(refined_box_losses) - refined_cls_losses = tf.add_n(refined_cls_losses) - mask_losses = tf.add_n(mask_losses) - losses = [rpn_box_losses, rpn_cls_losses, refined_box_losses, refined_cls_losses, mask_losses] - total_loss = tf.add_n(losses) - - rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) - refine_batch = tf.cast(tf.add_n(refine_batch), tf.float32) - mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) - rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) - refine_batch_pos = tf.cast(tf.add_n(refine_batch_pos), tf.float32) - mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) - - return total_loss, losses, [rpn_batch_pos, rpn_batch, \ - refine_batch_pos, refine_batch, \ - mask_batch_pos, mask_batch] - -def decode_output(outputs): - """decode outputs into boxes and masks""" - return [], [], [] - -def build(end_points, image_height, image_width, pyramid_map, - num_classes, - base_anchors, - is_training, - gt_boxes, - gt_masks, - loss_weights=[0.5, 0.5, 1.0, 0.5, 0.1]): - - pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) - - for p in pyramid: - print (p) - - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - is_training=is_training, gt_boxes=gt_boxes) - - if is_training: - loss, losses, batch_info = build_losses(pyramid, outputs, - gt_boxes, gt_masks, - num_classes=num_classes, base_anchors=base_anchors, - rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - refined_box_lw=loss_weights[2], refined_cls_lw=loss_weights[3], - mask_lw=loss_weights[4]) - - outputs['losses'] = losses - outputs['total_loss'] = loss - outputs['batch_info'] = batch_info - - ## just decode outputs into readable prediction - pred_boxes, pred_classes, pred_masks = decode_output(outputs) - outputs['pred_boxes'] = pred_boxes - outputs['pred_classes'] = pred_classes - outputs['pred_masks'] = pred_masks - - # image and gt visualization - visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) - - # rpn visualization - visualize_bb(end_points["input"], outputs['roi']["box"], name="rpn_bb_visualization") - - # final network visualization - first_mask = outputs['mask']['mask'][:1] - first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) - - visualize_final_predictions(outputs['final_boxes']["box"], end_points["input"], first_mask) - - return outputs diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index 3414037..fac6c3a 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -51,7 +51,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la box = np.floor(box).astype('uint16') bbox_w = box[2]-box[0] bbox_h = box[3]-box[1] - mask_color_id = np.random.randint(15) + mask_color_id = np.random.randint(35) color_img = color_id_to_color_code(mask_color_id)* np.ones((bbox_h,bbox_w,1)) * 255 color_img = Image.fromarray(color_img.astype('uint8')).convert('RGBA') #color_img = Image.new("RGBA", (bbox_w,bbox_h), np.random.rand(1,3) * 255 ) @@ -109,5 +109,27 @@ def color_id_to_color_code(colorId): [0, 169, 252], [104, 30, 126], [125, 60, 181], - [189, 122, 246]]) + [189, 122, 246], + [234, 62, 112], + [198, 44, 58], + [243, 114, 82], + [255, 130, 1], + [255, 211, 92], + [138, 151, 71], + [2, 181, 160], + [75, 196, 213], + [149, 69, 103], + [125, 9, 150], + [169, 27, 176], + [198, 30, 153], + [207, 0, 99], + [230, 21, 119], + [243, 77, 154], + [144, 33, 71], + [223, 40, 35], + [247, 106, 4], + [206, 156, 72], + [250, 194, 0], + [254, 221, 39], + ]) return color_code[colorId] From 9adc8e470dc311369ed38296b22549bc83ad51a5 Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 14:33:13 +0900 Subject: [PATCH 12/35] comments --- libs/layers/sample.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 1df561b..1e6ee95 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -193,6 +193,7 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): classes = np.array([[0]]) else: + #@TODO raise "inference nms type error" batch_inds = np.zeros([boxes.shape[0]]) From b79d5c15e007475c30f8c101b19acea36e29af7c Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 14:36:34 +0900 Subject: [PATCH 13/35] fixed only_positive in sample_rpn_outputs --- libs/layers/wrapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 4031f93..36ccf83 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -150,12 +150,12 @@ def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): return Mask -def sample_wrapper(boxes, scores, indexs, is_training=True, scope='SampleBoxes'): +def sample_wrapper(boxes, scores, indexs, is_training=True, only_positive=True, scope='SampleBoxes'): with tf.name_scope(scope) as sc: boxes, scores, batch_inds, indexs = \ tf.py_func(sample.sample_rpn_outputs, - [boxes, scores, indexs, is_training], + [boxes, scores, indexs, is_training, only_positive], [tf.float32, tf.float32, tf.int32, tf.int32]) boxes = tf.convert_to_tensor(boxes, name='Boxes') scores = tf.convert_to_tensor(scores, name='Scores') From 2d0514c4b68b72d27a778373163b14ed99db026f Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 16:07:04 +0900 Subject: [PATCH 14/35] fixed only_positive in sample_rpn_outputs_wrt_gt --- libs/configs/config_v1.py | 6 +++--- libs/layers/sample.py | 4 ++-- libs/layers/wrapper.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 3c027fd..be488d7 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.001, +tf.app.flags.DEFINE_float('learning_rate', 0.0001, 'Initial learning rate.') tf.app.flags.DEFINE_float( @@ -284,8 +284,8 @@ 'NMS threshold in RPN') tf.app.flags.DEFINE_float( - 'inst_nms_threshold', 0.3, - 'NMS threshold in inst inference') + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') ################################## # Mask # diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 1e6ee95..8d7e87a 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -135,7 +135,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): min_size = cfg.FLAGS.min_size - inst_nms_threshold = cfg.FLAGS.inst_nms_threshold + mask_nms_threshold = cfg.FLAGS.mask_nms_threshold post_nms_inst_n = cfg.FLAGS.post_nms_inst_n if class_agnostic is True: scores = prob[range(prob.shape[0]),classes] @@ -172,7 +172,7 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): # filter with nms det = np.hstack((boxes, scores)).astype(np.float32) - keeps = nms_wrapper.nms(det, inst_nms_threshold) + keeps = nms_wrapper.nms(det, mask_nms_threshold) # filter low score diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 36ccf83..426f9df 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -168,12 +168,12 @@ def sample_wrapper(boxes, scores, indexs, is_training=True, only_positive=True, return boxes, scores, batch_inds, indexs -def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, scope='SampleBoxesWithGT'): +def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): with tf.name_scope(scope) as sc: boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs = \ tf.py_func(sample.sample_rpn_outputs_wrt_gt_boxes, - [boxes, scores, gt_boxes, indexs, is_training], + [boxes, scores, gt_boxes, indexs, is_training, only_positive], [tf.float32, tf.float32, tf.int32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) boxes = tf.convert_to_tensor(boxes, name='Boxes') scores = tf.convert_to_tensor(scores, name='Scores') From c2027db40215a5f1db0292917b86b138804c9905 Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 16:09:22 +0900 Subject: [PATCH 15/35] changed some hyper params --- libs/configs/config_v1.py | 2 +- train/train.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index be488d7..9c4d44f 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.0001, +tf.app.flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.') tf.app.flags.DEFINE_float( diff --git a/train/train.py b/train/train.py index 638975e..4e72c44 100644 --- a/train/train.py +++ b/train/train.py @@ -190,7 +190,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1.0, 1.0, 200.0, 10.0, 100.0]) + loss_weights=[1.0, 1.0, 500.0, 10.0, 100.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) total_loss = outputs['total_loss'] From 8b9680417e5ba1c87f22813455f53fc77da25356 Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 1 Aug 2017 16:40:34 +0900 Subject: [PATCH 16/35] remove gt during testing --- libs/nets/pyramid_network.py | 58 ++++++++++++++++++------------------ train/test.py | 2 +- train/train.py | 2 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 6aaaaf8..4c73e38 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -603,15 +603,7 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) rcnn_batch_pos = tf.cast(tf.add_n(rcnn_batch_pos), tf.float32) mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) - - ### for debuging - outputs['tmp_0'] = rpn_cls_losses - outputs['tmp_1'] = rpn_cls_losses - outputs['tmp_2'] = rpn_cls_losses - outputs['tmp_3'] = rpn_cls_losses - outputs['tmp_4'] = rpn_cls_losses - outputs['tmp_5'] = rpn_cls_losses - + return total_loss, losses, [rpn_batch_pos, rpn_batch, \ rcnn_batch_pos, rcnn_batch, \ mask_batch_pos, mask_batch] @@ -624,30 +616,30 @@ def build(end_points, image_height, image_width, pyramid_map, num_classes, base_anchors, is_training, - gt_boxes, - gt_masks, + gt_boxes=None, + gt_masks=None, loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) - for p in pyramid: - print (p) - - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - is_training=is_training, gt_boxes=gt_boxes) - - # if is_training: - loss, losses, batch_info = build_losses(pyramid, outputs, - gt_boxes, gt_masks, - num_classes=num_classes, base_anchors=base_anchors, - rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], - mask_lw=loss_weights[4]) - - outputs['losses'] = losses - outputs['total_loss'] = loss - outputs['batch_info'] = batch_info + if is_training: + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training, gt_boxes=gt_boxes) + loss, losses, batch_info = build_losses(pyramid, outputs, + gt_boxes, gt_masks, + num_classes=num_classes, base_anchors=base_anchors, + rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], + rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], + mask_lw=loss_weights[4]) + + outputs['losses'] = losses + outputs['total_loss'] = loss + outputs['batch_info'] = batch_info + else: + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training) ### just decode outputs into readable prediction pred_boxes, pred_classes, pred_masks = decode_output(outputs) @@ -655,6 +647,14 @@ def build(end_points, image_height, image_width, pyramid_map, outputs['pred_classes'] = pred_classes outputs['pred_masks'] = pred_masks + ### for debuging + outputs['tmp_0'] = pred_classes + outputs['tmp_1'] = pred_classes + outputs['tmp_2'] = pred_classes + outputs['tmp_3'] = pred_classes + outputs['tmp_4'] = pred_classes + outputs['tmp_5'] = pred_classes + # ### image and gt visualization # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) diff --git a/train/test.py b/train/test.py index ef16c69..bc1f0c2 100644 --- a/train/test.py +++ b/train/test.py @@ -138,7 +138,7 @@ def test(): num_classes=81, base_anchors=9, is_training=False, - gt_boxes=gt_boxes, gt_masks=gt_masks, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) + gt_boxes=None, gt_masks=None, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) input_image = end_points['input'] diff --git a/train/train.py b/train/train.py index 4e72c44..3768e46 100644 --- a/train/train.py +++ b/train/train.py @@ -190,7 +190,7 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1.0, 1.0, 500.0, 10.0, 100.0]) + loss_weights=[1.0, 1.0, 200.0, 2.0, 10.0]) #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) total_loss = outputs['total_loss'] From ae98c854382895111a0f100990aa79a1fb72d291 Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 3 Aug 2017 17:10:05 +0900 Subject: [PATCH 17/35] fixed nms in sampling during test --- libs/configs/config_v1.py | 2 +- libs/layers/sample.py | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 9c4d44f..be488d7 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -130,7 +130,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.001, +tf.app.flags.DEFINE_float('learning_rate', 0.0001, 'Initial learning rate.') tf.app.flags.DEFINE_float( diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 8d7e87a..795980c 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -28,9 +28,9 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # training: 12000, 2000 # testing: 6000, 400 - if not is_training: - pre_nms_top_n = int(pre_nms_top_n / 2) - post_nms_top_n = int(post_nms_top_n / 5) + # if not is_training: + # pre_nms_top_n = int(pre_nms_top_n / 2) + # post_nms_top_n = int(post_nms_top_n / 5) boxes = boxes.reshape((-1, 4)) scores = scores.reshape((-1, 1)) @@ -161,7 +161,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): classes = classes[keeps] prob = prob[keeps, :] - #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] @@ -171,6 +170,13 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): prob = prob[keeps, :] # filter with nms + order = scores.ravel().argsort()[::-1] + scores = scores[order] + indexs = indexs[order] + boxes = boxes[order, :] + classes = classes[order] + prob = prob[order, :] + det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, mask_nms_threshold) @@ -191,6 +197,7 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([[0]]) + prob = np.zeros((1,81)) else: #@TODO From 4adbc5408bbcf0a84de16da67f1089cb78c6947d Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 3 Aug 2017 20:14:45 +0900 Subject: [PATCH 18/35] fixed conflict from variable names --- libs/nets/pyramid_network.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 4c73e38..f59f06e 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -268,15 +268,17 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g if is_training is True: ### for training, rcnn and maskrcnn take rpn boxes as inputs - rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) ### assign pyramid layer indexs to rcnn network's ROIs [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ - assign_boxes(rcnn_rois, [rcnn_rois, rcnn_batch_inds, rcnn_indexs], [2, 3, 4, 5]) + assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) ### crop features from pyramid for rcnn network rcnn_cropped_features = [] @@ -328,7 +330,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g ### assign pyramid layer indexs to mask network's ROIs if is_training: [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ - assign_boxes(mask_rois, [mask_rois, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) + assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) mask_cropped_features = [] mask_ordered_rois = [] @@ -351,9 +353,10 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g else: ### for testing, mask network takes rcnn boxes as inputs - mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ - assign_boxes(mask_rois, [mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs], [2, 3, 4, 5]) + assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) mask_cropped_features = [] mask_ordered_rois = [] From 9b351aebb664e143dd209b5c4f89845e489e895e Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 7 Aug 2017 13:40:02 +0900 Subject: [PATCH 19/35] last check before change anchor --- train/train.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/train/train.py b/train/train.py index 3768e46..bce8a0b 100644 --- a/train/train.py +++ b/train/train.py @@ -190,8 +190,9 @@ def train(): base_anchors=9, is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[1.0, 1.0, 200.0, 2.0, 10.0]) - #loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) + loss_weights=[10.0, 10.0, 1000.0, 1.0, 100.0]) + # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) + # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) total_loss = outputs['total_loss'] losses = outputs['losses'] From 10ffbd2e820f94f4d01d3fb785f6803e831a6a4c Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 7 Aug 2017 13:52:15 +0900 Subject: [PATCH 20/35] changed anchor from 3x3 to 5x3 --- libs/configs/config_v1.py | 2 +- libs/nets/pyramid_network.py | 2 +- train/train.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index be488d7..d64d057 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -256,7 +256,7 @@ 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 500, + 'rpn_batch_size', 512, 'Number of rpn anchors that should be sampled to train this network') tf.app.flags.DEFINE_integer( diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index f59f06e..81e6744 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -237,7 +237,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} diff --git a/train/train.py b/train/train.py index bce8a0b..2fdac91 100644 --- a/train/train.py +++ b/train/train.py @@ -187,7 +187,7 @@ def train(): weight_decay=FLAGS.weight_decay, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=9, + base_anchors=15,#9 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, loss_weights=[10.0, 10.0, 1000.0, 1.0, 100.0]) From 2d1622d82bcfa7f9bd26223f1ce4bc11afce95f3 Mon Sep 17 00:00:00 2001 From: souryuu Date: Wed, 9 Aug 2017 15:04:52 +0900 Subject: [PATCH 21/35] changed anchor to match with MaskRCNN original paper fixed the issue that is_training=False causes no bounding boxes during test fixed batch normalization gradient update --- libs/configs/config_v1.py | 781 +++++++++++++++++++++---------- libs/datasets/coco.py | 4 +- libs/datasets/dataset_factory.py | 3 +- libs/layers/sample.py | 20 +- libs/nets/nets_factory.py | 12 +- libs/nets/pyramid_network.py | 10 +- libs/nets/resnet_utils.py | 113 +++-- libs/nets/resnet_utils.py_ | 255 ++++++++++ libs/nets/resnet_v1.py | 251 +++++----- libs/nets/resnet_v1.py_ | 304 ++++++++++++ libs/visualization/pil_utils.py | 2 +- train/test.py | 17 +- train/train.py | 3 +- 13 files changed, 1348 insertions(+), 427 deletions(-) create mode 100644 libs/nets/resnet_utils.py_ create mode 100644 libs/nets/resnet_v1.py_ diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index d64d057..ac96d27 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -4,306 +4,613 @@ import tensorflow as tf -########################## -# restore -########################## -tf.app.flags.DEFINE_string( - 'train_dir', './output/mask_rcnn/', - 'Directory where checkpoints and event logs are written to.') +_IS_TRAINING = False -tf.app.flags.DEFINE_string( - 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', - 'Path to pretrained model') +if _IS_TRAINING is True: + ########################## + # restore + ########################## + tf.app.flags.DEFINE_string( + 'train_dir', './output/mask_rcnn/', + 'Directory where checkpoints and event logs are written to.') -########################## -# network -########################## -tf.app.flags.DEFINE_string( - 'network', 'resnet50', - 'name of backbone network') + tf.app.flags.DEFINE_string( + 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', + 'Path to pretrained model') -########################## -# dataset -########################## -tf.app.flags.DEFINE_bool( - 'update_bn', False, - 'Whether or not to update bacth normalization layer') + ########################## + # network + ########################## + tf.app.flags.DEFINE_string( + 'network', 'resnet50', + 'name of backbone network') -tf.app.flags.DEFINE_integer( - 'num_readers', 4, - 'The number of parallel readers that read data from the dataset.') + ########################## + # dataset + ########################## + tf.app.flags.DEFINE_bool( + 'update_bn', True, + 'Whether or not to update bacth normalization layer') -tf.app.flags.DEFINE_string( - 'dataset_name', 'coco', - 'The name of the dataset to load.') + tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') -tf.app.flags.DEFINE_string( - 'dataset_split_name', 'train2014', - 'The name of the train/test/val split.') + tf.app.flags.DEFINE_string( + 'dataset_name', 'coco', + 'The name of the dataset to load.') -tf.app.flags.DEFINE_string( - 'dataset_dir', 'data/coco/', - 'The directory where the dataset files are stored.') + tf.app.flags.DEFINE_string( + 'dataset_split_name', 'train2014', + 'The name of the train/test/val split.') -tf.app.flags.DEFINE_integer( - 'im_batch', 1, - 'number of images in a mini-batch') + tf.app.flags.DEFINE_string( + 'dataset_dir', 'data/coco/', + 'The directory where the dataset files are stored.') + tf.app.flags.DEFINE_integer( + 'im_batch', 1, + 'number of images in a mini-batch') -tf.app.flags.DEFINE_integer( - 'num_preprocessing_threads', 4, - 'The number of threads used to create the batches.') -tf.app.flags.DEFINE_integer( - 'log_every_n_steps', 10, - 'The frequency with which logs are print.') + tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') -tf.app.flags.DEFINE_integer( - 'save_summaries_secs', 60, - 'The frequency with which summaries are saved, in seconds.') + tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') -tf.app.flags.DEFINE_integer( - 'save_interval_secs', 7200, - 'The frequency with which the model is saved, in seconds.') + tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') -tf.app.flags.DEFINE_integer( - 'max_iters', 2500000, - 'max iterations') + tf.app.flags.DEFINE_integer( + 'save_interval_secs', 7200, + 'The frequency with which the model is saved, in seconds.') -###################### -# Optimization Flags # -###################### + tf.app.flags.DEFINE_integer( + 'max_iters', 2500000, + 'max iterations') -tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') + ###################### + # Optimization Flags # + ###################### -tf.app.flags.DEFINE_string( - 'optimizer', 'momentum', - 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' - '"ftrl", "momentum", "sgd" or "rmsprop".') + tf.app.flags.DEFINE_float( + 'weight_decay', 0.00005, 'The weight decay on the model weights.') -tf.app.flags.DEFINE_float( - 'adadelta_rho', 0.95, - 'The decay rate for adadelta.') + tf.app.flags.DEFINE_string( + 'optimizer', 'momentum', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') -tf.app.flags.DEFINE_float( - 'adagrad_initial_accumulator_value', 0.1, - 'Starting value for the AdaGrad accumulators.') + tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') -tf.app.flags.DEFINE_float( - 'adam_beta1', 0.9, - 'The exponential decay rate for the 1st moment estimates.') + tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') -tf.app.flags.DEFINE_float( - 'adam_beta2', 0.999, - 'The exponential decay rate for the 2nd moment estimates.') + tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') -tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') + tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') -tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, - 'The learning rate power.') + tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') -tf.app.flags.DEFINE_float( - 'ftrl_initial_accumulator_value', 0.1, - 'Starting value for the FTRL accumulators.') + tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') -tf.app.flags.DEFINE_float( - 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') + tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') -tf.app.flags.DEFINE_float( - 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') + tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') -tf.app.flags.DEFINE_float( - 'momentum', 0.99, - 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') + tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') -tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') + tf.app.flags.DEFINE_float( + 'momentum', 0.99, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') -tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') + tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') -####################### -# Learning Rate Flags # -####################### + tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') -tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', - 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' - ' or "polynomial"') + ####################### + # Learning Rate Flags # + ####################### -tf.app.flags.DEFINE_float('learning_rate', 0.0001, - 'Initial learning rate.') + tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', 'exponential', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') -tf.app.flags.DEFINE_float( - 'end_learning_rate', 0.00001, - 'The minimal end learning rate used by a polynomial decay learning rate.') + tf.app.flags.DEFINE_float('learning_rate', 0.0002, + 'Initial learning rate.') -tf.app.flags.DEFINE_float( - 'label_smoothing', 0.0, 'The amount of label smoothing.') + tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.00001, + 'The minimal end learning rate used by a polynomial decay learning rate.') -tf.app.flags.DEFINE_float( - 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') + tf.app.flags.DEFINE_float( + 'label_smoothing', 0.0, 'The amount of label smoothing.') -tf.app.flags.DEFINE_float( - 'num_epochs_per_decay', 2.0, - 'Number of epochs after which learning rate decays.') + tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') -tf.app.flags.DEFINE_bool( - 'sync_replicas', False, - 'Whether or not to synchronize the replicas during training.') + tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays.') -tf.app.flags.DEFINE_integer( - 'replicas_to_aggregate', 1, - 'The Number of gradients to collect before updating params.') + tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') -tf.app.flags.DEFINE_float( - 'moving_average_decay', None, - 'The decay to use for the moving average.' - 'If left as None, then moving averages are not used.') + tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') -####################### -# Dataset Flags # -####################### + tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') + ####################### + # Dataset Flags # + ####################### -tf.app.flags.DEFINE_string( - 'model_name', 'resnet50', - 'The name of the architecture to train.') -tf.app.flags.DEFINE_string( - 'preprocessing_name', 'coco', - 'The name of the preprocessing to use. If left ' - 'as `None`, then the model_name flag is used.') + tf.app.flags.DEFINE_string( + 'model_name', 'resnet50', + 'The name of the architecture to train.') -tf.app.flags.DEFINE_integer( - 'batch_size', 1, - 'The number of samples in each batch.') + tf.app.flags.DEFINE_string( + 'preprocessing_name', 'coco', + 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') -tf.app.flags.DEFINE_integer( - 'train_image_size', None, 'Train image size') + tf.app.flags.DEFINE_integer( + 'batch_size', 1, + 'The number of samples in each batch.') -tf.app.flags.DEFINE_integer('max_number_of_steps', None, - 'The maximum number of training steps.') + tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') -tf.app.flags.DEFINE_string( - 'classes', None, - 'The classes to classify.') + tf.app.flags.DEFINE_integer('max_number_of_steps', None, + 'The maximum number of training steps.') -tf.app.flags.DEFINE_integer( - 'image_min_size', 640, - 'resize image so that the min edge equals to image_min_size') + tf.app.flags.DEFINE_string( + 'classes', None, + 'The classes to classify.') -##################### -# Fine-Tuning Flags # -##################### + tf.app.flags.DEFINE_integer( + 'image_min_size', 640, + 'resize image so that the min edge equals to image_min_size') -tf.app.flags.DEFINE_string( - 'checkpoint_path', None, - 'The path to a checkpoint from which to fine-tune.') + ##################### + # Fine-Tuning Flags # + ##################### -tf.app.flags.DEFINE_string( - 'checkpoint_exclude_scopes', None, - 'Comma-separated list of scopes of variables to exclude when restoring ' - 'from a checkpoint.') + tf.app.flags.DEFINE_string( + 'checkpoint_path', None, + 'The path to a checkpoint from which to fine-tune.') -tf.app.flags.DEFINE_string( - 'checkpoint_include_scopes', None, - 'Comma-separated list of scopes of variables to include when restoring ' - 'from a checkpoint.') + tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') -tf.app.flags.DEFINE_string( - 'trainable_scopes', None, - 'Comma-separated list of scopes to filter the set of variables to train.' - 'By default, None would train all the variables.') + tf.app.flags.DEFINE_string( + 'checkpoint_include_scopes', None, + 'Comma-separated list of scopes of variables to include when restoring ' + 'from a checkpoint.') -tf.app.flags.DEFINE_boolean( - 'ignore_missing_vars', False, - 'When restoring a checkpoint would ignore missing variables.') + tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') -tf.app.flags.DEFINE_boolean( - 'restore_previous_if_exists', True, - 'When restoring a checkpoint would ignore missing variables.') + tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') -####################### -# BOX Flags # -####################### + tf.app.flags.DEFINE_boolean( + 'restore_previous_if_exists', True, + 'When restoring a checkpoint would ignore missing variables.') + + ####################### + # BOX Flags # + ####################### + + tf.app.flags.DEFINE_float( + 'rpn_fg_threshold', 0.7, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'fg_threshold', 0.5, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be bg') + + tf.app.flags.DEFINE_integer( + 'rois_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_roi_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_rpn_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'rpn_batch_size', 512, + 'Number of rpn anchors that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'allow_border', 10, + 'How many pixels out of an image') + + ################################## + # NMS # + ################################## + + tf.app.flags.DEFINE_integer( + 'pre_nms_top_n', 12000, + 'Number of rpn anchors that should be sampled before nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_top_n', 2000, + 'Number of rpn anchors that should be sampled after nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 300, + "Number of inst after NMS") + + tf.app.flags.DEFINE_float( + 'rpn_nms_threshold', 0.7, + 'NMS threshold in RPN') + + tf.app.flags.DEFINE_float( + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') + + ################################## + # Mask # + ################################## + + tf.app.flags.DEFINE_boolean( + 'mask_allow_bg', True, + 'Allow to add bg masks in the masking stage') + + tf.app.flags.DEFINE_float( + 'mask_threshold', 0.50, + 'Least intersection of a positive mask') + tf.app.flags.DEFINE_integer( + 'masks_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'min_size', 2, + 'minimum size of an object') + + FLAGS = tf.app.flags.FLAGS +else: + ########################## + # restore + ########################## + tf.app.flags.DEFINE_string( + 'train_dir', './output/mask_rcnn/', + 'Directory where checkpoints and event logs are written to.') + + tf.app.flags.DEFINE_string( + 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', + 'Path to pretrained model') + + ########################## + # network + ########################## + tf.app.flags.DEFINE_string( + 'network', 'resnet50', + 'name of backbone network') -tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') + ########################## + # dataset + ########################## + tf.app.flags.DEFINE_bool( + 'update_bn', False, + 'Whether or not to update bacth normalization layer') + + tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') -tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be fg') + tf.app.flags.DEFINE_string( + 'dataset_name', 'coco', + 'The name of the dataset to load.') -tf.app.flags.DEFINE_float( - 'fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') + tf.app.flags.DEFINE_string( + 'dataset_split_name', 'val2014', + 'The name of the train/test/val split.') -tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be bg') + tf.app.flags.DEFINE_string( + 'dataset_dir', 'data/coco/', + 'The directory where the dataset files are stored.') -tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, - 'Number of rois that should be sampled to train this network') + tf.app.flags.DEFINE_integer( + 'im_batch', 1, + 'number of images in a mini-batch') -tf.app.flags.DEFINE_float( - 'fg_roi_fraction', 0.25, - 'Number of rois that should be sampled to train this network') -tf.app.flags.DEFINE_float( - 'fg_rpn_fraction', 0.25, - 'Number of rois that should be sampled to train this network') + tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') -tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, - 'Number of rpn anchors that should be sampled to train this network') + tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') -tf.app.flags.DEFINE_integer( - 'allow_border', 10, - 'How many pixels out of an image') + tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') -################################## -# NMS # -################################## - -tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000, - 'Number of rpn anchors that should be sampled before nms') - -tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, - 'Number of rpn anchors that should be sampled after nms') - -tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 300, - "Number of inst after NMS") - -tf.app.flags.DEFINE_float( - 'rpn_nms_threshold', 0.7, - 'NMS threshold in RPN') - -tf.app.flags.DEFINE_float( - 'mask_nms_threshold', 0.3, - 'NMS threshold in mask network during testing') - -################################## -# Mask # -################################## - -tf.app.flags.DEFINE_boolean( - 'mask_allow_bg', True, - 'Allow to add bg masks in the masking stage') - -tf.app.flags.DEFINE_float( - 'mask_threshold', 0.50, - 'Least intersection of a positive mask') -tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, - 'Number of rois that should be sampled to train this network') - -tf.app.flags.DEFINE_float( - 'min_size', 2, - 'minimum size of an object') - -FLAGS = tf.app.flags.FLAGS + tf.app.flags.DEFINE_integer( + 'save_interval_secs', 7200, + 'The frequency with which the model is saved, in seconds.') + + tf.app.flags.DEFINE_integer( + 'max_iters', 2500000, + 'max iterations') + + ###################### + # Optimization Flags # + ###################### + + tf.app.flags.DEFINE_float( + 'weight_decay', 0.00005, 'The weight decay on the model weights.') + + tf.app.flags.DEFINE_string( + 'optimizer', 'momentum', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') + + tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') + + tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') + + tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') + + tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') + + tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') + + tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') + + tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') + + tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') + + tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') + + tf.app.flags.DEFINE_float( + 'momentum', 0.99, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') + + tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') + + tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') + + ####################### + # Learning Rate Flags # + ####################### + + tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', 'exponential', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') + + tf.app.flags.DEFINE_float('learning_rate', 0.0000, + 'Initial learning rate.') + + tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.00000, + 'The minimal end learning rate used by a polynomial decay learning rate.') + + tf.app.flags.DEFINE_float( + 'label_smoothing', 0.0, 'The amount of label smoothing.') + + tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') + + tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays.') + + tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') + + tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') + + tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') + + ####################### + # Dataset Flags # + ####################### + + + tf.app.flags.DEFINE_string( + 'model_name', 'resnet50', + 'The name of the architecture to train.') + + tf.app.flags.DEFINE_string( + 'preprocessing_name', 'coco', + 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') + + tf.app.flags.DEFINE_integer( + 'batch_size', 1, + 'The number of samples in each batch.') + + tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') + + tf.app.flags.DEFINE_integer('max_number_of_steps', None, + 'The maximum number of training steps.') + + tf.app.flags.DEFINE_string( + 'classes', None, + 'The classes to classify.') + + tf.app.flags.DEFINE_integer( + 'image_min_size', 640, + 'resize image so that the min edge equals to image_min_size') + + ##################### + # Fine-Tuning Flags # + ##################### + + tf.app.flags.DEFINE_string( + 'checkpoint_path', None, + 'The path to a checkpoint from which to fine-tune.') + + tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') + + tf.app.flags.DEFINE_string( + 'checkpoint_include_scopes', None, + 'Comma-separated list of scopes of variables to include when restoring ' + 'from a checkpoint.') + + tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') + + tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') + + tf.app.flags.DEFINE_boolean( + 'restore_previous_if_exists', True, + 'When restoring a checkpoint would ignore missing variables.') + + ####################### + # BOX Flags # + ####################### + + tf.app.flags.DEFINE_float( + 'rpn_fg_threshold', 0.7, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'fg_threshold', 0.5, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be bg') + + tf.app.flags.DEFINE_integer( + 'rois_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_roi_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_rpn_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'rpn_batch_size', 512, + 'Number of rpn anchors that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'allow_border', 10, + 'How many pixels out of an image') + + ################################## + # NMS # + ################################## + + tf.app.flags.DEFINE_integer( + 'pre_nms_top_n', 12000, + 'Number of rpn anchors that should be sampled before nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_top_n', 2000, + 'Number of rpn anchors that should be sampled after nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 300, + "Number of inst after NMS") + + tf.app.flags.DEFINE_float( + 'rpn_nms_threshold', 0.7, + 'NMS threshold in RPN') + + tf.app.flags.DEFINE_float( + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') + + ################################## + # Mask # + ################################## + + tf.app.flags.DEFINE_boolean( + 'mask_allow_bg', True, + 'Allow to add bg masks in the masking stage') + + tf.app.flags.DEFINE_float( + 'mask_threshold', 0.50, + 'Least intersection of a positive mask') + tf.app.flags.DEFINE_integer( + 'masks_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'min_size', 2, + 'minimum size of an object') + + FLAGS = tf.app.flags.FLAGS \ No newline at end of file diff --git a/libs/datasets/coco.py b/libs/datasets/coco.py index 464a8c5..f0c10f8 100644 --- a/libs/datasets/coco.py +++ b/libs/datasets/coco.py @@ -90,12 +90,12 @@ def _height_decoder(keys_to_tensors): items_to_descriptions=_ITEMS_TO_DESCRIPTIONS, num_classes=_NUM_CLASSES) -def read(tfrecords_filename): +def read(tfrecords_filename, is_training=False): if not isinstance(tfrecords_filename, list): tfrecords_filename = [tfrecords_filename] filename_queue = tf.train.string_input_producer( - tfrecords_filename, num_epochs=100) + tfrecords_filename, shuffle=is_training)#, num_epochs=100 options = tf.python_io.TFRecordOptions(TFRecordCompressionType.ZLIB) reader = tf.TFRecordReader(options=options) diff --git a/libs/datasets/dataset_factory.py b/libs/datasets/dataset_factory.py index f4fa449..d6c2b1d 100644 --- a/libs/datasets/dataset_factory.py +++ b/libs/datasets/dataset_factory.py @@ -16,7 +16,8 @@ def get_dataset(dataset_name, split_name, dataset_dir, file_pattern = dataset_name + '_' + split_name + '*.tfrecord' tfrecords = glob.glob(dataset_dir + '/records/' + file_pattern) - image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = coco.read(tfrecords) + print(tfrecords) + image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = coco.read(tfrecords, is_training=is_training) image, gt_boxes, gt_masks = coco_preprocess.preprocess_image(image, gt_boxes, gt_masks, is_training) #visualize_input(gt_boxes, image, tf.expand_dims(gt_masks, axis=3)) diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 795980c..2bd975b 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -13,7 +13,7 @@ _DEBUG=False -def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False): +def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False, with_nms=False): """Sample boxes according to scores and some learning strategies assuming the first class is background Params: @@ -50,7 +50,8 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores[keeps] indexs = indexs[keeps] - # filter with scores + + # filter with nms order = scores.ravel().argsort()[::-1] if pre_nms_top_n > 0: order = order[:pre_nms_top_n] @@ -58,15 +59,16 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores[order] indexs = indexs[order] - # filter with nms - det = np.hstack((boxes, scores)).astype(np.float32) - keeps = nms_wrapper.nms(det, rpn_nms_threshold) - + if with_nms is True: + det = np.hstack((boxes, scores)).astype(np.float32) + keeps = nms_wrapper.nms(det, rpn_nms_threshold) + if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] boxes = boxes[keeps, :] scores = scores[keeps].astype(np.float32) indexs = indexs[keeps] + batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) # # random sample boxes @@ -86,7 +88,7 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): """sample boxes for refined output""" - boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training, only_positive) + boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training=is_training, only_positive=only_positive, with_nms=True) if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( @@ -111,7 +113,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training # TODO: sampling strategy bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 128)#64 + bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 if bg_inds.size > 0 and bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) @@ -120,7 +122,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training mask_fg_inds = keep_inds else: bg_inds = np.arange(boxes.shape[0]) - bg_rois = min(int(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction)), 128)#64 + bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 if bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) diff --git a/libs/nets/nets_factory.py b/libs/nets/nets_factory.py index 30f5e50..4e260c6 100644 --- a/libs/nets/nets_factory.py +++ b/libs/nets/nets_factory.py @@ -28,12 +28,16 @@ def get_network(name, image, weight_decay=0.000005, is_training=False): if name == 'resnet50': - with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): - logits, end_points = resnet50(image, 1000, is_training=is_training) + # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): + # logits, end_points = resnet50(image, 1000, is_training=is_training) + with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): + logits, end_points = resnet50(image, 1000) if name == 'resnet101': - with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): - logits, end_points = resnet50(image, 1000, is_training=is_training) + # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): + # logits, end_points = resnet101(image, 1000, is_training=is_training) + with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): + logits, end_points = resnet101(image, 1000) if name == 'resnext50': name diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 81e6744..2dd7046 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -269,7 +269,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g if is_training is True: ### for training, rcnn and maskrcnn take rpn boxes as inputs rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: @@ -303,14 +303,14 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g # to 7 x 7 rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') rcnn = slim.flatten(rcnn) - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.05)) + weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_scores = tf.nn.softmax(rcnn_clses) ### decode rcnn network final outputs diff --git a/libs/nets/resnet_utils.py b/libs/nets/resnet_utils.py index 5e23d4a..9a8d7d0 100644 --- a/libs/nets/resnet_utils.py +++ b/libs/nets/resnet_utils.py @@ -4,7 +4,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -33,15 +33,24 @@ unit of each block. The two implementations give identical results but our implementation is more memory efficient. """ + from __future__ import absolute_import from __future__ import division from __future__ import print_function import collections -import tensorflow as tf -# slim = tf.contrib.slim -import tensorflow.contrib.slim as slim +from tensorflow.contrib import layers as layers_lib +from tensorflow.contrib.framework.python.ops import add_arg_scope +from tensorflow.contrib.framework.python.ops import arg_scope +from tensorflow.contrib.layers.python.layers import initializers +from tensorflow.contrib.layers.python.layers import layers +from tensorflow.contrib.layers.python.layers import regularizers +from tensorflow.contrib.layers.python.layers import utils +from tensorflow.python.framework import ops +from tensorflow.python.ops import array_ops +from tensorflow.python.ops import nn_ops +from tensorflow.python.ops import variable_scope class Block(collections.namedtuple('Block', ['scope', 'unit_fn', 'args'])): @@ -72,7 +81,7 @@ def subsample(inputs, factor, scope=None): if factor == 1: return inputs else: - return slim.max_pool2d(inputs, [1, 1], stride=factor, scope=scope) + return layers.max_pool2d(inputs, [1, 1], stride=factor, scope=scope) def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None): @@ -87,12 +96,14 @@ def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None): is equivalent to - net = slim.conv2d(inputs, num_outputs, 3, stride=1, padding='SAME') + net = tf.contrib.layers.conv2d(inputs, num_outputs, 3, stride=1, + padding='SAME') net = subsample(net, factor=stride) whereas - net = slim.conv2d(inputs, num_outputs, 3, stride=stride, padding='SAME') + net = tf.contrib.layers.conv2d(inputs, num_outputs, 3, stride=stride, + padding='SAME') is different when the input's height or width is even, which is why we add the current function. For more details, see ResnetUtilsTest.testConv2DSameEven(). @@ -110,21 +121,35 @@ def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None): the convolution output. """ if stride == 1: - return slim.conv2d(inputs, num_outputs, kernel_size, stride=1, rate=rate, - padding='SAME', scope=scope) + return layers_lib.conv2d( + inputs, + num_outputs, + kernel_size, + stride=1, + rate=rate, + padding='SAME', + scope=scope) else: kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1) pad_total = kernel_size_effective - 1 pad_beg = pad_total // 2 pad_end = pad_total - pad_beg - inputs = tf.pad(inputs, - [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) - return slim.conv2d(inputs, num_outputs, kernel_size, stride=stride, - rate=rate, padding='VALID', scope=scope) - - -@slim.add_arg_scope -def stack_blocks_dense(net, blocks, output_stride=None, + inputs = array_ops.pad( + inputs, [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) + return layers_lib.conv2d( + inputs, + num_outputs, + kernel_size, + stride=stride, + rate=rate, + padding='VALID', + scope=scope) + + +@add_arg_scope +def stack_blocks_dense(net, + blocks, + output_stride=None, outputs_collections=None): """Stacks ResNet `Blocks` and controls output feature density. @@ -173,33 +198,35 @@ def stack_blocks_dense(net, blocks, output_stride=None, rate = 1 for block in blocks: - with tf.variable_scope(block.scope, 'block', [net]) as sc: + with variable_scope.variable_scope(block.scope, 'block', [net]) as sc: for i, unit in enumerate(block.args): if output_stride is not None and current_stride > output_stride: raise ValueError('The target output_stride cannot be reached.') - with tf.variable_scope('unit_%d' % (i + 1), values=[net]): + with variable_scope.variable_scope('unit_%d' % (i + 1), values=[net]): unit_depth, unit_depth_bottleneck, unit_stride = unit # If we have reached the target output_stride, then we need to employ # atrous convolution with stride=1 and multiply the atrous rate by the # current unit's stride for use in subsequent layers. if output_stride is not None and current_stride == output_stride: - net = block.unit_fn(net, - depth=unit_depth, - depth_bottleneck=unit_depth_bottleneck, - stride=1, - rate=rate) + net = block.unit_fn( + net, + depth=unit_depth, + depth_bottleneck=unit_depth_bottleneck, + stride=1, + rate=rate) rate *= unit_stride else: - net = block.unit_fn(net, - depth=unit_depth, - depth_bottleneck=unit_depth_bottleneck, - stride=unit_stride, - rate=1) + net = block.unit_fn( + net, + depth=unit_depth, + depth_bottleneck=unit_depth_bottleneck, + stride=unit_stride, + rate=1) current_stride *= unit_stride - net = slim.utils.collect_named_outputs(outputs_collections, sc.name, net) + net = utils.collect_named_outputs(outputs_collections, sc.name, net) if output_stride is not None and current_stride != output_stride: raise ValueError('The target output_stride cannot be reached.') @@ -207,7 +234,8 @@ def stack_blocks_dense(net, blocks, output_stride=None, return net -def resnet_arg_scope(weight_decay=0.0001, +def resnet_arg_scope(is_training=True, + weight_decay=0.0001, batch_norm_decay=0.997, batch_norm_epsilon=1e-5, batch_norm_scale=True): @@ -219,6 +247,8 @@ def resnet_arg_scope(weight_decay=0.0001, training ResNets from scratch, they might need to be tuned. Args: + is_training: Whether or not we are training the parameters in the batch + normalization layers of the model. weight_decay: The weight decay to use for regularizing the model. batch_norm_decay: The moving average decay when estimating layer activation statistics in batch normalization. @@ -231,25 +261,26 @@ def resnet_arg_scope(weight_decay=0.0001, An `arg_scope` to use for the resnet models. """ batch_norm_params = { + 'is_training': is_training, 'decay': batch_norm_decay, 'epsilon': batch_norm_epsilon, 'scale': batch_norm_scale, - 'updates_collections': tf.GraphKeys.UPDATE_OPS, + 'updates_collections': ops.GraphKeys.UPDATE_OPS, } - with slim.arg_scope( - [slim.conv2d], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(), - activation_fn=tf.nn.relu, - normalizer_fn=slim.batch_norm, + with arg_scope( + [layers_lib.conv2d], + weights_regularizer=regularizers.l2_regularizer(weight_decay), + weights_initializer=initializers.variance_scaling_initializer(), + activation_fn=nn_ops.relu, + normalizer_fn=layers.batch_norm, normalizer_params=batch_norm_params): - with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with arg_scope([layers.batch_norm], **batch_norm_params): # The following implies padding='SAME' for pool1, which makes feature # alignment easier for dense prediction tasks. This is also used in # https://github.com/facebook/fb.resnet.torch. However the accompanying # code of 'Deep Residual Learning for Image Recognition' uses # padding='VALID' for pool1. You can switch to that choice by setting - # slim.arg_scope([slim.max_pool2d], padding='VALID'). - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + # tf.contrib.framework.arg_scope([tf.contrib.layers.max_pool2d], padding='VALID'). + with arg_scope([layers.max_pool2d], padding='SAME') as arg_sc: return arg_sc diff --git a/libs/nets/resnet_utils.py_ b/libs/nets/resnet_utils.py_ new file mode 100644 index 0000000..5e23d4a --- /dev/null +++ b/libs/nets/resnet_utils.py_ @@ -0,0 +1,255 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains building blocks for various versions of Residual Networks. + +Residual networks (ResNets) were proposed in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385, 2015 + +More variants were introduced in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027, 2016 + +We can obtain different ResNet variants by changing the network depth, width, +and form of residual unit. This module implements the infrastructure for +building them. Concrete ResNet units and full ResNet networks are implemented in +the accompanying resnet_v1.py and resnet_v2.py modules. + +Compared to https://github.com/KaimingHe/deep-residual-networks, in the current +implementation we subsample the output activations in the last residual unit of +each block, instead of subsampling the input activations in the first residual +unit of each block. The two implementations give identical results but our +implementation is more memory efficient. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import tensorflow as tf + +# slim = tf.contrib.slim +import tensorflow.contrib.slim as slim + + +class Block(collections.namedtuple('Block', ['scope', 'unit_fn', 'args'])): + """A named tuple describing a ResNet block. + + Its parts are: + scope: The scope of the `Block`. + unit_fn: The ResNet unit function which takes as input a `Tensor` and + returns another `Tensor` with the output of the ResNet unit. + args: A list of length equal to the number of units in the `Block`. The list + contains one (depth, depth_bottleneck, stride) tuple for each unit in the + block to serve as argument to unit_fn. + """ + + +def subsample(inputs, factor, scope=None): + """Subsamples the input along the spatial dimensions. + + Args: + inputs: A `Tensor` of size [batch, height_in, width_in, channels]. + factor: The subsampling factor. + scope: Optional variable_scope. + + Returns: + output: A `Tensor` of size [batch, height_out, width_out, channels] with the + input, either intact (if factor == 1) or subsampled (if factor > 1). + """ + if factor == 1: + return inputs + else: + return slim.max_pool2d(inputs, [1, 1], stride=factor, scope=scope) + + +def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None): + """Strided 2-D convolution with 'SAME' padding. + + When stride > 1, then we do explicit zero-padding, followed by conv2d with + 'VALID' padding. + + Note that + + net = conv2d_same(inputs, num_outputs, 3, stride=stride) + + is equivalent to + + net = slim.conv2d(inputs, num_outputs, 3, stride=1, padding='SAME') + net = subsample(net, factor=stride) + + whereas + + net = slim.conv2d(inputs, num_outputs, 3, stride=stride, padding='SAME') + + is different when the input's height or width is even, which is why we add the + current function. For more details, see ResnetUtilsTest.testConv2DSameEven(). + + Args: + inputs: A 4-D tensor of size [batch, height_in, width_in, channels]. + num_outputs: An integer, the number of output filters. + kernel_size: An int with the kernel_size of the filters. + stride: An integer, the output stride. + rate: An integer, rate for atrous convolution. + scope: Scope. + + Returns: + output: A 4-D tensor of size [batch, height_out, width_out, channels] with + the convolution output. + """ + if stride == 1: + return slim.conv2d(inputs, num_outputs, kernel_size, stride=1, rate=rate, + padding='SAME', scope=scope) + else: + kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1) + pad_total = kernel_size_effective - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + inputs = tf.pad(inputs, + [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) + return slim.conv2d(inputs, num_outputs, kernel_size, stride=stride, + rate=rate, padding='VALID', scope=scope) + + +@slim.add_arg_scope +def stack_blocks_dense(net, blocks, output_stride=None, + outputs_collections=None): + """Stacks ResNet `Blocks` and controls output feature density. + + First, this function creates scopes for the ResNet in the form of + 'block_name/unit_1', 'block_name/unit_2', etc. + + Second, this function allows the user to explicitly control the ResNet + output_stride, which is the ratio of the input to output spatial resolution. + This is useful for dense prediction tasks such as semantic segmentation or + object detection. + + Most ResNets consist of 4 ResNet blocks and subsample the activations by a + factor of 2 when transitioning between consecutive ResNet blocks. This results + to a nominal ResNet output_stride equal to 8. If we set the output_stride to + half the nominal network stride (e.g., output_stride=4), then we compute + responses twice. + + Control of the output feature density is implemented by atrous convolution. + + Args: + net: A `Tensor` of size [batch, height, width, channels]. + blocks: A list of length equal to the number of ResNet `Blocks`. Each + element is a ResNet `Block` object describing the units in the `Block`. + output_stride: If `None`, then the output will be computed at the nominal + network stride. If output_stride is not `None`, it specifies the requested + ratio of input to output spatial resolution, which needs to be equal to + the product of unit strides from the start up to some level of the ResNet. + For example, if the ResNet employs units with strides 1, 2, 1, 3, 4, 1, + then valid values for the output_stride are 1, 2, 6, 24 or None (which + is equivalent to output_stride=24). + outputs_collections: Collection to add the ResNet block outputs. + + Returns: + net: Output tensor with stride equal to the specified output_stride. + + Raises: + ValueError: If the target output_stride is not valid. + """ + # The current_stride variable keeps track of the effective stride of the + # activations. This allows us to invoke atrous convolution whenever applying + # the next residual unit would result in the activations having stride larger + # than the target output_stride. + current_stride = 1 + + # The atrous convolution rate parameter. + rate = 1 + + for block in blocks: + with tf.variable_scope(block.scope, 'block', [net]) as sc: + for i, unit in enumerate(block.args): + if output_stride is not None and current_stride > output_stride: + raise ValueError('The target output_stride cannot be reached.') + + with tf.variable_scope('unit_%d' % (i + 1), values=[net]): + unit_depth, unit_depth_bottleneck, unit_stride = unit + + # If we have reached the target output_stride, then we need to employ + # atrous convolution with stride=1 and multiply the atrous rate by the + # current unit's stride for use in subsequent layers. + if output_stride is not None and current_stride == output_stride: + net = block.unit_fn(net, + depth=unit_depth, + depth_bottleneck=unit_depth_bottleneck, + stride=1, + rate=rate) + rate *= unit_stride + + else: + net = block.unit_fn(net, + depth=unit_depth, + depth_bottleneck=unit_depth_bottleneck, + stride=unit_stride, + rate=1) + current_stride *= unit_stride + net = slim.utils.collect_named_outputs(outputs_collections, sc.name, net) + + if output_stride is not None and current_stride != output_stride: + raise ValueError('The target output_stride cannot be reached.') + + return net + + +def resnet_arg_scope(weight_decay=0.0001, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True): + """Defines the default ResNet arg scope. + + TODO(gpapan): The batch-normalization related default values above are + appropriate for use in conjunction with the reference ResNet models + released at https://github.com/KaimingHe/deep-residual-networks. When + training ResNets from scratch, they might need to be tuned. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: The moving average decay when estimating layer activation + statistics in batch normalization. + batch_norm_epsilon: Small constant to prevent division by zero when + normalizing activations by their variance in batch normalization. + batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the + activations in the batch normalization layer. + + Returns: + An `arg_scope` to use for the resnet models. + """ + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': tf.GraphKeys.UPDATE_OPS, + } + + with slim.arg_scope( + [slim.conv2d], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=tf.nn.relu, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params): + with slim.arg_scope([slim.batch_norm], **batch_norm_params): + # The following implies padding='SAME' for pool1, which makes feature + # alignment easier for dense prediction tasks. This is also used in + # https://github.com/facebook/fb.resnet.torch. However the accompanying + # code of 'Deep Residual Learning for Image Recognition' uses + # padding='VALID' for pool1. You can switch to that choice by setting + # slim.arg_scope([slim.max_pool2d], padding='VALID'). + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc diff --git a/libs/nets/resnet_v1.py b/libs/nets/resnet_v1.py index d8d4031..6d24baa 100644 --- a/libs/nets/resnet_v1.py +++ b/libs/nets/resnet_v1.py @@ -4,7 +4,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -34,40 +34,50 @@ Typical use: - from tensorflow.contrib.slim.nets import resnet_v1 + from tensorflow.contrib.slim.python.slim.nets import + resnet_v1 ResNet-101 for image classification into 1000 classes: # inputs has shape [batch, 224, 224, 3] - with slim.arg_scope(resnet_v1.resnet_arg_scope()): - net, end_points = resnet_v1.resnet_v1_101(inputs, 1000, is_training=False) + with slim.arg_scope(resnet_v1.resnet_arg_scope(is_training)): + net, end_points = resnet_v1.resnet_v1_101(inputs, 1000) ResNet-101 for semantic segmentation into 21 classes: # inputs has shape [batch, 513, 513, 3] - with slim.arg_scope(resnet_v1.resnet_arg_scope()): + with slim.arg_scope(resnet_v1.resnet_arg_scope(is_training)): net, end_points = resnet_v1.resnet_v1_101(inputs, 21, - is_training=False, global_pool=False, output_stride=16) """ + from __future__ import absolute_import from __future__ import division from __future__ import print_function -import tensorflow as tf - -from libs.nets import resnet_utils - +from tensorflow.contrib import layers +from tensorflow.contrib.framework.python.ops import add_arg_scope +from tensorflow.contrib.framework.python.ops import arg_scope +from tensorflow.contrib.layers.python.layers import layers as layers_lib +from tensorflow.contrib.layers.python.layers import utils +from tensorflow.contrib.slim.python.slim.nets import resnet_utils +from tensorflow.python.ops import math_ops +from tensorflow.python.ops import nn_ops +from tensorflow.python.ops import variable_scope resnet_arg_scope = resnet_utils.resnet_arg_scope -slim = tf.contrib.slim -@slim.add_arg_scope -def bottleneck(inputs, depth, depth_bottleneck, stride, rate=1, - outputs_collections=None, scope=None): +@add_arg_scope +def bottleneck(inputs, + depth, + depth_bottleneck, + stride, + rate=1, + outputs_collections=None, + scope=None): """Bottleneck residual unit variant with BN after convolutions. This is the original residual unit proposed in [1]. See Fig. 1(a) of [2] for @@ -90,36 +100,36 @@ def bottleneck(inputs, depth, depth_bottleneck, stride, rate=1, Returns: The ResNet unit's output. """ - with tf.variable_scope(scope, 'bottleneck_v1', [inputs]) as sc: - depth_in = slim.utils.last_dimension(inputs.get_shape(), min_rank=4) + with variable_scope.variable_scope(scope, 'bottleneck_v1', [inputs]) as sc: + depth_in = utils.last_dimension(inputs.get_shape(), min_rank=4) if depth == depth_in: shortcut = resnet_utils.subsample(inputs, stride, 'shortcut') else: - shortcut = slim.conv2d(inputs, depth, [1, 1], stride=stride, - activation_fn=None, scope='shortcut') + shortcut = layers.conv2d( + inputs, + depth, [1, 1], + stride=stride, + activation_fn=None, + scope='shortcut') - residual = slim.conv2d(inputs, depth_bottleneck, [1, 1], stride=1, - scope='conv1') - residual = resnet_utils.conv2d_same(residual, depth_bottleneck, 3, stride, - rate=rate, scope='conv2') - residual = slim.conv2d(residual, depth, [1, 1], stride=1, - activation_fn=None, scope='conv3') + residual = layers.conv2d( + inputs, depth_bottleneck, [1, 1], stride=1, scope='conv1') + residual = resnet_utils.conv2d_same( + residual, depth_bottleneck, 3, stride, rate=rate, scope='conv2') + residual = layers.conv2d( + residual, depth, [1, 1], stride=1, activation_fn=None, scope='conv3') - output = tf.nn.relu(shortcut + residual) + output = nn_ops.relu(shortcut + residual) - return slim.utils.collect_named_outputs(outputs_collections, - sc.original_name_scope, - output) + return utils.collect_named_outputs(outputs_collections, sc.name, output) def resnet_v1(inputs, blocks, num_classes=None, - is_training=True, global_pool=True, output_stride=None, include_root_block=True, - spatial_squeeze=True, reuse=None, scope=None): """Generator for v1 ResNet models. @@ -151,7 +161,6 @@ def resnet_v1(inputs, is a resnet_utils.Block object describing the units in the block. num_classes: Number of predicted classes for classification tasks. If None we return the features before the logit layer. - is_training: whether is training or not. global_pool: If True, we perform global average pooling before computing the logits. Set to True for image classification, False for dense prediction. output_stride: If None, then the output will be computed at the nominal @@ -159,8 +168,6 @@ def resnet_v1(inputs, ratio of input to output spatial resolution. include_root_block: If True, include the initial convolution followed by max-pooling, if False excludes it. - spatial_squeeze: if True, logits is of shape [B, C], if false logits is - of shape [B, 1, 1, C], where B is batch_size and C is number of classes. reuse: whether or not the network and its variables should be reused. To be able to reuse 'scope' must be given. scope: Optional variable_scope. @@ -179,126 +186,144 @@ def resnet_v1(inputs, Raises: ValueError: If the target output_stride is not valid. """ - with tf.variable_scope(scope, 'resnet_v1', [inputs], reuse=reuse) as sc: - end_points_collection = sc.name + '_end_points' - with slim.arg_scope([slim.conv2d, bottleneck, - resnet_utils.stack_blocks_dense], - outputs_collections=end_points_collection): - with slim.arg_scope([slim.batch_norm], is_training=is_training): - net = inputs - if include_root_block: - if output_stride is not None: - if output_stride % 4 != 0: - raise ValueError('The output_stride needs to be a multiple of 4.') - output_stride /= 4 - net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') - net = slim.max_pool2d(net, [3, 3], stride=2, scope='pool1') - net = resnet_utils.stack_blocks_dense(net, blocks, output_stride) - if global_pool: - # Global average pooling. - net = tf.reduce_mean(net, [1, 2], name='pool5', keep_dims=True) - if num_classes is not None: - net = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, - normalizer_fn=None, scope='logits') - if spatial_squeeze: - logits = tf.squeeze(net, [1, 2], name='SpatialSqueeze') - # Convert end_points_collection into a dictionary of end_points. - end_points = slim.utils.convert_collection_to_dict(end_points_collection) - if num_classes is not None: - end_points['predictions'] = slim.softmax(logits, scope='predictions') - return logits, end_points + with variable_scope.variable_scope( + scope, 'resnet_v1', [inputs], reuse=reuse) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + with arg_scope( + [layers.conv2d, bottleneck, resnet_utils.stack_blocks_dense], + outputs_collections=end_points_collection): + net = inputs + if include_root_block: + if output_stride is not None: + if output_stride % 4 != 0: + raise ValueError('The output_stride needs to be a multiple of 4.') + output_stride /= 4 + net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') + net = layers_lib.max_pool2d(net, [3, 3], stride=2, scope='pool1') + net = resnet_utils.stack_blocks_dense(net, blocks, output_stride) + if global_pool: + # Global average pooling. + net = math_ops.reduce_mean(net, [1, 2], name='pool5', keep_dims=True) + if num_classes is not None: + net = layers.conv2d( + net, + num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + scope='logits') + # Convert end_points_collection into a dictionary of end_points. + end_points = utils.convert_collection_to_dict(end_points_collection) + if num_classes is not None: + end_points['predictions'] = layers_lib.softmax(net, scope='predictions') + return net, end_points + + resnet_v1.default_image_size = 224 def resnet_v1_50(inputs, num_classes=None, - is_training=True, global_pool=True, output_stride=None, reuse=None, scope='resnet_v1_50'): """ResNet-50 model of [1]. See resnet_v1() for arg and return description.""" blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 5 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3) + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 3 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 5 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) ] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_50.default_image_size = resnet_v1.default_image_size + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) def resnet_v1_101(inputs, num_classes=None, - is_training=True, global_pool=True, output_stride=None, reuse=None, scope='resnet_v1_101'): """ResNet-101 model of [1]. See resnet_v1() for arg and return description.""" blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 22 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3) + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 3 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 22 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) ] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_101.default_image_size = resnet_v1.default_image_size + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) def resnet_v1_152(inputs, num_classes=None, - is_training=True, global_pool=True, output_stride=None, reuse=None, scope='resnet_v1_152'): """ResNet-152 model of [1]. See resnet_v1() for arg and return description.""" blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 7 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3)] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_152.default_image_size = resnet_v1.default_image_size + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 7 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) def resnet_v1_200(inputs, num_classes=None, - is_training=True, global_pool=True, output_stride=None, reuse=None, scope='resnet_v1_200'): """ResNet-200 model of [2]. See resnet_v1() for arg and return description.""" blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 23 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3)] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_200.default_image_size = resnet_v1.default_image_size + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 23 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) diff --git a/libs/nets/resnet_v1.py_ b/libs/nets/resnet_v1.py_ new file mode 100644 index 0000000..d8d4031 --- /dev/null +++ b/libs/nets/resnet_v1.py_ @@ -0,0 +1,304 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for the original form of Residual Networks. + +The 'v1' residual networks (ResNets) implemented in this module were proposed +by: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +Other variants were introduced in: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The networks defined in this module utilize the bottleneck building block of +[1] with projection shortcuts only for increasing depths. They employ batch +normalization *after* every weight layer. This is the architecture used by +MSRA in the Imagenet and MSCOCO 2016 competition models ResNet-101 and +ResNet-152. See [2; Fig. 1a] for a comparison between the current 'v1' +architecture and the alternative 'v2' architecture of [2] which uses batch +normalization *before* every weight layer in the so-called full pre-activation +units. + +Typical use: + + from tensorflow.contrib.slim.nets import resnet_v1 + +ResNet-101 for image classification into 1000 classes: + + # inputs has shape [batch, 224, 224, 3] + with slim.arg_scope(resnet_v1.resnet_arg_scope()): + net, end_points = resnet_v1.resnet_v1_101(inputs, 1000, is_training=False) + +ResNet-101 for semantic segmentation into 21 classes: + + # inputs has shape [batch, 513, 513, 3] + with slim.arg_scope(resnet_v1.resnet_arg_scope()): + net, end_points = resnet_v1.resnet_v1_101(inputs, + 21, + is_training=False, + global_pool=False, + output_stride=16) +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from libs.nets import resnet_utils + + +resnet_arg_scope = resnet_utils.resnet_arg_scope +slim = tf.contrib.slim + + +@slim.add_arg_scope +def bottleneck(inputs, depth, depth_bottleneck, stride, rate=1, + outputs_collections=None, scope=None): + """Bottleneck residual unit variant with BN after convolutions. + + This is the original residual unit proposed in [1]. See Fig. 1(a) of [2] for + its definition. Note that we use here the bottleneck variant which has an + extra bottleneck layer. + + When putting together two consecutive ResNet blocks that use this unit, one + should use stride = 2 in the last unit of the first block. + + Args: + inputs: A tensor of size [batch, height, width, channels]. + depth: The depth of the ResNet unit output. + depth_bottleneck: The depth of the bottleneck layers. + stride: The ResNet unit's stride. Determines the amount of downsampling of + the units output compared to its input. + rate: An integer, rate for atrous convolution. + outputs_collections: Collection to add the ResNet unit output. + scope: Optional variable_scope. + + Returns: + The ResNet unit's output. + """ + with tf.variable_scope(scope, 'bottleneck_v1', [inputs]) as sc: + depth_in = slim.utils.last_dimension(inputs.get_shape(), min_rank=4) + if depth == depth_in: + shortcut = resnet_utils.subsample(inputs, stride, 'shortcut') + else: + shortcut = slim.conv2d(inputs, depth, [1, 1], stride=stride, + activation_fn=None, scope='shortcut') + + residual = slim.conv2d(inputs, depth_bottleneck, [1, 1], stride=1, + scope='conv1') + residual = resnet_utils.conv2d_same(residual, depth_bottleneck, 3, stride, + rate=rate, scope='conv2') + residual = slim.conv2d(residual, depth, [1, 1], stride=1, + activation_fn=None, scope='conv3') + + output = tf.nn.relu(shortcut + residual) + + return slim.utils.collect_named_outputs(outputs_collections, + sc.original_name_scope, + output) + + +def resnet_v1(inputs, + blocks, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + include_root_block=True, + spatial_squeeze=True, + reuse=None, + scope=None): + """Generator for v1 ResNet models. + + This function generates a family of ResNet v1 models. See the resnet_v1_*() + methods for specific model instantiations, obtained by selecting different + block instantiations that produce ResNets of various depths. + + Training for image classification on Imagenet is usually done with [224, 224] + inputs, resulting in [7, 7] feature maps at the output of the last ResNet + block for the ResNets defined in [1] that have nominal stride equal to 32. + However, for dense prediction tasks we advise that one uses inputs with + spatial dimensions that are multiples of 32 plus 1, e.g., [321, 321]. In + this case the feature maps at the ResNet output will have spatial shape + [(height - 1) / output_stride + 1, (width - 1) / output_stride + 1] + and corners exactly aligned with the input image corners, which greatly + facilitates alignment of the features to the image. Using as input [225, 225] + images results in [8, 8] feature maps at the output of the last ResNet block. + + For dense prediction tasks, the ResNet needs to run in fully-convolutional + (FCN) mode and global_pool needs to be set to False. The ResNets in [1, 2] all + have nominal stride equal to 32 and a good choice in FCN mode is to use + output_stride=16 in order to increase the density of the computed features at + small computational and memory overhead, cf. http://arxiv.org/abs/1606.00915. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + blocks: A list of length equal to the number of ResNet blocks. Each element + is a resnet_utils.Block object describing the units in the block. + num_classes: Number of predicted classes for classification tasks. If None + we return the features before the logit layer. + is_training: whether is training or not. + global_pool: If True, we perform global average pooling before computing the + logits. Set to True for image classification, False for dense prediction. + output_stride: If None, then the output will be computed at the nominal + network stride. If output_stride is not None, it specifies the requested + ratio of input to output spatial resolution. + include_root_block: If True, include the initial convolution followed by + max-pooling, if False excludes it. + spatial_squeeze: if True, logits is of shape [B, C], if false logits is + of shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + + Returns: + net: A rank-4 tensor of size [batch, height_out, width_out, channels_out]. + If global_pool is False, then height_out and width_out are reduced by a + factor of output_stride compared to the respective height_in and width_in, + else both height_out and width_out equal one. If num_classes is None, then + net is the output of the last ResNet block, potentially after global + average pooling. If num_classes is not None, net contains the pre-softmax + activations. + end_points: A dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: If the target output_stride is not valid. + """ + with tf.variable_scope(scope, 'resnet_v1', [inputs], reuse=reuse) as sc: + end_points_collection = sc.name + '_end_points' + with slim.arg_scope([slim.conv2d, bottleneck, + resnet_utils.stack_blocks_dense], + outputs_collections=end_points_collection): + with slim.arg_scope([slim.batch_norm], is_training=is_training): + net = inputs + if include_root_block: + if output_stride is not None: + if output_stride % 4 != 0: + raise ValueError('The output_stride needs to be a multiple of 4.') + output_stride /= 4 + net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') + net = slim.max_pool2d(net, [3, 3], stride=2, scope='pool1') + net = resnet_utils.stack_blocks_dense(net, blocks, output_stride) + if global_pool: + # Global average pooling. + net = tf.reduce_mean(net, [1, 2], name='pool5', keep_dims=True) + if num_classes is not None: + net = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='logits') + if spatial_squeeze: + logits = tf.squeeze(net, [1, 2], name='SpatialSqueeze') + # Convert end_points_collection into a dictionary of end_points. + end_points = slim.utils.convert_collection_to_dict(end_points_collection) + if num_classes is not None: + end_points['predictions'] = slim.softmax(logits, scope='predictions') + return logits, end_points +resnet_v1.default_image_size = 224 + + +def resnet_v1_50(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_50'): + """ResNet-50 model of [1]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block( + 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block( + 'block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]), + resnet_utils.Block( + 'block3', bottleneck, [(1024, 256, 1)] * 5 + [(1024, 256, 2)]), + resnet_utils.Block( + 'block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, reuse=reuse, scope=scope) +resnet_v1_50.default_image_size = resnet_v1.default_image_size + + +def resnet_v1_101(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_101'): + """ResNet-101 model of [1]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block( + 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block( + 'block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]), + resnet_utils.Block( + 'block3', bottleneck, [(1024, 256, 1)] * 22 + [(1024, 256, 2)]), + resnet_utils.Block( + 'block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, reuse=reuse, scope=scope) +resnet_v1_101.default_image_size = resnet_v1.default_image_size + + +def resnet_v1_152(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_152'): + """ResNet-152 model of [1]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block( + 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block( + 'block2', bottleneck, [(512, 128, 1)] * 7 + [(512, 128, 2)]), + resnet_utils.Block( + 'block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), + resnet_utils.Block( + 'block4', bottleneck, [(2048, 512, 1)] * 3)] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, reuse=reuse, scope=scope) +resnet_v1_152.default_image_size = resnet_v1.default_image_size + + +def resnet_v1_200(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_200'): + """ResNet-200 model of [2]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block( + 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block( + 'block2', bottleneck, [(512, 128, 1)] * 23 + [(512, 128, 2)]), + resnet_utils.Block( + 'block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), + resnet_utils.Block( + 'block4', bottleneck, [(2048, 512, 1)] * 3)] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, reuse=reuse, scope=scope) +resnet_v1_200.default_image_size = resnet_v1.default_image_size diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index fac6c3a..ee3da3a 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -11,7 +11,7 @@ def draw_img(step, image, name='', image_height=1, image_width=1, rois=None): img = Image.fromarray(img) return img.save(FLAGS.train_dir + 'test_' + name + '_' + str(step) +'.jpg', 'JPEG') -def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, label=None, gt_label=None, mask=None, prob=None, iou=None, vis_th=0.7, vis_all=False, ignore_bg=True): +def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, label=None, gt_label=None, mask=None, prob=None, iou=None, vis_th=0.5, vis_all=False, ignore_bg=True): source_img = Image.fromarray(image) b, g, r = source_img.split() source_img = Image.merge("RGB", (r, g, b)) diff --git a/train/test.py b/train/test.py index bc1f0c2..5ee54f5 100644 --- a/train/test.py +++ b/train/test.py @@ -117,26 +117,17 @@ def test(): FLAGS.dataset_split_name, FLAGS.dataset_dir, FLAGS.im_batch, - is_training=True) - - data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, - dtypes=( - image.dtype, ih.dtype, iw.dtype, - gt_boxes.dtype, gt_masks.dtype, - num_instances.dtype, img_id.dtype)) - enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) - data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) - tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) - (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() + is_training=False) + im_shape = tf.shape(image) image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, - weight_decay=FLAGS.weight_decay, is_training=True) + weight_decay=FLAGS.weight_decay, is_training=False) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=9, + base_anchors=15, is_training=False, gt_boxes=None, gt_masks=None, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) diff --git a/train/train.py b/train/train.py index 2fdac91..9a0d3c5 100644 --- a/train/train.py +++ b/train/train.py @@ -190,9 +190,10 @@ def train(): base_anchors=15,#9 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[10.0, 10.0, 1000.0, 1.0, 100.0]) + loss_weights=[10.0, 1.0, 1000.0, 1.0, 100.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) + # loss_weights=[0.1, 0.01, 10.0, 0.1, 1.0]) total_loss = outputs['total_loss'] losses = outputs['losses'] From 43d399252be9d49b8a6b6fefe3714d005d2a856c Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 10 Aug 2017 12:13:19 +0900 Subject: [PATCH 22/35] speed up sorting in sample_rpn_outputs change anchor back to 3x3 (5x3 creates too many anchors. anchor_encoder slows down the training significantly) --- libs/configs/config_v1.py | 2 +- libs/datasets/dataset_factory.py | 1 - libs/layers/anchor.py | 27 ++- libs/layers/sample.py | 33 ++-- libs/nets/pyramid_network.py | 4 +- libs/nets/resnet_utils.py_ | 255 -------------------------- libs/nets/resnet_v1.py_ | 304 ------------------------------- libs/visualization/pil_utils.py | 5 +- train/test.py | 91 +++++---- train/train.py | 2 +- 10 files changed, 102 insertions(+), 622 deletions(-) delete mode 100644 libs/nets/resnet_utils.py_ delete mode 100644 libs/nets/resnet_v1.py_ diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index ac96d27..ca65d52 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -374,7 +374,7 @@ 'The frequency with which the model is saved, in seconds.') tf.app.flags.DEFINE_integer( - 'max_iters', 2500000, + 'max_iters', 2500, 'max iterations') ###################### diff --git a/libs/datasets/dataset_factory.py b/libs/datasets/dataset_factory.py index d6c2b1d..d4ac778 100644 --- a/libs/datasets/dataset_factory.py +++ b/libs/datasets/dataset_factory.py @@ -16,7 +16,6 @@ def get_dataset(dataset_name, split_name, dataset_dir, file_pattern = dataset_name + '_' + split_name + '*.tfrecord' tfrecords = glob.glob(dataset_dir + '/records/' + file_pattern) - print(tfrecords) image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = coco.read(tfrecords, is_training=is_training) image, gt_boxes, gt_masks = coco_preprocess.preprocess_image(image, gt_boxes, gt_masks, is_training) diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index ccd10a2..876609f 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -43,6 +43,7 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): # (all_anchors[:, 2] < (width * stride) + border) & # (all_anchors[:, 3] < (height * stride) + border))[0] # anchors = all_anchors[inds_inside, :] + all_anchors = all_anchors.reshape([-1, 4]) anchors = all_anchors total_anchors = all_anchors.shape[0] @@ -145,7 +146,6 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): bbox_targets = bbox_targets.reshape((1, height, width, -1)) bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) - return labels, bbox_targets, bbox_inside_weights, indexs def decode(boxes, scores, all_anchors, ih, iw): @@ -231,21 +231,32 @@ def _compute_targets(ex_rois, gt_rois): for i in range(10): cfg.FLAGS.fg_threshold = 0.1 - classes = np.random.randint(0, 3, (50, 1)) + classes = np.random.randint(0, 1, (50, 1)) boxes = np.random.randint(10, 50, (50, 2)) s = np.random.randint(20, 50, (50, 2)) s = boxes + s boxes = np.concatenate((boxes, s), axis=1) gt_boxes = np.hstack((boxes, classes)) # gt_boxes = boxes - rois = np.random.randint(10, 50, (20, 2)) - s = np.random.randint(0, 20, (20, 2)) + + N = 100 + rois = np.random.randint(10, 50, (N, 2)) + s = np.random.randint(0, 20, (N, 2)) s = rois + s rois = np.concatenate((rois, s), axis=1) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=200, width=300, stride=4) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=100, width=150, stride=8) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=50, width=75, stride=16) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=None, height=25, width=37, stride=32) + indexs = np.arange(N) + + all_anchors = anchors_plane(200, 300, stride = 4, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=200, width=300, stride=4, indexs=indexs) + + all_anchors = anchors_plane(100, 150, stride = 8, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=100, width=150, stride=8, indexs=indexs) + + all_anchors = anchors_plane(50, 75, stride = 16, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=50, width=75, stride=16, indexs=indexs) + + all_anchors = anchors_plane(25, 37, stride = 32, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=25, width=37, stride=32, indexs=indexs) # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) print('average time: %f' % ((time.time() - t)/10.0)) diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 2bd975b..b489c2d 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -20,7 +20,6 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F boxes: of shape (..., Ax4), each entry is [x1, y1, x2, y2], the last axis has k*4 dims scores: of shape (..., A), probs of fg, in [0, 1] """ - min_size = cfg.FLAGS.min_size rpn_nms_threshold = cfg.FLAGS.rpn_nms_threshold pre_nms_top_n = cfg.FLAGS.pre_nms_top_n @@ -36,39 +35,45 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores.reshape((-1, 1)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' - # filter backgrounds - # Hope this will filter most of background anchors, since a argsort is too slow.. + ## filter backgrounds + ## Hope this will filter most of background anchors, since a argsort is too slow.. if only_positive: keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] indexs = indexs[keeps] - # filter minimum size + ## filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) boxes = boxes[keeps, :] scores = scores[keeps] indexs = indexs[keeps] - - # filter with nms - order = scores.ravel().argsort()[::-1] - if pre_nms_top_n > 0: - order = order[:pre_nms_top_n] + ## sort and filter before nms + if len(scores) <= pre_nms_top_n: ##full sort + order = scores.ravel().argsort()[::-1] + if pre_nms_top_n > 0: + order = order[:pre_nms_top_n] + else: ## partial + full sort + order = scores.ravel() + order = np.argsort((order[np.argpartition(-order, pre_nms_top_n)])[0:pre_nms_top_n:])[::-1] boxes = boxes[order, :] scores = scores[order] indexs = indexs[order] + ## filter by nms if with_nms is True: det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, rpn_nms_threshold) + ## filter after nms if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] boxes = boxes[keeps, :] scores = scores[keeps].astype(np.float32) indexs = indexs[keeps] + batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) # # random sample boxes @@ -128,14 +133,11 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training keep_inds = bg_inds mask_fg_inds = bg_inds - - return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): - min_size = cfg.FLAGS.min_size mask_nms_threshold = cfg.FLAGS.mask_nms_threshold post_nms_inst_n = cfg.FLAGS.post_nms_inst_n @@ -261,16 +263,19 @@ def _apply_nms(boxes, scores, threshold = 0.5): t = time.time() for i in range(10): - N = 200000 + N = 700000 boxes = np.random.randint(0, 50, (N, 2)) s = np.random.randint(10, 40, (N, 2)) s = boxes + s boxes = np.hstack((boxes, s)) scores = np.random.rand(N, 1) + indexs = np.arange(N) # scores_ = 1 - np.random.rand(N, 1) # scores = np.hstack((scores, scores_)) - boxes, scores = sample_rpn_outputs(boxes, scores, only_positive=False) + boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, only_positive=False) + + print ('average time %f' % ((time.time() - t) / 10)) diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 2dd7046..db8fa37 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -237,7 +237,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] + anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} @@ -269,7 +269,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g if is_training is True: ### for training, rcnn and maskrcnn take rpn boxes as inputs rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: diff --git a/libs/nets/resnet_utils.py_ b/libs/nets/resnet_utils.py_ deleted file mode 100644 index 5e23d4a..0000000 --- a/libs/nets/resnet_utils.py_ +++ /dev/null @@ -1,255 +0,0 @@ -# Copyright 2016 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Contains building blocks for various versions of Residual Networks. - -Residual networks (ResNets) were proposed in: - Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun - Deep Residual Learning for Image Recognition. arXiv:1512.03385, 2015 - -More variants were introduced in: - Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun - Identity Mappings in Deep Residual Networks. arXiv: 1603.05027, 2016 - -We can obtain different ResNet variants by changing the network depth, width, -and form of residual unit. This module implements the infrastructure for -building them. Concrete ResNet units and full ResNet networks are implemented in -the accompanying resnet_v1.py and resnet_v2.py modules. - -Compared to https://github.com/KaimingHe/deep-residual-networks, in the current -implementation we subsample the output activations in the last residual unit of -each block, instead of subsampling the input activations in the first residual -unit of each block. The two implementations give identical results but our -implementation is more memory efficient. -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import collections -import tensorflow as tf - -# slim = tf.contrib.slim -import tensorflow.contrib.slim as slim - - -class Block(collections.namedtuple('Block', ['scope', 'unit_fn', 'args'])): - """A named tuple describing a ResNet block. - - Its parts are: - scope: The scope of the `Block`. - unit_fn: The ResNet unit function which takes as input a `Tensor` and - returns another `Tensor` with the output of the ResNet unit. - args: A list of length equal to the number of units in the `Block`. The list - contains one (depth, depth_bottleneck, stride) tuple for each unit in the - block to serve as argument to unit_fn. - """ - - -def subsample(inputs, factor, scope=None): - """Subsamples the input along the spatial dimensions. - - Args: - inputs: A `Tensor` of size [batch, height_in, width_in, channels]. - factor: The subsampling factor. - scope: Optional variable_scope. - - Returns: - output: A `Tensor` of size [batch, height_out, width_out, channels] with the - input, either intact (if factor == 1) or subsampled (if factor > 1). - """ - if factor == 1: - return inputs - else: - return slim.max_pool2d(inputs, [1, 1], stride=factor, scope=scope) - - -def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None): - """Strided 2-D convolution with 'SAME' padding. - - When stride > 1, then we do explicit zero-padding, followed by conv2d with - 'VALID' padding. - - Note that - - net = conv2d_same(inputs, num_outputs, 3, stride=stride) - - is equivalent to - - net = slim.conv2d(inputs, num_outputs, 3, stride=1, padding='SAME') - net = subsample(net, factor=stride) - - whereas - - net = slim.conv2d(inputs, num_outputs, 3, stride=stride, padding='SAME') - - is different when the input's height or width is even, which is why we add the - current function. For more details, see ResnetUtilsTest.testConv2DSameEven(). - - Args: - inputs: A 4-D tensor of size [batch, height_in, width_in, channels]. - num_outputs: An integer, the number of output filters. - kernel_size: An int with the kernel_size of the filters. - stride: An integer, the output stride. - rate: An integer, rate for atrous convolution. - scope: Scope. - - Returns: - output: A 4-D tensor of size [batch, height_out, width_out, channels] with - the convolution output. - """ - if stride == 1: - return slim.conv2d(inputs, num_outputs, kernel_size, stride=1, rate=rate, - padding='SAME', scope=scope) - else: - kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1) - pad_total = kernel_size_effective - 1 - pad_beg = pad_total // 2 - pad_end = pad_total - pad_beg - inputs = tf.pad(inputs, - [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) - return slim.conv2d(inputs, num_outputs, kernel_size, stride=stride, - rate=rate, padding='VALID', scope=scope) - - -@slim.add_arg_scope -def stack_blocks_dense(net, blocks, output_stride=None, - outputs_collections=None): - """Stacks ResNet `Blocks` and controls output feature density. - - First, this function creates scopes for the ResNet in the form of - 'block_name/unit_1', 'block_name/unit_2', etc. - - Second, this function allows the user to explicitly control the ResNet - output_stride, which is the ratio of the input to output spatial resolution. - This is useful for dense prediction tasks such as semantic segmentation or - object detection. - - Most ResNets consist of 4 ResNet blocks and subsample the activations by a - factor of 2 when transitioning between consecutive ResNet blocks. This results - to a nominal ResNet output_stride equal to 8. If we set the output_stride to - half the nominal network stride (e.g., output_stride=4), then we compute - responses twice. - - Control of the output feature density is implemented by atrous convolution. - - Args: - net: A `Tensor` of size [batch, height, width, channels]. - blocks: A list of length equal to the number of ResNet `Blocks`. Each - element is a ResNet `Block` object describing the units in the `Block`. - output_stride: If `None`, then the output will be computed at the nominal - network stride. If output_stride is not `None`, it specifies the requested - ratio of input to output spatial resolution, which needs to be equal to - the product of unit strides from the start up to some level of the ResNet. - For example, if the ResNet employs units with strides 1, 2, 1, 3, 4, 1, - then valid values for the output_stride are 1, 2, 6, 24 or None (which - is equivalent to output_stride=24). - outputs_collections: Collection to add the ResNet block outputs. - - Returns: - net: Output tensor with stride equal to the specified output_stride. - - Raises: - ValueError: If the target output_stride is not valid. - """ - # The current_stride variable keeps track of the effective stride of the - # activations. This allows us to invoke atrous convolution whenever applying - # the next residual unit would result in the activations having stride larger - # than the target output_stride. - current_stride = 1 - - # The atrous convolution rate parameter. - rate = 1 - - for block in blocks: - with tf.variable_scope(block.scope, 'block', [net]) as sc: - for i, unit in enumerate(block.args): - if output_stride is not None and current_stride > output_stride: - raise ValueError('The target output_stride cannot be reached.') - - with tf.variable_scope('unit_%d' % (i + 1), values=[net]): - unit_depth, unit_depth_bottleneck, unit_stride = unit - - # If we have reached the target output_stride, then we need to employ - # atrous convolution with stride=1 and multiply the atrous rate by the - # current unit's stride for use in subsequent layers. - if output_stride is not None and current_stride == output_stride: - net = block.unit_fn(net, - depth=unit_depth, - depth_bottleneck=unit_depth_bottleneck, - stride=1, - rate=rate) - rate *= unit_stride - - else: - net = block.unit_fn(net, - depth=unit_depth, - depth_bottleneck=unit_depth_bottleneck, - stride=unit_stride, - rate=1) - current_stride *= unit_stride - net = slim.utils.collect_named_outputs(outputs_collections, sc.name, net) - - if output_stride is not None and current_stride != output_stride: - raise ValueError('The target output_stride cannot be reached.') - - return net - - -def resnet_arg_scope(weight_decay=0.0001, - batch_norm_decay=0.997, - batch_norm_epsilon=1e-5, - batch_norm_scale=True): - """Defines the default ResNet arg scope. - - TODO(gpapan): The batch-normalization related default values above are - appropriate for use in conjunction with the reference ResNet models - released at https://github.com/KaimingHe/deep-residual-networks. When - training ResNets from scratch, they might need to be tuned. - - Args: - weight_decay: The weight decay to use for regularizing the model. - batch_norm_decay: The moving average decay when estimating layer activation - statistics in batch normalization. - batch_norm_epsilon: Small constant to prevent division by zero when - normalizing activations by their variance in batch normalization. - batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the - activations in the batch normalization layer. - - Returns: - An `arg_scope` to use for the resnet models. - """ - batch_norm_params = { - 'decay': batch_norm_decay, - 'epsilon': batch_norm_epsilon, - 'scale': batch_norm_scale, - 'updates_collections': tf.GraphKeys.UPDATE_OPS, - } - - with slim.arg_scope( - [slim.conv2d], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(), - activation_fn=tf.nn.relu, - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params): - with slim.arg_scope([slim.batch_norm], **batch_norm_params): - # The following implies padding='SAME' for pool1, which makes feature - # alignment easier for dense prediction tasks. This is also used in - # https://github.com/facebook/fb.resnet.torch. However the accompanying - # code of 'Deep Residual Learning for Image Recognition' uses - # padding='VALID' for pool1. You can switch to that choice by setting - # slim.arg_scope([slim.max_pool2d], padding='VALID'). - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc diff --git a/libs/nets/resnet_v1.py_ b/libs/nets/resnet_v1.py_ deleted file mode 100644 index d8d4031..0000000 --- a/libs/nets/resnet_v1.py_ +++ /dev/null @@ -1,304 +0,0 @@ -# Copyright 2016 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Contains definitions for the original form of Residual Networks. - -The 'v1' residual networks (ResNets) implemented in this module were proposed -by: -[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun - Deep Residual Learning for Image Recognition. arXiv:1512.03385 - -Other variants were introduced in: -[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun - Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 - -The networks defined in this module utilize the bottleneck building block of -[1] with projection shortcuts only for increasing depths. They employ batch -normalization *after* every weight layer. This is the architecture used by -MSRA in the Imagenet and MSCOCO 2016 competition models ResNet-101 and -ResNet-152. See [2; Fig. 1a] for a comparison between the current 'v1' -architecture and the alternative 'v2' architecture of [2] which uses batch -normalization *before* every weight layer in the so-called full pre-activation -units. - -Typical use: - - from tensorflow.contrib.slim.nets import resnet_v1 - -ResNet-101 for image classification into 1000 classes: - - # inputs has shape [batch, 224, 224, 3] - with slim.arg_scope(resnet_v1.resnet_arg_scope()): - net, end_points = resnet_v1.resnet_v1_101(inputs, 1000, is_training=False) - -ResNet-101 for semantic segmentation into 21 classes: - - # inputs has shape [batch, 513, 513, 3] - with slim.arg_scope(resnet_v1.resnet_arg_scope()): - net, end_points = resnet_v1.resnet_v1_101(inputs, - 21, - is_training=False, - global_pool=False, - output_stride=16) -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf - -from libs.nets import resnet_utils - - -resnet_arg_scope = resnet_utils.resnet_arg_scope -slim = tf.contrib.slim - - -@slim.add_arg_scope -def bottleneck(inputs, depth, depth_bottleneck, stride, rate=1, - outputs_collections=None, scope=None): - """Bottleneck residual unit variant with BN after convolutions. - - This is the original residual unit proposed in [1]. See Fig. 1(a) of [2] for - its definition. Note that we use here the bottleneck variant which has an - extra bottleneck layer. - - When putting together two consecutive ResNet blocks that use this unit, one - should use stride = 2 in the last unit of the first block. - - Args: - inputs: A tensor of size [batch, height, width, channels]. - depth: The depth of the ResNet unit output. - depth_bottleneck: The depth of the bottleneck layers. - stride: The ResNet unit's stride. Determines the amount of downsampling of - the units output compared to its input. - rate: An integer, rate for atrous convolution. - outputs_collections: Collection to add the ResNet unit output. - scope: Optional variable_scope. - - Returns: - The ResNet unit's output. - """ - with tf.variable_scope(scope, 'bottleneck_v1', [inputs]) as sc: - depth_in = slim.utils.last_dimension(inputs.get_shape(), min_rank=4) - if depth == depth_in: - shortcut = resnet_utils.subsample(inputs, stride, 'shortcut') - else: - shortcut = slim.conv2d(inputs, depth, [1, 1], stride=stride, - activation_fn=None, scope='shortcut') - - residual = slim.conv2d(inputs, depth_bottleneck, [1, 1], stride=1, - scope='conv1') - residual = resnet_utils.conv2d_same(residual, depth_bottleneck, 3, stride, - rate=rate, scope='conv2') - residual = slim.conv2d(residual, depth, [1, 1], stride=1, - activation_fn=None, scope='conv3') - - output = tf.nn.relu(shortcut + residual) - - return slim.utils.collect_named_outputs(outputs_collections, - sc.original_name_scope, - output) - - -def resnet_v1(inputs, - blocks, - num_classes=None, - is_training=True, - global_pool=True, - output_stride=None, - include_root_block=True, - spatial_squeeze=True, - reuse=None, - scope=None): - """Generator for v1 ResNet models. - - This function generates a family of ResNet v1 models. See the resnet_v1_*() - methods for specific model instantiations, obtained by selecting different - block instantiations that produce ResNets of various depths. - - Training for image classification on Imagenet is usually done with [224, 224] - inputs, resulting in [7, 7] feature maps at the output of the last ResNet - block for the ResNets defined in [1] that have nominal stride equal to 32. - However, for dense prediction tasks we advise that one uses inputs with - spatial dimensions that are multiples of 32 plus 1, e.g., [321, 321]. In - this case the feature maps at the ResNet output will have spatial shape - [(height - 1) / output_stride + 1, (width - 1) / output_stride + 1] - and corners exactly aligned with the input image corners, which greatly - facilitates alignment of the features to the image. Using as input [225, 225] - images results in [8, 8] feature maps at the output of the last ResNet block. - - For dense prediction tasks, the ResNet needs to run in fully-convolutional - (FCN) mode and global_pool needs to be set to False. The ResNets in [1, 2] all - have nominal stride equal to 32 and a good choice in FCN mode is to use - output_stride=16 in order to increase the density of the computed features at - small computational and memory overhead, cf. http://arxiv.org/abs/1606.00915. - - Args: - inputs: A tensor of size [batch, height_in, width_in, channels]. - blocks: A list of length equal to the number of ResNet blocks. Each element - is a resnet_utils.Block object describing the units in the block. - num_classes: Number of predicted classes for classification tasks. If None - we return the features before the logit layer. - is_training: whether is training or not. - global_pool: If True, we perform global average pooling before computing the - logits. Set to True for image classification, False for dense prediction. - output_stride: If None, then the output will be computed at the nominal - network stride. If output_stride is not None, it specifies the requested - ratio of input to output spatial resolution. - include_root_block: If True, include the initial convolution followed by - max-pooling, if False excludes it. - spatial_squeeze: if True, logits is of shape [B, C], if false logits is - of shape [B, 1, 1, C], where B is batch_size and C is number of classes. - reuse: whether or not the network and its variables should be reused. To be - able to reuse 'scope' must be given. - scope: Optional variable_scope. - - Returns: - net: A rank-4 tensor of size [batch, height_out, width_out, channels_out]. - If global_pool is False, then height_out and width_out are reduced by a - factor of output_stride compared to the respective height_in and width_in, - else both height_out and width_out equal one. If num_classes is None, then - net is the output of the last ResNet block, potentially after global - average pooling. If num_classes is not None, net contains the pre-softmax - activations. - end_points: A dictionary from components of the network to the corresponding - activation. - - Raises: - ValueError: If the target output_stride is not valid. - """ - with tf.variable_scope(scope, 'resnet_v1', [inputs], reuse=reuse) as sc: - end_points_collection = sc.name + '_end_points' - with slim.arg_scope([slim.conv2d, bottleneck, - resnet_utils.stack_blocks_dense], - outputs_collections=end_points_collection): - with slim.arg_scope([slim.batch_norm], is_training=is_training): - net = inputs - if include_root_block: - if output_stride is not None: - if output_stride % 4 != 0: - raise ValueError('The output_stride needs to be a multiple of 4.') - output_stride /= 4 - net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') - net = slim.max_pool2d(net, [3, 3], stride=2, scope='pool1') - net = resnet_utils.stack_blocks_dense(net, blocks, output_stride) - if global_pool: - # Global average pooling. - net = tf.reduce_mean(net, [1, 2], name='pool5', keep_dims=True) - if num_classes is not None: - net = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, - normalizer_fn=None, scope='logits') - if spatial_squeeze: - logits = tf.squeeze(net, [1, 2], name='SpatialSqueeze') - # Convert end_points_collection into a dictionary of end_points. - end_points = slim.utils.convert_collection_to_dict(end_points_collection) - if num_classes is not None: - end_points['predictions'] = slim.softmax(logits, scope='predictions') - return logits, end_points -resnet_v1.default_image_size = 224 - - -def resnet_v1_50(inputs, - num_classes=None, - is_training=True, - global_pool=True, - output_stride=None, - reuse=None, - scope='resnet_v1_50'): - """ResNet-50 model of [1]. See resnet_v1() for arg and return description.""" - blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 5 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3) - ] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_50.default_image_size = resnet_v1.default_image_size - - -def resnet_v1_101(inputs, - num_classes=None, - is_training=True, - global_pool=True, - output_stride=None, - reuse=None, - scope='resnet_v1_101'): - """ResNet-101 model of [1]. See resnet_v1() for arg and return description.""" - blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 22 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3) - ] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_101.default_image_size = resnet_v1.default_image_size - - -def resnet_v1_152(inputs, - num_classes=None, - is_training=True, - global_pool=True, - output_stride=None, - reuse=None, - scope='resnet_v1_152'): - """ResNet-152 model of [1]. See resnet_v1() for arg and return description.""" - blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 7 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3)] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_152.default_image_size = resnet_v1.default_image_size - - -def resnet_v1_200(inputs, - num_classes=None, - is_training=True, - global_pool=True, - output_stride=None, - reuse=None, - scope='resnet_v1_200'): - """ResNet-200 model of [2]. See resnet_v1() for arg and return description.""" - blocks = [ - resnet_utils.Block( - 'block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]), - resnet_utils.Block( - 'block2', bottleneck, [(512, 128, 1)] * 23 + [(512, 128, 2)]), - resnet_utils.Block( - 'block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), - resnet_utils.Block( - 'block4', bottleneck, [(2048, 512, 1)] * 3)] - return resnet_v1(inputs, blocks, num_classes, is_training, - global_pool=global_pool, output_stride=output_stride, - include_root_block=True, reuse=reuse, scope=scope) -resnet_v1_200.default_image_size = resnet_v1.default_image_size diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index ee3da3a..6fe14a2 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -24,16 +24,13 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la for i, box in enumerate(bbox): if label is not None and not np.all(box==0): if prob is not None: - # print("prob") - # print(prob.shape) - # print("label") - # print(label.shape) if ((prob[i,label[i]] > vis_th) or (vis_all is True)) and ((ignore_bg is True) and (label[i] > 0)) : if gt_label is not None: if gt_label is not None and len(iou) > 1: text = cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]) + ' : ' + str(iou[i])[:3] else: text = cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]) + ' : ' + str(prob[i][label[i]])[:4] + if label[i] != gt_label[i]: color = '#ff0000'#draw.text((2+bbox[i,0], 2+bbox[i,1]), cat_id_to_cls_name(label[i]) + ' : ' + cat_id_to_cls_name(gt_label[i]), fill='#ff0000') else: diff --git a/train/test.py b/train/test.py index 5ee54f5..399114d 100644 --- a/train/test.py +++ b/train/test.py @@ -20,6 +20,7 @@ import libs.preprocessings.coco_v1 as coco_preprocess import libs.nets.pyramid_network as pyramid_network import libs.nets.resnet_v1 as resnet_v1 +import libs.boxes.cython_bbox as cython_bbox from train.train_utils import _configure_learning_rate, _configure_optimizer, \ _get_variables_to_train, _get_init_fn, get_var_list_to_restore @@ -79,35 +80,35 @@ def restore(sess): time.sleep(2) return except: - print ('--restore_previous_if_exists is set, but failed to restore in %s %s'\ - % (FLAGS.train_dir, checkpoint_path)) - time.sleep(2) + print (' failed to restore in %s %s' % (FLAGS.train_dir, checkpoint_path)) + raise + +def evaluate(ap_threshold, gt_boxes, gt_masks, boxes, classes, probs, masks): + num_instances = gt_boxes.shape[0] + num_prediction = boxes.shape[0] + recall = [] + precision = [] + if num_instances is not 0 and num_prediction is not 0: + m = np.array(masks) + m = np.transpose(m,(0,3,1,2)) + + overlaps = cython_bbox.bbox_overlaps( + np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), + np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) + - if FLAGS.pretrained_model: - if tf.gfile.IsDirectory(FLAGS.pretrained_model): - checkpoint_path = tf.train.latest_checkpoint(FLAGS.pretrained_model) - else: - checkpoint_path = FLAGS.pretrained_model - - if FLAGS.checkpoint_exclude_scopes is None: - FLAGS.checkpoint_exclude_scopes='pyramid' - if FLAGS.checkpoint_include_scopes is None: - FLAGS.checkpoint_include_scopes='resnet_v1_50' - - vars_to_restore = get_var_list_to_restore() - for var in vars_to_restore: - print ('restoring ', var.name) - - try: - restorer = tf.train.Saver(vars_to_restore) - restorer.restore(sess, checkpoint_path) - print ('Restored %d(%d) vars from %s' %( - len(vars_to_restore), len(tf.global_variables()), - checkpoint_path )) - except: - print ('Checking your params %s' %(checkpoint_path)) - raise + overlaps_recall = np.max(overlaps, axis=0) + overlaps_precision = np.max(overlaps, axis=1) + for i, threshold in enumerate(ap_threshold): + recall.append(np.sum(overlaps_recall > threshold)) + precision.append(np.sum(overlaps_precision > threshold)) + else: + for i, threshold in enumerate(ap_threshold): + recall.append(0) + precision.append(0) + return np.array(recall), np.array(precision), num_instances, num_prediction + def test(): """The main function that runs training""" @@ -150,7 +151,6 @@ def test(): ## solvers global_step = slim.create_global_step() - #update_op = solve(global_step) cropped_rois = tf.get_collection('__CROPPED__')[0] transposed = tf.get_collection('__TRANSPOSED__')[0] @@ -181,18 +181,25 @@ def test(): start=True)) tf.train.start_queue_runners(sess=sess, coord=coord) - saver = tf.train.Saver(max_to_keep=20) - for step in range(FLAGS.max_iters): + ap_threshold = [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95] + total_recall = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + total_precision = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + total_instance = 0 + total_prediction = 0 + + + # for step in range(FLAGS.max_iters): + for step in range(2500): start_time = time.time() img_id_str, \ - gt_boxesnp, \ + gt_boxesnp, gt_masksnp,\ input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ sess.run([img_id] + \ - [gt_boxes] + \ + [gt_boxes] + [gt_masks] +\ [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + \ [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) @@ -213,6 +220,26 @@ def test(): prob=testing_mask_final_scoresnp, mask=testing_mask_final_masknp,) + if step % 1 == 0: + draw_bbox(step, + np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + name='test_gt', + bbox=gt_boxesnp[:,0:4], + label=gt_boxesnp[:,4].astype(np.int32), + prob=np.ones((gt_boxesnp.shape[0],81), dtype=np.float32),) + + recall, precision, num_instances, num_prediction = evaluate(ap_threshold, gt_boxesnp, gt_masksnp, testing_mask_roisnp, testing_mask_final_clsesnp, testing_mask_final_scoresnp, testing_mask_final_masknp) + total_recall += recall + total_precision += precision + total_instance += num_instances + total_prediction += num_prediction + + # print("recall = {}".format([x / float(total_instance) for x in total_recall])) + # print("precision = {}".format([x / float(total_prediction) for x in total_precision])) + print("recall = {}".format(total_recall / float(total_instance))) + print("precision = {}".format(total_precision / float(total_prediction))) + + if __name__ == '__main__': test() diff --git a/train/train.py b/train/train.py index 9a0d3c5..885dc21 100644 --- a/train/train.py +++ b/train/train.py @@ -187,7 +187,7 @@ def train(): weight_decay=FLAGS.weight_decay, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=15,#9 + base_anchors=9,#15 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, loss_weights=[10.0, 1.0, 1000.0, 1.0, 100.0]) From f69a778d2e6e9ac18cc73c97e6ba52a2b4e2c0f9 Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 10 Aug 2017 15:49:01 +0900 Subject: [PATCH 23/35] changed detail in config_v1.py added recall and precision calculation set test dataset to val2014 remove random picking data during test --- libs/configs/config_v1.py | 757 ++++++++++++-------------------------- train/train.py | 11 +- 2 files changed, 240 insertions(+), 528 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index ca65d52..1cbf063 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -4,613 +4,324 @@ import tensorflow as tf -_IS_TRAINING = False +_IS_TRAINING = True -if _IS_TRAINING is True: - ########################## - # restore - ########################## - tf.app.flags.DEFINE_string( - 'train_dir', './output/mask_rcnn/', - 'Directory where checkpoints and event logs are written to.') +########################## +# restore +########################## +tf.app.flags.DEFINE_string( + 'train_dir', './output/mask_rcnn/', + 'Directory where checkpoints and event logs are written to.') - tf.app.flags.DEFINE_string( - 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', - 'Path to pretrained model') +tf.app.flags.DEFINE_string( + 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', + 'Path to pretrained model') - ########################## - # network - ########################## - tf.app.flags.DEFINE_string( - 'network', 'resnet50', - 'name of backbone network') +########################## +# network +########################## +tf.app.flags.DEFINE_string( + 'network', 'resnet50', + 'name of backbone network') - ########################## - # dataset - ########################## - tf.app.flags.DEFINE_bool( - 'update_bn', True, - 'Whether or not to update bacth normalization layer') +########################## +# dataset +########################## +tf.app.flags.DEFINE_bool( + 'update_bn', True, + 'Whether or not to update bacth normalization layer') - tf.app.flags.DEFINE_integer( - 'num_readers', 4, - 'The number of parallel readers that read data from the dataset.') +tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') - tf.app.flags.DEFINE_string( - 'dataset_name', 'coco', - 'The name of the dataset to load.') +tf.app.flags.DEFINE_string( + 'dataset_name', 'coco', + 'The name of the dataset to load.') - tf.app.flags.DEFINE_string( - 'dataset_split_name', 'train2014', - 'The name of the train/test/val split.') +tf.app.flags.DEFINE_string( + 'dataset_split_name', 'train2014', + 'The name of the train/test/val split.') - tf.app.flags.DEFINE_string( - 'dataset_dir', 'data/coco/', - 'The directory where the dataset files are stored.') +tf.app.flags.DEFINE_string( + 'dataset_dir', 'data/coco/', + 'The directory where the dataset files are stored.') - tf.app.flags.DEFINE_integer( - 'im_batch', 1, - 'number of images in a mini-batch') +tf.app.flags.DEFINE_integer( + 'im_batch', 1, + 'number of images in a mini-batch') - tf.app.flags.DEFINE_integer( - 'num_preprocessing_threads', 4, - 'The number of threads used to create the batches.') +tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') - tf.app.flags.DEFINE_integer( - 'log_every_n_steps', 10, - 'The frequency with which logs are print.') +tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') - tf.app.flags.DEFINE_integer( - 'save_summaries_secs', 60, - 'The frequency with which summaries are saved, in seconds.') +tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') - tf.app.flags.DEFINE_integer( - 'save_interval_secs', 7200, - 'The frequency with which the model is saved, in seconds.') +tf.app.flags.DEFINE_integer( + 'save_interval_secs', 7200, + 'The frequency with which the model is saved, in seconds.') - tf.app.flags.DEFINE_integer( - 'max_iters', 2500000, - 'max iterations') +tf.app.flags.DEFINE_integer( + 'max_iters', 2500000, + 'max iterations') - ###################### - # Optimization Flags # - ###################### +###################### +# Optimization Flags # +###################### - tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') +tf.app.flags.DEFINE_float( + 'weight_decay', 0.00005, 'The weight decay on the model weights.') - tf.app.flags.DEFINE_string( - 'optimizer', 'momentum', - 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' - '"ftrl", "momentum", "sgd" or "rmsprop".') +tf.app.flags.DEFINE_string( + 'optimizer', 'momentum', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') - tf.app.flags.DEFINE_float( - 'adadelta_rho', 0.95, - 'The decay rate for adadelta.') +tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') - tf.app.flags.DEFINE_float( - 'adagrad_initial_accumulator_value', 0.1, - 'Starting value for the AdaGrad accumulators.') +tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') - tf.app.flags.DEFINE_float( - 'adam_beta1', 0.9, - 'The exponential decay rate for the 1st moment estimates.') +tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') - tf.app.flags.DEFINE_float( - 'adam_beta2', 0.999, - 'The exponential decay rate for the 2nd moment estimates.') +tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') - tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') +tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') - tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, - 'The learning rate power.') +tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') - tf.app.flags.DEFINE_float( - 'ftrl_initial_accumulator_value', 0.1, - 'Starting value for the FTRL accumulators.') +tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') - tf.app.flags.DEFINE_float( - 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') +tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') - tf.app.flags.DEFINE_float( - 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') +tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') - tf.app.flags.DEFINE_float( - 'momentum', 0.99, - 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') +tf.app.flags.DEFINE_float( + 'momentum', 0.99, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') - tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') +tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') - tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') +tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') - ####################### - # Learning Rate Flags # - ####################### +####################### +# Learning Rate Flags # +####################### - tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', - 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' - ' or "polynomial"') +tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', 'exponential', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') - tf.app.flags.DEFINE_float('learning_rate', 0.0002, - 'Initial learning rate.') +tf.app.flags.DEFINE_float('learning_rate', 0.0002, + 'Initial learning rate.') - tf.app.flags.DEFINE_float( - 'end_learning_rate', 0.00001, - 'The minimal end learning rate used by a polynomial decay learning rate.') +tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.00001, + 'The minimal end learning rate used by a polynomial decay learning rate.') - tf.app.flags.DEFINE_float( - 'label_smoothing', 0.0, 'The amount of label smoothing.') +tf.app.flags.DEFINE_float( + 'label_smoothing', 0.0, 'The amount of label smoothing.') - tf.app.flags.DEFINE_float( - 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') +tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') - tf.app.flags.DEFINE_float( - 'num_epochs_per_decay', 2.0, - 'Number of epochs after which learning rate decays.') +tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays.') - tf.app.flags.DEFINE_bool( - 'sync_replicas', False, - 'Whether or not to synchronize the replicas during training.') +tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') - tf.app.flags.DEFINE_integer( - 'replicas_to_aggregate', 1, - 'The Number of gradients to collect before updating params.') +tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') - tf.app.flags.DEFINE_float( - 'moving_average_decay', None, - 'The decay to use for the moving average.' - 'If left as None, then moving averages are not used.') +tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') - ####################### - # Dataset Flags # - ####################### +####################### +# Dataset Flags # +####################### - tf.app.flags.DEFINE_string( - 'model_name', 'resnet50', - 'The name of the architecture to train.') +tf.app.flags.DEFINE_string( + 'model_name', 'resnet50', + 'The name of the architecture to train.') - tf.app.flags.DEFINE_string( - 'preprocessing_name', 'coco', - 'The name of the preprocessing to use. If left ' - 'as `None`, then the model_name flag is used.') +tf.app.flags.DEFINE_string( + 'preprocessing_name', 'coco', + 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') - tf.app.flags.DEFINE_integer( - 'batch_size', 1, - 'The number of samples in each batch.') +tf.app.flags.DEFINE_integer( + 'batch_size', 1, + 'The number of samples in each batch.') - tf.app.flags.DEFINE_integer( - 'train_image_size', None, 'Train image size') +tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') - tf.app.flags.DEFINE_integer('max_number_of_steps', None, - 'The maximum number of training steps.') +tf.app.flags.DEFINE_integer('max_number_of_steps', None, + 'The maximum number of training steps.') - tf.app.flags.DEFINE_string( - 'classes', None, - 'The classes to classify.') +tf.app.flags.DEFINE_string( + 'classes', None, + 'The classes to classify.') - tf.app.flags.DEFINE_integer( - 'image_min_size', 640, - 'resize image so that the min edge equals to image_min_size') +tf.app.flags.DEFINE_integer( + 'image_min_size', 640, + 'resize image so that the min edge equals to image_min_size') - ##################### - # Fine-Tuning Flags # - ##################### +##################### +# Fine-Tuning Flags # +##################### - tf.app.flags.DEFINE_string( - 'checkpoint_path', None, - 'The path to a checkpoint from which to fine-tune.') +tf.app.flags.DEFINE_string( + 'checkpoint_path', None, + 'The path to a checkpoint from which to fine-tune.') - tf.app.flags.DEFINE_string( - 'checkpoint_exclude_scopes', None, - 'Comma-separated list of scopes of variables to exclude when restoring ' - 'from a checkpoint.') +tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') - tf.app.flags.DEFINE_string( - 'checkpoint_include_scopes', None, - 'Comma-separated list of scopes of variables to include when restoring ' - 'from a checkpoint.') +tf.app.flags.DEFINE_string( + 'checkpoint_include_scopes', None, + 'Comma-separated list of scopes of variables to include when restoring ' + 'from a checkpoint.') - tf.app.flags.DEFINE_string( - 'trainable_scopes', None, - 'Comma-separated list of scopes to filter the set of variables to train.' - 'By default, None would train all the variables.') +tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') - tf.app.flags.DEFINE_boolean( - 'ignore_missing_vars', False, - 'When restoring a checkpoint would ignore missing variables.') +tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') - tf.app.flags.DEFINE_boolean( - 'restore_previous_if_exists', True, - 'When restoring a checkpoint would ignore missing variables.') +tf.app.flags.DEFINE_boolean( + 'restore_previous_if_exists', True, + 'When restoring a checkpoint would ignore missing variables.') - ####################### - # BOX Flags # - ####################### +####################### +# BOX Flags # +####################### - tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') +tf.app.flags.DEFINE_float( + 'rpn_fg_threshold', 0.7, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') - tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be fg') +tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') - tf.app.flags.DEFINE_float( - 'fg_threshold', 0.5, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') +tf.app.flags.DEFINE_float( + 'fg_threshold', 0.5, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') - tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be bg') +tf.app.flags.DEFINE_float( + 'bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be bg') - tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, - 'Number of rois that should be sampled to train this network') +tf.app.flags.DEFINE_integer( + 'rois_per_image', 512, + 'Number of rois that should be sampled to train this network') - tf.app.flags.DEFINE_float( - 'fg_roi_fraction', 0.25, - 'Number of rois that should be sampled to train this network') +tf.app.flags.DEFINE_float( + 'fg_roi_fraction', 0.25, + 'Number of rois that should be sampled to train this network') - tf.app.flags.DEFINE_float( - 'fg_rpn_fraction', 0.25, - 'Number of rois that should be sampled to train this network') +tf.app.flags.DEFINE_float( + 'fg_rpn_fraction', 0.25, + 'Number of rois that should be sampled to train this network') - tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, - 'Number of rpn anchors that should be sampled to train this network') +tf.app.flags.DEFINE_integer( + 'rpn_batch_size', 512, + 'Number of rpn anchors that should be sampled to train this network') - tf.app.flags.DEFINE_integer( - 'allow_border', 10, - 'How many pixels out of an image') +tf.app.flags.DEFINE_integer( + 'allow_border', 10, + 'How many pixels out of an image') - ################################## - # NMS # - ################################## +################################## +# NMS # +################################## - tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000, - 'Number of rpn anchors that should be sampled before nms') +tf.app.flags.DEFINE_integer( + 'pre_nms_top_n', 12000, + 'Number of rpn anchors that should be sampled before nms') - tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, - 'Number of rpn anchors that should be sampled after nms') +tf.app.flags.DEFINE_integer( + 'post_nms_top_n', 2000, + 'Number of rpn anchors that should be sampled after nms') - tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 300, - "Number of inst after NMS") +tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 300, + "Number of inst after NMS") - tf.app.flags.DEFINE_float( - 'rpn_nms_threshold', 0.7, - 'NMS threshold in RPN') +tf.app.flags.DEFINE_float( + 'rpn_nms_threshold', 0.7, + 'NMS threshold in RPN') - tf.app.flags.DEFINE_float( - 'mask_nms_threshold', 0.3, - 'NMS threshold in mask network during testing') - - ################################## - # Mask # - ################################## - - tf.app.flags.DEFINE_boolean( - 'mask_allow_bg', True, - 'Allow to add bg masks in the masking stage') - - tf.app.flags.DEFINE_float( - 'mask_threshold', 0.50, - 'Least intersection of a positive mask') - tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, - 'Number of rois that should be sampled to train this network') +tf.app.flags.DEFINE_float( + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') - tf.app.flags.DEFINE_float( - 'min_size', 2, - 'minimum size of an object') - - FLAGS = tf.app.flags.FLAGS -else: - ########################## - # restore - ########################## - tf.app.flags.DEFINE_string( - 'train_dir', './output/mask_rcnn/', - 'Directory where checkpoints and event logs are written to.') +################################## +# Mask # +################################## - tf.app.flags.DEFINE_string( - 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', - 'Path to pretrained model') +tf.app.flags.DEFINE_boolean( + 'mask_allow_bg', True, + 'Allow to add bg masks in the masking stage') - ########################## - # network - ########################## - tf.app.flags.DEFINE_string( - 'network', 'resnet50', - 'name of backbone network') +tf.app.flags.DEFINE_float( + 'mask_threshold', 0.50, + 'Least intersection of a positive mask') +tf.app.flags.DEFINE_integer( + 'masks_per_image', 512, + 'Number of rois that should be sampled to train this network') - ########################## - # dataset - ########################## - tf.app.flags.DEFINE_bool( - 'update_bn', False, - 'Whether or not to update bacth normalization layer') +tf.app.flags.DEFINE_float( + 'min_size', 2, + 'minimum size of an object') - tf.app.flags.DEFINE_integer( - 'num_readers', 4, - 'The number of parallel readers that read data from the dataset.') - tf.app.flags.DEFINE_string( - 'dataset_name', 'coco', - 'The name of the dataset to load.') +################################# +# TEST params # +################################# +if _IS_TRAINING is True: tf.app.flags.DEFINE_string( 'dataset_split_name', 'val2014', 'The name of the train/test/val split.') - tf.app.flags.DEFINE_string( - 'dataset_dir', 'data/coco/', - 'The directory where the dataset files are stored.') - - tf.app.flags.DEFINE_integer( - 'im_batch', 1, - 'number of images in a mini-batch') - - - tf.app.flags.DEFINE_integer( - 'num_preprocessing_threads', 4, - 'The number of threads used to create the batches.') - - tf.app.flags.DEFINE_integer( - 'log_every_n_steps', 10, - 'The frequency with which logs are print.') - - tf.app.flags.DEFINE_integer( - 'save_summaries_secs', 60, - 'The frequency with which summaries are saved, in seconds.') - - tf.app.flags.DEFINE_integer( - 'save_interval_secs', 7200, - 'The frequency with which the model is saved, in seconds.') - - tf.app.flags.DEFINE_integer( - 'max_iters', 2500, - 'max iterations') - - ###################### - # Optimization Flags # - ###################### - - tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') - - tf.app.flags.DEFINE_string( - 'optimizer', 'momentum', - 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' - '"ftrl", "momentum", "sgd" or "rmsprop".') - - tf.app.flags.DEFINE_float( - 'adadelta_rho', 0.95, - 'The decay rate for adadelta.') - - tf.app.flags.DEFINE_float( - 'adagrad_initial_accumulator_value', 0.1, - 'Starting value for the AdaGrad accumulators.') - - tf.app.flags.DEFINE_float( - 'adam_beta1', 0.9, - 'The exponential decay rate for the 1st moment estimates.') - - tf.app.flags.DEFINE_float( - 'adam_beta2', 0.999, - 'The exponential decay rate for the 2nd moment estimates.') - - tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') - - tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, - 'The learning rate power.') - - tf.app.flags.DEFINE_float( - 'ftrl_initial_accumulator_value', 0.1, - 'Starting value for the FTRL accumulators.') - - tf.app.flags.DEFINE_float( - 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') - - tf.app.flags.DEFINE_float( - 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') - - tf.app.flags.DEFINE_float( - 'momentum', 0.99, - 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') - - tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') - - tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') - - ####################### - # Learning Rate Flags # - ####################### - - tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', - 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' - ' or "polynomial"') - tf.app.flags.DEFINE_float('learning_rate', 0.0000, - 'Initial learning rate.') - - tf.app.flags.DEFINE_float( - 'end_learning_rate', 0.00000, - 'The minimal end learning rate used by a polynomial decay learning rate.') - - tf.app.flags.DEFINE_float( - 'label_smoothing', 0.0, 'The amount of label smoothing.') - - tf.app.flags.DEFINE_float( - 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') - - tf.app.flags.DEFINE_float( - 'num_epochs_per_decay', 2.0, - 'Number of epochs after which learning rate decays.') - - tf.app.flags.DEFINE_bool( - 'sync_replicas', False, - 'Whether or not to synchronize the replicas during training.') - - tf.app.flags.DEFINE_integer( - 'replicas_to_aggregate', 1, - 'The Number of gradients to collect before updating params.') - - tf.app.flags.DEFINE_float( - 'moving_average_decay', None, - 'The decay to use for the moving average.' - 'If left as None, then moving averages are not used.') - - ####################### - # Dataset Flags # - ####################### - - - tf.app.flags.DEFINE_string( - 'model_name', 'resnet50', - 'The name of the architecture to train.') - - tf.app.flags.DEFINE_string( - 'preprocessing_name', 'coco', - 'The name of the preprocessing to use. If left ' - 'as `None`, then the model_name flag is used.') - - tf.app.flags.DEFINE_integer( - 'batch_size', 1, - 'The number of samples in each batch.') - - tf.app.flags.DEFINE_integer( - 'train_image_size', None, 'Train image size') - - tf.app.flags.DEFINE_integer('max_number_of_steps', None, - 'The maximum number of training steps.') - - tf.app.flags.DEFINE_string( - 'classes', None, - 'The classes to classify.') - - tf.app.flags.DEFINE_integer( - 'image_min_size', 640, - 'resize image so that the min edge equals to image_min_size') - - ##################### - # Fine-Tuning Flags # - ##################### - - tf.app.flags.DEFINE_string( - 'checkpoint_path', None, - 'The path to a checkpoint from which to fine-tune.') - - tf.app.flags.DEFINE_string( - 'checkpoint_exclude_scopes', None, - 'Comma-separated list of scopes of variables to exclude when restoring ' - 'from a checkpoint.') - - tf.app.flags.DEFINE_string( - 'checkpoint_include_scopes', None, - 'Comma-separated list of scopes of variables to include when restoring ' - 'from a checkpoint.') - - tf.app.flags.DEFINE_string( - 'trainable_scopes', None, - 'Comma-separated list of scopes to filter the set of variables to train.' - 'By default, None would train all the variables.') - - tf.app.flags.DEFINE_boolean( - 'ignore_missing_vars', False, - 'When restoring a checkpoint would ignore missing variables.') - - tf.app.flags.DEFINE_boolean( - 'restore_previous_if_exists', True, - 'When restoring a checkpoint would ignore missing variables.') - - ####################### - # BOX Flags # - ####################### - - tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'fg_threshold', 0.5, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be bg') - - tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'fg_roi_fraction', 0.25, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'fg_rpn_fraction', 0.25, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, - 'Number of rpn anchors that should be sampled to train this network') - - tf.app.flags.DEFINE_integer( - 'allow_border', 10, - 'How many pixels out of an image') - - ################################## - # NMS # - ################################## - - tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000, - 'Number of rpn anchors that should be sampled before nms') - - tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, - 'Number of rpn anchors that should be sampled after nms') - - tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 300, - "Number of inst after NMS") - - tf.app.flags.DEFINE_float( - 'rpn_nms_threshold', 0.7, - 'NMS threshold in RPN') - - tf.app.flags.DEFINE_float( - 'mask_nms_threshold', 0.3, - 'NMS threshold in mask network during testing') - - ################################## - # Mask # - ################################## - - tf.app.flags.DEFINE_boolean( - 'mask_allow_bg', True, - 'Allow to add bg masks in the masking stage') - - tf.app.flags.DEFINE_float( - 'mask_threshold', 0.50, - 'Least intersection of a positive mask') - tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, - 'Number of rois that should be sampled to train this network') + 'Initial learning rate.') tf.app.flags.DEFINE_float( - 'min_size', 2, - 'minimum size of an object') + 'weight_decay', 0.00000, 'The weight decay on the model weights.') - FLAGS = tf.app.flags.FLAGS \ No newline at end of file +FLAGS = tf.app.flags.FLAGS \ No newline at end of file diff --git a/train/train.py b/train/train.py index 885dc21..24fa734 100644 --- a/train/train.py +++ b/train/train.py @@ -25,6 +25,7 @@ from train.train_utils import _configure_learning_rate, _configure_optimizer, \ _get_variables_to_train, _get_init_fn, get_var_list_to_restore +from libs.logs.log import LOG from PIL import Image, ImageFont, ImageDraw, ImageEnhance from libs.datasets import download_and_convert_coco from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox @@ -272,7 +273,7 @@ def train(): duration_time = time.time() - start_time if step % 1 == 0: - print ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ + LOG ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ """total-loss %.4f(%.4f, %.4f, %.6f, %.4f, %.4f), """ """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" @@ -283,10 +284,10 @@ def train(): # print (np.array(tmp_0np).shape) # print (np.array(tmp_1np).shape) - print ("target") - print (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) - print ("predict") - print (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) + LOG ("target") + LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) + LOG ("predict") + LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) if step % 50 == 0: draw_bbox(step, From e197a0ea0d43060588b307424ce4064c3e560f18 Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 10 Aug 2017 17:25:57 +0900 Subject: [PATCH 24/35] fixed number of test data fixed some evaluation problems --- libs/configs/config_v1.py | 2 +- train/test.py | 44 ++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 1cbf063..e6b1723 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -4,7 +4,7 @@ import tensorflow as tf -_IS_TRAINING = True +_IS_TRAINING = False ########################## # restore diff --git a/train/test.py b/train/test.py index 399114d..97f120b 100644 --- a/train/test.py +++ b/train/test.py @@ -84,10 +84,12 @@ def restore(sess): raise def evaluate(ap_threshold, gt_boxes, gt_masks, boxes, classes, probs, masks): - num_instances = gt_boxes.shape[0] + gt_clses = gt_boxes[:, 4] num_prediction = boxes.shape[0] - recall = [] - precision = [] + num_instances = gt_boxes.shape[0] + precision = np.zeros_like(ap_threshold) + recall = np.zeros_like(ap_threshold) + if num_instances is not 0 and num_prediction is not 0: m = np.array(masks) m = np.transpose(m,(0,3,1,2)) @@ -96,17 +98,27 @@ def evaluate(ap_threshold, gt_boxes, gt_masks, boxes, classes, probs, masks): np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) - - overlaps_recall = np.max(overlaps, axis=0) overlaps_precision = np.max(overlaps, axis=1) + overlaps_precision_indexs = np.argmax(overlaps, axis=1) + overlaps_recall = np.max(overlaps, axis=0) + overlaps_recall_indexs = np.argmax(overlaps, axis=0) + for i, threshold in enumerate(ap_threshold): - recall.append(np.sum(overlaps_recall > threshold)) - precision.append(np.sum(overlaps_precision > threshold)) - else: - for i, threshold in enumerate(ap_threshold): - recall.append(0) - precision.append(0) - return np.array(recall), np.array(precision), num_instances, num_prediction + #precision + iou_bool = overlaps_precision > threshold + cls_bool = gt_clses[overlaps_precision_indexs] == classes + #mask_bool = True ##TODO + precision[i] = np.sum(iou_bool * cls_bool ) + + #recall + iou_bool = overlaps_recall > threshold + cls_bool = gt_clses == classes[overlaps_recall_indexs] + #mask_bool = True ##TODO + recall[i] = np.sum(iou_bool * cls_bool ) + # print(iou_bool) + # print(cls_bool) + + return recall, precision, num_instances, num_prediction def test(): @@ -128,7 +140,7 @@ def test(): weight_decay=FLAGS.weight_decay, is_training=False) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=15, + base_anchors=9,#15 is_training=False, gt_boxes=None, gt_masks=None, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) @@ -190,7 +202,7 @@ def test(): # for step in range(FLAGS.max_iters): - for step in range(2500): + for step in range(40503): start_time = time.time() @@ -233,9 +245,13 @@ def test(): total_precision += precision total_instance += num_instances total_prediction += num_prediction + print("recall = {}".format(total_recall / float(total_instance))) + print("precision = {}".format(total_precision / float(total_prediction))) + print("------------------------------------------------") # print("recall = {}".format([x / float(total_instance) for x in total_recall])) # print("precision = {}".format([x / float(total_prediction) for x in total_precision])) + print("===============================================") print("recall = {}".format(total_recall / float(total_instance))) print("precision = {}".format(total_precision / float(total_prediction))) From 6b41fee0bf8bc2428579c9f9004da47c875448f8 Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 10 Aug 2017 18:41:14 +0900 Subject: [PATCH 25/35] fix wrong sorting in sample_rpn_outputs --- libs/layers/sample.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libs/layers/sample.py b/libs/layers/sample.py index b489c2d..d9ded39 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -49,14 +49,17 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores[keeps] indexs = indexs[keeps] - ## sort and filter before nms - if len(scores) <= pre_nms_top_n: ##full sort - order = scores.ravel().argsort()[::-1] - if pre_nms_top_n > 0: - order = order[:pre_nms_top_n] - else: ## partial + full sort - order = scores.ravel() - order = np.argsort((order[np.argpartition(-order, pre_nms_top_n)])[0:pre_nms_top_n:])[::-1] + ## filter before nms + if len(scores) > pre_nms_top_n: + partial_order = scores.ravel() + partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] + + boxes = boxes[partial_order, :] + scores = scores[partial_order] + indexs = indexs[partial_order] + + ## sort + order = scores.ravel().argsort()[::-1] boxes = boxes[order, :] scores = scores[order] indexs = indexs[order] From 44f3c6752fbd0030ee8159e1ba2fb79d0ae0dfaf Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 10 Aug 2017 21:18:34 +0900 Subject: [PATCH 26/35] simplified config_v1 (no need to set _is_training) revert partial sort (too buggy) --- libs/configs/config_v1.py | 24 +++++------------------- libs/layers/sample.py | 36 +++++++++++++++++++++++++++--------- train/test.py | 2 +- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index e6b1723..ec5fded 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -4,8 +4,6 @@ import tensorflow as tf -_IS_TRAINING = False - ########################## # restore ########################## @@ -41,7 +39,11 @@ tf.app.flags.DEFINE_string( 'dataset_split_name', 'train2014', - 'The name of the train/test/val split.') + 'The name of the train split.') + +tf.app.flags.DEFINE_string( + 'dataset_split_name_test', 'val2014', + 'The name of the test/val split.') tf.app.flags.DEFINE_string( 'dataset_dir', 'data/coco/', @@ -308,20 +310,4 @@ 'min_size', 2, 'minimum size of an object') - -################################# -# TEST params # -################################# - -if _IS_TRAINING is True: - tf.app.flags.DEFINE_string( - 'dataset_split_name', 'val2014', - 'The name of the train/test/val split.') - - tf.app.flags.DEFINE_float('learning_rate', 0.0000, - 'Initial learning rate.') - - tf.app.flags.DEFINE_float( - 'weight_decay', 0.00000, 'The weight decay on the model weights.') - FLAGS = tf.app.flags.FLAGS \ No newline at end of file diff --git a/libs/layers/sample.py b/libs/layers/sample.py index d9ded39..ef00f1e 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -49,20 +49,28 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F scores = scores[keeps] indexs = indexs[keeps] + # scores_ = scores + ## filter before nms - if len(scores) > pre_nms_top_n: - partial_order = scores.ravel() - partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] + # if len(scores) > pre_nms_top_n: + # partial_order = scores.ravel() + # partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] - boxes = boxes[partial_order, :] - scores = scores[partial_order] - indexs = indexs[partial_order] + # boxes = boxes[partial_order, :] + # scores = scores[partial_order] + # indexs = indexs[partial_order] ## sort order = scores.ravel().argsort()[::-1] + if len(order) > pre_nms_top_n: + order = order[:pre_nms_top_n] boxes = boxes[order, :] scores = scores[order] indexs = indexs[order] + + # if len(scores_) > pre_nms_top_n: + # scores_ = scores_[scores_.ravel().argsort()[::-1][:pre_nms_top_n]] + # print(np.array_equal(scores_, scores)) ## filter by nms if with_nms is True: @@ -72,6 +80,15 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F ## filter after nms if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] + + # if np.any(keeps > len(scores)): + # print ("ERROR: keep index exceeds array range: {}".format(keeps[keeps > len(scores)])) + # print (keeps.shape) + # print (boxes.shape) + # print (scores.shape) + # print (indexs.shape) + # keeps[keeps > len(scores)] = len(scores)-1 + boxes = boxes[keeps, :] scores = scores[keeps].astype(np.float32) indexs = indexs[keeps] @@ -264,9 +281,10 @@ def _apply_nms(boxes, scores, threshold = 0.5): if __name__ == '__main__': import time t = time.time() - - for i in range(10): - N = 700000 + + for i in range(100): + + N = 120000 boxes = np.random.randint(0, 50, (N, 2)) s = np.random.randint(10, 40, (N, 2)) s = boxes + s diff --git a/train/test.py b/train/test.py index 97f120b..f7dffc4 100644 --- a/train/test.py +++ b/train/test.py @@ -127,7 +127,7 @@ def test(): ## data image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ datasets.get_dataset(FLAGS.dataset_name, - FLAGS.dataset_split_name, + FLAGS.dataset_split_name_test, FLAGS.dataset_dir, FLAGS.im_batch, is_training=False) From 038973e959e3044d35bb7ba51e871db5a37e2855 Mon Sep 17 00:00:00 2001 From: souryuu Date: Fri, 11 Aug 2017 14:39:06 +0900 Subject: [PATCH 27/35] Change only_positive to False for training from scratch --- libs/configs/config_v1.py | 2 +- libs/layers/sample.py | 18 +++++++++--------- libs/nets/pyramid_network.py | 2 +- train/test.py | 34 ---------------------------------- 4 files changed, 11 insertions(+), 45 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index ec5fded..76614ab 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -240,7 +240,7 @@ 'Only regions which intersection is less than bg_threshold are considered to be fg') tf.app.flags.DEFINE_float( - 'fg_threshold', 0.5, + 'fg_threshold', 0.7, 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( diff --git a/libs/layers/sample.py b/libs/layers/sample.py index ef00f1e..5586482 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -52,18 +52,18 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # scores_ = scores ## filter before nms - # if len(scores) > pre_nms_top_n: - # partial_order = scores.ravel() - # partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] + if len(scores) > pre_nms_top_n: + partial_order = scores.ravel() + partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] - # boxes = boxes[partial_order, :] - # scores = scores[partial_order] - # indexs = indexs[partial_order] + boxes = boxes[partial_order, :] + scores = scores[partial_order] + indexs = indexs[partial_order] ## sort order = scores.ravel().argsort()[::-1] - if len(order) > pre_nms_top_n: - order = order[:pre_nms_top_n] + # if pre_nms_top_n > 0: + # order = order[:pre_nms_top_n] boxes = boxes[order, :] scores = scores[order] indexs = indexs[order] @@ -108,7 +108,7 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # hs = boxes[:, 3] - boxes[:, 1] # ws = boxes[:, 2] - boxes[:, 0] # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' - + print(boxes.shape) return boxes, scores, batch_inds, indexs def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index db8fa37..e135607 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -269,7 +269,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g if is_training is True: ### for training, rcnn and maskrcnn take rpn boxes as inputs rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: diff --git a/train/test.py b/train/test.py index f7dffc4..a4c9ae1 100644 --- a/train/test.py +++ b/train/test.py @@ -32,40 +32,6 @@ FLAGS = tf.app.flags.FLAGS resnet50 = resnet_v1.resnet_v1_50 -def solve(global_step): - """add solver to losses""" - # learning reate - lr = _configure_learning_rate(82783, global_step) - optimizer = _configure_optimizer(lr) - tf.summary.scalar('learning_rate', lr) - - # compute and apply gradient - losses = tf.get_collection(tf.GraphKeys.LOSSES) - regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) - regular_loss = tf.add_n(regular_losses) - out_loss = tf.add_n(losses) - total_loss = tf.add_n(losses + regular_losses) - - tf.summary.scalar('total_loss', total_loss) - tf.summary.scalar('out_loss', out_loss) - tf.summary.scalar('regular_loss', regular_loss) - - update_ops = [] - variables_to_train = _get_variables_to_train() - # update_op = optimizer.minimize(total_loss) - gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) - grad_updates = optimizer.apply_gradients(gradients, - global_step=global_step) - update_ops.append(grad_updates) - - # update moving mean and variance - if FLAGS.update_bn: - update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) - update_bn = tf.group(*update_bns) - update_ops.append(update_bn) - - return tf.group(*update_ops) - def restore(sess): """choose which param to restore""" if FLAGS.restore_previous_if_exists: From 0a166dc13ff83734c93275c31ffd271ffb3ce311 Mon Sep 17 00:00:00 2001 From: souryuu Date: Thu, 31 Aug 2017 17:17:49 +0900 Subject: [PATCH 28/35] excluded clowd instances from dataset changed the layers for pyramid features C2-4 to match the original paper (endpoints of each resnet block) test.py generates results.json file pycocoEval.py evaluates AP and AR from results.json ***my max current AP 0.5 is 0.262 --- libs/configs/config_v1.py | 10 +- libs/datasets/dataset_factory.py | 4 +- libs/datasets/pycocotools/coco.py | 3 + libs/layers/roi.py | 2 +- libs/layers/sample.py | 106 ++++- libs/nets/nets_factory.py | 18 +- libs/nets/pyramid_network.py | 43 +- libs/nets/pyramid_network_.py | 711 ++++++++++++++++++++++++++++ libs/nets/pyramid_network_backup.py | 673 ++++++++++++++++++++++++++ libs/nets/resnet_v1.py | 1 + libs/preprocessings/coco_v1.py | 4 +- libs/visualization/pil_utils.py | 2 +- pycocoEval.py | 47 ++ train/test.py | 134 +++--- train/train.py | 126 ++++- 15 files changed, 1746 insertions(+), 138 deletions(-) create mode 100644 libs/nets/pyramid_network_.py create mode 100644 libs/nets/pyramid_network_backup.py create mode 100644 pycocoEval.py diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 76614ab..674c359 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -42,7 +42,7 @@ 'The name of the train split.') tf.app.flags.DEFINE_string( - 'dataset_split_name_test', 'val2014', + 'dataset_split_name_test', 'train2014',#val2014 'The name of the test/val split.') tf.app.flags.DEFINE_string( @@ -134,7 +134,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.0002, +tf.app.flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.') tf.app.flags.DEFINE_float( @@ -232,15 +232,15 @@ ####################### tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, + 'rpn_fg_threshold', 0.5, 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, + 'rpn_bg_threshold', 0.5, 'Only regions which intersection is less than bg_threshold are considered to be fg') tf.app.flags.DEFINE_float( - 'fg_threshold', 0.7, + 'fg_threshold', 0.5, 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( diff --git a/libs/datasets/dataset_factory.py b/libs/datasets/dataset_factory.py index d4ac778..a84033c 100644 --- a/libs/datasets/dataset_factory.py +++ b/libs/datasets/dataset_factory.py @@ -18,8 +18,8 @@ def get_dataset(dataset_name, split_name, dataset_dir, tfrecords = glob.glob(dataset_dir + '/records/' + file_pattern) image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = coco.read(tfrecords, is_training=is_training) - image, gt_boxes, gt_masks = coco_preprocess.preprocess_image(image, gt_boxes, gt_masks, is_training) + image, new_ih, new_iw, gt_boxes, gt_masks = coco_preprocess.preprocess_image(image, gt_boxes, gt_masks, is_training) #visualize_input(gt_boxes, image, tf.expand_dims(gt_masks, axis=3)) - return image, ih, iw, gt_boxes, gt_masks, num_instances, img_id + return image, ih, iw, new_ih, new_iw, gt_boxes, gt_masks, num_instances, img_id diff --git a/libs/datasets/pycocotools/coco.py b/libs/datasets/pycocotools/coco.py index d48bf27..7519138 100644 --- a/libs/datasets/pycocotools/coco.py +++ b/libs/datasets/pycocotools/coco.py @@ -308,6 +308,9 @@ def loadRes(self, resFile): anns = resFile assert type(anns) == list, 'results in not an array of objects' annsImgIds = [ann['image_id'] for ann in anns] + print(annsImgIds[0:10]) + print("$$$$$$$$$$$$$$$$$$") + print(self.getImgIds()[0:10]) assert set(annsImgIds) == (set(annsImgIds) & set(self.getImgIds())), \ 'Results do not correspond to current coco set' if 'caption' in anns[0]: diff --git a/libs/layers/roi.py b/libs/layers/roi.py index a2a3286..570d42c 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -149,7 +149,7 @@ def _compute_targets(ex_rois, gt_rois, labels, num_classes): start = 4 * cls end = start + 4 bbox_targets[ind, start:end] = targets[ind, 0:4] - bbox_inside_weights[ind, start:end] = 1 + bbox_inside_weights[ind, start:end] = 1.0 return bbox_targets, bbox_inside_weights def _unmap(data, count, inds, fill=0): diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 5586482..a92dd17 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -108,7 +108,7 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # hs = boxes[:, 3] - boxes[:, 1] # ws = boxes[:, 2] - boxes[:, 0] # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' - print(boxes.shape) + # print(boxes.shape) return boxes, scores, batch_inds, indexs def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): @@ -123,9 +123,9 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] - if True: - gt_argmax_overlaps = overlaps.argmax(axis=0) # G - fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) + # if True: + # gt_argmax_overlaps = overlaps.argmax(axis=0) # G + # fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] @@ -138,7 +138,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training # TODO: sampling strategy bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 + bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 8))#128cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction if bg_inds.size > 0 and bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) @@ -147,7 +147,7 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training mask_fg_inds = keep_inds else: bg_inds = np.arange(boxes.shape[0]) - bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 + bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), 8))#128cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction if bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) @@ -157,16 +157,19 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] -def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): +def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): min_size = cfg.FLAGS.min_size mask_nms_threshold = cfg.FLAGS.mask_nms_threshold post_nms_inst_n = cfg.FLAGS.post_nms_inst_n if class_agnostic is True: - scores = prob[range(prob.shape[0]),classes] + scores = prob.max(axis=1) boxes = boxes.reshape((-1, 4)) + classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) indexs = indexs.reshape((-1, 1)) + probs = probs.reshape((-1, 81)) + assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' # filter background @@ -204,7 +207,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, mask_nms_threshold) - # filter low score if post_nms_inst_n > 0: keeps = keeps[:post_nms_inst_n] @@ -220,13 +222,91 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): scores = np.zeros((1, 1)) indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) - classes = np.array([[0]]) + classes = np.array([0]) prob = np.zeros((1,81)) else: - #@TODO - raise "inference nms type error" - + scores = prob.max(axis=1) + + boxes = boxes.reshape((-1, 4)) + classes = classes.reshape((-1, 1)) + scores = scores.reshape((-1, 1)) + indexs = indexs.reshape((-1, 1)) + prob = prob.reshape((-1, 81)) + assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' + + # filter background + keeps = np.where(classes != 0)[0] + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + # filter minimum size + keeps = _filter_boxes(boxes, min_size=min_size) + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + #filter with scores + keeps = np.where(scores > 0.5)[0] + scores = scores[keeps] + indexs = indexs[keeps] + boxes = boxes[keeps, :] + classes = classes[keeps] + prob = prob[keeps, :] + + __scores = [] + __indexs = [] + __boxes = [] + __classes = [] + __prob = [] + + for c in range(1,(prob.shape[1])): + _keeps = (classes == c).reshape(-1) + + _scores = scores[_keeps] + _indexs = indexs[_keeps] + _boxes = boxes[_keeps, :] + _classes = classes[_keeps] + _prob = prob[_keeps, :] + + # filter with nms + _order = _scores.ravel().argsort()[::-1] + _scores = _scores[_order] + _indexs = _indexs[_order] + _boxes = _boxes[_order, :] + _classes = _classes[_order] + _prob = _prob[_order, :] + + _det = np.hstack((_boxes, _scores)).astype(np.float32) + _keeps = nms_wrapper.nms(_det, mask_nms_threshold) + + # filter low score + if post_nms_inst_n > 0: + _keeps = _keeps[:post_nms_inst_n] + __scores.append(_scores[_keeps]) + __indexs.append(_indexs[_keeps]) + __boxes.append(_boxes[_keeps, :]) + __classes.append(_classes[_keeps]) + __prob.append(_prob[_keeps, :]) + + scores = np.vstack(__scores) + indexs = np.vstack(__indexs) + boxes = np.vstack(__boxes) + classes = np.vstack(__classes).reshape(-1) + prob = np.vstack(__prob) + + if len(classes) is 0: + scores = np.zeros((1, 1)) + indexs = np.zeros((1, 1)) + boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) + classes = np.array([0]).reshape(-1) + prob = np.zeros((1,81)) + batch_inds = np.zeros([boxes.shape[0]]) return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) diff --git a/libs/nets/nets_factory.py b/libs/nets/nets_factory.py index 4e260c6..d51d30d 100644 --- a/libs/nets/nets_factory.py +++ b/libs/nets/nets_factory.py @@ -13,10 +13,16 @@ slim = tf.contrib.slim pyramid_maps = { + # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + # 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + # 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + # 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + # }, 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, 'resnet101': {'C1': '', 'C2': '', @@ -25,19 +31,19 @@ } } -def get_network(name, image, weight_decay=0.000005, is_training=False): +def get_network(name, image, weight_decay=0.000005, is_training=True): if name == 'resnet50': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet50(image, 1000, is_training=is_training) with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): - logits, end_points = resnet50(image, 1000) + logits, end_points = resnet50(image) if name == 'resnet101': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet101(image, 1000, is_training=is_training) with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): - logits, end_points = resnet101(image, 1000) + logits, end_points = resnet101(image) if name == 'resnext50': name diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index e135607..aafba0b 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -25,10 +25,16 @@ # mapping each stage to its' tensor features _networks_map = { + # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + # 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + # 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + # 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + # }, 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, 'resnet101': {'C1': '', 'C2': '', @@ -60,8 +66,11 @@ def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params): # with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc + with slim.arg_scope([slim.max_pool2d], padding='SAME'): + with slim.arg_scope([slim.fully_connected], + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params) as arg_sc: + return arg_sc def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): @@ -171,8 +180,8 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): pyramid_map = net_name # pyramid['inputs'] = end_points['inputs'] if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() - # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) # @@ -215,8 +224,8 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g """ outputs = {} if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() - # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) @@ -274,7 +283,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=False) ### assign pyramid layer indexs to rcnn network's ROIs [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ @@ -304,9 +313,9 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') rcnn = slim.flatten(rcnn) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, @@ -437,8 +446,8 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, mask_batch_pos = [] if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() - # arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) with slim.arg_scope(arg_scope): @@ -512,16 +521,18 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, rcnn_ordered_index = outputs['rcnn_ordered_index'] rcnn_boxes = outputs['rcnn_boxes'] rcnn_clses = outputs['rcnn_clses'] + rcnn_scores = outputs['rcnn_scores'] rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') - rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ tf.reshape(rcnn_clses_target, [-1]), tf.reshape(rcnn_ordered_index, [-1]), tf.reshape(rcnn_ordered_rois, [-1, 4]), tf.reshape(rcnn_clses, [-1, num_classes]), + tf.reshape(rcnn_scores, [-1, num_classes]), tf.reshape(rcnn_boxes, [-1, num_classes * 4]), tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) @@ -549,8 +560,10 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) rcnn_cls_losses.append(rcnn_cls_loss) + outputs['training_rcnn_rois'] = rcnn_ordered_rois outputs['training_rcnn_clses_target'] = rcnn_clses_target outputs['training_rcnn_clses'] = rcnn_clses + outputs['training_rcnn_scores'] = rcnn_scores ### mask loss # mask of shape (N, h, w, num_classes) diff --git a/libs/nets/pyramid_network_.py b/libs/nets/pyramid_network_.py new file mode 100644 index 0000000..bedf6ac --- /dev/null +++ b/libs/nets/pyramid_network_.py @@ -0,0 +1,711 @@ +# coding=utf-8 +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +import tensorflow.contrib.slim as slim + +from libs.boxes.roi import roi_cropping +from libs.layers import anchor_encoder +from libs.layers import anchor_decoder +from libs.layers import roi_encoder +from libs.layers import roi_decoder +from libs.layers import mask_encoder +from libs.layers import mask_decoder +from libs.layers import gen_all_anchors +from libs.layers import ROIAlign +from libs.layers import sample_rpn_outputs +from libs.layers import sample_rpn_outputs_with_gt +from libs.layers import sample_rcnn_outputs +from libs.layers import assign_boxes +from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input + +_BN = True + +# mapping each stage to its' tensor features +_networks_map = { + # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + # 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + # 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + # 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + # }, + 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', + 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + }, + 'resnet101': {'C1': '', 'C2': '', + 'C3': '', 'C4': '', + 'C5': '', + } +} + +def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, + activation_fn=None, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True, + is_training=True): + + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': tf.GraphKeys.UPDATE_OPS, + 'is_training': is_training + } + + with slim.arg_scope( + [slim.conv2d], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=tf.nn.relu, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params): + # with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.max_pool2d], padding='SAME'): + with slim.arg_scope([slim.fully_connected], + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params) as arg_sc: + return arg_sc + +def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): + + with slim.arg_scope( + [slim.conv2d, slim.conv2d_transpose], + padding='SAME', + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), + activation_fn=tf.nn.relu, + normalizer_fn=normalizer_fn,): + with slim.arg_scope( + [slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), + activation_fn=activation_fn, + normalizer_fn=normalizer_fn): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def my_sigmoid(x): + """add an active function for the box output layer, which is linear around 0""" + return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 + +def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): + """Smooth L1 loss + Returns + ------ + dist: element-wise distance, as the same shape of x, y + """ + deltas = x - y + with tf.name_scope(name=name) as scope: + deltas_abs = tf.abs(deltas) + smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) + return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ + (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) + +def _get_valid_sample_fraction(labels, p=0): + """return fraction of non-negative examples, the ignored examples have been marked as negative""" + num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) + num_example = tf.cast(tf.size(labels), tf.float32) + frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, + lambda: tf.cast(0, tf.float32)) + frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, + lambda: tf.cast(0, tf.float32)) + return frac, frac_ + + +def _filter_negative_samples(labels, tensors): + """keeps only samples with none-negative labels + Params: + ----- + labels: of shape (N,) + tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number + + Returns: + ----- + tensors: filtered tensors + """ + # return tensors + keeps = tf.where(tf.greater_equal(labels, 0)) + keeps = tf.reshape(keeps, [-1]) + + filtered = [] + for t in tensors: + tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) + f = tf.gather(t, keeps) + filtered.append(f) + + return filtered + +def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): + ws = gt_boxes[:, 2] - gt_boxes[:, 0] + hs = gt_boxes[:, 3] - gt_boxes[:, 1] + shape = tf.shape(gt_boxes)[0] + jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) + jitter = tf.reshape(jitter, [-1]) + ws_offset = ws * jitter + hs_offset = hs * jitter + x1s = gt_boxes[:, 0] + ws_offset + x2s = gt_boxes[:, 2] + ws_offset + y1s = gt_boxes[:, 1] + hs_offset + y2s = gt_boxes[:, 3] + hs_offset + boxes = tf.concat( + values=[ + x1s[:, tf.newaxis], + y1s[:, tf.newaxis], + x2s[:, tf.newaxis], + y2s[:, tf.newaxis]], + axis=1) + new_scores = tf.ones([shape], tf.float32) + new_batch_inds = tf.zeros([shape], tf.int32) + + return tf.concat(values=[rois, boxes], axis=0), \ + tf.concat(values=[scores, new_scores], axis=0), \ + tf.concat(values=[batch_inds, new_batch_inds], axis=0) + +def build_pyramid(net_name, end_points, bilinear=True, is_training=True): + """build pyramid features from a typical network, + assume each stage is 2 time larger than its top feature + Returns: + returns several endpoints + """ + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + # pyramid['inputs'] = end_points['inputs'] + if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): + + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + + pyramid['P%d'%(c)] = s + + return pyramid + +def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None, bilinear=True): + """Build the 3-way outputs, i.e., class, box and mask in the pyramid + Algo + ---- + For each layer: + 1. Build anchor layer + 2. Process the results of anchor layer, decode the output into rois + 3. Sample rois + 4. Build roi layer + 5. Process the results of roi layer, decode the output into boxes + 6. Build the mask layer + 7. Build losses + """ + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + + outputs = {} + if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + + pyramid['P%d'%(c)] = s + + ### for p in pyramid + outputs['rpn'] = {} + for i in range(5, 1, -1): + p = 'P%d'%i + stride = 2 ** i + + ### rpn head + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) + box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) + cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) + + anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# + print("anchor_scales = " , anchor_scales) + all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} + + ### gather all rois + rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] + rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] + rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] + rpn_boxes = tf.concat(values=rpn_boxes, axis=0) + rpn_clses = tf.concat(values=rpn_clses, axis=0) + rpn_anchors = tf.concat(values=rpn_anchors, axis=0) + + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) + rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + + outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] + for i in range(4, 1, -1): + p = 'P%d'%i + outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] + + outputs['rpn_boxes'] = rpn_boxes + outputs['rpn_clses'] = rpn_clses + outputs['rpn_anchor'] = rpn_anchors + outputs['rpn_final_boxes'] = rpn_final_boxes + outputs['rpn_final_clses'] = rpn_final_clses + outputs['rpn_final_scores'] = rpn_final_scores + outputs['rpn_indexs'] = indexs + + if is_training is True: + ### for training, rcnn and maskrcnn take rpn boxes as inputs + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) + # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + else: + ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=False) + + ### assign pyramid layer indexs to rcnn network's ROIs + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) + + ### crop features from pyramid for rcnn network + rcnn_cropped_features = [] + rcnn_ordered_rois = [] + rcnn_ordered_index = [] + for i in range(5, 1, -1): + p = 'P%d'%i + rcnn_splitted_roi = rcnn_assigned_rois[i-2] + rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] + rcnn_index = rcnn_assigned_indexs[i-2] + rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + rcnn_cropped_features.append(rcnn_cropped_feature) + rcnn_ordered_rois.append(rcnn_splitted_roi) + rcnn_ordered_index.append(rcnn_index) + + rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) + rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) + rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) + + ### rcnn head + # to 7 x 7 + rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') + rcnn = slim.flatten(rcnn) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training + rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn_scores = tf.nn.softmax(rcnn_clses) + + ### decode rcnn network final outputs + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) + + outputs['rcnn_ordered_rois'] = rcnn_ordered_rois + outputs['rcnn_ordered_index'] = rcnn_ordered_index + outputs['rcnn_cropped_features'] = rcnn_cropped_features + tf.add_to_collection('__CROPPED__', rcnn_cropped_features) + outputs['rcnn_boxes'] = rcnn_boxes + outputs['rcnn_clses'] = rcnn_clses + outputs['rcnn_scores'] = rcnn_scores + outputs['rcnn_final_boxes'] = rcnn_final_boxes + outputs['rcnn_final_clses'] = rcnn_final_classes + outputs['rcnn_final_scores'] = rcnn_final_scores + + ### assign pyramid layer indexs to mask network's ROIs + if is_training: + [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) + + mask_cropped_features = [] + mask_ordered_rois = [] + mask_ordered_indexs = [] + ### crop features from pyramid for mask network + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assigned_indexs[i-2] + mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_features.append(mask_cropped_feature) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) + + mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) + + else: + ### for testing, mask network takes rcnn boxes as inputs + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ + assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) + + mask_cropped_features = [] + mask_ordered_rois = [] + mask_ordered_indexs = [] + mask_ordered_clses = [] + mask_ordered_scores = [] + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_splitted_cls = mask_assigned_clses[i-2] + mask_splitted_score = mask_assigned_scores[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assign_indexs[i-2] + mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_features.append(mask_cropped_feature) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) + mask_ordered_clses.append(mask_splitted_cls) + mask_ordered_scores.append(mask_splitted_score) + + mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) + mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) + mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) + + outputs['mask_final_clses'] = mask_ordered_clses + outputs['mask_final_scores'] = mask_ordered_scores + + ### mask head + m = mask_cropped_features + for _ in range(4): + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) + # to 28 x 28 + m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) + tf.add_to_collection('__TRANSPOSED__', m) + m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) + + outputs['mask_ordered_rois'] = mask_ordered_rois + outputs['mask_ordered_indexs'] = mask_ordered_indexs + outputs['mask_cropped_features'] = mask_cropped_features + outputs['mask_mask'] = m + outputs['mask_final_mask'] = tf.nn.sigmoid(m) + + return pyramid, outputs + +def build_losses(pyramid, outputs, gt_boxes, gt_masks, + num_classes, base_anchors, + rpn_box_lw =0.1, rpn_cls_lw = 0.1, + rcnn_box_lw=1.0, rcnn_cls_lw=0.1, + mask_lw=1.0): + """Building 3-way output losses, totally 5 losses + Params: + ------ + outputs: output of build_heads + gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] + gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] + *_lw: loss weight of rpn, rcnn and mask losses + + Returns: + ------- + l: a loss tensor + """ + + # losses for pyramid + losses = [] + rpn_box_losses, rpn_cls_losses = [], [] + rcnn_box_losses, rcnn_cls_losses = [], [] + mask_losses = [] + + # watch some info during training + rpn_batch = [] + rcnn_batch = [] + mask_batch = [] + rpn_batch_pos = [] + rcnn_batch_pos = [] + mask_batch_pos = [] + + if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with tf.variable_scope('pyramid', reuse=True): + with slim.arg_scope(arg_scope): + ## assigning gt_boxes + [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) + + ## build losses for PFN + for i in range(5, 1, -1): + p = 'P%d' % i + stride = 2 ** i + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + + splitted_gt_boxes = assigned_gt_boxes[i-2] + + ### rpn losses + # 1. encode ground truth + # 2. compute distances + # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + all_anchors = outputs['rpn'][p]['anchor'] + all_indexs = outputs['rpn'][p]['index'] + rpn_boxes = outputs['rpn'][p]['box'] + rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) + + rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') + + rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ + _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ + tf.reshape(rpn_clses_target, [-1]), + tf.reshape(all_indexs, [-1]), + tf.reshape(rpn_clses, [-1, 2]), + tf.reshape(rpn_boxes, [-1, 4]), + tf.reshape(rpn_boxes_target, [-1, 4]), + tf.reshape(rpn_boxes_inside_weight, [-1, 4]) + ]) + + rpn_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rpn_clses_target, 0), tf.float32 + ))) + rpn_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rpn_clses_target, 1), tf.float32 + ))) + + rpn_box_loss = rpn_boxes_inside_weight * _smooth_l1_dist(rpn_boxes, rpn_boxes_target) + rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) + rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) + rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) + rpn_box_losses.append(rpn_box_loss) + + ### NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses + # BUT these examples still count when computing the average of softmax_cross_entropy, + # the loss become smaller by a factor (None_negtive_labels / all_labels) + # the BEST practise still should be gathering all none-negative examples + rpn_clses_target = slim.one_hot_encoding(rpn_clses_target, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros + rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rpn_clses_target, logits=rpn_clses) + rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) + rpn_cls_losses.append(rpn_cls_loss) + + ### rcnn losses + # 1. encode ground truth + # 2. compute distances + rcnn_ordered_rois = outputs['rcnn_ordered_rois'] + rcnn_ordered_index = outputs['rcnn_ordered_index'] + rcnn_boxes = outputs['rcnn_boxes'] + rcnn_clses = outputs['rcnn_clses'] + rcnn_scores = outputs['rcnn_scores'] + + rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') + + rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ + tf.reshape(rcnn_clses_target, [-1]), + tf.reshape(rcnn_ordered_index, [-1]), + tf.reshape(rcnn_ordered_rois, [-1, 4]), + tf.reshape(rcnn_clses, [-1, num_classes]), + tf.reshape(rcnn_scores, [-1, num_classes]), + tf.reshape(rcnn_boxes, [-1, num_classes * 4]), + tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), + tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) + ] ) + + rcnn_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rcnn_clses_target, 0), tf.float32 + ))) + rcnn_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rcnn_clses_target, 1), tf.float32 + ))) + + rcnn_box_loss = rcnn_boxes_inside_weight * _smooth_l1_dist(rcnn_boxes, rcnn_boxes_target) + rcnn_box_loss = tf.reshape(rcnn_box_loss, [-1, 4]) + rcnn_box_loss = tf.reduce_sum(rcnn_box_loss, axis=1) + rcnn_box_loss = rcnn_box_lw * tf.reduce_mean(rcnn_box_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_box_loss) + rcnn_box_losses.append(rcnn_box_loss) + + rcnn_clses_target = slim.one_hot_encoding(rcnn_clses_target, num_classes, on_value=1.0, off_value=0.0) + rcnn_cls_loss = rcnn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rcnn_clses_target, logits=rcnn_clses) + rcnn_cls_loss = tf.reduce_mean(rcnn_cls_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) + rcnn_cls_losses.append(rcnn_cls_loss) + + outputs['training_rcnn_rois'] = rcnn_ordered_rois + outputs['training_rcnn_clses_target'] = rcnn_clses_target + outputs['training_rcnn_clses'] = rcnn_clses + outputs['training_rcnn_scores'] = rcnn_scores + + ### mask loss + # mask of shape (N, h, w, num_classes) + mask_ordered_rois = outputs['mask_ordered_rois'] + mask_ordered_indexs = outputs['mask_ordered_indexs'] + masks = outputs['mask_mask'] + + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') + + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ + _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ + tf.reshape(mask_clses_target, [-1]), + tf.reshape(mask_targets, [-1, 28, 28, num_classes]), + tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), + tf.reshape(mask_rois, [-1, 4]), + tf.reshape(mask_ordered_indexs, [-1]), + tf.reshape(masks, [-1, 28, 28, num_classes]), + ]) + + mask_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(mask_clses_target, 0), tf.float32 + ))) + mask_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(mask_clses_target, 1), tf.float32 + ))) + ### NOTE: w/o competition between classes. + mask_loss = mask_inside_weights * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) + mask_loss = mask_lw * mask_loss + mask_loss = tf.reduce_mean(mask_loss) + mask_loss = tf.cond(tf.greater(tf.size(mask_clses_target), 0), lambda: mask_loss, lambda: tf.constant(0.0)) + tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) + mask_losses.append(mask_loss) + + outputs['training_mask_rois'] = mask_rois + outputs['training_mask_clses_target'] = mask_clses_target + outputs['training_mask_final_mask'] = tf.nn.sigmoid(masks) + outputs['training_mask_final_mask_target'] = mask_targets + + rpn_box_losses = tf.add_n(rpn_box_losses) + rpn_cls_losses = tf.add_n(rpn_cls_losses) + rcnn_box_losses = tf.add_n(rcnn_box_losses) + rcnn_cls_losses = tf.add_n(rcnn_cls_losses) + mask_losses = tf.add_n(mask_losses) + losses = [rpn_box_losses, rpn_cls_losses, rcnn_box_losses, rcnn_cls_losses, mask_losses] + total_loss = tf.add_n(losses) + + rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) + rcnn_batch = tf.cast(tf.add_n(rcnn_batch), tf.float32) + mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) + rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) + rcnn_batch_pos = tf.cast(tf.add_n(rcnn_batch_pos), tf.float32) + mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) + + return total_loss, losses, [rpn_batch_pos, rpn_batch, \ + rcnn_batch_pos, rcnn_batch, \ + mask_batch_pos, mask_batch] + +def decode_output(outputs): + """decode outputs into boxes and masks""" + return [], [], [] + +def build(end_points, image_height, image_width, pyramid_map, + num_classes, + base_anchors, + is_training, + gt_boxes=None, + gt_masks=None, + loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): + + #pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + + if is_training: + # outputs = \ + # build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + # is_training=is_training, gt_boxes=gt_boxes) + pyramid, outputs = \ + build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, + is_training=is_training, gt_boxes=gt_boxes) + loss, losses, batch_info = build_losses(pyramid, outputs, + gt_boxes, gt_masks, + num_classes=num_classes, base_anchors=base_anchors, + rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], + rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], + mask_lw=loss_weights[4]) + + outputs['losses'] = losses + outputs['total_loss'] = loss + outputs['batch_info'] = batch_info + else: + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training) + + ### just decode outputs into readable prediction + pred_boxes, pred_classes, pred_masks = decode_output(outputs) + outputs['pred_boxes'] = pred_boxes + outputs['pred_classes'] = pred_classes + outputs['pred_masks'] = pred_masks + + ### for debuging + outputs['tmp_0'] = pred_classes + outputs['tmp_1'] = pred_classes + outputs['tmp_2'] = pred_classes + outputs['tmp_3'] = pred_classes + outputs['tmp_4'] = pred_classes + outputs['tmp_5'] = pred_classes + + # ### image and gt visualization + # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) + + # ### rpn visualization + # visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") + + # ### mask network visualization + # first_mask = outputs['training_mask_final_mask'][:1] + # first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) + + # visualize_final_predictions(outputs['rcnn_final_boxes'], end_points["input"], first_mask) + + return outputs diff --git a/libs/nets/pyramid_network_backup.py b/libs/nets/pyramid_network_backup.py new file mode 100644 index 0000000..170bc3e --- /dev/null +++ b/libs/nets/pyramid_network_backup.py @@ -0,0 +1,673 @@ +# coding=utf-8 +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +import tensorflow.contrib.slim as slim + +from libs.boxes.roi import roi_cropping +from libs.layers import anchor_encoder +from libs.layers import anchor_decoder +from libs.layers import roi_encoder +from libs.layers import roi_decoder +from libs.layers import mask_encoder +from libs.layers import mask_decoder +from libs.layers import gen_all_anchors +from libs.layers import ROIAlign +from libs.layers import sample_rpn_outputs +from libs.layers import sample_rpn_outputs_with_gt +from libs.layers import sample_rcnn_outputs +from libs.layers import assign_boxes +from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input + +_BN = True + +# mapping each stage to its' tensor features +_networks_map = { + 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', + 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + }, + 'resnet101': {'C1': '', 'C2': '', + 'C3': '', 'C4': '', + 'C5': '', + } +} + +def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, + activation_fn=None, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True, + is_training=True): + + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': tf.GraphKeys.UPDATE_OPS, + 'is_training': is_training + } + + with slim.arg_scope( + [slim.conv2d], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=tf.nn.relu, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params): + # with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): + + with slim.arg_scope( + [slim.conv2d, slim.conv2d_transpose], + padding='SAME', + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), + activation_fn=tf.nn.relu, + normalizer_fn=normalizer_fn,): + with slim.arg_scope( + [slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), + activation_fn=activation_fn, + normalizer_fn=normalizer_fn): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + +def my_sigmoid(x): + """add an active function for the box output layer, which is linear around 0""" + return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 + +def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): + """Smooth L1 loss + Returns + ------ + dist: element-wise distance, as the same shape of x, y + """ + deltas = x - y + with tf.name_scope(name=name) as scope: + deltas_abs = tf.abs(deltas) + smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) + return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ + (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) + +def _get_valid_sample_fraction(labels, p=0): + """return fraction of non-negative examples, the ignored examples have been marked as negative""" + num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) + num_example = tf.cast(tf.size(labels), tf.float32) + frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, + lambda: tf.cast(0, tf.float32)) + frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, + lambda: tf.cast(0, tf.float32)) + return frac, frac_ + + +def _filter_negative_samples(labels, tensors): + """keeps only samples with none-negative labels + Params: + ----- + labels: of shape (N,) + tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number + + Returns: + ----- + tensors: filtered tensors + """ + # return tensors + keeps = tf.where(tf.greater_equal(labels, 0)) + keeps = tf.reshape(keeps, [-1]) + + filtered = [] + for t in tensors: + tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) + f = tf.gather(t, keeps) + filtered.append(f) + + return filtered + +def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): + ws = gt_boxes[:, 2] - gt_boxes[:, 0] + hs = gt_boxes[:, 3] - gt_boxes[:, 1] + shape = tf.shape(gt_boxes)[0] + jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) + jitter = tf.reshape(jitter, [-1]) + ws_offset = ws * jitter + hs_offset = hs * jitter + x1s = gt_boxes[:, 0] + ws_offset + x2s = gt_boxes[:, 2] + ws_offset + y1s = gt_boxes[:, 1] + hs_offset + y2s = gt_boxes[:, 3] + hs_offset + boxes = tf.concat( + values=[ + x1s[:, tf.newaxis], + y1s[:, tf.newaxis], + x2s[:, tf.newaxis], + y2s[:, tf.newaxis]], + axis=1) + new_scores = tf.ones([shape], tf.float32) + new_batch_inds = tf.zeros([shape], tf.int32) + + return tf.concat(values=[rois, boxes], axis=0), \ + tf.concat(values=[scores, new_scores], axis=0), \ + tf.concat(values=[batch_inds, new_batch_inds], axis=0) + +def build_pyramid(net_name, end_points, bilinear=True, is_training=True): + """build pyramid features from a typical network, + assume each stage is 2 time larger than its top feature + Returns: + returns several endpoints + """ + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + # pyramid['inputs'] = end_points['inputs'] + if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): + + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + + pyramid['P%d'%(c)] = s + + return pyramid + +def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): + """Build the 3-way outputs, i.e., class, box and mask in the pyramid + Algo + ---- + For each layer: + 1. Build anchor layer + 2. Process the results of anchor layer, decode the output into rois + 3. Sample rois + 4. Build roi layer + 5. Process the results of roi layer, decode the output into boxes + 6. Build the mask layer + 7. Build losses + """ + outputs = {} + if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + ### for p in pyramid + outputs['rpn'] = {} + for i in range(5, 1, -1): + p = 'P%d'%i + stride = 2 ** i + + ### rpn head + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) + box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) + cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ + weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) + + anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# + print("anchor_scales = " , anchor_scales) + all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} + + ### gather all rois + rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] + rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] + rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] + rpn_boxes = tf.concat(values=rpn_boxes, axis=0) + rpn_clses = tf.concat(values=rpn_clses, axis=0) + rpn_anchors = tf.concat(values=rpn_anchors, axis=0) + + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) + rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + + outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] + for i in range(4, 1, -1): + p = 'P%d'%i + outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] + + outputs['rpn_boxes'] = rpn_boxes + outputs['rpn_clses'] = rpn_clses + outputs['rpn_anchor'] = rpn_anchors + outputs['rpn_final_boxes'] = rpn_final_boxes + outputs['rpn_final_clses'] = rpn_final_clses + outputs['rpn_final_scores'] = rpn_final_scores + outputs['rpn_indexs'] = indexs + + if is_training is True: + ### for training, rcnn and maskrcnn take rpn boxes as inputs + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) + # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + else: + ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) + + ### assign pyramid layer indexs to rcnn network's ROIs + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) + + ### crop features from pyramid for rcnn network + rcnn_cropped_features = [] + rcnn_ordered_rois = [] + rcnn_ordered_index = [] + for i in range(5, 1, -1): + p = 'P%d'%i + rcnn_splitted_roi = rcnn_assigned_rois[i-2] + rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] + rcnn_index = rcnn_assigned_indexs[i-2] + rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + rcnn_cropped_features.append(rcnn_cropped_feature) + rcnn_ordered_rois.append(rcnn_splitted_roi) + rcnn_ordered_index.append(rcnn_index) + + rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) + rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) + rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) + + ### rcnn head + # to 7 x 7 + rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') + rcnn = slim.flatten(rcnn) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, + weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn_scores = tf.nn.softmax(rcnn_clses) + + ### decode rcnn network final outputs + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) + + outputs['rcnn_ordered_rois'] = rcnn_ordered_rois + outputs['rcnn_ordered_index'] = rcnn_ordered_index + outputs['rcnn_cropped_features'] = rcnn_cropped_features + tf.add_to_collection('__CROPPED__', rcnn_cropped_features) + outputs['rcnn_boxes'] = rcnn_boxes + outputs['rcnn_clses'] = rcnn_clses + outputs['rcnn_scores'] = rcnn_scores + outputs['rcnn_final_boxes'] = rcnn_final_boxes + outputs['rcnn_final_clses'] = rcnn_final_classes + outputs['rcnn_final_scores'] = rcnn_final_scores + + ### assign pyramid layer indexs to mask network's ROIs + if is_training: + [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) + + mask_cropped_features = [] + mask_ordered_rois = [] + mask_ordered_indexs = [] + ### crop features from pyramid for mask network + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assigned_indexs[i-2] + mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_features.append(mask_cropped_feature) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) + + mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) + + else: + ### for testing, mask network takes rcnn boxes as inputs + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ + assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) + + mask_cropped_features = [] + mask_ordered_rois = [] + mask_ordered_indexs = [] + mask_ordered_clses = [] + mask_ordered_scores = [] + for i in range(5, 1, -1): + p = 'P%d'%i + mask_splitted_roi = mask_assigned_rois[i-2] + mask_splitted_cls = mask_assigned_clses[i-2] + mask_splitted_score = mask_assigned_scores[i-2] + mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assign_indexs[i-2] + mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + pooled_height=14, pooled_width=14) + mask_cropped_features.append(mask_cropped_feature) + mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) + mask_ordered_clses.append(mask_splitted_cls) + mask_ordered_scores.append(mask_splitted_score) + + mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) + mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) + mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) + mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) + + outputs['mask_final_clses'] = mask_ordered_clses + outputs['mask_final_scores'] = mask_ordered_scores + + ### mask head + m = mask_cropped_features + for _ in range(4): + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) + # to 28 x 28 + m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) + tf.add_to_collection('__TRANSPOSED__', m) + m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) + + outputs['mask_ordered_rois'] = mask_ordered_rois + outputs['mask_ordered_indexs'] = mask_ordered_indexs + outputs['mask_cropped_features'] = mask_cropped_features + outputs['mask_mask'] = m + outputs['mask_final_mask'] = tf.nn.sigmoid(m) + + return outputs + +def build_losses(pyramid, outputs, gt_boxes, gt_masks, + num_classes, base_anchors, + rpn_box_lw =0.1, rpn_cls_lw = 0.1, + rcnn_box_lw=1.0, rcnn_cls_lw=0.1, + mask_lw=1.0): + """Building 3-way output losses, totally 5 losses + Params: + ------ + outputs: output of build_heads + gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] + gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] + *_lw: loss weight of rpn, rcnn and mask losses + + Returns: + ------- + l: a loss tensor + """ + + # losses for pyramid + losses = [] + rpn_box_losses, rpn_cls_losses = [], [] + rcnn_box_losses, rcnn_cls_losses = [], [] + mask_losses = [] + + # watch some info during training + rpn_batch = [] + rcnn_batch = [] + mask_batch = [] + rpn_batch_pos = [] + rcnn_batch_pos = [] + mask_batch_pos = [] + + if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + + ## assigning gt_boxes + [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) + + ## build losses for PFN + for i in range(5, 1, -1): + p = 'P%d' % i + stride = 2 ** i + shape = tf.shape(pyramid[p]) + height, width = shape[1], shape[2] + + splitted_gt_boxes = assigned_gt_boxes[i-2] + + ### rpn losses + # 1. encode ground truth + # 2. compute distances + # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + all_anchors = outputs['rpn'][p]['anchor'] + all_indexs = outputs['rpn'][p]['index'] + rpn_boxes = outputs['rpn'][p]['box'] + rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) + + rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') + + rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ + _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ + tf.reshape(rpn_clses_target, [-1]), + tf.reshape(all_indexs, [-1]), + tf.reshape(rpn_clses, [-1, 2]), + tf.reshape(rpn_boxes, [-1, 4]), + tf.reshape(rpn_boxes_target, [-1, 4]), + tf.reshape(rpn_boxes_inside_weight, [-1, 4]) + ]) + + rpn_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rpn_clses_target, 0), tf.float32 + ))) + rpn_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rpn_clses_target, 1), tf.float32 + ))) + + rpn_box_loss = rpn_boxes_inside_weight * _smooth_l1_dist(rpn_boxes, rpn_boxes_target) + rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) + rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) + rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) + rpn_box_losses.append(rpn_box_loss) + + ### NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses + # BUT these examples still count when computing the average of softmax_cross_entropy, + # the loss become smaller by a factor (None_negtive_labels / all_labels) + # the BEST practise still should be gathering all none-negative examples + rpn_clses_target = slim.one_hot_encoding(rpn_clses_target, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros + rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rpn_clses_target, logits=rpn_clses) + rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) + tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) + rpn_cls_losses.append(rpn_cls_loss) + + ### rcnn losses + # 1. encode ground truth + # 2. compute distances + rcnn_ordered_rois = outputs['rcnn_ordered_rois'] + rcnn_ordered_index = outputs['rcnn_ordered_index'] + rcnn_boxes = outputs['rcnn_boxes'] + rcnn_clses = outputs['rcnn_clses'] + + rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') + + rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ + tf.reshape(rcnn_clses_target, [-1]), + tf.reshape(rcnn_ordered_index, [-1]), + tf.reshape(rcnn_ordered_rois, [-1, 4]), + tf.reshape(rcnn_clses, [-1, num_classes]), + tf.reshape(rcnn_boxes, [-1, num_classes * 4]), + tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), + tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) + ] ) + + rcnn_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rcnn_clses_target, 0), tf.float32 + ))) + rcnn_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(rcnn_clses_target, 1), tf.float32 + ))) + + rcnn_box_loss = rcnn_boxes_inside_weight * _smooth_l1_dist(rcnn_boxes, rcnn_boxes_target) + rcnn_box_loss = tf.reshape(rcnn_box_loss, [-1, 4]) + rcnn_box_loss = tf.reduce_sum(rcnn_box_loss, axis=1) + rcnn_box_loss = rcnn_box_lw * tf.reduce_mean(rcnn_box_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_box_loss) + rcnn_box_losses.append(rcnn_box_loss) + + rcnn_clses_target = slim.one_hot_encoding(rcnn_clses_target, num_classes, on_value=1.0, off_value=0.0) + rcnn_cls_loss = rcnn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rcnn_clses_target, logits=rcnn_clses) + rcnn_cls_loss = tf.reduce_mean(rcnn_cls_loss) # * frac_ + tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) + rcnn_cls_losses.append(rcnn_cls_loss) + + outputs['training_rcnn_clses_target'] = rcnn_clses_target + outputs['training_rcnn_clses'] = rcnn_clses + + ### mask loss + # mask of shape (N, h, w, num_classes) + mask_ordered_rois = outputs['mask_ordered_rois'] + mask_ordered_indexs = outputs['mask_ordered_indexs'] + masks = outputs['mask_mask'] + + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') + + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ + _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ + tf.reshape(mask_clses_target, [-1]), + tf.reshape(mask_targets, [-1, 28, 28, num_classes]), + tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), + tf.reshape(mask_rois, [-1, 4]), + tf.reshape(mask_ordered_indexs, [-1]), + tf.reshape(masks, [-1, 28, 28, num_classes]), + ]) + + mask_batch.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(mask_clses_target, 0), tf.float32 + ))) + mask_batch_pos.append( + tf.reduce_sum(tf.cast( + tf.greater_equal(mask_clses_target, 1), tf.float32 + ))) + ### NOTE: w/o competition between classes. + mask_loss = mask_inside_weights * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) + mask_loss = mask_lw * mask_loss + mask_loss = tf.reduce_mean(mask_loss) + mask_loss = tf.cond(tf.greater(tf.size(mask_clses_target), 0), lambda: mask_loss, lambda: tf.constant(0.0)) + tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) + mask_losses.append(mask_loss) + + outputs['training_mask_rois'] = mask_rois + outputs['training_mask_clses_target'] = mask_clses_target + outputs['training_mask_final_mask'] = tf.nn.sigmoid(masks) + outputs['training_mask_final_mask_target'] = mask_targets + + rpn_box_losses = tf.add_n(rpn_box_losses) + rpn_cls_losses = tf.add_n(rpn_cls_losses) + rcnn_box_losses = tf.add_n(rcnn_box_losses) + rcnn_cls_losses = tf.add_n(rcnn_cls_losses) + mask_losses = tf.add_n(mask_losses) + losses = [rpn_box_losses, rpn_cls_losses, rcnn_box_losses, rcnn_cls_losses, mask_losses] + total_loss = tf.add_n(losses) + + rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) + rcnn_batch = tf.cast(tf.add_n(rcnn_batch), tf.float32) + mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) + rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) + rcnn_batch_pos = tf.cast(tf.add_n(rcnn_batch_pos), tf.float32) + mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) + + return total_loss, losses, [rpn_batch_pos, rpn_batch, \ + rcnn_batch_pos, rcnn_batch, \ + mask_batch_pos, mask_batch] + +def decode_output(outputs): + """decode outputs into boxes and masks""" + return [], [], [] + +def build(end_points, image_height, image_width, pyramid_map, + num_classes, + base_anchors, + is_training, + gt_boxes=None, + gt_masks=None, + loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): + + pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + + if is_training: + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training, gt_boxes=gt_boxes) + loss, losses, batch_info = build_losses(pyramid, outputs, + gt_boxes, gt_masks, + num_classes=num_classes, base_anchors=base_anchors, + rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], + rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], + mask_lw=loss_weights[4]) + + outputs['losses'] = losses + outputs['total_loss'] = loss + outputs['batch_info'] = batch_info + else: + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + is_training=is_training) + + ### just decode outputs into readable prediction + pred_boxes, pred_classes, pred_masks = decode_output(outputs) + outputs['pred_boxes'] = pred_boxes + outputs['pred_classes'] = pred_classes + outputs['pred_masks'] = pred_masks + + ### for debuging + outputs['tmp_0'] = pred_classes + outputs['tmp_1'] = pred_classes + outputs['tmp_2'] = pred_classes + outputs['tmp_3'] = pred_classes + outputs['tmp_4'] = pred_classes + outputs['tmp_5'] = pred_classes + + # ### image and gt visualization + # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) + + # ### rpn visualization + # visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") + + # ### mask network visualization + # first_mask = outputs['training_mask_final_mask'][:1] + # first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) + + # visualize_final_predictions(outputs['rcnn_final_boxes'], end_points["input"], first_mask) + + return outputs diff --git a/libs/nets/resnet_v1.py b/libs/nets/resnet_v1.py index 6d24baa..cd96fd8 100644 --- a/libs/nets/resnet_v1.py +++ b/libs/nets/resnet_v1.py @@ -66,6 +66,7 @@ from tensorflow.python.ops import math_ops from tensorflow.python.ops import nn_ops from tensorflow.python.ops import variable_scope +import tensorflow as tf resnet_arg_scope = resnet_utils.resnet_arg_scope diff --git a/libs/preprocessings/coco_v1.py b/libs/preprocessings/coco_v1.py index e18fe15..cd9255f 100644 --- a/libs/preprocessings/coco_v1.py +++ b/libs/preprocessings/coco_v1.py @@ -67,7 +67,7 @@ def preprocess_for_training(image, gt_boxes, gt_masks): ## rgb to bgr image = tf.reverse(image, axis=[-1]) - return image, gt_boxes, gt_masks + return image, new_ih, new_iw, gt_boxes, gt_masks def preprocess_for_test(image, gt_boxes, gt_masks): @@ -98,4 +98,4 @@ def preprocess_for_test(image, gt_boxes, gt_masks): ## rgb to bgr image = tf.reverse(image, axis=[-1]) - return image, gt_boxes, gt_masks + return image, new_ih, new_iw, gt_boxes, gt_masks diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index 6fe14a2..83e2a09 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -36,7 +36,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la else: color = '#0000ff' else: - text = cat_id_to_cls_name(label[i]) + ' : ' + str(i)#+ str(prob[i][label[i]])[:4] + text = cat_id_to_cls_name(label[i]) + ' : ' + "{:.3f}".format(prob[i][label[i]]) #str(i)#+ draw.text((2+bbox[i,0], 2+bbox[i,1]), text, fill=color) if _DEBUG is True: diff --git a/pycocoEval.py b/pycocoEval.py new file mode 100644 index 0000000..d43193e --- /dev/null +++ b/pycocoEval.py @@ -0,0 +1,47 @@ + +import matplotlib.pyplot as plt +# from data.coco.PythonAPI.pycocotools.coco import COCO +# from data.coco.PythonAPI.pycocotools.cocoeval import COCOeval +from libs.datasets.pycocotools.coco import COCO +from libs.datasets.pycocotools.cocoeval import COCOeval +import numpy as np +import skimage.io as io +import pylab +import json + +pylab.rcParams['figure.figsize'] = (10.0, 8.0) + +annType = ['segm','bbox','keypoints'] +annType = annType[1] #specify type here +prefix = 'person_keypoints' if annType=='keypoints' else 'instances' +print 'Running demo for *%s* results.'%(annType) + +#initialize COCO ground truth api +dataDir='data/coco/' +dataType='train2014'#val2014 +annFile = '%s/annotations/%s_%s.json'%(dataDir,prefix,dataType) +cocoGt=COCO(annFile) + + +#initialize COCO detections api +# resFile='%s/results/%s_%s_fake%s100_results.json' +# resFile = resFile%(dataDir, prefix, dataType, annType) +resFile = 'output/mask_rcnn/results.json' +cocoDt=cocoGt.loadRes(resFile) + +with open(resFile) as results: + res = json.load(results) + +imgIds = [] + +for inst in res: + imgIds.append(inst['image_id']) + +# imgIds=[378962, 116819, 378967, 378968, 116825] + +# running evaluation +cocoEval = COCOeval(cocoGt,cocoDt,annType) +cocoEval.params.imgIds = imgIds +cocoEval.evaluate() +cocoEval.accumulate() +cocoEval.summarize() \ No newline at end of file diff --git a/train/test.py b/train/test.py index a4c9ae1..6c2256e 100644 --- a/train/test.py +++ b/train/test.py @@ -10,6 +10,7 @@ import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim +import json from time import gmtime, strftime sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) @@ -32,6 +33,58 @@ FLAGS = tf.app.flags.FLAGS resnet50 = resnet_v1.resnet_v1_50 +def _cat_id_to_real_id(readId): + """Note coco has 80 classes, but the catId ranges from 1 to 90!""" + cat_id_to_real_id = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, + 90,]) + return cat_id_to_real_id[readId] + +def _writeJSON(_dict): + with open(FLAGS.train_dir + 'results.json', 'a+') as f: + f.seek(0,2) #Go to the end of file + if f.tell() == 0 : #Check if file is empty + json.dump([_dict], f) #If empty, write an array + else : + f.seek(-1,2) + f.truncate() #Remove the last character, open the array + f.write(' , ') #Write the separator + json.dump(_dict,f) #Dump the dictionary + f.write(']') #Close the array + f.close() + return + +def _convertBoxes(boxes, img_h, img_w, new_img_h, new_img_w): + new_boxes = boxes + new_boxes[:,2] = (boxes[:,2]*img_h/new_img_h - boxes[:,0]*img_h/new_img_h).astype(np.float32) + new_boxes[:,3] = (boxes[:,3]*img_w/new_img_w - boxes[:,1]*img_w/new_img_w).astype(np.float32) + new_boxes[:,0] = (boxes[:,0]*img_h/new_img_h).astype(np.float32) + new_boxes[:,1] = (boxes[:,1]*img_w/new_img_w).astype(np.float32) + return new_boxes + +def _collectData(image_id, classes, boxes, probs, img_h, img_w, new_img_h, new_img_w): + instance_num = probs.shape[0] + boxes = _convertBoxes(boxes, img_h, img_w, new_img_h, new_img_w) + + image_ids = [image_id] * instance_num + real_category_id = _cat_id_to_real_id(classes).tolist() + bbox = boxes.tolist()#change format + score = probs.tolist() + + for instance_index in range(instance_num): + instance = {} + instance['image_id'] = int(image_ids[instance_index]) + instance['category_id'] = real_category_id[instance_index] + instance['bbox'] = bbox[instance_index] + instance['score'] = score[instance_index][classes[instance_index]] + _writeJSON(instance) + def restore(sess): """choose which param to restore""" if FLAGS.restore_previous_if_exists: @@ -48,50 +101,12 @@ def restore(sess): except: print (' failed to restore in %s %s' % (FLAGS.train_dir, checkpoint_path)) raise - -def evaluate(ap_threshold, gt_boxes, gt_masks, boxes, classes, probs, masks): - gt_clses = gt_boxes[:, 4] - num_prediction = boxes.shape[0] - num_instances = gt_boxes.shape[0] - precision = np.zeros_like(ap_threshold) - recall = np.zeros_like(ap_threshold) - - if num_instances is not 0 and num_prediction is not 0: - m = np.array(masks) - m = np.transpose(m,(0,3,1,2)) - - overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), - np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) - - overlaps_precision = np.max(overlaps, axis=1) - overlaps_precision_indexs = np.argmax(overlaps, axis=1) - overlaps_recall = np.max(overlaps, axis=0) - overlaps_recall_indexs = np.argmax(overlaps, axis=0) - - for i, threshold in enumerate(ap_threshold): - #precision - iou_bool = overlaps_precision > threshold - cls_bool = gt_clses[overlaps_precision_indexs] == classes - #mask_bool = True ##TODO - precision[i] = np.sum(iou_bool * cls_bool ) - - #recall - iou_bool = overlaps_recall > threshold - cls_bool = gt_clses == classes[overlaps_recall_indexs] - #mask_bool = True ##TODO - recall[i] = np.sum(iou_bool * cls_bool ) - # print(iou_bool) - # print(cls_bool) - - return recall, precision, num_instances, num_prediction - def test(): """The main function that runs training""" ## data - image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ + image, ih, iw, new_ih, new_iw, gt_boxes, gt_masks, num_instances, img_id = \ datasets.get_dataset(FLAGS.dataset_name, FLAGS.dataset_split_name_test, FLAGS.dataset_dir, @@ -103,7 +118,7 @@ def test(): ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, - weight_decay=FLAGS.weight_decay, is_training=False) + weight_decay=FLAGS.weight_decay, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, base_anchors=9,#15 @@ -155,28 +170,20 @@ def test(): threads = [] # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): - threads.extend(qr.create_threads(sess, coord=coord, daemon=True, - start=True)) + threads.extend(qr.create_threads(sess, coord=coord, start=True)) tf.train.start_queue_runners(sess=sess, coord=coord) - ap_threshold = [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95] - total_recall = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - total_precision = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - total_instance = 0 - total_prediction = 0 - - # for step in range(FLAGS.max_iters): - for step in range(40503): + for step in range(10000):#range(40503): start_time = time.time() - img_id_str, \ + img_id_str, img_h, img_w, new_img_h, new_img_w, \ gt_boxesnp, gt_masksnp,\ input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ - sess.run([img_id] + \ + sess.run([img_id] + [ih] + [iw] + [new_ih] + [new_iw] +\ [gt_boxes] + [gt_masks] +\ [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + \ [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) @@ -196,9 +203,9 @@ def test(): bbox=testing_mask_roisnp, label=testing_mask_final_clsesnp, prob=testing_mask_final_scoresnp, - mask=testing_mask_final_masknp,) + mask=testing_mask_final_masknp, + vis_th=0.2) - if step % 1 == 0: draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='test_gt', @@ -206,22 +213,15 @@ def test(): label=gt_boxesnp[:,4].astype(np.int32), prob=np.ones((gt_boxesnp.shape[0],81), dtype=np.float32),) - recall, precision, num_instances, num_prediction = evaluate(ap_threshold, gt_boxesnp, gt_masksnp, testing_mask_roisnp, testing_mask_final_clsesnp, testing_mask_final_scoresnp, testing_mask_final_masknp) - total_recall += recall - total_precision += precision - total_instance += num_instances - total_prediction += num_prediction - print("recall = {}".format(total_recall / float(total_instance))) - print("precision = {}".format(total_precision / float(total_prediction))) - print("------------------------------------------------") - # print("recall = {}".format([x / float(total_instance) for x in total_recall])) - # print("precision = {}".format([x / float(total_prediction) for x in total_precision])) - print("===============================================") - print("recall = {}".format(total_recall / float(total_instance))) - print("precision = {}".format(total_precision / float(total_prediction))) + print ("predict") + # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) + print (cat_id_to_cls_name(testing_mask_final_clsesnp)) + print (np.max(np.array(testing_mask_final_scoresnp),axis=1)) + _collectData(img_id_str, testing_mask_final_clsesnp, testing_mask_roisnp, testing_mask_final_scoresnp, img_h, img_w, new_img_h, new_img_w) + # writeJSON('results.json', data) if __name__ == '__main__': test() diff --git a/train/train.py b/train/train.py index 24fa734..23cd1ce 100644 --- a/train/train.py +++ b/train/train.py @@ -76,12 +76,45 @@ def restore(sess): restorer = tf.train.Saver() ########### + # not_restore = [ 'pyramid/fully_connected/BatchNorm/gamma:0', + # 'pyramid/fully_connected_1/BatchNorm/gamma:0', + # 'pyramid/fully_connected_2/BatchNorm/gamma:0', + # 'pyramid/fully_connected_3/BatchNorm/gamma:0', + # 'pyramid/fully_connected/BatchNorm/beta:0', + # 'pyramid/fully_connected_1/BatchNorm/beta:0', + # 'pyramid/fully_connected_2/BatchNorm/beta:0', + # 'pyramid/fully_connected_3/BatchNorm/beta:0', + # 'pyramid/fully_connected/BatchNorm/moving_mean:0', + # 'pyramid/fully_connected_1/BatchNorm/moving_mean:0', + # 'pyramid/fully_connected_2/BatchNorm/moving_mean:0', + # 'pyramid/fully_connected_3/BatchNorm/moving_mean:0', + # 'pyramid/fully_connected/BatchNorm/moving_variance:0', + # 'pyramid/fully_connected_1/BatchNorm/moving_variance:0', + # 'pyramid/fully_connected_2/BatchNorm/moving_variance:0', + # 'pyramid/fully_connected_3/BatchNorm/moving_variance:0', + + # 'pyramid/fully_connected/BatchNorm/gamma/Momentum:0', + # 'pyramid/fully_connected_1/BatchNorm/gamma/Momentum:0', + # 'pyramid/fully_connected_2/BatchNorm/gamma/Momentum:0', + # 'pyramid/fully_connected_3/BatchNorm/gamma/Momentum:0', + # 'pyramid/fully_connected/BatchNorm/beta/Momentum:0', + # 'pyramid/fully_connected_1/BatchNorm/beta/Momentum:0', + # 'pyramid/fully_connected_2/BatchNorm/beta/Momentum:0', + # 'pyramid/fully_connected_3/BatchNorm/beta/Momentum:0', + # 'pyramid/fully_connected/BatchNorm/moving_mean/Momentum:0', + # 'pyramid/fully_connected_1/BatchNorm/moving_mean/Momentum:0', + # 'pyramid/fully_connected_2/BatchNorm/moving_mean/Momentum:0', + # 'pyramid/fully_connected_3/BatchNorm/moving_mean/Momentum:0', + # 'pyramid/fully_connected/BatchNorm/moving_variance/Momentum:0', + # 'pyramid/fully_connected_1/BatchNorm/moving_variance/Momentum:0', + # 'pyramid/fully_connected_2/BatchNorm/moving_variance/Momentum:0', + # 'pyramid/fully_connected_3/BatchNorm/moving_variance/Momentum:0',] + ########### # not_restore = [ 'pyramid/fully_connected/weights:0', # 'pyramid/fully_connected/biases:0', - # 'pyramid/fully_connected/weights:0', - # 'pyramid/fully_connected_1/biases:0', # 'pyramid/fully_connected_1/weights:0', + # 'pyramid/fully_connected_1/biases:0', # 'pyramid/fully_connected_2/weights:0', # 'pyramid/fully_connected_2/biases:0', # 'pyramid/fully_connected_3/weights:0', @@ -100,9 +133,8 @@ def restore(sess): # 'pyramid/Conv_4/biases:0', # 'pyramid/fully_connected/weights/Momentum:0', # 'pyramid/fully_connected/biases/Momentum:0', - # 'pyramid/fully_connected/weights/Momentum:0', - # 'pyramid/fully_connected_1/biases/Momentum:0', # 'pyramid/fully_connected_1/weights/Momentum:0', + # 'pyramid/fully_connected_1/biases/Momentum:0', # 'pyramid/fully_connected_2/weights/Momentum:0', # 'pyramid/fully_connected_2/biases/Momentum:0', # 'pyramid/fully_connected_3/weights/Momentum:0', @@ -119,6 +151,23 @@ def restore(sess): # 'pyramid/Conv2d_transpose/biases/Momentum:0', # 'pyramid/Conv_4/weights/Momentum:0', # 'pyramid/Conv_4/biases/Momentum:0',] + # not_restore = [ 'pyramid/P2/rpn/weights:0', + # 'pyramid/P2/rpn/biases:0', + # 'pyramid/P3/rpn/weights:0', + # 'pyramid/P3/rpn/biases:0', + # 'pyramid/P4/rpn/weights:0', + # 'pyramid/P4/rpn/biases:0', + # 'pyramid/P5/rpn/weights:0', + # 'pyramid/P5/rpn/biases:0', + # 'pyramid/P2/rpn/weights/Momentum:0', + # 'pyramid/P2/rpn/biases/Momentum:0', + # 'pyramid/P3/rpn/weights/Momentum:0', + # 'pyramid/P3/rpn/biases/Momentum:0', + # 'pyramid/P4/rpn/weights/Momentum:0', + # 'pyramid/P4/rpn/biases/Momentum:0', + # 'pyramid/P5/rpn/weights/Momentum:0', + # 'pyramid/P5/rpn/biases/Momentum:0',,] + # vars_to_restore = [v for v in tf.all_variables()if v.name not in not_restore] # restorer = tf.train.Saver(vars_to_restore) # for var in vars_to_restore: @@ -164,22 +213,22 @@ def restore(sess): def train(): """The main function that runs training""" ## data - image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ + image, ih, iw, new_img_h, new_img_w, gt_boxes, gt_masks, num_instances, img_id = \ datasets.get_dataset(FLAGS.dataset_name, FLAGS.dataset_split_name, FLAGS.dataset_dir, FLAGS.im_batch, is_training=True) - data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, - dtypes=( - image.dtype, ih.dtype, iw.dtype, - gt_boxes.dtype, gt_masks.dtype, - num_instances.dtype, img_id.dtype)) - enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) - data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) - tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) - (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() + # data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, + # dtypes=( + # image.dtype, ih.dtype, iw.dtype, + # gt_boxes.dtype, gt_masks.dtype, + # num_instances.dtype, img_id.dtype)) + # enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) + # data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) + # tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) + # (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() im_shape = tf.shape(image) image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) @@ -191,7 +240,7 @@ def train(): base_anchors=9,#15 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[10.0, 1.0, 1000.0, 1.0, 100.0]) + loss_weights=[0.1, 1.0, 0.1, 1.0, 1.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) # loss_weights=[0.1, 0.01, 10.0, 0.1, 1.0]) @@ -202,8 +251,10 @@ def train(): regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) input_image = end_points['input'] + training_rcnn_rois = outputs['training_rcnn_rois'] training_rcnn_clses = outputs['training_rcnn_clses'] training_rcnn_clses_target = outputs['training_rcnn_clses_target'] + training_rcnn_scores = outputs['training_rcnn_scores'] training_mask_rois = outputs['training_mask_rois'] training_mask_clses_target = outputs['training_mask_clses_target'] training_mask_final_mask = outputs['training_mask_final_mask'] @@ -263,13 +314,13 @@ def train(): gt_boxesnp, \ rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch, \ input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ - training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ + training_rcnn_roisnp, training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_rcnn_scoresnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ sess.run([update_op, total_loss, regular_loss, img_id] + losses + [gt_boxes] + batch_info + [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + - [training_rcnn_clses] + [training_rcnn_clses_target] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) + [training_rcnn_rois] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_rcnn_scores] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) duration_time = time.time() - start_time if step % 1 == 0: @@ -286,27 +337,50 @@ def train(): LOG ("target") LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) + # print (cat_id_to_cls_name(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1))) + LOG ("predict") LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) + # print (cat_id_to_cls_name(np.argmax(np.array(training_rcnn_clsesnp),axis=1))) + # print (np.max(np.array(training_rcnn_clsesnp),axis=1)) + + # print(training_rcnn_clsesnp.shape) + # print(training_mask_clses_targetnp.shape) if step % 50 == 0: draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_est', - bbox=training_mask_roisnp, - label=training_mask_clses_targetnp, - prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, - mask=training_mask_final_masknp, + bbox=training_rcnn_roisnp, + label=np.argmax(np.array(training_rcnn_scoresnp),axis=1), + prob=training_rcnn_scoresnp,#np.zeros((training_rcnn_clsesnp.shape[0],81), dtype=np.float32)+1.0, vis_all=True) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_gt', - bbox=training_mask_roisnp, - label=training_mask_clses_targetnp, - prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, - mask=training_mask_final_mask_targetnp, + bbox=training_rcnn_roisnp, + label=np.argmax(np.array(training_rcnn_clses_targetnp),axis=1), + prob=np.zeros((training_rcnn_clsesnp.shape[0],81), dtype=np.float32)+1.0, vis_all=True) + + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='train_est', + # bbox=training_mask_roisnp, + # label=training_mask_clses_targetnp, + # prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + # mask=training_mask_final_masknp, + # vis_all=True) + + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='train_gt', + # bbox=training_mask_roisnp, + # label=training_mask_clses_targetnp, + # prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + # mask=training_mask_final_mask_targetnp, + # vis_all=True) if np.isnan(tot_loss) or np.isinf(tot_loss): print (gt_boxesnp) @@ -317,7 +391,7 @@ def train(): summary_writer.add_summary(summary_str, step) summary_writer.flush() - if (step % 10000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: + if (step % 1000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: checkpoint_path = os.path.join(FLAGS.train_dir, FLAGS.dataset_name + '_' + FLAGS.network + '_model.ckpt') saver.save(sess, checkpoint_path, global_step=step) From 4b31df90d59d37389b730f646aa35bd0ce918297 Mon Sep 17 00:00:00 2001 From: souryuu Date: Fri, 8 Sep 2017 11:44:21 +0900 Subject: [PATCH 29/35] failed version dont use this one --- libs/boxes/anchor.py | 113 ++++++++++++++++--- libs/configs/config_v1.py | 24 ++-- libs/layers/anchor.py | 187 ++++++++++++++++++-------------- libs/layers/mask.py | 74 +------------ libs/layers/roi.py | 6 +- libs/layers/sample.py | 71 ++++-------- libs/layers/wrapper.py | 183 ++++++++++++------------------- libs/nets/pyramid_network.py | 186 ++++++++++++++++--------------- libs/nets/pyramid_network_.py | 2 +- libs/visualization/pil_utils.py | 4 +- train/train.py | 118 ++++++++++++-------- 11 files changed, 480 insertions(+), 488 deletions(-) diff --git a/libs/boxes/anchor.py b/libs/boxes/anchor.py index 136a7d0..f8948a3 100644 --- a/libs/boxes/anchor.py +++ b/libs/boxes/anchor.py @@ -4,6 +4,9 @@ import numpy as np from libs.boxes import cython_anchor +from libs.logs.log import LOG +from libs.boxes import cython_bbox +from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes def anchors(scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16): """Get a set of anchors at one position """ @@ -21,7 +24,7 @@ def anchors_plane(height, width, stride = 1.0, # ratios = kwargs.setdefault('ratios', [0.5, 1, 2.0]) # base = kwargs.setdefault('base', 16) anc = anchors(scales, ratios, base) - all_anchors = cython_anchor.anchors_plane(height, width, stride, anc) + all_anchors = cython_anchor.anchors_plane(height, width, stride, anc).astype(np.float32) return all_anchors # Written by Ross Girshick and Sean Bell @@ -73,8 +76,8 @@ def _ratio_enum(anchor, ratios): w, h, x_ctr, y_ctr = _whctrs(anchor) size = w * h size_ratios = size / ratios - ws = np.round(np.sqrt(size_ratios)) - hs = np.round(ws * ratios) + ws = (np.sqrt(size_ratios)) + hs = (ws * ratios)#np.round anchors = _mkanchors(ws, hs, x_ctr, y_ctr) return anchors @@ -103,28 +106,102 @@ def _unmap(data, count, inds, fill=0): ret[inds, :] = data return ret +def _jitter_gt_boxes(gt_boxes, jitter=0.05): + """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs + gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int + """ + jittered_boxes = gt_boxes.copy() + ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 + hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 + width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws + height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs + jittered_boxes[:, 0] += width_offset + jittered_boxes[:, 2] += width_offset + jittered_boxes[:, 1] += height_offset + jittered_boxes[:, 3] += height_offset + + return jittered_boxes + if __name__ == '__main__': import time t = time.time() - a = anchors() - num_anchors = 0 + total_anchors = 0 + + iw = 1134 + ih = 640 + stride = 16 # all_anchors = anchors_plane(200, 250, stride=4, boarder=0) # num_anchors += all_anchors.shape[0] - for i in range(10): - ancs = anchors() - all_anchors = cython_anchor.anchors_plane(200, 250, 4, ancs) - num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - all_anchors = cython_anchor.anchors_plane(100, 125, 8, ancs) - num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - all_anchors = cython_anchor.anchors_plane(50, 63, 16, ancs) - num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - all_anchors = cython_anchor.anchors_plane(25, 32, 32, ancs) - num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - print('average time: %f' % ((time.time() - t) / 10)) - print('anchors: %d' % (num_anchors / 10)) - print(a.shape, '\n', a) + # for i in range(10): + gt_boxes = np.array([ [705.20550537 ,246.37339783, 915.78503418 , 411.53240967]]) + # gt_boxes = np.array([ [476.03378296, 363.47793579, 961.50238037, 559.27886963], + # [ 472.08267212, 378.50143433, 814.7980957, 562.92962646], + # [3.15492964, 491.46292114, 957.62628174, 630.52020264]]) + + jittered_gt_boxes = _jitter_gt_boxes(gt_boxes[:, :4]) + clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (ih, iw)) + + ancs = anchors() + print("\n%s" % ancs) + all_anchors = cython_anchor.anchors_plane(40, 71, stride, ancs) + total_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + print (all_anchors) print (all_anchors.shape) + all_anchors = all_anchors.reshape([-1, 4]) + labels = np.empty((all_anchors.shape[0], ), dtype=np.int32) + labels.fill(-1) + + overlaps = cython_bbox.bbox_overlaps( + np.ascontiguousarray(all_anchors, dtype=np.float), + np.ascontiguousarray(clipped_gt_boxes, dtype=np.float)) + + gt_assignment = overlaps.argmax(axis=1) # (A) + print(gt_assignment) + max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] + print(max_overlaps) + gt_argmax_overlaps = overlaps.argmax(axis=0) # G + print(gt_argmax_overlaps) + gt_max_overlaps = overlaps[gt_argmax_overlaps, + np.arange(overlaps.shape[1])] + print(gt_max_overlaps) + + # bg label: less than threshold IOU + labels[max_overlaps < 0.3] = 0 + # fg label: above threshold IOU + labels[max_overlaps >= 0.7] = 1 + + # ignore cross-boundary anchors + cb0_inds = np.where(all_anchors[:, 0] <= 0 - (all_anchors[:, 2] - all_anchors[:, 0]) * 0) + cb1_inds = np.where(all_anchors[:, 1] <= 0 - (all_anchors[:, 3] - all_anchors[:, 1]) * 0) + cb2_inds = np.where(all_anchors[:, 2] >= iw + (all_anchors[:, 2] - all_anchors[:, 0]) * 0) + cb3_inds = np.where(all_anchors[:, 3] >= ih + (all_anchors[:, 3] - all_anchors[:, 1]) * 0) + cb_inds = np.unique(np.concatenate((cb0_inds, cb1_inds, cb2_inds, cb3_inds), axis =1)) + labels[cb_inds] = -2 + #LOG ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[:, 0]), np.min(all_anchors[:, 1]), np.max(all_anchors[:, 2]), np.max(all_anchors[:, 3]))) + print ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[labels!=-2, 0]), np.min(all_anchors[labels!=-2, 1]), np.max(all_anchors[labels!=-2, 2]), np.max(all_anchors[labels!=-2, 3]))) + + labels[gt_argmax_overlaps] = 2 + + print ("above threshold: %s closest box: %s"% ((np.where(labels==1)), (np.where(labels==2)))) + print ("all_anchors anchor\n%s" %all_anchors[labels==2, :]) + print ("gt anchor\n%s" %gt_boxes) + + # all_anchors = cython_anchor.anchors_plane(20, 30, 16, ancs) + # num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + + # all_anchors = cython_anchor.anchors_plane(40, 60, 8, ancs) + # num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + + # all_anchors = cython_anchor.anchors_plane(80, 120, 4, ancs) + # num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + + # print('average time: %f' % ((time.time() - t) / 10)) + # print('anchors: %d' % (num_anchors / 10)) + # print(a.shape, '\n', a) + # print (all_anchors.shape) # from IPython import embed # embed() + + diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 674c359..5f30fcc 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -30,7 +30,7 @@ 'Whether or not to update bacth normalization layer') tf.app.flags.DEFINE_integer( - 'num_readers', 4, + 'num_readers', 1, 'The number of parallel readers that read data from the dataset.') tf.app.flags.DEFINE_string( @@ -79,10 +79,10 @@ ###################### tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') + 'weight_decay', 0.0005, 'The weight decay on the model weights.') tf.app.flags.DEFINE_string( - 'optimizer', 'momentum', + 'optimizer', 'adam', 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' '"ftrl", "momentum", "sgd" or "rmsprop".') @@ -118,7 +118,7 @@ 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') tf.app.flags.DEFINE_float( - 'momentum', 0.99, + 'momentum', 0.9, 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') @@ -232,15 +232,15 @@ ####################### tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.5, + 'rpn_fg_threshold', 0.7, 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.5, + 'rpn_bg_threshold', 0.3, 'Only regions which intersection is less than bg_threshold are considered to be fg') tf.app.flags.DEFINE_float( - 'fg_threshold', 0.5, + 'fg_threshold', 0.7, 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( @@ -260,23 +260,23 @@ 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, + 'rpn_batch_size', 128, 'Number of rpn anchors that should be sampled to train this network') tf.app.flags.DEFINE_integer( - 'allow_border', 10, - 'How many pixels out of an image') + 'allow_border', 0.0, + 'Percentage of bounding box height and length that are allowed to be out of an image boundary') ################################## # NMS # ################################## tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000, + 'pre_nms_top_n', 200,#12000, 'Number of rpn anchors that should be sampled before nms') tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, + 'post_nms_top_n', 10, #2000 'Number of rpn anchors that should be sampled after nms') tf.app.flags.DEFINE_integer( diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index 876609f..798a8a4 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -13,7 +13,7 @@ _DEBUG = False -def encode(gt_boxes, all_anchors, height, width, stride, indexs): +def encode(gt_boxes, all_anchors, height, width, stride, ih, iw, ignore_cross_boundary=True): """Matching and Encoding groundtruth into learning targets Sampling @@ -52,64 +52,45 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): labels = np.empty((anchors.shape[0], ), dtype=np.int32) labels.fill(-1) + jittered_gt_boxes = _jitter_gt_boxes(gt_boxes[:, :4]) + clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (ih, iw)) + if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( np.ascontiguousarray(anchors, dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) - - # if _DEBUG: - # print ('gt_boxes shape: ', gt_boxes.shape) - # print ('anchors shape: ', anchors.shape) - # print ('overlaps shape: ', overlaps.shape) - + np.ascontiguousarray(clipped_gt_boxes, dtype=np.float)) - gt_assignment = overlaps.argmax(axis=1) # (A) + gt_assignment = overlaps.argmax(axis=1) # (A) max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] gt_argmax_overlaps = overlaps.argmax(axis=0) # G gt_max_overlaps = overlaps[gt_argmax_overlaps, np.arange(overlaps.shape[1])] + - labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 - if _DEBUG: - print ('gt_assignment shape: ', gt_assignment.shape) - print ('max_overlaps shape: ', max_overlaps.shape) - print ('gt_argmax_overlaps shape: ', gt_argmax_overlaps.shape) - print ('gt_max_overlaps shape: ', gt_max_overlaps.shape) - - if True: - # this is sentive to boxes of little overlaps, no need! - # gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] - - # fg label: for each gt, hard-assign anchor with highest overlap despite its overlaps - labels[gt_argmax_overlaps] = 1 - - # exclude examples with little overlaps - # added later - # excludes = np.where(gt_max_overlaps < cfg.FLAGS.bg_threshold)[0] - # labels[gt_argmax_overlaps[excludes]] = -1 - - # if _DEBUG: - # min_ov = np.min(gt_max_overlaps) - # max_ov = np.max(gt_max_overlaps) - # mean_ov = np.mean(gt_max_overlaps) - # if min_ov < cfg.FLAGS.bg_threshold: - # LOG('ANCHOREncoder: overlaps: (min %.3f mean:%.3f max:%.3f), stride: %d, shape:(h:%d, w:%d)' - # % (min_ov, mean_ov, max_ov, stride, height, width)) - # worst = gt_boxes[np.argmin(gt_max_overlaps)] - # anc = anchors[gt_argmax_overlaps[np.argmin(gt_max_overlaps)], :] - # LOG('ANCHOREncoder: worst case: overlap: %.3f, box:(%.1f, %.1f, %.1f, %.1f %d), anchor:(%.1f, %.1f, %.1f, %.1f)' - # % (min_ov, worst[0], worst[1], worst[2], worst[3], worst[4], - # anc[0], anc[1], anc[2], anc[3])) - - - # fg label: above threshold IOU + # bg label: less than threshold IOU + labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 + # fg label: above threshold IOU labels[max_overlaps >= cfg.FLAGS.rpn_fg_threshold] = 1 - - if _DEBUG: - print('highest cover :', gt_max_overlaps.shape) - print('more than 0.7 :', len(max_overlaps >= cfg.FLAGS.rpn_fg_threshold)) - print('labels is 1 :', len(labels == 1)) + # LOG ("all_anchors anchor above threshold\n%s" %all_anchors[labels==1, :]) + + # ignore cross-boundary anchors + if ignore_cross_boundary is True: + cb0_inds = np.where(all_anchors[:, 0] <= 0 - (all_anchors[:, 2] - all_anchors[:, 0]) * cfg.FLAGS.allow_border) + cb1_inds = np.where(all_anchors[:, 1] <= 0 - (all_anchors[:, 3] - all_anchors[:, 1]) * cfg.FLAGS.allow_border) + cb2_inds = np.where(all_anchors[:, 2] >= iw + (all_anchors[:, 2] - all_anchors[:, 0]) * cfg.FLAGS.allow_border) + cb3_inds = np.where(all_anchors[:, 3] >= ih + (all_anchors[:, 3] - all_anchors[:, 1]) * cfg.FLAGS.allow_border) + cb_inds = np.unique(np.concatenate((cb0_inds, cb1_inds, cb2_inds, cb3_inds), axis =1)) + labels[cb_inds] = -1 + #LOG ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[:, 0]), np.min(all_anchors[:, 1]), np.max(all_anchors[:, 2]), np.max(all_anchors[:, 3]))) + # LOG ("above threshold: %s"% np.where(labels==1)) + gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] + labels[gt_argmax_overlaps] = 1 + + # LOG ("all_anchors anchor closest box\n%s" %all_anchors[labels==2, :]) + # LOG ("gt anchor\n%s" %gt_boxes) + # LOG ("closest box: %s"% np.where(labels==2)) + # LOG ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[labels!=-2, 0]), np.min(all_anchors[labels!=-2, 1]), np.max(all_anchors[labels!=-2, 2]), np.max(all_anchors[labels!=-2, 3]))) # subsample positive labels if there are too many num_fg = int(cfg.FLAGS.fg_rpn_fraction * cfg.FLAGS.rpn_batch_size) @@ -124,7 +105,7 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): # TODO: mild hard negative mining # subsample negative labels if there are too many num_fg = np.sum(labels == 1) - num_bg = max(min(cfg.FLAGS.rpn_batch_size - num_fg, num_fg * 3), 8) + num_bg = max(min(cfg.FLAGS.rpn_batch_size - num_fg, num_fg * 3), 2) bg_inds = np.where(labels == 0)[0] if len(bg_inds) > num_bg: disable_inds = np.random.choice(bg_inds, size=(len(bg_inds) - num_bg), replace=False) @@ -142,11 +123,10 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): # bbox_inside_weights = _unmap(bbox_inside_weights, total_anchors, inds_inside, fill=0) labels = labels.reshape((1, height, width, -1)) - indexs = indexs.reshape((1, height, width, -1)) bbox_targets = bbox_targets.reshape((1, height, width, -1)) bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) - return labels, bbox_targets, bbox_inside_weights, indexs + return labels, bbox_targets, bbox_inside_weights def decode(boxes, scores, all_anchors, ih, iw): """Decode outputs into boxes @@ -171,7 +151,6 @@ def decode(boxes, scores, all_anchors, ih, iw): scores = scores.reshape((-1, 2)) assert scores.shape[0] == boxes.shape[0] == all_anchors.shape[0], \ 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0],boxes.shape[0],all_anchors.reshape[0]) - index = np.arange(scores.shape[0]).astype(np.int32) boxes = bbox_transform_inv(all_anchors, boxes) classes = np.argmax(scores, axis=1) scores = scores[:, 1] @@ -179,7 +158,7 @@ def decode(boxes, scores, all_anchors, ih, iw): final_boxes = clip_boxes(final_boxes, (ih, iw)) classes = classes.astype(np.int32) - return final_boxes, classes, scores, index + return final_boxes, classes, scores def sample(boxes, scores, ih, iw, is_training): """ @@ -229,34 +208,76 @@ def _compute_targets(ex_rois, gt_rois): import time t = time.time() - for i in range(10): - cfg.FLAGS.fg_threshold = 0.1 - classes = np.random.randint(0, 1, (50, 1)) - boxes = np.random.randint(10, 50, (50, 2)) - s = np.random.randint(20, 50, (50, 2)) - s = boxes + s - boxes = np.concatenate((boxes, s), axis=1) - gt_boxes = np.hstack((boxes, classes)) - # gt_boxes = boxes - - N = 100 - rois = np.random.randint(10, 50, (N, 2)) - s = np.random.randint(0, 20, (N, 2)) - s = rois + s - rois = np.concatenate((rois, s), axis=1) - indexs = np.arange(N) - - all_anchors = anchors_plane(200, 300, stride = 4, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=200, width=300, stride=4, indexs=indexs) - - all_anchors = anchors_plane(100, 150, stride = 8, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=100, width=150, stride=8, indexs=indexs) - - all_anchors = anchors_plane(50, 75, stride = 16, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=50, width=75, stride=16, indexs=indexs) - - all_anchors = anchors_plane(25, 37, stride = 32, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=25, width=37, stride=32, indexs=indexs) - # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) + cfg.FLAGS.fg_threshold = 0.5 + # classes = np.ones((2,1))#random.randint(1, 1, (2, 1)) + # boxes = np.random.randint(10, 50, (2, 2)) + # s = np.random.randint(20, 50, (2, 2)) + # s = boxes + s + # boxes = np.concatenate((boxes, s), axis=1) + # gt_boxes = np.hstack((boxes, classes)) + # print(gt_boxes) + + gt_boxes = np.array([[0, 0, 5, 5],[6, 6, 8, 8]]) + print(gt_boxes) + anchors = np.array([[-10,-10, 5, 5],[6, 6, 8, 8]]) + print(anchors) + overlaps = cython_bbox.bbox_overlaps( + np.ascontiguousarray(anchors, dtype=np.float), + np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) + print(overlaps) + + # all_anchors = anchors_plane(25, 37, stride = 32, scales=[8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + # print(all_anchors) + # print(all_anchors.shape) + # all_anchors = all_anchors.reshape([-1, 4]) + + # for i in range(10): + # cfg.FLAGS.fg_threshold = 0.5 + # classes = np.random.randint(0, 1, (50, 1)) + # boxes = np.random.randint(10, 50, (50, 2)) + # s = np.random.randint(20, 50, (50, 2)) + # s = boxes + s + # boxes = np.concatenate((boxes, s), axis=1) + # gt_boxes = np.hstack((boxes, classes)) + # # gt_boxes = boxes + + # N = 100 + # rois = np.random.randint(10, 50, (N, 2)) + # s = np.random.randint(0, 20, (N, 2)) + # s = rois + s + # rois = np.concatenate((rois, s), axis=1) + + # indexs = np.arange(5*3*200*300) + # all_anchors = anchors_plane(200, 300, stride = 4, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=200, width=300, stride=4, indexs=indexs) + + # indexs = np.arange(5*3*100*150) + # all_anchors = anchors_plane(100, 150, stride = 8, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=100, width=150, stride=8, indexs=indexs) + + # indexs = np.arange(5*3*50*75) + # all_anchors = anchors_plane(50, 75, stride = 16, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=50, width=75, stride=16, indexs=indexs) + + # indexs = np.arange(5*3*25*37) + # all_anchors = anchors_plane(25, 37, stride = 32, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=25, width=37, stride=32, indexs=indexs) + # # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) - print('average time: %f' % ((time.time() - t)/10.0)) + # print('average time: %f' % ((time.time() - t)/10.0)) + +def _jitter_gt_boxes(gt_boxes, jitter=0.05): + """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs + gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int + """ + jittered_boxes = gt_boxes.copy() + ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 + hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 + width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws + height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs + jittered_boxes[:, 0] += width_offset + jittered_boxes[:, 2] += width_offset + jittered_boxes[:, 1] += height_offset + jittered_boxes[:, 3] += height_offset + + return jittered_boxes \ No newline at end of file diff --git a/libs/layers/mask.py b/libs/layers/mask.py index 109937d..d72559a 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -12,7 +12,7 @@ _DEBUG = False -def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): +def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): """Encode masks groundtruth into learnable targets Sample some exmaples @@ -63,8 +63,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index gt_height = gt_masks.shape[1] gt_width = gt_masks.shape[2] - enlarged_width = mask_width*20 - enlarged_height = mask_height*20 + enlarged_width = mask_width*5 + enlarged_height = mask_height*5 roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], :, :] @@ -87,73 +87,7 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) mask_rois = np.zeros((total_masks, 4), dtype=np.float32) - return labels, mask_targets, mask_inside_weights, mask_rois, indexs - -# def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): -# """Encode masks groundtruth into learnable targets -# Sample some exmaples - -# Params -# ------ -# gt_masks: image_height x image_width {0, 1} matrix, of shape (G, imh, imw) -# gt_boxes: ground-truth boxes of shape (G, 5), each raw is [x1, y1, x2, y2, class] -# rois: the bounding boxes of shape (N, 4), -# ## scores: scores of shape (N, 1) -# num_classes; K -# mask_height, mask_width: height and width of output masks - -# Returns -# ------- -# # rois: boxes sampled for cropping masks, of shape (M, 4) -# labels: class-ids of shape (M, 1) -# mask_targets: learning targets of shape (M, pooled_height, pooled_width, K) in {0, 1} values -# mask_inside_weights: of shape (M, pooled_height, pooled_width, K) in {0, 1}Í indicating which mask is sampled -# """ -# total_masks = rois.shape[0] -# if gt_boxes.size > 0: -# # B x G -# overlaps = cython_bbox.bbox_overlaps( -# np.ascontiguousarray(rois[:, 0:4], dtype=np.float), -# np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) -# gt_assignment = overlaps.argmax(axis=1) # shape is N -# max_overlaps = overlaps[np.arange(len(gt_assignment)), gt_assignment] # N -# # note: this will assign every rois with a positive label -# # labels = gt_boxes[gt_assignment, 4] # N -# labels = np.zeros((total_masks, ), np.int32) -# labels[:] = -1 - -# # sample positive rois which intersection is more than 0.5 -# keep_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] -# num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) -# if keep_inds.size > 0 and num_masks < keep_inds.size: -# keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) -# -# labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] - -# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) -# mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) -# rois [rois < 0] = 0 - -# # TODO: speed bottleneck? -# for i in keep_inds: -# roi = rois[i, :4] -# cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] -# cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) - -# mask_targets[i, :, :, labels[i]] = cropped -# mask_inside_weights[i, :, :, labels[i]] = 1 -# # print("in mask.py rois: ", roi) -# mask_rois = rois[:, :4] -# # print("in mask.py rois2: ") -# # print(mask_rois) -# else: -# # there is no gt -# labels = np.zeros((total_masks, ), np.int32) -# labels[:] = -1 -# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) -# mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) -# mask_rois = np.zeros((total_masks, 4), dtype=np.float32) -# return labels, mask_targets, mask_inside_weights, mask_rois, indexs + return labels, mask_targets, mask_inside_weights, mask_rois def decode(mask_targets, rois, classes, ih, iw): """Decode outputs into final masks diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 570d42c..4ea989c 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -13,7 +13,7 @@ _DEBUG = False -def encode(gt_boxes, rois, num_classes, indexs): +def encode(gt_boxes, rois, num_classes): """Matching and Encoding groundtruth boxes (gt_boxes) into learning targets to boxes Sampling Parameters @@ -35,7 +35,7 @@ def encode(gt_boxes, rois, num_classes, indexs): # R x G matrix overlaps = cython_bbox.bbox_overlaps( np.ascontiguousarray(all_rois[:, 0:4], dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) + np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) # R # max_overlaps = overlaps.max(axis=1) # R max_overlaps = overlaps[np.arange(rois.shape[0]), gt_assignment] @@ -97,7 +97,7 @@ def encode(gt_boxes, rois, num_classes, indexs): labels[ignore_inds] = -1 max_overlaps = labels - return labels, bbox_targets, bbox_inside_weights, max_overlaps.astype(np.float32), indexs + return labels, bbox_targets, bbox_inside_weights def decode(boxes, scores, rois, ih, iw): """Decode prediction targets into boxes and only keep only one boxes of greatest possibility for each rois diff --git a/libs/layers/sample.py b/libs/layers/sample.py index a92dd17..479c6d8 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -2,7 +2,6 @@ from __future__ import division from __future__ import print_function -import tensorflow as tf import numpy as np import libs.configs.config_v1 as cfg @@ -13,7 +12,7 @@ _DEBUG=False -def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False, with_nms=False): +def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, with_nms=False, random=False): """Sample boxes according to scores and some learning strategies assuming the first class is background Params: @@ -41,24 +40,26 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] - indexs = indexs[keeps] ## filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) boxes = boxes[keeps, :] scores = scores[keeps] - indexs = indexs[keeps] # scores_ = scores ## filter before nms - if len(scores) > pre_nms_top_n: - partial_order = scores.ravel() - partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] + if random is True: + keeps = np.random.choice(np.arange(boxes.shape[0]), size=pre_nms_top_n, replace=False) + boxes = boxes[keeps, :] + scores = scores[keeps] + else: + if len(scores) > pre_nms_top_n: + partial_order = scores.ravel() + partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] - boxes = boxes[partial_order, :] - scores = scores[partial_order] - indexs = indexs[partial_order] + boxes = boxes[partial_order, :] + scores = scores[partial_order] ## sort order = scores.ravel().argsort()[::-1] @@ -66,7 +67,6 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # order = order[:pre_nms_top_n] boxes = boxes[order, :] scores = scores[order] - indexs = indexs[order] # if len(scores_) > pre_nms_top_n: # scores_ = scores_[scores_.ravel().argsort()[::-1][:pre_nms_top_n]] @@ -81,18 +81,8 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F if post_nms_top_n > 0: keeps = keeps[:post_nms_top_n] - # if np.any(keeps > len(scores)): - # print ("ERROR: keep index exceeds array range: {}".format(keeps[keeps > len(scores)])) - # print (keeps.shape) - # print (boxes.shape) - # print (scores.shape) - # print (indexs.shape) - # keeps[keeps > len(scores)] = len(scores)-1 - boxes = boxes[keeps, :] scores = scores[keeps].astype(np.float32) - indexs = indexs[keeps] - batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) @@ -109,11 +99,11 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # ws = boxes[:, 2] - boxes[:, 0] # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' # print(boxes.shape) - return boxes, scores, batch_inds, indexs + return boxes, scores, batch_inds -def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): +def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, only_positive=False): """sample boxes for refined output""" - boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training=is_training, only_positive=only_positive, with_nms=True) + boxes, scores, batch_inds= sample_rpn_outputs(boxes, scores, is_training=is_training, only_positive=only_positive, with_nms=True) if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( @@ -123,9 +113,9 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] - # if True: - # gt_argmax_overlaps = overlaps.argmax(axis=0) # G - # fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) + if True: + gt_argmax_overlaps = overlaps.argmax(axis=0) # G + fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] @@ -153,11 +143,11 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training keep_inds = bg_inds mask_fg_inds = bg_inds - - return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ - boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] -def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): + return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], \ + boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds] + +def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): min_size = cfg.FLAGS.min_size mask_nms_threshold = cfg.FLAGS.mask_nms_threshold post_nms_inst_n = cfg.FLAGS.post_nms_inst_n @@ -167,7 +157,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): boxes = boxes.reshape((-1, 4)) classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) - indexs = indexs.reshape((-1, 1)) probs = probs.reshape((-1, 81)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' @@ -175,7 +164,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -183,7 +171,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -191,7 +178,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -199,7 +185,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter with nms order = scores.ravel().argsort()[::-1] scores = scores[order] - indexs = indexs[order] boxes = boxes[order, :] classes = classes[order] prob = prob[order, :] @@ -211,7 +196,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): if post_nms_inst_n > 0: keeps = keeps[:post_nms_inst_n] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -220,7 +204,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): #@TODO if len(classes) is 0: scores = np.zeros((1, 1)) - indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([0]) prob = np.zeros((1,81)) @@ -231,14 +214,12 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): boxes = boxes.reshape((-1, 4)) classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) - indexs = indexs.reshape((-1, 1)) prob = prob.reshape((-1, 81)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -246,7 +227,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -254,13 +234,11 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] __scores = [] - __indexs = [] __boxes = [] __classes = [] __prob = [] @@ -269,7 +247,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): _keeps = (classes == c).reshape(-1) _scores = scores[_keeps] - _indexs = indexs[_keeps] _boxes = boxes[_keeps, :] _classes = classes[_keeps] _prob = prob[_keeps, :] @@ -277,7 +254,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter with nms _order = _scores.ravel().argsort()[::-1] _scores = _scores[_order] - _indexs = _indexs[_order] _boxes = _boxes[_order, :] _classes = _classes[_order] _prob = _prob[_order, :] @@ -289,27 +265,24 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): if post_nms_inst_n > 0: _keeps = _keeps[:post_nms_inst_n] __scores.append(_scores[_keeps]) - __indexs.append(_indexs[_keeps]) __boxes.append(_boxes[_keeps, :]) __classes.append(_classes[_keeps]) __prob.append(_prob[_keeps, :]) scores = np.vstack(__scores) - indexs = np.vstack(__indexs) boxes = np.vstack(__boxes) classes = np.vstack(__classes).reshape(-1) prob = np.vstack(__prob) if len(classes) is 0: scores = np.zeros((1, 1)) - indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([0]).reshape(-1) prob = np.zeros((1,81)) batch_inds = np.zeros([boxes.shape[0]]) - return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) + return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32) def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 426f9df..94de298 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -7,6 +7,7 @@ from __future__ import print_function import tensorflow as tf +import gc from . import anchor from . import roi from . import mask @@ -14,194 +15,149 @@ from . import assign from libs.boxes.anchor import anchors_plane -def anchor_encoder(gt_boxes, all_anchors, height, width, stride, indexs, scope='AnchorEncoder'): - +def anchor_encoder(gt_boxes, all_anchors, height, width, stride, ih, iw, scope='AnchorEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights, indexs = \ + labels, bbox_targets, bbox_inside_weights = \ tf.py_func(anchor.encode, - [gt_boxes, all_anchors, height, width, stride, indexs], - [tf.int32, tf.float32, tf.float32, tf.int32]) + [gt_boxes, all_anchors, height, width, stride, ih, iw], + [tf.int32, tf.float32, tf.float32]) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (1, height, width, -1)) - indexs = tf.reshape(indexs, (1, height, width, -1)) bbox_targets = tf.reshape(bbox_targets, (1, height, width, -1)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (1, height, width, -1)) - - return labels, bbox_targets, bbox_inside_weights, indexs + return labels, bbox_targets, bbox_inside_weights def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): - with tf.name_scope(scope) as sc: - final_boxes, classes, scores, indexs = \ + final_boxes, classes, scores = \ tf.py_func(anchor.decode, [boxes, scores, all_anchors, ih, iw], - [tf.float32, tf.int32, tf.float32, tf.int32]) + [tf.float32, tf.int32, tf.float32]) - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') - indexs = tf.reshape(indexs, (-1, )) final_boxes = tf.reshape(final_boxes, (-1, 4)) classes = tf.reshape(classes, (-1, )) scores = tf.reshape(scores, (-1, )) - - return final_boxes, classes, scores, indexs + + return final_boxes, classes, scores -def roi_encoder(gt_boxes, rois, num_classes, indexs, scope='ROIEncoder'): - +def roi_encoder(gt_boxes, rois, num_classes, scope='ROIEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs = \ + labels, bbox_targets, bbox_inside_weights = \ tf.py_func(roi.encode, - [gt_boxes, rois, num_classes, indexs], - [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32] + [gt_boxes, rois, num_classes], + [tf.int32, tf.float32, tf.float32] ) - labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='indexs') + labels = tf.convert_to_tensor(labels, name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (-1, )) - indexs = tf.reshape(indexs, (-1, )) bbox_targets = tf.reshape(bbox_targets, (-1, num_classes * 4)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (-1, num_classes * 4)) - max_overlaps = tf.reshape(max_overlaps,(-1, )) - - return labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs + + return labels, bbox_targets, bbox_inside_weights def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): - with tf.name_scope(scope) as sc: - final_boxes, classes, scores = \ + boxes, classes, scores = \ tf.py_func(roi.decode, [boxes, scores, rois, ih, iw], [tf.float32, tf.int32, tf.float32]) - final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') + boxes = tf.convert_to_tensor(boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') - final_boxes = tf.reshape(final_boxes, (-1, 4)) - - return final_boxes, classes, scores - -# def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): - -# with tf.name_scope(scope) as sc: -# labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ -# tf.py_func(mask.encode_, -# [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], -# [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) - -# labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') -# indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') -# mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') -# mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') - -# labels = tf.reshape(labels, (-1,)) -# indexs = tf.reshape(indexs, (-1,)) -# mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) -# mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) -# mask_rois = tf.reshape(mask_rois,(-1, 4)) - -# return labels, mask_targets, mask_inside_weights, mask_rois, indexs - -def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): - + boxes = tf.reshape(boxes, (-1, 4)) + + return boxes, classes, scores + +def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): with tf.name_scope(scope) as sc: - labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ + labels, mask_targets, mask_inside_weights, mask_rois = \ tf.py_func(mask.encode, - [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], - [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) + [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width], + [tf.int32, tf.float32, tf.float32, tf.float32]) - labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') + labels = tf.convert_to_tensor(labels, name='labels') mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') mask_rois = tf.convert_to_tensor(mask_rois, name='mask_rois') labels = tf.reshape(labels, (-1,)) - indexs = tf.reshape(indexs, (-1,)) mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) mask_rois = tf.reshape(mask_rois,(-1, 4)) - - return labels, mask_targets, mask_inside_weights, mask_rois, indexs + + return labels, mask_targets, mask_inside_weights, mask_rois def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): - with tf.name_scope(scope) as sc: Mask = \ tf.py_func(mask.decode, [mask_targets, rois, classes, ih, iw,], [tf.float32]) - Mask = tf.convert_to_tensor(Mask, name='MaskImage') + Mask = tf.convert_to_tensor(Mask, name='Mask') Mask = tf.reshape(Mask, (ih, iw)) - - return Mask + + return Mask -def sample_wrapper(boxes, scores, indexs, is_training=True, only_positive=True, scope='SampleBoxes'): - +def sample_wrapper(boxes, scores, is_training=True, only_positive=True, scope='SampleBoxes'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, indexs = \ + boxes, scores, batch_inds = \ tf.py_func(sample.sample_rpn_outputs, - [boxes, scores, indexs, is_training, only_positive], - [tf.float32, tf.float32, tf.int32, tf.int32]) - boxes = tf.convert_to_tensor(boxes, name='Boxes') - scores = tf.convert_to_tensor(scores, name='Scores') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - indexs = tf.convert_to_tensor(indexs, name='Indexs') + [boxes, scores, is_training, only_positive], + [tf.float32, tf.float32, tf.int32]) + boxes = tf.convert_to_tensor(boxes, name='boxes') + scores = tf.convert_to_tensor(scores, name='scores') + batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') boxes = tf.reshape(boxes, (-1, 4)) batch_inds = tf.reshape(batch_inds, [-1]) - indexs = tf.reshape(indexs, [-1]) - - return boxes, scores, batch_inds, indexs -def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): - + return boxes, scores, batch_inds + +def sample_with_gt_wrapper(boxes, scores, gt_boxes, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs = \ + boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds = \ tf.py_func(sample.sample_rpn_outputs_wrt_gt_boxes, - [boxes, scores, gt_boxes, indexs, is_training, only_positive], - [tf.float32, tf.float32, tf.int32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) - boxes = tf.convert_to_tensor(boxes, name='Boxes') - scores = tf.convert_to_tensor(scores, name='Scores') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - indexs = tf.convert_to_tensor(indexs, name='Indexs') + [boxes, scores, gt_boxes, is_training, only_positive], + [tf.float32, tf.float32, tf.int32, tf.float32, tf.float32, tf.int32]) + boxes = tf.convert_to_tensor(boxes, name='boxes') + scores = tf.convert_to_tensor(scores, name='scores') + batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') - mask_boxes = tf.convert_to_tensor(mask_boxes, name='MaskBoxes') - mask_scores = tf.convert_to_tensor(mask_scores, name='MaskScores') - mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='MaskBatchInds') - mask_indexs = tf.convert_to_tensor(mask_indexs, name='Indexs') - - return boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs + mask_boxes = tf.convert_to_tensor(mask_boxes, name='mask_boxes') + mask_scores = tf.convert_to_tensor(mask_scores, name='mask_scores') + mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='mask_batch_inds') + + return boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): - with tf.name_scope(scope) as sc: all_anchors = \ tf.py_func(anchors_plane, [height, width, stride, scales], - [tf.float64] + [tf.float32] ) - all_anchors = tf.convert_to_tensor(tf.cast(all_anchors, tf.float32), name='AllAnchors') + all_anchors = tf.convert_to_tensor(tf.cast(all_anchors, tf.float32), name='all_anchors') all_anchors = tf.reshape(all_anchors, (height, width, -1)) - - return all_anchors -def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): + return all_anchors +def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): with tf.name_scope(scope) as sc: min_k = layers[0] max_k = layers[-1] @@ -215,25 +171,24 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): for t in tensors: split_tensors = [] for l in layers: - tf.cast(l, tf.int32) + # tf.cast(l, tf.int32) inds = tf.where(tf.equal(assigned_layers, l)) inds = tf.reshape(inds, [-1]) split_tensors.append(tf.gather(t, inds)) assigned_tensors.append(split_tensors) - return assigned_tensors + [assigned_layers] + return assigned_tensors + [assigned_layers] -def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, indexs, scope='instInference'): +def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, scope='instInference'): with tf.name_scope(scope) as sc: - inst_boxes, inst_classes, inst_prob, batch_inds, inst_indexs = \ + inst_boxes, inst_classes, inst_prob, batch_inds = \ tf.py_func(sample.sample_rcnn_outputs, - [final_boxes, classes, cls2_prob, indexs], - [tf.float32, tf.int32, tf.float32, tf.int32, tf.int32]) + [final_boxes, classes, cls2_prob], + [tf.float32, tf.int32, tf.float32, tf.int32]) - inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') - inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') - inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - inst_indexs = tf.convert_to_tensor(inst_indexs, name='inst_indexs') + inst_boxes = tf.convert_to_tensor(inst_boxes, name='inst_boxes') + inst_classes = tf.convert_to_tensor(inst_classes, name='inst_classes') + inst_prob = tf.convert_to_tensor(inst_prob, name='inst_prob') + batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') - return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] + [inst_indexs] \ No newline at end of file + return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index aafba0b..b02a1d5 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -100,8 +100,8 @@ def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): ------ dist: element-wise distance, as the same shape of x, y """ - deltas = x - y with tf.name_scope(name=name) as scope: + deltas = x - y deltas_abs = tf.abs(deltas) smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ @@ -118,7 +118,7 @@ def _get_valid_sample_fraction(labels, p=0): return frac, frac_ -def _filter_negative_samples(labels, tensors): +def _filter_negative_samples(labels, tensors, name='_filter_negative_samples'): """keeps only samples with none-negative labels Params: ----- @@ -130,14 +130,15 @@ def _filter_negative_samples(labels, tensors): tensors: filtered tensors """ # return tensors - keeps = tf.where(tf.greater_equal(labels, 0)) - keeps = tf.reshape(keeps, [-1]) + with tf.name_scope(name=name) as scope: + keeps = tf.where(tf.greater_equal(labels, 0)) + keeps = tf.reshape(keeps, [-1]) - filtered = [] - for t in tensors: - tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) - f = tf.gather(t, keeps) - filtered.append(f) + filtered = [] + for t in tensors: + tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) + f = tf.gather(t, keeps) + filtered.append(f) return filtered @@ -209,7 +210,7 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): return pyramid -def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): +def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None, bilinear=True): """Build the 3-way outputs, i.e., class, box and mask in the pyramid Algo ---- @@ -222,33 +223,73 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g 6. Build the mask layer 7. Build losses """ + #strides = [-1, -1, 8, 16, 32, 32] + pyramid = {} outputs = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + # pyramid['inputs'] = end_points['inputs'] if _BN is True: # arg_scope = _extra_conv_arg_scope_with_bn() arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): + + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, activation_fn=None, scope='C5') + + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, activation_fn=None, scope='C%d'%c) + + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, activation_fn=None, scope='C%d/fusion'%c) + + pyramid['P%d'%(c)] = s + + ### for p in pyramid + outputs['rpn'] = {} + - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - ### for p in pyramid - outputs['rpn'] = {} for i in range(5, 1, -1): p = 'P%d'%i - stride = 2 ** i - + stride = min(2*(2**i), 32)#strides[i]#2 ** i + ### rpn head shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, scope='%s/rpn'%p) box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# + anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] # print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) + # if i == 5: + # outputs['tmp_5'] = all_anchors + # elif i == 4: + # outputs['tmp_4'] = all_anchors + # elif i == 3: + # outputs['tmp_3'] = all_anchors + # elif i == 2: + # outputs['tmp_2'] = all_anchors + # outputs['tmp_1'] = width + # outputs['tmp_0'] = height + outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} ### gather all rois @@ -260,12 +301,7 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rpn_anchors = tf.concat(values=rpn_anchors, axis=0) rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - - outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] - for i in range(4, 1, -1): - p = 'P%d'%i - outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] + rpn_final_boxes, rpn_final_clses, rpn_final_scores = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) outputs['rpn_boxes'] = rpn_boxes outputs['rpn_clses'] = rpn_clses @@ -273,45 +309,38 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g outputs['rpn_final_boxes'] = rpn_final_boxes outputs['rpn_final_clses'] = rpn_final_clses outputs['rpn_final_scores'] = rpn_final_scores - outputs['rpn_indexs'] = indexs if is_training is True: ### for training, rcnn and maskrcnn take rpn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) - # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask = \ + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, is_training=is_training, only_positive=False) else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=False) + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, only_positive=False) ### assign pyramid layer indexs to rcnn network's ROIs - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn], [2, 3, 4, 5]) ### crop features from pyramid for rcnn network rcnn_cropped_features = [] rcnn_ordered_rois = [] - rcnn_ordered_index = [] for i in range(5, 1, -1): p = 'P%d'%i rcnn_splitted_roi = rcnn_assigned_rois[i-2] rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] - rcnn_index = rcnn_assigned_indexs[i-2] rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) + pooled_height=7, pooled_width=7) rcnn_cropped_features.append(rcnn_cropped_feature) rcnn_ordered_rois.append(rcnn_splitted_roi) - rcnn_ordered_index.append(rcnn_index) rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) - rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) ### rcnn head # to 7 x 7 - rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') - rcnn = slim.flatten(rcnn) + #rcnn = slim.max_pool2d(rcnn_cropped_features, [2, 2], stride=2, padding='SAME') + rcnn = slim.flatten(rcnn_cropped_features) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) @@ -326,7 +355,6 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) outputs['rcnn_ordered_rois'] = rcnn_ordered_rois - outputs['rcnn_ordered_index'] = rcnn_ordered_index outputs['rcnn_cropped_features'] = rcnn_cropped_features tf.add_to_collection('__CROPPED__', rcnn_cropped_features) outputs['rcnn_boxes'] = rcnn_boxes @@ -338,38 +366,32 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g ### assign pyramid layer indexs to mask network's ROIs if is_training: - [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) + [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask], [2, 3, 4, 5]) mask_cropped_features = [] mask_ordered_rois = [] - mask_ordered_indexs = [] ### crop features from pyramid for mask network for i in range(5, 1, -1): p = 'P%d'%i mask_splitted_roi = mask_assigned_rois[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assigned_indexs[i-2] mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) else: ### for testing, mask network takes rcnn boxes as inputs - rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ - assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores) + [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assigned_layer_inds] =\ + assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask], [2, 3, 4, 5]) mask_cropped_features = [] mask_ordered_rois = [] - mask_ordered_indexs = [] mask_ordered_clses = [] mask_ordered_scores = [] for i in range(5, 1, -1): @@ -378,18 +400,15 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g mask_splitted_cls = mask_assigned_clses[i-2] mask_splitted_score = mask_assigned_scores[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assign_indexs[i-2] mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) mask_ordered_clses.append(mask_splitted_cls) mask_ordered_scores.append(mask_splitted_score) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) @@ -406,14 +425,13 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_indexs'] = mask_ordered_indexs outputs['mask_cropped_features'] = mask_cropped_features outputs['mask_mask'] = m outputs['mask_final_mask'] = tf.nn.sigmoid(m) - return outputs + return pyramid, outputs -def build_losses(pyramid, outputs, gt_boxes, gt_masks, +def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, num_classes, base_anchors, rpn_box_lw =0.1, rpn_cls_lw = 0.1, rcnn_box_lw=1.0, rcnn_cls_lw=0.1, @@ -445,6 +463,8 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, rcnn_batch_pos = [] mask_batch_pos = [] + strides = [-1, -1, 8, 16, 32, 32] + if _BN is True: # arg_scope = _extra_conv_arg_scope_with_bn() arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) @@ -459,7 +479,7 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, ## build losses for PFN for i in range(5, 1, -1): p = 'P%d' % i - stride = 2 ** i + stride = stride = min(2*(2**i), 32)#strides[i]#2 ** i shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] @@ -471,17 +491,15 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) all_anchors = outputs['rpn'][p]['anchor'] - all_indexs = outputs['rpn'][p]['index'] rpn_boxes = outputs['rpn'][p]['box'] rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') + rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, ih, iw, scope='AnchorEncoder') - rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ + rpn_clses_target, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ tf.reshape(rpn_clses_target, [-1]), - tf.reshape(all_indexs, [-1]), tf.reshape(rpn_clses, [-1, 2]), tf.reshape(rpn_boxes, [-1, 4]), tf.reshape(rpn_boxes_target, [-1, 4]), @@ -518,18 +536,16 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # 1. encode ground truth # 2. compute distances rcnn_ordered_rois = outputs['rcnn_ordered_rois'] - rcnn_ordered_index = outputs['rcnn_ordered_index'] rcnn_boxes = outputs['rcnn_boxes'] rcnn_clses = outputs['rcnn_clses'] rcnn_scores = outputs['rcnn_scores'] - rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ - roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') + rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, scope='ROIEncoder') - rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + rcnn_clses_target, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ tf.reshape(rcnn_clses_target, [-1]), - tf.reshape(rcnn_ordered_index, [-1]), tf.reshape(rcnn_ordered_rois, [-1, 4]), tf.reshape(rcnn_clses, [-1, num_classes]), tf.reshape(rcnn_scores, [-1, num_classes]), @@ -568,19 +584,17 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, ### mask loss # mask of shape (N, h, w, num_classes) mask_ordered_rois = outputs['mask_ordered_rois'] - mask_ordered_indexs = outputs['mask_ordered_indexs'] masks = outputs['mask_mask'] - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ - mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') + mask_clses_target, mask_targets, mask_inside_weights, mask_rois = \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28,scope='MaskEncoder') - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, masks = \ _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ tf.reshape(mask_clses_target, [-1]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), tf.reshape(mask_rois, [-1, 4]), - tf.reshape(mask_ordered_indexs, [-1]), tf.reshape(masks, [-1, 28, 28, num_classes]), ]) @@ -636,13 +650,13 @@ def build(end_points, image_height, image_width, pyramid_map, gt_masks=None, loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): - pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + #pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) if is_training: - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + pyramid, outputs = \ + build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, is_training=is_training, gt_boxes=gt_boxes) - loss, losses, batch_info = build_losses(pyramid, outputs, + loss, losses, batch_info = build_losses(pyramid, image_height, image_width, outputs, gt_boxes, gt_masks, num_classes=num_classes, base_anchors=base_anchors, rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], @@ -654,22 +668,14 @@ def build(end_points, image_height, image_width, pyramid_map, outputs['batch_info'] = batch_info else: outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, is_training=is_training) ### just decode outputs into readable prediction - pred_boxes, pred_classes, pred_masks = decode_output(outputs) - outputs['pred_boxes'] = pred_boxes - outputs['pred_classes'] = pred_classes - outputs['pred_masks'] = pred_masks - - ### for debuging - outputs['tmp_0'] = pred_classes - outputs['tmp_1'] = pred_classes - outputs['tmp_2'] = pred_classes - outputs['tmp_3'] = pred_classes - outputs['tmp_4'] = pred_classes - outputs['tmp_5'] = pred_classes + # pred_boxes, pred_classes, pred_masks = decode_output(outputs) + # outputs['pred_boxes'] = pred_boxes + # outputs['pred_classes'] = pred_classes + # outputs['pred_masks'] = pred_masks # ### image and gt visualization # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) diff --git a/libs/nets/pyramid_network_.py b/libs/nets/pyramid_network_.py index bedf6ac..bd7de47 100644 --- a/libs/nets/pyramid_network_.py +++ b/libs/nets/pyramid_network_.py @@ -269,7 +269,7 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# + anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] # print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index 83e2a09..1187271 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -1,9 +1,9 @@ import numpy as np -import tensorflow as tf +import libs.configs.config_v1 as cfg from PIL import Image, ImageFont, ImageDraw, ImageEnhance from scipy.misc import imresize -FLAGS = tf.app.flags.FLAGS +FLAGS = cfg.FLAGS _DEBUG = False def draw_img(step, image, name='', image_height=1, image_width=1, rois=None): diff --git a/train/train.py b/train/train.py index 23cd1ce..764717c 100644 --- a/train/train.py +++ b/train/train.py @@ -6,10 +6,12 @@ import functools import os, sys +import psutil import time import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim +import gc from time import gmtime, strftime @@ -33,6 +35,9 @@ FLAGS = tf.app.flags.FLAGS resnet50 = resnet_v1.resnet_v1_50 +def printMemUsed(discript): + print("%s:\t%d" % (discript, psutil.virtual_memory().used)) + def solve(global_step): """add solver to losses""" # learning reate @@ -42,14 +47,14 @@ def solve(global_step): # compute and apply gradient losses = tf.get_collection(tf.GraphKeys.LOSSES) - regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) - regular_loss = tf.add_n(regular_losses) + # regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + # regular_loss = tf.add_n(regular_losses) out_loss = tf.add_n(losses) - total_loss = tf.add_n(losses + regular_losses) + total_loss = tf.add_n(losses ) #+ regular_losses tf.summary.scalar('total_loss', total_loss) tf.summary.scalar('out_loss', out_loss) - tf.summary.scalar('regular_loss', regular_loss) + # tf.summary.scalar('regular_loss', regular_loss) update_ops = [] variables_to_train = _get_variables_to_train() @@ -166,7 +171,40 @@ def restore(sess): # 'pyramid/P4/rpn/weights/Momentum:0', # 'pyramid/P4/rpn/biases/Momentum:0', # 'pyramid/P5/rpn/weights/Momentum:0', - # 'pyramid/P5/rpn/biases/Momentum:0',,] + + # 'pyramid/P2/rpn/box/weights:0', + # 'pyramid/P2/rpn/box/biases:0', + # 'pyramid/P3/rpn/box/weights:0', + # 'pyramid/P3/rpn/box/biases:0', + # 'pyramid/P4/rpn/box/weights:0', + # 'pyramid/P4/rpn/box/biases:0', + # 'pyramid/P5/rpn/box/weights:0', + # 'pyramid/P5/rpn/box/biases:0', + # 'pyramid/P2/rpn/box/weights/Momentum:0', + # 'pyramid/P2/rpn/box/biases/Momentum:0', + # 'pyramid/P3/rpn/box/weights/Momentum:0', + # 'pyramid/P3/rpn/box/biases/Momentum:0', + # 'pyramid/P4/rpn/box/weights/Momentum:0', + # 'pyramid/P4/rpn/box/biases/Momentum:0', + # 'pyramid/P5/rpn/box/weights/Momentum:0', + # 'pyramid/P5/rpn/box/biases/Momentum:0', + + # 'pyramid/P2/rpn/cls/weights:0', + # 'pyramid/P2/rpn/cls/biases:0', + # 'pyramid/P3/rpn/cls/weights:0', + # 'pyramid/P3/rpn/cls/biases:0', + # 'pyramid/P4/rpn/cls/weights:0', + # 'pyramid/P4/rpn/cls/biases:0', + # 'pyramid/P5/rpn/cls/weights:0', + # 'pyramid/P5/rpn/cls/biases:0', + # 'pyramid/P2/rpn/cls/weights/Momentum:0', + # 'pyramid/P2/rpn/cls/biases/Momentum:0', + # 'pyramid/P3/rpn/cls/weights/Momentum:0', + # 'pyramid/P3/rpn/cls/biases/Momentum:0', + # 'pyramid/P4/rpn/cls/weights/Momentum:0', + # 'pyramid/P4/rpn/cls/biases/Momentum:0', + # 'pyramid/P5/rpn/cls/weights/Momentum:0', + # 'pyramid/P5/rpn/cls/biases/Momentum:0',] # vars_to_restore = [v for v in tf.all_variables()if v.name not in not_restore] # restorer = tf.train.Saver(vars_to_restore) @@ -235,12 +273,13 @@ def train(): ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=True) - outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, + outputs = pyramid_network.build(end_points, new_img_h, new_img_w, pyramid_map, num_classes=81, - base_anchors=9,#15 + base_anchors=15,#9,# is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[0.1, 1.0, 0.1, 1.0, 1.0]) + loss_weights=[2.0, 1.0, 1.0, 1.0, 1.0]) + # loss_weights=[0.1, 1.0, 0.1, 1.0, 1.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) # loss_weights=[0.1, 0.01, 10.0, 0.1, 1.0]) @@ -248,7 +287,7 @@ def train(): total_loss = outputs['total_loss'] losses = outputs['losses'] batch_info = outputs['batch_info'] - regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) + #regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) input_image = end_points['input'] training_rcnn_rois = outputs['training_rcnn_rois'] @@ -260,16 +299,6 @@ def train(): training_mask_final_mask = outputs['training_mask_final_mask'] training_mask_final_mask_target = outputs['training_mask_final_mask_target'] - ############################# - tmp_0 = outputs['tmp_0'] - tmp_1 = outputs['tmp_1'] - tmp_2 = outputs['tmp_2'] - tmp_3 = outputs['tmp_3'] - tmp_4 = outputs['tmp_4'] - tmp_5 = outputs['tmp_5'] - ############################ - - ## solvers global_step = slim.create_global_step() update_op = solve(global_step) @@ -297,7 +326,6 @@ def train(): ## main loop coord = tf.train.Coordinator() threads = [] - # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): threads.extend(qr.create_threads(sess, coord=coord, daemon=True, start=True)) @@ -309,45 +337,42 @@ def train(): start_time = time.time() - s_, tot_loss, reg_lossnp, img_id_str, \ + s_, tot_loss, img_id_str, \ rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, \ gt_boxesnp, \ - rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch, \ - input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ - training_rcnn_roisnp, training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_rcnn_scoresnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ - sess.run([update_op, total_loss, regular_loss, img_id] + - losses + - [gt_boxes] + - batch_info + - [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + - [training_rcnn_rois] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_rcnn_scores] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) + input_imagenp, training_rcnn_roisnp, training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_rcnn_scoresnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp, \ + rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch = sess.run([update_op, total_loss, img_id] \ + + losses \ + + [gt_boxes] \ + + [input_image] + [training_rcnn_rois] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_rcnn_scores] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target] \ + + batch_info ) + # , reg_lossnp + # regular_loss, + #, regular_loss: %.6f + # reg_lossnp , + # + # , + duration_time = time.time() - start_time if step % 1 == 0: - LOG ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ + LOG ( """iter %d: image-id:%07d, time:%.3f(sec), """ """total-loss %.4f(%.4f, %.4f, %.6f, %.4f, %.4f), """ """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" - % (step, img_id_str, duration_time, reg_lossnp, + % (step, img_id_str, duration_time, tot_loss, rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch)) - # print (np.array(tmp_0np).shape) - # print (np.array(tmp_1np).shape) - LOG ("target") - LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) - # print (cat_id_to_cls_name(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1))) + # LOG ("target") + # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) - LOG ("predict") - LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) - # print (cat_id_to_cls_name(np.argmax(np.array(training_rcnn_clsesnp),axis=1))) - # print (np.max(np.array(training_rcnn_clsesnp),axis=1)) + # LOG ("predict") + # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) - # print(training_rcnn_clsesnp.shape) - # print(training_mask_clses_targetnp.shape) - if step % 50 == 0: + if step % 1 == 0: draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_est', @@ -391,7 +416,7 @@ def train(): summary_writer.add_summary(summary_str, step) summary_writer.flush() - if (step % 1000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: + if (step % 500 == 0 or step + 1 == FLAGS.max_iters) and step != 0: checkpoint_path = os.path.join(FLAGS.train_dir, FLAGS.dataset_name + '_' + FLAGS.network + '_model.ckpt') saver.save(sess, checkpoint_path, global_step=step) @@ -399,7 +424,8 @@ def train(): if coord.should_stop(): coord.request_stop() coord.join(threads) + gc.collect() if __name__ == '__main__': - train() + train() \ No newline at end of file From ec156d67f3a290af62fd09cb9af017cff550d17a Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 12 Sep 2017 10:41:45 +0900 Subject: [PATCH 30/35] commit before rollback --- libs/boxes/anchor.py | 38 +++---- libs/configs/config_v1.py | 4 +- libs/layers/anchor.py | 22 +--- libs/layers/mask.py | 6 +- libs/layers/sample.py | 8 +- libs/layers/wrapper.py | 2 +- libs/nets/nets_factory.py | 18 ++-- libs/nets/pyramid_network.py | 193 +++++++++++++++++------------------ train/test.py | 18 ++-- train/train.py | 6 +- 10 files changed, 142 insertions(+), 173 deletions(-) diff --git a/libs/boxes/anchor.py b/libs/boxes/anchor.py index f8948a3..fdf483d 100644 --- a/libs/boxes/anchor.py +++ b/libs/boxes/anchor.py @@ -27,6 +27,22 @@ def anchors_plane(height, width, stride = 1.0, all_anchors = cython_anchor.anchors_plane(height, width, stride, anc).astype(np.float32) return all_anchors +def jitter_gt_boxes(gt_boxes, jitter=0.05): + """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs + gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int + """ + jittered_boxes = gt_boxes.copy() + ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 + hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 + width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws + height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs + jittered_boxes[:, 0] += width_offset + jittered_boxes[:, 2] += width_offset + jittered_boxes[:, 1] += height_offset + jittered_boxes[:, 3] += height_offset + + return jittered_boxes + # Written by Ross Girshick and Sean Bell def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2 ** np.arange(3, 6)): @@ -76,8 +92,8 @@ def _ratio_enum(anchor, ratios): w, h, x_ctr, y_ctr = _whctrs(anchor) size = w * h size_ratios = size / ratios - ws = (np.sqrt(size_ratios)) - hs = (ws * ratios)#np.round + ws = np.round(np.sqrt(size_ratios)) + hs = np.round(ws * ratios) anchors = _mkanchors(ws, hs, x_ctr, y_ctr) return anchors @@ -106,22 +122,6 @@ def _unmap(data, count, inds, fill=0): ret[inds, :] = data return ret -def _jitter_gt_boxes(gt_boxes, jitter=0.05): - """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs - gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int - """ - jittered_boxes = gt_boxes.copy() - ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 - hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 - width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws - height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs - jittered_boxes[:, 0] += width_offset - jittered_boxes[:, 2] += width_offset - jittered_boxes[:, 1] += height_offset - jittered_boxes[:, 3] += height_offset - - return jittered_boxes - if __name__ == '__main__': import time @@ -140,7 +140,7 @@ def _jitter_gt_boxes(gt_boxes, jitter=0.05): # [ 472.08267212, 378.50143433, 814.7980957, 562.92962646], # [3.15492964, 491.46292114, 957.62628174, 630.52020264]]) - jittered_gt_boxes = _jitter_gt_boxes(gt_boxes[:, :4]) + jittered_gt_boxes = jitter_gt_boxes(gt_boxes[:, :4]) clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (ih, iw)) ancs = anchors() diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 5f30fcc..5ff377f 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -272,11 +272,11 @@ ################################## tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 200,#12000, + 'pre_nms_top_n', 12000,#12000, 'Number of rpn anchors that should be sampled before nms') tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 10, #2000 + 'post_nms_top_n', 2000, #2000 'Number of rpn anchors that should be sampled after nms') tf.app.flags.DEFINE_integer( diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index 798a8a4..ad26c7c 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -7,7 +7,7 @@ import libs.boxes.cython_bbox as cython_bbox import libs.configs.config_v1 as cfg from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes -from libs.boxes.anchor import anchors_plane +from libs.boxes.anchor import anchors_plane, jitter_gt_boxes from libs.logs.log import LOG # FLAGS = tf.app.flags.FLAGS @@ -52,7 +52,7 @@ def encode(gt_boxes, all_anchors, height, width, stride, ih, iw, ignore_cross_bo labels = np.empty((anchors.shape[0], ), dtype=np.int32) labels.fill(-1) - jittered_gt_boxes = _jitter_gt_boxes(gt_boxes[:, :4]) + jittered_gt_boxes = jitter_gt_boxes(gt_boxes[:, :4]) clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (ih, iw)) if gt_boxes.size > 0: @@ -264,20 +264,4 @@ def _compute_targets(ex_rois, gt_rois): # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=25, width=37, stride=32, indexs=indexs) # # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) - # print('average time: %f' % ((time.time() - t)/10.0)) - -def _jitter_gt_boxes(gt_boxes, jitter=0.05): - """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs - gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int - """ - jittered_boxes = gt_boxes.copy() - ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 - hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 - width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws - height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs - jittered_boxes[:, 0] += width_offset - jittered_boxes[:, 2] += width_offset - jittered_boxes[:, 1] += height_offset - jittered_boxes[:, 3] += height_offset - - return jittered_boxes \ No newline at end of file + # print('average time: %f' % ((time.time() - t)/10.0)) \ No newline at end of file diff --git a/libs/layers/mask.py b/libs/layers/mask.py index d72559a..5becd6e 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -63,8 +63,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): gt_height = gt_masks.shape[1] gt_width = gt_masks.shape[2] - enlarged_width = mask_width*5 - enlarged_height = mask_height*5 + enlarged_width = mask_width*20.0 + enlarged_height = mask_height*20.0 roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], :, :] @@ -77,8 +77,6 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): mask_targets[i, :, :, labels[i]] = cropped mask_inside_weights[i, :, :, labels[i]] = 1.0 - - mask_rois = rois[:, :4] else: # there is no gt diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 479c6d8..62db3b3 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -76,13 +76,13 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, wi if with_nms is True: det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, rpn_nms_threshold) + boxes = boxes[keeps, :] + scores = scores[keeps].astype(np.float32) ## filter after nms if post_nms_top_n > 0: - keeps = keeps[:post_nms_top_n] - - boxes = boxes[keeps, :] - scores = scores[keeps].astype(np.float32) + boxes = boxes[:post_nms_top_n, :] + scores = scores[:post_nms_top_n] batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 94de298..7737066 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -171,7 +171,7 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): for t in tensors: split_tensors = [] for l in layers: - # tf.cast(l, tf.int32) + tf.cast(l, tf.int32) inds = tf.where(tf.equal(assigned_layers, l)) inds = tf.reshape(inds, [-1]) split_tensors.append(tf.gather(t, inds)) diff --git a/libs/nets/nets_factory.py b/libs/nets/nets_factory.py index d51d30d..0cb4d32 100644 --- a/libs/nets/nets_factory.py +++ b/libs/nets/nets_factory.py @@ -13,18 +13,18 @@ slim = tf.contrib.slim pyramid_maps = { - # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - # 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - # 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - # 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', - # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - # }, 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', + 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, + # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + # 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', + # 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', + # 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', + # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + # }, 'resnet101': {'C1': '', 'C2': '', 'C3': '', 'C4': '', 'C5': '', diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index b02a1d5..32a9d6f 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -25,18 +25,18 @@ # mapping each stage to its' tensor features _networks_map = { - # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - # 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - # 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - # 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', - # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - # }, 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', + 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', + 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', + 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, + # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', + # 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', + # 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', + # 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', + # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', + # }, 'resnet101': {'C1': '', 'C2': '', 'C3': '', 'C4': '', 'C5': '', @@ -100,8 +100,8 @@ def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): ------ dist: element-wise distance, as the same shape of x, y """ + deltas = x - y with tf.name_scope(name=name) as scope: - deltas = x - y deltas_abs = tf.abs(deltas) smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ @@ -118,7 +118,7 @@ def _get_valid_sample_fraction(labels, p=0): return frac, frac_ -def _filter_negative_samples(labels, tensors, name='_filter_negative_samples'): +def _filter_negative_samples(labels, tensors): """keeps only samples with none-negative labels Params: ----- @@ -130,15 +130,14 @@ def _filter_negative_samples(labels, tensors, name='_filter_negative_samples'): tensors: filtered tensors """ # return tensors - with tf.name_scope(name=name) as scope: - keeps = tf.where(tf.greater_equal(labels, 0)) - keeps = tf.reshape(keeps, [-1]) + keeps = tf.where(tf.greater_equal(labels, 0)) + keeps = tf.reshape(keeps, [-1]) - filtered = [] - for t in tensors: - tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) - f = tf.gather(t, keeps) - filtered.append(f) + filtered = [] + for t in tensors: + tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) + f = tf.gather(t, keeps) + filtered.append(f) return filtered @@ -168,53 +167,54 @@ def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): tf.concat(values=[scores, new_scores], axis=0), \ tf.concat(values=[batch_inds, new_batch_inds], axis=0) -def build_pyramid(net_name, end_points, bilinear=True, is_training=True): - """build pyramid features from a typical network, - assume each stage is 2 time larger than its top feature - Returns: - returns several endpoints - """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): +# def build_pyramid(net_name, end_points, bilinear=True, is_training=True): +# """build pyramid features from a typical network, +# assume each stage is 2 time larger than its top feature +# Returns: +# returns several endpoints +# """ +# pyramid = {} +# if isinstance(net_name, str): +# pyramid_map = _networks_map[net_name] +# else: +# pyramid_map = net_name +# # pyramid['inputs'] = end_points['inputs'] +# if _BN is True: +# # arg_scope = _extra_conv_arg_scope_with_bn() +# arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) +# else: +# arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) +# # +# with tf.variable_scope('pyramid'): +# with slim.arg_scope(arg_scope): - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') +# pyramid['P5'] = \ +# slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] +# for c in range(4, 1, -1): +# s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) +# # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) +# up_shape = tf.shape(s_) +# # out_shape = tf.stack((up_shape[1], up_shape[2])) +# # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) +# s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) +# s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) +# s = tf.add(s, s_, name='C%d/addition'%c) +# s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) - pyramid['P%d'%(c)] = s +# pyramid['P%d'%(c)] = s - return pyramid +# return pyramid def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None, bilinear=True): """Build the 3-way outputs, i.e., class, box and mask in the pyramid Algo ---- For each layer: + 0. Build pyramid features from a typical network (assume each stage is 2 time larger than its top feature) 1. Build anchor layer 2. Process the results of anchor layer, decode the output into rois 3. Sample rois @@ -223,9 +223,9 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai 6. Build the mask layer 7. Build losses """ - #strides = [-1, -1, 8, 16, 32, 32] pyramid = {} outputs = {} + outputs['rpn'] = {} if isinstance(net_name, str): pyramid_map = _networks_map[net_name] else: @@ -240,34 +240,37 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai with tf.variable_scope('pyramid'): with slim.arg_scope(arg_scope): + """Build pyramid (P2-P5) from convolutional layer (C2-C5) from Resnet + C5 160 x ?? x 256 + C4 80 x ?? x 256 + C3 40 x ?? x 256 + C2 20 x ?? x 256 + ?? is changed according to image aspect ratio + """ pyramid['P5'] = \ slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, activation_fn=None, scope='C5') - for c in range(4, 1, -1): s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) s_ = slim.conv2d(s_, 256, [1,1], stride=1, activation_fn=None, scope='C%d'%c) - s = tf.add(s, s_, name='C%d/addition'%c) s = slim.conv2d(s, 256, [3,3], stride=1, activation_fn=None, scope='C%d/fusion'%c) pyramid['P%d'%(c)] = s - ### for p in pyramid - outputs['rpn'] = {} - - + """Build RPN head + RPN takes features from pyramid network. + strides are respectively set to [4, 8, 16, 32] for pyramid feature layer P2,P3,P4,P5 + anchor_scales are set to [2, 4, 8, 16, 32] in all pyramid layers (*This is probably inconsistent with original paper where the only scale is 8) + It generates 2 outputs. + box: an array of shape (1, pyramid_height, pyramid_width, num_anchorx4). box regression values [shift_x, shift_y, scale_width, scale_height] are stored in the last dimension of the array. + cls: an array of shape (1, pyramid_height, pyramid_width, num_anchorx2). Note that this value is before softmax + """ for i in range(5, 1, -1): p = 'P%d'%i - stride = min(2*(2**i), 32)#strides[i]#2 ** i + stride = 2**i - ### rpn head shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, scope='%s/rpn'%p) @@ -277,22 +280,10 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] # - print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - # if i == 5: - # outputs['tmp_5'] = all_anchors - # elif i == 4: - # outputs['tmp_4'] = all_anchors - # elif i == 3: - # outputs['tmp_3'] = all_anchors - # elif i == 2: - # outputs['tmp_2'] = all_anchors - # outputs['tmp_1'] = width - # outputs['tmp_0'] = height - outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - ### gather all rois + ### gather boxes, clses, anchors from all pyramid layers rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] @@ -300,8 +291,8 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai rpn_clses = tf.concat(values=rpn_clses, axis=0) rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rpn_final_boxes, rpn_final_clses, rpn_final_scores = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) ### softmax to get probability + rpn_final_boxes, rpn_final_clses, rpn_final_scores = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) ### decode anchors and box regression values into proposed bounding boxes outputs['rpn_boxes'] = rpn_boxes outputs['rpn_clses'] = rpn_clses @@ -311,18 +302,18 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai outputs['rpn_final_scores'] = rpn_final_scores if is_training is True: - ### for training, rcnn and maskrcnn take rpn boxes as inputs + ### for training, rcnn and maskrcnn take rpn proposed bounding boxes as inputs rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask = \ sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, is_training=is_training, only_positive=False) else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, only_positive=False) - ### assign pyramid layer indexs to rcnn network's ROIs + ### assign pyramid layer indexs to rcnn network's ROIs. [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_layer_inds] = \ assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn], [2, 3, 4, 5]) - ### crop features from pyramid for rcnn network + ### crop features from pyramid using ROIs. Note that this will change order of the ROIs, so ROIs are also reordered. rcnn_cropped_features = [] rcnn_ordered_rois = [] for i in range(5, 1, -1): @@ -337,9 +328,11 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) - ### rcnn head - # to 7 x 7 - #rcnn = slim.max_pool2d(rcnn_cropped_features, [2, 2], stride=2, padding='SAME') + """Build rcnn head + rcnn takes cropped features and generates 2 outputs. + rcnn_boxes: an array of shape (num_ROIs, num_classes x 4). Box regression values of each classes [shift_x, shift_y, scale_width, scale_height] are stored in the last dimension of the array. + rcnn_clses: an array of shape (num_ROIs, num_classes). Class prediction values (before softmax) are stored + """ rcnn = slim.flatten(rcnn_cropped_features) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training @@ -349,10 +342,10 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn_scores = tf.nn.softmax(rcnn_clses) + rcnn_scores = tf.nn.softmax(rcnn_clses)### softmax to get probability ### decode rcnn network final outputs - rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) ### decode ROIs and box regression values into bounding boxes outputs['rcnn_ordered_rois'] = rcnn_ordered_rois outputs['rcnn_cropped_features'] = rcnn_cropped_features @@ -364,14 +357,15 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai outputs['rcnn_final_clses'] = rcnn_final_classes outputs['rcnn_final_scores'] = rcnn_final_scores - ### assign pyramid layer indexs to mask network's ROIs + if is_training: + ### assign pyramid layer indexs to mask network's ROIs [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_layer_inds] = \ assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask], [2, 3, 4, 5]) + ### crop features from pyramid using ROIs. Again, this will change order of the ROIs, so ROIs are reordered. mask_cropped_features = [] mask_ordered_rois = [] - ### crop features from pyramid for mask network for i in range(5, 1, -1): p = 'P%d'%i mask_splitted_roi = mask_assigned_rois[i-2] @@ -383,7 +377,6 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - else: ### for testing, mask network takes rcnn boxes as inputs rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores) @@ -415,11 +408,13 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai outputs['mask_final_clses'] = mask_ordered_clses outputs['mask_final_scores'] = mask_ordered_scores - ### mask head + """Build mask rcnn head + mask rcnn takes cropped features and generates masks for each classes. + m: an array of shape (28, 28, num_classes). Note that this value is before sigmoid. + """ m = mask_cropped_features for _ in range(4): m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - # to 28 x 28 m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) tf.add_to_collection('__TRANSPOSED__', m) m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) @@ -463,8 +458,6 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, rcnn_batch_pos = [] mask_batch_pos = [] - strides = [-1, -1, 8, 16, 32, 32] - if _BN is True: # arg_scope = _extra_conv_arg_scope_with_bn() arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) @@ -479,7 +472,7 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, ## build losses for PFN for i in range(5, 1, -1): p = 'P%d' % i - stride = stride = min(2*(2**i), 32)#strides[i]#2 ** i + stride = (2 ** i)#min(2*(2**i), 32)#strides[i]#2 ** i shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] @@ -488,8 +481,6 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, ### rpn losses # 1. encode ground truth # 2. compute distances - # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) all_anchors = outputs['rpn'][p]['anchor'] rpn_boxes = outputs['rpn'][p]['box'] rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) @@ -667,7 +658,7 @@ def build(end_points, image_height, image_width, pyramid_map, outputs['total_loss'] = loss outputs['batch_info'] = batch_info else: - outputs = \ + pyramid, outputs = \ build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, is_training=is_training) diff --git a/train/test.py b/train/test.py index 6c2256e..4810d24 100644 --- a/train/test.py +++ b/train/test.py @@ -121,7 +121,7 @@ def test(): weight_decay=FLAGS.weight_decay, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=9,#15 + base_anchors=15,#15 is_training=False, gt_boxes=None, gt_masks=None, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) @@ -133,12 +133,12 @@ def test(): testing_mask_final_scores = outputs['mask_final_scores'] ############################# - tmp_0 = outputs['tmp_0'] - tmp_1 = outputs['tmp_1'] - tmp_2 = outputs['tmp_2'] - tmp_3 = outputs['tmp_3'] - tmp_4 = outputs['tmp_4'] - tmp_5 = outputs['tmp_5'] + # tmp_0 = outputs['tmp_0'] + # tmp_1 = outputs['tmp_1'] + # tmp_2 = outputs['tmp_2'] + # tmp_3 = outputs['tmp_3'] + # tmp_4 = outputs['tmp_4'] + # tmp_5 = outputs['tmp_5'] ############################ @@ -181,11 +181,11 @@ def test(): img_id_str, img_h, img_w, new_img_h, new_img_w, \ gt_boxesnp, gt_masksnp,\ - input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ + input_imagenp, \ testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ sess.run([img_id] + [ih] + [iw] + [new_ih] + [new_iw] +\ [gt_boxes] + [gt_masks] +\ - [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + \ + [input_image] + \ [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) duration_time = time.time() - start_time diff --git a/train/train.py b/train/train.py index 764717c..e1ae58e 100644 --- a/train/train.py +++ b/train/train.py @@ -278,7 +278,7 @@ def train(): base_anchors=15,#9,# is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[2.0, 1.0, 1.0, 1.0, 1.0]) + loss_weights=[2.0, 1.0, 0.0, 0.0, 0.0]) # loss_weights=[0.1, 1.0, 0.1, 1.0, 1.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) @@ -350,9 +350,6 @@ def train(): # regular_loss, #, regular_loss: %.6f # reg_lossnp , - # - # , - duration_time = time.time() - start_time if step % 1 == 0: @@ -367,7 +364,6 @@ def train(): # LOG ("target") # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) - # LOG ("predict") # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) From dca602c495989206f9411f851efdb1ea0fe9532e Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 12 Sep 2017 10:44:29 +0900 Subject: [PATCH 31/35] roll back some part to v1 --- libs/boxes/anchor.py | 109 +--- libs/configs/config_v1.py | 783 +++++++++++++++++++--------- libs/datasets/pycocotools/_mask.c | 2 +- libs/datasets/pycocotools/coco.py | 3 - libs/layers/anchor.py | 173 +++--- libs/layers/mask.py | 76 ++- libs/layers/roi.py | 8 +- libs/layers/sample.py | 349 ++++++++++++- libs/layers/wrapper.py | 181 ++++--- libs/nets/nets_factory.py | 12 +- libs/nets/pyramid_network.py | 296 +++++------ libs/nets/pyramid_network_.py | 711 ------------------------- libs/nets/pyramid_network_backup.py | 673 ------------------------ libs/nets/resnet_v1.py | 1 - libs/preprocessings/coco_v1.py | 2 +- libs/visualization/pil_utils.py | 6 +- train/test.py | 204 +++++++- train/train.py | 224 +++----- 18 files changed, 1570 insertions(+), 2243 deletions(-) delete mode 100644 libs/nets/pyramid_network_.py delete mode 100644 libs/nets/pyramid_network_backup.py diff --git a/libs/boxes/anchor.py b/libs/boxes/anchor.py index fdf483d..136a7d0 100644 --- a/libs/boxes/anchor.py +++ b/libs/boxes/anchor.py @@ -4,9 +4,6 @@ import numpy as np from libs.boxes import cython_anchor -from libs.logs.log import LOG -from libs.boxes import cython_bbox -from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes def anchors(scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16): """Get a set of anchors at one position """ @@ -24,25 +21,9 @@ def anchors_plane(height, width, stride = 1.0, # ratios = kwargs.setdefault('ratios', [0.5, 1, 2.0]) # base = kwargs.setdefault('base', 16) anc = anchors(scales, ratios, base) - all_anchors = cython_anchor.anchors_plane(height, width, stride, anc).astype(np.float32) + all_anchors = cython_anchor.anchors_plane(height, width, stride, anc) return all_anchors -def jitter_gt_boxes(gt_boxes, jitter=0.05): - """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs - gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int - """ - jittered_boxes = gt_boxes.copy() - ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 - hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 - width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws - height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs - jittered_boxes[:, 0] += width_offset - jittered_boxes[:, 2] += width_offset - jittered_boxes[:, 1] += height_offset - jittered_boxes[:, 3] += height_offset - - return jittered_boxes - # Written by Ross Girshick and Sean Bell def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2 ** np.arange(3, 6)): @@ -126,82 +107,24 @@ def _unmap(data, count, inds, fill=0): import time t = time.time() - total_anchors = 0 - + a = anchors() + num_anchors = 0 - iw = 1134 - ih = 640 - stride = 16 # all_anchors = anchors_plane(200, 250, stride=4, boarder=0) # num_anchors += all_anchors.shape[0] - # for i in range(10): - gt_boxes = np.array([ [705.20550537 ,246.37339783, 915.78503418 , 411.53240967]]) - # gt_boxes = np.array([ [476.03378296, 363.47793579, 961.50238037, 559.27886963], - # [ 472.08267212, 378.50143433, 814.7980957, 562.92962646], - # [3.15492964, 491.46292114, 957.62628174, 630.52020264]]) - - jittered_gt_boxes = jitter_gt_boxes(gt_boxes[:, :4]) - clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (ih, iw)) - - ancs = anchors() - print("\n%s" % ancs) - all_anchors = cython_anchor.anchors_plane(40, 71, stride, ancs) - total_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - print (all_anchors) + for i in range(10): + ancs = anchors() + all_anchors = cython_anchor.anchors_plane(200, 250, 4, ancs) + num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + all_anchors = cython_anchor.anchors_plane(100, 125, 8, ancs) + num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + all_anchors = cython_anchor.anchors_plane(50, 63, 16, ancs) + num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + all_anchors = cython_anchor.anchors_plane(25, 32, 32, ancs) + num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] + print('average time: %f' % ((time.time() - t) / 10)) + print('anchors: %d' % (num_anchors / 10)) + print(a.shape, '\n', a) print (all_anchors.shape) - all_anchors = all_anchors.reshape([-1, 4]) - labels = np.empty((all_anchors.shape[0], ), dtype=np.int32) - labels.fill(-1) - - overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(all_anchors, dtype=np.float), - np.ascontiguousarray(clipped_gt_boxes, dtype=np.float)) - - gt_assignment = overlaps.argmax(axis=1) # (A) - print(gt_assignment) - max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] - print(max_overlaps) - gt_argmax_overlaps = overlaps.argmax(axis=0) # G - print(gt_argmax_overlaps) - gt_max_overlaps = overlaps[gt_argmax_overlaps, - np.arange(overlaps.shape[1])] - print(gt_max_overlaps) - - # bg label: less than threshold IOU - labels[max_overlaps < 0.3] = 0 - # fg label: above threshold IOU - labels[max_overlaps >= 0.7] = 1 - - # ignore cross-boundary anchors - cb0_inds = np.where(all_anchors[:, 0] <= 0 - (all_anchors[:, 2] - all_anchors[:, 0]) * 0) - cb1_inds = np.where(all_anchors[:, 1] <= 0 - (all_anchors[:, 3] - all_anchors[:, 1]) * 0) - cb2_inds = np.where(all_anchors[:, 2] >= iw + (all_anchors[:, 2] - all_anchors[:, 0]) * 0) - cb3_inds = np.where(all_anchors[:, 3] >= ih + (all_anchors[:, 3] - all_anchors[:, 1]) * 0) - cb_inds = np.unique(np.concatenate((cb0_inds, cb1_inds, cb2_inds, cb3_inds), axis =1)) - labels[cb_inds] = -2 - #LOG ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[:, 0]), np.min(all_anchors[:, 1]), np.max(all_anchors[:, 2]), np.max(all_anchors[:, 3]))) - print ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[labels!=-2, 0]), np.min(all_anchors[labels!=-2, 1]), np.max(all_anchors[labels!=-2, 2]), np.max(all_anchors[labels!=-2, 3]))) - - labels[gt_argmax_overlaps] = 2 - - print ("above threshold: %s closest box: %s"% ((np.where(labels==1)), (np.where(labels==2)))) - print ("all_anchors anchor\n%s" %all_anchors[labels==2, :]) - print ("gt anchor\n%s" %gt_boxes) - - # all_anchors = cython_anchor.anchors_plane(20, 30, 16, ancs) - # num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - - # all_anchors = cython_anchor.anchors_plane(40, 60, 8, ancs) - # num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - - # all_anchors = cython_anchor.anchors_plane(80, 120, 4, ancs) - # num_anchors += all_anchors.shape[0] * all_anchors.shape[1] * all_anchors.shape[2] - - # print('average time: %f' % ((time.time() - t) / 10)) - # print('anchors: %d' % (num_anchors / 10)) - # print(a.shape, '\n', a) - # print (all_anchors.shape) # from IPython import embed # embed() - - diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 5ff377f..5943fe4 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -4,310 +4,613 @@ import tensorflow as tf -########################## -# restore -########################## -tf.app.flags.DEFINE_string( - 'train_dir', './output/mask_rcnn/', - 'Directory where checkpoints and event logs are written to.') +_IS_TRAINING = True -tf.app.flags.DEFINE_string( - 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', - 'Path to pretrained model') +if _IS_TRAINING is True: + ########################## + # restore + ########################## + tf.app.flags.DEFINE_string( + 'train_dir', './output/mask_rcnn/', + 'Directory where checkpoints and event logs are written to.') -########################## -# network -########################## -tf.app.flags.DEFINE_string( - 'network', 'resnet50', - 'name of backbone network') + tf.app.flags.DEFINE_string( + 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', + 'Path to pretrained model') -########################## -# dataset -########################## -tf.app.flags.DEFINE_bool( - 'update_bn', True, - 'Whether or not to update bacth normalization layer') + ########################## + # network + ########################## + tf.app.flags.DEFINE_string( + 'network', 'resnet50', + 'name of backbone network') -tf.app.flags.DEFINE_integer( - 'num_readers', 1, - 'The number of parallel readers that read data from the dataset.') + ########################## + # dataset + ########################## + tf.app.flags.DEFINE_bool( + 'update_bn', True, + 'Whether or not to update bacth normalization layer') -tf.app.flags.DEFINE_string( - 'dataset_name', 'coco', - 'The name of the dataset to load.') + tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') -tf.app.flags.DEFINE_string( - 'dataset_split_name', 'train2014', - 'The name of the train split.') + tf.app.flags.DEFINE_string( + 'dataset_name', 'coco', + 'The name of the dataset to load.') -tf.app.flags.DEFINE_string( - 'dataset_split_name_test', 'train2014',#val2014 - 'The name of the test/val split.') + tf.app.flags.DEFINE_string( + 'dataset_split_name', 'train2014', + 'The name of the train/test/val split.') -tf.app.flags.DEFINE_string( - 'dataset_dir', 'data/coco/', - 'The directory where the dataset files are stored.') + tf.app.flags.DEFINE_string( + 'dataset_dir', 'data/coco/', + 'The directory where the dataset files are stored.') -tf.app.flags.DEFINE_integer( - 'im_batch', 1, - 'number of images in a mini-batch') + tf.app.flags.DEFINE_integer( + 'im_batch', 1, + 'number of images in a mini-batch') -tf.app.flags.DEFINE_integer( - 'num_preprocessing_threads', 4, - 'The number of threads used to create the batches.') + tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') -tf.app.flags.DEFINE_integer( - 'log_every_n_steps', 10, - 'The frequency with which logs are print.') + tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') -tf.app.flags.DEFINE_integer( - 'save_summaries_secs', 60, - 'The frequency with which summaries are saved, in seconds.') + tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') -tf.app.flags.DEFINE_integer( - 'save_interval_secs', 7200, - 'The frequency with which the model is saved, in seconds.') + tf.app.flags.DEFINE_integer( + 'save_interval_secs', 7200, + 'The frequency with which the model is saved, in seconds.') -tf.app.flags.DEFINE_integer( - 'max_iters', 2500000, - 'max iterations') + tf.app.flags.DEFINE_integer( + 'max_iters', 2500000, + 'max iterations') -###################### -# Optimization Flags # -###################### + ###################### + # Optimization Flags # + ###################### -tf.app.flags.DEFINE_float( - 'weight_decay', 0.0005, 'The weight decay on the model weights.') + tf.app.flags.DEFINE_float( + 'weight_decay', 0.00005, 'The weight decay on the model weights.') -tf.app.flags.DEFINE_string( - 'optimizer', 'adam', - 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' - '"ftrl", "momentum", "sgd" or "rmsprop".') + tf.app.flags.DEFINE_string( + 'optimizer', 'momentum', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') -tf.app.flags.DEFINE_float( - 'adadelta_rho', 0.95, - 'The decay rate for adadelta.') + tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') -tf.app.flags.DEFINE_float( - 'adagrad_initial_accumulator_value', 0.1, - 'Starting value for the AdaGrad accumulators.') + tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') -tf.app.flags.DEFINE_float( - 'adam_beta1', 0.9, - 'The exponential decay rate for the 1st moment estimates.') + tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') -tf.app.flags.DEFINE_float( - 'adam_beta2', 0.999, - 'The exponential decay rate for the 2nd moment estimates.') + tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') -tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') + tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') -tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, - 'The learning rate power.') + tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') -tf.app.flags.DEFINE_float( - 'ftrl_initial_accumulator_value', 0.1, - 'Starting value for the FTRL accumulators.') + tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') -tf.app.flags.DEFINE_float( - 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') + tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') -tf.app.flags.DEFINE_float( - 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') + tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') -tf.app.flags.DEFINE_float( - 'momentum', 0.9, - 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') + tf.app.flags.DEFINE_float( + 'momentum', 0.99, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') -tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') + tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') -tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') + tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') -####################### -# Learning Rate Flags # -####################### + ####################### + # Learning Rate Flags # + ####################### -tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', - 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' - ' or "polynomial"') + tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', 'exponential', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.001, - 'Initial learning rate.') + tf.app.flags.DEFINE_float('learning_rate', 0.0002, + 'Initial learning rate.') -tf.app.flags.DEFINE_float( - 'end_learning_rate', 0.00001, - 'The minimal end learning rate used by a polynomial decay learning rate.') + tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.00001, + 'The minimal end learning rate used by a polynomial decay learning rate.') -tf.app.flags.DEFINE_float( - 'label_smoothing', 0.0, 'The amount of label smoothing.') + tf.app.flags.DEFINE_float( + 'label_smoothing', 0.0, 'The amount of label smoothing.') -tf.app.flags.DEFINE_float( - 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') + tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') -tf.app.flags.DEFINE_float( - 'num_epochs_per_decay', 2.0, - 'Number of epochs after which learning rate decays.') + tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays.') -tf.app.flags.DEFINE_bool( - 'sync_replicas', False, - 'Whether or not to synchronize the replicas during training.') + tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') -tf.app.flags.DEFINE_integer( - 'replicas_to_aggregate', 1, - 'The Number of gradients to collect before updating params.') + tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') -tf.app.flags.DEFINE_float( - 'moving_average_decay', None, - 'The decay to use for the moving average.' - 'If left as None, then moving averages are not used.') + tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') -####################### -# Dataset Flags # -####################### + ####################### + # Dataset Flags # + ####################### -tf.app.flags.DEFINE_string( - 'model_name', 'resnet50', - 'The name of the architecture to train.') + tf.app.flags.DEFINE_string( + 'model_name', 'resnet50', + 'The name of the architecture to train.') -tf.app.flags.DEFINE_string( - 'preprocessing_name', 'coco', - 'The name of the preprocessing to use. If left ' - 'as `None`, then the model_name flag is used.') + tf.app.flags.DEFINE_string( + 'preprocessing_name', 'coco', + 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') -tf.app.flags.DEFINE_integer( - 'batch_size', 1, - 'The number of samples in each batch.') + tf.app.flags.DEFINE_integer( + 'batch_size', 1, + 'The number of samples in each batch.') -tf.app.flags.DEFINE_integer( - 'train_image_size', None, 'Train image size') + tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') -tf.app.flags.DEFINE_integer('max_number_of_steps', None, - 'The maximum number of training steps.') + tf.app.flags.DEFINE_integer('max_number_of_steps', None, + 'The maximum number of training steps.') -tf.app.flags.DEFINE_string( - 'classes', None, - 'The classes to classify.') + tf.app.flags.DEFINE_string( + 'classes', None, + 'The classes to classify.') -tf.app.flags.DEFINE_integer( - 'image_min_size', 640, - 'resize image so that the min edge equals to image_min_size') + tf.app.flags.DEFINE_integer( + 'image_min_size', 640, + 'resize image so that the min edge equals to image_min_size') -##################### -# Fine-Tuning Flags # -##################### + ##################### + # Fine-Tuning Flags # + ##################### -tf.app.flags.DEFINE_string( - 'checkpoint_path', None, - 'The path to a checkpoint from which to fine-tune.') + tf.app.flags.DEFINE_string( + 'checkpoint_path', None, + 'The path to a checkpoint from which to fine-tune.') -tf.app.flags.DEFINE_string( - 'checkpoint_exclude_scopes', None, - 'Comma-separated list of scopes of variables to exclude when restoring ' - 'from a checkpoint.') + tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') -tf.app.flags.DEFINE_string( - 'checkpoint_include_scopes', None, - 'Comma-separated list of scopes of variables to include when restoring ' - 'from a checkpoint.') + tf.app.flags.DEFINE_string( + 'checkpoint_include_scopes', None, + 'Comma-separated list of scopes of variables to include when restoring ' + 'from a checkpoint.') -tf.app.flags.DEFINE_string( - 'trainable_scopes', None, - 'Comma-separated list of scopes to filter the set of variables to train.' - 'By default, None would train all the variables.') + tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') -tf.app.flags.DEFINE_boolean( - 'ignore_missing_vars', False, - 'When restoring a checkpoint would ignore missing variables.') + tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') -tf.app.flags.DEFINE_boolean( - 'restore_previous_if_exists', True, - 'When restoring a checkpoint would ignore missing variables.') + tf.app.flags.DEFINE_boolean( + 'restore_previous_if_exists', True, + 'When restoring a checkpoint would ignore missing variables.') + + ####################### + # BOX Flags # + ####################### + + tf.app.flags.DEFINE_float( + 'rpn_fg_threshold', 0.7, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'fg_threshold', 0.5, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be bg') + + tf.app.flags.DEFINE_integer( + 'rois_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_roi_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_rpn_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'rpn_batch_size', 512, + 'Number of rpn anchors that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'allow_border', 10, + 'How many pixels out of an image') + + ################################## + # NMS # + ################################## + + tf.app.flags.DEFINE_integer( + 'pre_nms_top_n', 12000, + 'Number of rpn anchors that should be sampled before nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_top_n', 2000, + 'Number of rpn anchors that should be sampled after nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 300, + "Number of inst after NMS") + + tf.app.flags.DEFINE_float( + 'rpn_nms_threshold', 0.7, + 'NMS threshold in RPN') + + tf.app.flags.DEFINE_float( + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') + + ################################## + # Mask # + ################################## + + tf.app.flags.DEFINE_boolean( + 'mask_allow_bg', True, + 'Allow to add bg masks in the masking stage') + + tf.app.flags.DEFINE_float( + 'mask_threshold', 0.50, + 'Least intersection of a positive mask') + tf.app.flags.DEFINE_integer( + 'masks_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'min_size', 2, + 'minimum size of an object') + + FLAGS = tf.app.flags.FLAGS +else: + ########################## + # restore + ########################## + tf.app.flags.DEFINE_string( + 'train_dir', './output/mask_rcnn/', + 'Directory where checkpoints and event logs are written to.') + + tf.app.flags.DEFINE_string( + 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', + 'Path to pretrained model') + + ########################## + # network + ########################## + tf.app.flags.DEFINE_string( + 'network', 'resnet50', + 'name of backbone network') -####################### -# BOX Flags # -####################### + ########################## + # dataset + ########################## + tf.app.flags.DEFINE_bool( + 'update_bn', False, + 'Whether or not to update bacth normalization layer') + + tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') -tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') + tf.app.flags.DEFINE_string( + 'dataset_name', 'coco', + 'The name of the dataset to load.') -tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be fg') + tf.app.flags.DEFINE_string( + 'dataset_split_name', 'val2014', + 'The name of the train/test/val split.') -tf.app.flags.DEFINE_float( - 'fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') + tf.app.flags.DEFINE_string( + 'dataset_dir', 'data/coco/', + 'The directory where the dataset files are stored.') -tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be bg') + tf.app.flags.DEFINE_integer( + 'im_batch', 1, + 'number of images in a mini-batch') -tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, - 'Number of rois that should be sampled to train this network') -tf.app.flags.DEFINE_float( - 'fg_roi_fraction', 0.25, - 'Number of rois that should be sampled to train this network') + tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') -tf.app.flags.DEFINE_float( - 'fg_rpn_fraction', 0.25, - 'Number of rois that should be sampled to train this network') + tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') -tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 128, - 'Number of rpn anchors that should be sampled to train this network') + tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') -tf.app.flags.DEFINE_integer( - 'allow_border', 0.0, - 'Percentage of bounding box height and length that are allowed to be out of an image boundary') + tf.app.flags.DEFINE_integer( + 'save_interval_secs', 7200, + 'The frequency with which the model is saved, in seconds.') -################################## -# NMS # -################################## - -tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000,#12000, - 'Number of rpn anchors that should be sampled before nms') - -tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, #2000 - 'Number of rpn anchors that should be sampled after nms') - -tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 300, - "Number of inst after NMS") - -tf.app.flags.DEFINE_float( - 'rpn_nms_threshold', 0.7, - 'NMS threshold in RPN') - -tf.app.flags.DEFINE_float( - 'mask_nms_threshold', 0.3, - 'NMS threshold in mask network during testing') - -################################## -# Mask # -################################## - -tf.app.flags.DEFINE_boolean( - 'mask_allow_bg', True, - 'Allow to add bg masks in the masking stage') - -tf.app.flags.DEFINE_float( - 'mask_threshold', 0.50, - 'Least intersection of a positive mask') -tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, - 'Number of rois that should be sampled to train this network') - -tf.app.flags.DEFINE_float( - 'min_size', 2, - 'minimum size of an object') - -FLAGS = tf.app.flags.FLAGS \ No newline at end of file + tf.app.flags.DEFINE_integer( + 'max_iters', 2500, + 'max iterations') + + ###################### + # Optimization Flags # + ###################### + + tf.app.flags.DEFINE_float( + 'weight_decay', 0.00005, 'The weight decay on the model weights.') + + tf.app.flags.DEFINE_string( + 'optimizer', 'momentum', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') + + tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') + + tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') + + tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') + + tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') + + tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') + + tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') + + tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') + + tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') + + tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') + + tf.app.flags.DEFINE_float( + 'momentum', 0.99, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') + + tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') + + tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') + + ####################### + # Learning Rate Flags # + ####################### + + tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', 'exponential', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') + + tf.app.flags.DEFINE_float('learning_rate', 0.0000, + 'Initial learning rate.') + + tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.00000, + 'The minimal end learning rate used by a polynomial decay learning rate.') + + tf.app.flags.DEFINE_float( + 'label_smoothing', 0.0, 'The amount of label smoothing.') + + tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') + + tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays.') + + tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') + + tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') + + tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') + + ####################### + # Dataset Flags # + ####################### + + + tf.app.flags.DEFINE_string( + 'model_name', 'resnet50', + 'The name of the architecture to train.') + + tf.app.flags.DEFINE_string( + 'preprocessing_name', 'coco', + 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') + + tf.app.flags.DEFINE_integer( + 'batch_size', 1, + 'The number of samples in each batch.') + + tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') + + tf.app.flags.DEFINE_integer('max_number_of_steps', None, + 'The maximum number of training steps.') + + tf.app.flags.DEFINE_string( + 'classes', None, + 'The classes to classify.') + + tf.app.flags.DEFINE_integer( + 'image_min_size', 640, + 'resize image so that the min edge equals to image_min_size') + + ##################### + # Fine-Tuning Flags # + ##################### + + tf.app.flags.DEFINE_string( + 'checkpoint_path', None, + 'The path to a checkpoint from which to fine-tune.') + + tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') + + tf.app.flags.DEFINE_string( + 'checkpoint_include_scopes', None, + 'Comma-separated list of scopes of variables to include when restoring ' + 'from a checkpoint.') + + tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') + + tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') + + tf.app.flags.DEFINE_boolean( + 'restore_previous_if_exists', True, + 'When restoring a checkpoint would ignore missing variables.') + + ####################### + # BOX Flags # + ####################### + + tf.app.flags.DEFINE_float( + 'rpn_fg_threshold', 0.7, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'fg_threshold', 0.5, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') + + tf.app.flags.DEFINE_float( + 'bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be bg') + + tf.app.flags.DEFINE_integer( + 'rois_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_roi_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'fg_rpn_fraction', 0.25, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'rpn_batch_size', 512, + 'Number of rpn anchors that should be sampled to train this network') + + tf.app.flags.DEFINE_integer( + 'allow_border', 10, + 'How many pixels out of an image') + + ################################## + # NMS # + ################################## + + tf.app.flags.DEFINE_integer( + 'pre_nms_top_n', 12000, + 'Number of rpn anchors that should be sampled before nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_top_n', 2000, + 'Number of rpn anchors that should be sampled after nms') + + tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 300, + "Number of inst after NMS") + + tf.app.flags.DEFINE_float( + 'rpn_nms_threshold', 0.7, + 'NMS threshold in RPN') + + tf.app.flags.DEFINE_float( + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') + + ################################## + # Mask # + ################################## + + tf.app.flags.DEFINE_boolean( + 'mask_allow_bg', True, + 'Allow to add bg masks in the masking stage') + + tf.app.flags.DEFINE_float( + 'mask_threshold', 0.50, + 'Least intersection of a positive mask') + tf.app.flags.DEFINE_integer( + 'masks_per_image', 512, + 'Number of rois that should be sampled to train this network') + + tf.app.flags.DEFINE_float( + 'min_size', 2, + 'minimum size of an object') + + FLAGS = tf.app.flags.FLAGS \ No newline at end of file diff --git a/libs/datasets/pycocotools/_mask.c b/libs/datasets/pycocotools/_mask.c index e1fc5f9..c210d6f 100644 --- a/libs/datasets/pycocotools/_mask.c +++ b/libs/datasets/pycocotools/_mask.c @@ -1432,7 +1432,7 @@ static char __pyx_k_input_data_type_not_allowed[] = "input data type not allowed static char __pyx_k_input_type_is_not_supported[] = "input type is not supported."; static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; static char __pyx_k_Python_version_must_be_2_or_3[] = "Python version must be 2 or 3"; -static char __pyx_k_home_rojana_workspace_FastMaskR[] = "/home/rojana/workspace/FastMaskRCNN/libs/datasets/pycocotools/_mask.pyx"; +static char __pyx_k_home_rojana_workspace_FastMaskR[] = "/home/rojana/workspace/FastMaskRCNN_scratch/libs/datasets/pycocotools/_mask.pyx"; static char __pyx_k_libs_datasets_pycocotools__mask[] = "libs.datasets.pycocotools._mask"; static char __pyx_k_numpy_ndarray_input_is_only_for[] = "numpy ndarray input is only for *bounding boxes* and should have Nx4 dimension"; static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; diff --git a/libs/datasets/pycocotools/coco.py b/libs/datasets/pycocotools/coco.py index 7519138..d48bf27 100644 --- a/libs/datasets/pycocotools/coco.py +++ b/libs/datasets/pycocotools/coco.py @@ -308,9 +308,6 @@ def loadRes(self, resFile): anns = resFile assert type(anns) == list, 'results in not an array of objects' annsImgIds = [ann['image_id'] for ann in anns] - print(annsImgIds[0:10]) - print("$$$$$$$$$$$$$$$$$$") - print(self.getImgIds()[0:10]) assert set(annsImgIds) == (set(annsImgIds) & set(self.getImgIds())), \ 'Results do not correspond to current coco set' if 'caption' in anns[0]: diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index ad26c7c..876609f 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -7,13 +7,13 @@ import libs.boxes.cython_bbox as cython_bbox import libs.configs.config_v1 as cfg from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes -from libs.boxes.anchor import anchors_plane, jitter_gt_boxes +from libs.boxes.anchor import anchors_plane from libs.logs.log import LOG # FLAGS = tf.app.flags.FLAGS _DEBUG = False -def encode(gt_boxes, all_anchors, height, width, stride, ih, iw, ignore_cross_boundary=True): +def encode(gt_boxes, all_anchors, height, width, stride, indexs): """Matching and Encoding groundtruth into learning targets Sampling @@ -52,45 +52,64 @@ def encode(gt_boxes, all_anchors, height, width, stride, ih, iw, ignore_cross_bo labels = np.empty((anchors.shape[0], ), dtype=np.int32) labels.fill(-1) - jittered_gt_boxes = jitter_gt_boxes(gt_boxes[:, :4]) - clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (ih, iw)) - if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( np.ascontiguousarray(anchors, dtype=np.float), - np.ascontiguousarray(clipped_gt_boxes, dtype=np.float)) + np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) + + # if _DEBUG: + # print ('gt_boxes shape: ', gt_boxes.shape) + # print ('anchors shape: ', anchors.shape) + # print ('overlaps shape: ', overlaps.shape) - gt_assignment = overlaps.argmax(axis=1) # (A) + + gt_assignment = overlaps.argmax(axis=1) # (A) max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] gt_argmax_overlaps = overlaps.argmax(axis=0) # G gt_max_overlaps = overlaps[gt_argmax_overlaps, np.arange(overlaps.shape[1])] - + labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 - # bg label: less than threshold IOU - labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 - # fg label: above threshold IOU - labels[max_overlaps >= cfg.FLAGS.rpn_fg_threshold] = 1 - # LOG ("all_anchors anchor above threshold\n%s" %all_anchors[labels==1, :]) - - # ignore cross-boundary anchors - if ignore_cross_boundary is True: - cb0_inds = np.where(all_anchors[:, 0] <= 0 - (all_anchors[:, 2] - all_anchors[:, 0]) * cfg.FLAGS.allow_border) - cb1_inds = np.where(all_anchors[:, 1] <= 0 - (all_anchors[:, 3] - all_anchors[:, 1]) * cfg.FLAGS.allow_border) - cb2_inds = np.where(all_anchors[:, 2] >= iw + (all_anchors[:, 2] - all_anchors[:, 0]) * cfg.FLAGS.allow_border) - cb3_inds = np.where(all_anchors[:, 3] >= ih + (all_anchors[:, 3] - all_anchors[:, 1]) * cfg.FLAGS.allow_border) - cb_inds = np.unique(np.concatenate((cb0_inds, cb1_inds, cb2_inds, cb3_inds), axis =1)) - labels[cb_inds] = -1 - #LOG ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[:, 0]), np.min(all_anchors[:, 1]), np.max(all_anchors[:, 2]), np.max(all_anchors[:, 3]))) - # LOG ("above threshold: %s"% np.where(labels==1)) - gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] - labels[gt_argmax_overlaps] = 1 + if _DEBUG: + print ('gt_assignment shape: ', gt_assignment.shape) + print ('max_overlaps shape: ', max_overlaps.shape) + print ('gt_argmax_overlaps shape: ', gt_argmax_overlaps.shape) + print ('gt_max_overlaps shape: ', gt_max_overlaps.shape) - # LOG ("all_anchors anchor closest box\n%s" %all_anchors[labels==2, :]) - # LOG ("gt anchor\n%s" %gt_boxes) - # LOG ("closest box: %s"% np.where(labels==2)) - # LOG ("stride: %d total anchor: %d\tremained anchor: %d\t ih:%d iw:%d min size %d %d \t max size %d %d" % (stride, total_anchors, total_anchors-len(cb_inds), ih, iw, np.min(all_anchors[labels!=-2, 0]), np.min(all_anchors[labels!=-2, 1]), np.max(all_anchors[labels!=-2, 2]), np.max(all_anchors[labels!=-2, 3]))) + if True: + # this is sentive to boxes of little overlaps, no need! + # gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] + + # fg label: for each gt, hard-assign anchor with highest overlap despite its overlaps + labels[gt_argmax_overlaps] = 1 + + # exclude examples with little overlaps + # added later + # excludes = np.where(gt_max_overlaps < cfg.FLAGS.bg_threshold)[0] + # labels[gt_argmax_overlaps[excludes]] = -1 + + # if _DEBUG: + # min_ov = np.min(gt_max_overlaps) + # max_ov = np.max(gt_max_overlaps) + # mean_ov = np.mean(gt_max_overlaps) + # if min_ov < cfg.FLAGS.bg_threshold: + # LOG('ANCHOREncoder: overlaps: (min %.3f mean:%.3f max:%.3f), stride: %d, shape:(h:%d, w:%d)' + # % (min_ov, mean_ov, max_ov, stride, height, width)) + # worst = gt_boxes[np.argmin(gt_max_overlaps)] + # anc = anchors[gt_argmax_overlaps[np.argmin(gt_max_overlaps)], :] + # LOG('ANCHOREncoder: worst case: overlap: %.3f, box:(%.1f, %.1f, %.1f, %.1f %d), anchor:(%.1f, %.1f, %.1f, %.1f)' + # % (min_ov, worst[0], worst[1], worst[2], worst[3], worst[4], + # anc[0], anc[1], anc[2], anc[3])) + + + # fg label: above threshold IOU + labels[max_overlaps >= cfg.FLAGS.rpn_fg_threshold] = 1 + + if _DEBUG: + print('highest cover :', gt_max_overlaps.shape) + print('more than 0.7 :', len(max_overlaps >= cfg.FLAGS.rpn_fg_threshold)) + print('labels is 1 :', len(labels == 1)) # subsample positive labels if there are too many num_fg = int(cfg.FLAGS.fg_rpn_fraction * cfg.FLAGS.rpn_batch_size) @@ -105,7 +124,7 @@ def encode(gt_boxes, all_anchors, height, width, stride, ih, iw, ignore_cross_bo # TODO: mild hard negative mining # subsample negative labels if there are too many num_fg = np.sum(labels == 1) - num_bg = max(min(cfg.FLAGS.rpn_batch_size - num_fg, num_fg * 3), 2) + num_bg = max(min(cfg.FLAGS.rpn_batch_size - num_fg, num_fg * 3), 8) bg_inds = np.where(labels == 0)[0] if len(bg_inds) > num_bg: disable_inds = np.random.choice(bg_inds, size=(len(bg_inds) - num_bg), replace=False) @@ -123,10 +142,11 @@ def encode(gt_boxes, all_anchors, height, width, stride, ih, iw, ignore_cross_bo # bbox_inside_weights = _unmap(bbox_inside_weights, total_anchors, inds_inside, fill=0) labels = labels.reshape((1, height, width, -1)) + indexs = indexs.reshape((1, height, width, -1)) bbox_targets = bbox_targets.reshape((1, height, width, -1)) bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) - return labels, bbox_targets, bbox_inside_weights + return labels, bbox_targets, bbox_inside_weights, indexs def decode(boxes, scores, all_anchors, ih, iw): """Decode outputs into boxes @@ -151,6 +171,7 @@ def decode(boxes, scores, all_anchors, ih, iw): scores = scores.reshape((-1, 2)) assert scores.shape[0] == boxes.shape[0] == all_anchors.shape[0], \ 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0],boxes.shape[0],all_anchors.reshape[0]) + index = np.arange(scores.shape[0]).astype(np.int32) boxes = bbox_transform_inv(all_anchors, boxes) classes = np.argmax(scores, axis=1) scores = scores[:, 1] @@ -158,7 +179,7 @@ def decode(boxes, scores, all_anchors, ih, iw): final_boxes = clip_boxes(final_boxes, (ih, iw)) classes = classes.astype(np.int32) - return final_boxes, classes, scores + return final_boxes, classes, scores, index def sample(boxes, scores, ih, iw, is_training): """ @@ -208,60 +229,34 @@ def _compute_targets(ex_rois, gt_rois): import time t = time.time() - cfg.FLAGS.fg_threshold = 0.5 - # classes = np.ones((2,1))#random.randint(1, 1, (2, 1)) - # boxes = np.random.randint(10, 50, (2, 2)) - # s = np.random.randint(20, 50, (2, 2)) - # s = boxes + s - # boxes = np.concatenate((boxes, s), axis=1) - # gt_boxes = np.hstack((boxes, classes)) - # print(gt_boxes) - - gt_boxes = np.array([[0, 0, 5, 5],[6, 6, 8, 8]]) - print(gt_boxes) - anchors = np.array([[-10,-10, 5, 5],[6, 6, 8, 8]]) - print(anchors) - overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(anchors, dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) - print(overlaps) - - # all_anchors = anchors_plane(25, 37, stride = 32, scales=[8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - # print(all_anchors) - # print(all_anchors.shape) - # all_anchors = all_anchors.reshape([-1, 4]) - - # for i in range(10): - # cfg.FLAGS.fg_threshold = 0.5 - # classes = np.random.randint(0, 1, (50, 1)) - # boxes = np.random.randint(10, 50, (50, 2)) - # s = np.random.randint(20, 50, (50, 2)) - # s = boxes + s - # boxes = np.concatenate((boxes, s), axis=1) - # gt_boxes = np.hstack((boxes, classes)) - # # gt_boxes = boxes - - # N = 100 - # rois = np.random.randint(10, 50, (N, 2)) - # s = np.random.randint(0, 20, (N, 2)) - # s = rois + s - # rois = np.concatenate((rois, s), axis=1) - - # indexs = np.arange(5*3*200*300) - # all_anchors = anchors_plane(200, 300, stride = 4, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=200, width=300, stride=4, indexs=indexs) - - # indexs = np.arange(5*3*100*150) - # all_anchors = anchors_plane(100, 150, stride = 8, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=100, width=150, stride=8, indexs=indexs) - - # indexs = np.arange(5*3*50*75) - # all_anchors = anchors_plane(50, 75, stride = 16, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=50, width=75, stride=16, indexs=indexs) - - # indexs = np.arange(5*3*25*37) - # all_anchors = anchors_plane(25, 37, stride = 32, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) - # labels, bbox_targets, bbox_inside_weights, indexs = encode(gt_boxes, all_anchors=all_anchors, height=25, width=37, stride=32, indexs=indexs) - # # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) + for i in range(10): + cfg.FLAGS.fg_threshold = 0.1 + classes = np.random.randint(0, 1, (50, 1)) + boxes = np.random.randint(10, 50, (50, 2)) + s = np.random.randint(20, 50, (50, 2)) + s = boxes + s + boxes = np.concatenate((boxes, s), axis=1) + gt_boxes = np.hstack((boxes, classes)) + # gt_boxes = boxes + + N = 100 + rois = np.random.randint(10, 50, (N, 2)) + s = np.random.randint(0, 20, (N, 2)) + s = rois + s + rois = np.concatenate((rois, s), axis=1) + indexs = np.arange(N) + + all_anchors = anchors_plane(200, 300, stride = 4, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=200, width=300, stride=4, indexs=indexs) + + all_anchors = anchors_plane(100, 150, stride = 8, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=100, width=150, stride=8, indexs=indexs) + + all_anchors = anchors_plane(50, 75, stride = 16, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=50, width=75, stride=16, indexs=indexs) + + all_anchors = anchors_plane(25, 37, stride = 32, scales=[2, 4, 8, 16, 32], ratios=[0.5, 1, 2.0], base=16) + labels, bbox_targets, bbox_inside_weights = encode(gt_boxes, all_anchors=all_anchors, height=25, width=37, stride=32, indexs=indexs) + # anchors, _, _ = anchors_plane(200, 300, stride=4, boarder=0) - # print('average time: %f' % ((time.time() - t)/10.0)) \ No newline at end of file + print('average time: %f' % ((time.time() - t)/10.0)) diff --git a/libs/layers/mask.py b/libs/layers/mask.py index 5becd6e..109937d 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -12,7 +12,7 @@ _DEBUG = False -def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): +def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): """Encode masks groundtruth into learnable targets Sample some exmaples @@ -63,8 +63,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): gt_height = gt_masks.shape[1] gt_width = gt_masks.shape[2] - enlarged_width = mask_width*20.0 - enlarged_height = mask_height*20.0 + enlarged_width = mask_width*20 + enlarged_height = mask_height*20 roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], :, :] @@ -77,6 +77,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): mask_targets[i, :, :, labels[i]] = cropped mask_inside_weights[i, :, :, labels[i]] = 1.0 + + mask_rois = rois[:, :4] else: # there is no gt @@ -85,7 +87,73 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) mask_rois = np.zeros((total_masks, 4), dtype=np.float32) - return labels, mask_targets, mask_inside_weights, mask_rois + return labels, mask_targets, mask_inside_weights, mask_rois, indexs + +# def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): +# """Encode masks groundtruth into learnable targets +# Sample some exmaples + +# Params +# ------ +# gt_masks: image_height x image_width {0, 1} matrix, of shape (G, imh, imw) +# gt_boxes: ground-truth boxes of shape (G, 5), each raw is [x1, y1, x2, y2, class] +# rois: the bounding boxes of shape (N, 4), +# ## scores: scores of shape (N, 1) +# num_classes; K +# mask_height, mask_width: height and width of output masks + +# Returns +# ------- +# # rois: boxes sampled for cropping masks, of shape (M, 4) +# labels: class-ids of shape (M, 1) +# mask_targets: learning targets of shape (M, pooled_height, pooled_width, K) in {0, 1} values +# mask_inside_weights: of shape (M, pooled_height, pooled_width, K) in {0, 1}Í indicating which mask is sampled +# """ +# total_masks = rois.shape[0] +# if gt_boxes.size > 0: +# # B x G +# overlaps = cython_bbox.bbox_overlaps( +# np.ascontiguousarray(rois[:, 0:4], dtype=np.float), +# np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) +# gt_assignment = overlaps.argmax(axis=1) # shape is N +# max_overlaps = overlaps[np.arange(len(gt_assignment)), gt_assignment] # N +# # note: this will assign every rois with a positive label +# # labels = gt_boxes[gt_assignment, 4] # N +# labels = np.zeros((total_masks, ), np.int32) +# labels[:] = -1 + +# # sample positive rois which intersection is more than 0.5 +# keep_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] +# num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) +# if keep_inds.size > 0 and num_masks < keep_inds.size: +# keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) +# +# labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] + +# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) +# mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) +# rois [rois < 0] = 0 + +# # TODO: speed bottleneck? +# for i in keep_inds: +# roi = rois[i, :4] +# cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] +# cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) + +# mask_targets[i, :, :, labels[i]] = cropped +# mask_inside_weights[i, :, :, labels[i]] = 1 +# # print("in mask.py rois: ", roi) +# mask_rois = rois[:, :4] +# # print("in mask.py rois2: ") +# # print(mask_rois) +# else: +# # there is no gt +# labels = np.zeros((total_masks, ), np.int32) +# labels[:] = -1 +# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) +# mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) +# mask_rois = np.zeros((total_masks, 4), dtype=np.float32) +# return labels, mask_targets, mask_inside_weights, mask_rois, indexs def decode(mask_targets, rois, classes, ih, iw): """Decode outputs into final masks diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 4ea989c..a2a3286 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -13,7 +13,7 @@ _DEBUG = False -def encode(gt_boxes, rois, num_classes): +def encode(gt_boxes, rois, num_classes, indexs): """Matching and Encoding groundtruth boxes (gt_boxes) into learning targets to boxes Sampling Parameters @@ -35,7 +35,7 @@ def encode(gt_boxes, rois, num_classes): # R x G matrix overlaps = cython_bbox.bbox_overlaps( np.ascontiguousarray(all_rois[:, 0:4], dtype=np.float), - np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) + np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) # R # max_overlaps = overlaps.max(axis=1) # R max_overlaps = overlaps[np.arange(rois.shape[0]), gt_assignment] @@ -97,7 +97,7 @@ def encode(gt_boxes, rois, num_classes): labels[ignore_inds] = -1 max_overlaps = labels - return labels, bbox_targets, bbox_inside_weights + return labels, bbox_targets, bbox_inside_weights, max_overlaps.astype(np.float32), indexs def decode(boxes, scores, rois, ih, iw): """Decode prediction targets into boxes and only keep only one boxes of greatest possibility for each rois @@ -149,7 +149,7 @@ def _compute_targets(ex_rois, gt_rois, labels, num_classes): start = 4 * cls end = start + 4 bbox_targets[ind, start:end] = targets[ind, 0:4] - bbox_inside_weights[ind, start:end] = 1.0 + bbox_inside_weights[ind, start:end] = 1 return bbox_targets, bbox_inside_weights def _unmap(data, count, inds, fill=0): diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 62db3b3..a3312b0 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -2,6 +2,7 @@ from __future__ import division from __future__ import print_function +import tensorflow as tf import numpy as np import libs.configs.config_v1 as cfg @@ -12,7 +13,7 @@ _DEBUG=False -def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, with_nms=False, random=False): +def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False, with_nms=False, random=False): """Sample boxes according to scores and some learning strategies assuming the first class is background Params: @@ -40,11 +41,13 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, wi keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] + indexs = indexs[keeps] ## filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) boxes = boxes[keeps, :] scores = scores[keeps] + indexs = indexs[keeps] # scores_ = scores @@ -53,6 +56,7 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, wi keeps = np.random.choice(np.arange(boxes.shape[0]), size=pre_nms_top_n, replace=False) boxes = boxes[keeps, :] scores = scores[keeps] + indexs = indexs[keeps] else: if len(scores) > pre_nms_top_n: partial_order = scores.ravel() @@ -60,13 +64,22 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, wi boxes = boxes[partial_order, :] scores = scores[partial_order] + indexs = indexs[partial_order] - ## sort + ## filter before nms + if len(scores) > pre_nms_top_n: + partial_order = scores.ravel() + partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] + + boxes = boxes[partial_order, :] + scores = scores[partial_order] + indexs = indexs[partial_order] + +## sort order = scores.ravel().argsort()[::-1] - # if pre_nms_top_n > 0: - # order = order[:pre_nms_top_n] boxes = boxes[order, :] scores = scores[order] + indexs = indexs[order] # if len(scores_) > pre_nms_top_n: # scores_ = scores_[scores_.ravel().argsort()[::-1][:pre_nms_top_n]] @@ -78,11 +91,13 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, wi keeps = nms_wrapper.nms(det, rpn_nms_threshold) boxes = boxes[keeps, :] scores = scores[keeps].astype(np.float32) + indexs = indexs[keeps] ## filter after nms if post_nms_top_n > 0: boxes = boxes[:post_nms_top_n, :] - scores = scores[:post_nms_top_n] + scores = scores[:post_nms_top_n] + indexs = indexs[:post_nms_top_n] batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) @@ -99,11 +114,11 @@ def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, wi # ws = boxes[:, 2] - boxes[:, 0] # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' # print(boxes.shape) - return boxes, scores, batch_inds + return boxes, scores, batch_inds, indexs -def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, only_positive=False): +def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): """sample boxes for refined output""" - boxes, scores, batch_inds= sample_rpn_outputs(boxes, scores, is_training=is_training, only_positive=only_positive, with_nms=True) + boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training=is_training, only_positive=only_positive, with_nms=True) if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( @@ -124,11 +139,11 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) if fg_inds.size > 0 and fg_rois < fg_inds.size: - fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) + fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) # TODO: sampling strategy bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 8))#128cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction + bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 if bg_inds.size > 0 and bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) @@ -137,17 +152,17 @@ def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, mask_fg_inds = keep_inds else: bg_inds = np.arange(boxes.shape[0]) - bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), 8))#128cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction + bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 if bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) keep_inds = bg_inds mask_fg_inds = bg_inds + + return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ + boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] - return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], \ - boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds] - -def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): +def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): min_size = cfg.FLAGS.min_size mask_nms_threshold = cfg.FLAGS.mask_nms_threshold post_nms_inst_n = cfg.FLAGS.post_nms_inst_n @@ -157,6 +172,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): boxes = boxes.reshape((-1, 4)) classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) + indexs = indexs.reshape((-1, 1)) probs = probs.reshape((-1, 81)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' @@ -164,6 +180,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -171,6 +188,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -178,6 +196,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -185,6 +204,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): # filter with nms order = scores.ravel().argsort()[::-1] scores = scores[order] + indexs = indexs[order] boxes = boxes[order, :] classes = classes[order] prob = prob[order, :] @@ -196,6 +216,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): if post_nms_inst_n > 0: keeps = keeps[:post_nms_inst_n] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -204,6 +225,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): #@TODO if len(classes) is 0: scores = np.zeros((1, 1)) + indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([0]) prob = np.zeros((1,81)) @@ -214,12 +236,14 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): boxes = boxes.reshape((-1, 4)) classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) + indexs = indexs.reshape((-1, 1)) prob = prob.reshape((-1, 81)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -227,6 +251,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -234,11 +259,13 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] + indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] __scores = [] + __indexs = [] __boxes = [] __classes = [] __prob = [] @@ -247,6 +274,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): _keeps = (classes == c).reshape(-1) _scores = scores[_keeps] + _indexs = indexs[_keeps] _boxes = boxes[_keeps, :] _classes = classes[_keeps] _prob = prob[_keeps, :] @@ -254,6 +282,7 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): # filter with nms _order = _scores.ravel().argsort()[::-1] _scores = _scores[_order] + _indexs = _indexs[_order] _boxes = _boxes[_order, :] _classes = _classes[_order] _prob = _prob[_order, :] @@ -265,24 +294,27 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): if post_nms_inst_n > 0: _keeps = _keeps[:post_nms_inst_n] __scores.append(_scores[_keeps]) + __indexs.append(_indexs[_keeps]) __boxes.append(_boxes[_keeps, :]) __classes.append(_classes[_keeps]) __prob.append(_prob[_keeps, :]) scores = np.vstack(__scores) + indexs = np.vstack(__indexs) boxes = np.vstack(__boxes) classes = np.vstack(__classes).reshape(-1) prob = np.vstack(__prob) if len(classes) is 0: scores = np.zeros((1, 1)) + indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([0]).reshape(-1) prob = np.zeros((1,81)) batch_inds = np.zeros([boxes.shape[0]]) - return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32) + return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois @@ -353,3 +385,288 @@ def _apply_nms(boxes, scores, threshold = 0.5): print ('average time %f' % ((time.time() - t) / 10)) + + + + +# from __future__ import absolute_import +# from __future__ import division +# from __future__ import print_function + +# import tensorflow as tf +# import numpy as np + +# import libs.configs.config_v1 as cfg +# import libs.boxes.nms_wrapper as nms_wrapper +# import libs.boxes.cython_bbox as cython_bbox +# from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes +# from libs.logs.log import LOG + +# _DEBUG=False + +# def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False, with_nms=False): +# """Sample boxes according to scores and some learning strategies +# assuming the first class is background +# Params: +# boxes: of shape (..., Ax4), each entry is [x1, y1, x2, y2], the last axis has k*4 dims +# scores: of shape (..., A), probs of fg, in [0, 1] +# """ +# min_size = cfg.FLAGS.min_size +# rpn_nms_threshold = cfg.FLAGS.rpn_nms_threshold +# pre_nms_top_n = cfg.FLAGS.pre_nms_top_n +# post_nms_top_n = cfg.FLAGS.post_nms_top_n + +# # training: 12000, 2000 +# # testing: 6000, 400 +# # if not is_training: +# # pre_nms_top_n = int(pre_nms_top_n / 2) +# # post_nms_top_n = int(post_nms_top_n / 5) + +# boxes = boxes.reshape((-1, 4)) +# scores = scores.reshape((-1, 1)) +# assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' + +# ## filter backgrounds +# ## Hope this will filter most of background anchors, since a argsort is too slow.. +# if only_positive: +# keeps = np.where(scores > 0.5)[0] +# boxes = boxes[keeps, :] +# scores = scores[keeps] +# indexs = indexs[keeps] + +# ## filter minimum size +# keeps = _filter_boxes(boxes, min_size=min_size) +# boxes = boxes[keeps, :] +# scores = scores[keeps] +# indexs = indexs[keeps] + +# ## sort and filter before nms +# if len(scores) <= pre_nms_top_n: ##full sort +# order = scores.ravel().argsort()[::-1] +# if pre_nms_top_n > 0: +# order = order[:pre_nms_top_n] +# else: ## partial + full sort +# order = scores.ravel() +# order = np.argsort((order[np.argpartition(-order, pre_nms_top_n)])[0:pre_nms_top_n:])[::-1] +# boxes = boxes[order, :] +# scores = scores[order] +# indexs = indexs[order] + +# ## filter by nms +# if with_nms is True: +# det = np.hstack((boxes, scores)).astype(np.float32) +# keeps = nms_wrapper.nms(det, rpn_nms_threshold) + +# ## filter after nms +# if post_nms_top_n > 0: +# keeps = keeps[:post_nms_top_n] +# boxes = boxes[keeps, :] +# scores = scores[keeps].astype(np.float32) +# indexs = indexs[keeps] + + +# batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) + +# # # random sample boxes +# ## try early sample later +# # fg_inds = np.where(scores > 0.5)[0] +# # num_fgs = min(len(fg_inds.size), int(rois_per_image * fg_roi_fraction)) + +# # if _DEBUG: +# # LOG('SAMPLE: %d rois has been choosen' % len(scores)) +# # LOG('SAMPLE: a positive box: %d %d %d %d %.4f' % (boxes[0, 0], boxes[0, 1], boxes[0, 2], boxes[0, 3], scores[0])) +# # LOG('SAMPLE: a negative box: %d %d %d %d %.4f' % (boxes[-1, 0], boxes[-1, 1], boxes[-1, 2], boxes[-1, 3], scores[-1])) +# # hs = boxes[:, 3] - boxes[:, 1] +# # ws = boxes[:, 2] - boxes[:, 0] +# # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' + +# return boxes, scores, batch_inds, indexs + +# def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): +# """sample boxes for refined output""" +# boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training=is_training, only_positive=only_positive, with_nms=True) + +# if gt_boxes.size > 0: +# overlaps = cython_bbox.bbox_overlaps( +# np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), +# np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) +# gt_assignment = overlaps.argmax(axis=1) # B +# max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B +# fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] + +# if True: +# gt_argmax_overlaps = overlaps.argmax(axis=0) # G +# fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) + +# mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] + +# if mask_fg_inds.size > cfg.FLAGS.masks_per_image: +# mask_fg_inds = np.random.choice(mask_fg_inds, size=cfg.FLAGS.masks_per_image, replace=False) + +# fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) +# if fg_inds.size > 0 and fg_rois < fg_inds.size: +# fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) + +# # TODO: sampling strategy +# bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] +# bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 +# if bg_inds.size > 0 and bg_rois < bg_inds.size: +# bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) + +# keep_inds = np.append(fg_inds, bg_inds) +# if mask_fg_inds.size is 0: +# mask_fg_inds = keep_inds +# else: +# bg_inds = np.arange(boxes.shape[0]) +# bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 +# if bg_rois < bg_inds.size: +# bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) + +# keep_inds = bg_inds +# mask_fg_inds = bg_inds + +# return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ +# boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] + +# def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): +# min_size = cfg.FLAGS.min_size +# mask_nms_threshold = cfg.FLAGS.mask_nms_threshold +# post_nms_inst_n = cfg.FLAGS.post_nms_inst_n +# if class_agnostic is True: +# scores = prob[range(prob.shape[0]),classes] + +# boxes = boxes.reshape((-1, 4)) +# scores = scores.reshape((-1, 1)) +# indexs = indexs.reshape((-1, 1)) +# assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' + +# # filter background +# keeps = np.where(classes != 0)[0] +# scores = scores[keeps] +# indexs = indexs[keeps] +# boxes = boxes[keeps, :] +# classes = classes[keeps] +# prob = prob[keeps, :] + +# # filter minimum size +# keeps = _filter_boxes(boxes, min_size=min_size) +# scores = scores[keeps] +# indexs = indexs[keeps] +# boxes = boxes[keeps, :] +# classes = classes[keeps] +# prob = prob[keeps, :] + +# #filter with scores +# keeps = np.where(scores > 0.5)[0] +# scores = scores[keeps] +# indexs = indexs[keeps] +# boxes = boxes[keeps, :] +# classes = classes[keeps] +# prob = prob[keeps, :] + +# # filter with nms +# order = scores.ravel().argsort()[::-1] +# scores = scores[order] +# indexs = indexs[order] +# boxes = boxes[order, :] +# classes = classes[order] +# prob = prob[order, :] + +# det = np.hstack((boxes, scores)).astype(np.float32) +# keeps = nms_wrapper.nms(det, mask_nms_threshold) + + +# # filter low score +# if post_nms_inst_n > 0: +# keeps = keeps[:post_nms_inst_n] +# scores = scores[keeps] +# indexs = indexs[keeps] +# boxes = boxes[keeps, :] +# classes = classes[keeps] +# prob = prob[keeps, :] + +# # quick fix for tensorflow error when no bbox presents +# #@TODO +# if len(classes) is 0: +# scores = np.zeros((1, 1)) +# indexs = np.zeros((1, 1)) +# boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) +# classes = np.array([[0]]) +# prob = np.zeros((1,81)) + +# else: +# #@TODO +# raise "inference nms type error" + +# batch_inds = np.zeros([boxes.shape[0]]) + +# return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) + +# def _jitter_boxes(boxes, jitter=0.1): +# """ jitter the boxes before appending them into rois +# """ +# jittered_boxes = boxes.copy() +# ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 +# hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 +# width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws +# height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs +# jittered_boxes[:, 0] += width_offset +# jittered_boxes[:, 2] += width_offset +# jittered_boxes[:, 1] += height_offset +# jittered_boxes[:, 3] += height_offset + +# return jittered_boxes + +# def _filter_boxes(boxes, min_size): +# """Remove all boxes with any side smaller than min_size.""" +# ws = boxes[:, 2] - boxes[:, 0] + 1 +# hs = boxes[:, 3] - boxes[:, 1] + 1 +# keep = np.where((ws >= min_size) & (hs >= min_size))[0] +# return keep + +# def _apply_nms(boxes, scores, threshold = 0.5): +# """After this only positive boxes are left +# Applying this class-wise +# """ +# num_class = scores.shape[1] +# assert boxes.shape[0] == scores.shape[0], \ +# 'Shape dismatch {} vs {}'.format(boxes.shape, scores.shape) + +# final_boxes = [] +# final_scores = [] +# for cls in np.arange(1, num_class): +# cls_boxes = boxes[:, 4*cls: 4*cls+4] +# cls_scores = scores[:, cls] +# dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) +# keep = nms_wrapper.nms(dets, thresh=0.3) +# dets = dets[keep, :] +# dets = dets[np.where(dets[:, 4] > threshold)] +# final_boxes.append(dets[:, :4]) +# final_scores.append(dets[:, 4]) + +# final_boxes = np.vstack(final_boxes) +# final_scores = np.vstack(final_scores) + +# return final_boxes, final_scores + +# if __name__ == '__main__': +# import time +# t = time.time() + +# for i in range(10): +# N = 700000 +# boxes = np.random.randint(0, 50, (N, 2)) +# s = np.random.randint(10, 40, (N, 2)) +# s = boxes + s +# boxes = np.hstack((boxes, s)) + +# scores = np.random.rand(N, 1) +# indexs = np.arange(N) +# # scores_ = 1 - np.random.rand(N, 1) +# # scores = np.hstack((scores, scores_)) + +# boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, only_positive=False) + + + +# print ('average time %f' % ((time.time() - t) / 10)) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 7737066..426f9df 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -7,7 +7,6 @@ from __future__ import print_function import tensorflow as tf -import gc from . import anchor from . import roi from . import mask @@ -15,149 +14,194 @@ from . import assign from libs.boxes.anchor import anchors_plane -def anchor_encoder(gt_boxes, all_anchors, height, width, stride, ih, iw, scope='AnchorEncoder'): +def anchor_encoder(gt_boxes, all_anchors, height, width, stride, indexs, scope='AnchorEncoder'): + with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights = \ + labels, bbox_targets, bbox_inside_weights, indexs = \ tf.py_func(anchor.encode, - [gt_boxes, all_anchors, height, width, stride, ih, iw], - [tf.int32, tf.float32, tf.float32]) + [gt_boxes, all_anchors, height, width, stride, indexs], + [tf.int32, tf.float32, tf.float32, tf.int32]) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (1, height, width, -1)) + indexs = tf.reshape(indexs, (1, height, width, -1)) bbox_targets = tf.reshape(bbox_targets, (1, height, width, -1)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (1, height, width, -1)) - return labels, bbox_targets, bbox_inside_weights + + return labels, bbox_targets, bbox_inside_weights, indexs def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): + with tf.name_scope(scope) as sc: - final_boxes, classes, scores = \ + final_boxes, classes, scores, indexs = \ tf.py_func(anchor.decode, [boxes, scores, all_anchors, ih, iw], - [tf.float32, tf.int32, tf.float32]) + [tf.float32, tf.int32, tf.float32, tf.int32]) + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') + indexs = tf.reshape(indexs, (-1, )) final_boxes = tf.reshape(final_boxes, (-1, 4)) classes = tf.reshape(classes, (-1, )) scores = tf.reshape(scores, (-1, )) - - return final_boxes, classes, scores + + return final_boxes, classes, scores, indexs -def roi_encoder(gt_boxes, rois, num_classes, scope='ROIEncoder'): +def roi_encoder(gt_boxes, rois, num_classes, indexs, scope='ROIEncoder'): + with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights = \ + labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs = \ tf.py_func(roi.encode, - [gt_boxes, rois, num_classes], - [tf.int32, tf.float32, tf.float32] + [gt_boxes, rois, num_classes, indexs], + [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32] ) - labels = tf.convert_to_tensor(labels, name='labels') + labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='indexs') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (-1, )) + indexs = tf.reshape(indexs, (-1, )) bbox_targets = tf.reshape(bbox_targets, (-1, num_classes * 4)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (-1, num_classes * 4)) - - return labels, bbox_targets, bbox_inside_weights + max_overlaps = tf.reshape(max_overlaps,(-1, )) + + return labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): + with tf.name_scope(scope) as sc: - boxes, classes, scores = \ + final_boxes, classes, scores = \ tf.py_func(roi.decode, [boxes, scores, rois, ih, iw], [tf.float32, tf.int32, tf.float32]) - boxes = tf.convert_to_tensor(boxes, name='boxes') + final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') - boxes = tf.reshape(boxes, (-1, 4)) - - return boxes, classes, scores - -def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): + final_boxes = tf.reshape(final_boxes, (-1, 4)) + + return final_boxes, classes, scores + +# def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): + +# with tf.name_scope(scope) as sc: +# labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ +# tf.py_func(mask.encode_, +# [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], +# [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) + +# labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') +# indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') +# mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') +# mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') + +# labels = tf.reshape(labels, (-1,)) +# indexs = tf.reshape(indexs, (-1,)) +# mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) +# mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) +# mask_rois = tf.reshape(mask_rois,(-1, 4)) + +# return labels, mask_targets, mask_inside_weights, mask_rois, indexs + +def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): + with tf.name_scope(scope) as sc: - labels, mask_targets, mask_inside_weights, mask_rois = \ + labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ tf.py_func(mask.encode, - [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width], - [tf.int32, tf.float32, tf.float32, tf.float32]) + [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], + [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) - labels = tf.convert_to_tensor(labels, name='labels') + labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') + indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') mask_rois = tf.convert_to_tensor(mask_rois, name='mask_rois') labels = tf.reshape(labels, (-1,)) + indexs = tf.reshape(indexs, (-1,)) mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) mask_rois = tf.reshape(mask_rois,(-1, 4)) - - return labels, mask_targets, mask_inside_weights, mask_rois + + return labels, mask_targets, mask_inside_weights, mask_rois, indexs def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): + with tf.name_scope(scope) as sc: Mask = \ tf.py_func(mask.decode, [mask_targets, rois, classes, ih, iw,], [tf.float32]) - Mask = tf.convert_to_tensor(Mask, name='Mask') + Mask = tf.convert_to_tensor(Mask, name='MaskImage') Mask = tf.reshape(Mask, (ih, iw)) - - return Mask + + return Mask -def sample_wrapper(boxes, scores, is_training=True, only_positive=True, scope='SampleBoxes'): +def sample_wrapper(boxes, scores, indexs, is_training=True, only_positive=True, scope='SampleBoxes'): + with tf.name_scope(scope) as sc: - boxes, scores, batch_inds = \ + boxes, scores, batch_inds, indexs = \ tf.py_func(sample.sample_rpn_outputs, - [boxes, scores, is_training, only_positive], - [tf.float32, tf.float32, tf.int32]) - boxes = tf.convert_to_tensor(boxes, name='boxes') - scores = tf.convert_to_tensor(scores, name='scores') - batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') + [boxes, scores, indexs, is_training, only_positive], + [tf.float32, tf.float32, tf.int32, tf.int32]) + boxes = tf.convert_to_tensor(boxes, name='Boxes') + scores = tf.convert_to_tensor(scores, name='Scores') + batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + indexs = tf.convert_to_tensor(indexs, name='Indexs') boxes = tf.reshape(boxes, (-1, 4)) batch_inds = tf.reshape(batch_inds, [-1]) + indexs = tf.reshape(indexs, [-1]) + + return boxes, scores, batch_inds, indexs - return boxes, scores, batch_inds - -def sample_with_gt_wrapper(boxes, scores, gt_boxes, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): +def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): + with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds = \ + boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs = \ tf.py_func(sample.sample_rpn_outputs_wrt_gt_boxes, - [boxes, scores, gt_boxes, is_training, only_positive], - [tf.float32, tf.float32, tf.int32, tf.float32, tf.float32, tf.int32]) - boxes = tf.convert_to_tensor(boxes, name='boxes') - scores = tf.convert_to_tensor(scores, name='scores') - batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') + [boxes, scores, gt_boxes, indexs, is_training, only_positive], + [tf.float32, tf.float32, tf.int32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) + boxes = tf.convert_to_tensor(boxes, name='Boxes') + scores = tf.convert_to_tensor(scores, name='Scores') + batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + indexs = tf.convert_to_tensor(indexs, name='Indexs') - mask_boxes = tf.convert_to_tensor(mask_boxes, name='mask_boxes') - mask_scores = tf.convert_to_tensor(mask_scores, name='mask_scores') - mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='mask_batch_inds') - - return boxes, scores, batch_inds, mask_boxes, mask_scores, mask_batch_inds + mask_boxes = tf.convert_to_tensor(mask_boxes, name='MaskBoxes') + mask_scores = tf.convert_to_tensor(mask_scores, name='MaskScores') + mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='MaskBatchInds') + mask_indexs = tf.convert_to_tensor(mask_indexs, name='Indexs') + + return boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): + with tf.name_scope(scope) as sc: all_anchors = \ tf.py_func(anchors_plane, [height, width, stride, scales], - [tf.float32] + [tf.float64] ) - all_anchors = tf.convert_to_tensor(tf.cast(all_anchors, tf.float32), name='all_anchors') + all_anchors = tf.convert_to_tensor(tf.cast(all_anchors, tf.float32), name='AllAnchors') all_anchors = tf.reshape(all_anchors, (height, width, -1)) - - return all_anchors + + return all_anchors def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): + with tf.name_scope(scope) as sc: min_k = layers[0] max_k = layers[-1] @@ -177,18 +221,19 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): split_tensors.append(tf.gather(t, inds)) assigned_tensors.append(split_tensors) - return assigned_tensors + [assigned_layers] + return assigned_tensors + [assigned_layers] -def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, scope='instInference'): +def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, indexs, scope='instInference'): with tf.name_scope(scope) as sc: - inst_boxes, inst_classes, inst_prob, batch_inds = \ + inst_boxes, inst_classes, inst_prob, batch_inds, inst_indexs = \ tf.py_func(sample.sample_rcnn_outputs, - [final_boxes, classes, cls2_prob], - [tf.float32, tf.int32, tf.float32, tf.int32]) + [final_boxes, classes, cls2_prob, indexs], + [tf.float32, tf.int32, tf.float32, tf.int32, tf.int32]) - inst_boxes = tf.convert_to_tensor(inst_boxes, name='inst_boxes') - inst_classes = tf.convert_to_tensor(inst_classes, name='inst_classes') - inst_prob = tf.convert_to_tensor(inst_prob, name='inst_prob') - batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') + inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') + inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') + inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') + batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') + inst_indexs = tf.convert_to_tensor(inst_indexs, name='inst_indexs') - return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file + return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] + [inst_indexs] \ No newline at end of file diff --git a/libs/nets/nets_factory.py b/libs/nets/nets_factory.py index 0cb4d32..4e260c6 100644 --- a/libs/nets/nets_factory.py +++ b/libs/nets/nets_factory.py @@ -19,31 +19,25 @@ 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, - # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - # 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', - # 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', - # 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', - # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - # }, 'resnet101': {'C1': '', 'C2': '', 'C3': '', 'C4': '', 'C5': '', } } -def get_network(name, image, weight_decay=0.000005, is_training=True): +def get_network(name, image, weight_decay=0.000005, is_training=False): if name == 'resnet50': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet50(image, 1000, is_training=is_training) with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): - logits, end_points = resnet50(image) + logits, end_points = resnet50(image, 1000) if name == 'resnet101': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet101(image, 1000, is_training=is_training) with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): - logits, end_points = resnet101(image) + logits, end_points = resnet101(image, 1000) if name == 'resnext50': name diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 32a9d6f..db8fa37 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -31,12 +31,6 @@ 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, - # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - # 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', - # 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', - # 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', - # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - # }, 'resnet101': {'C1': '', 'C2': '', 'C3': '', 'C4': '', 'C5': '', @@ -66,11 +60,8 @@ def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params): # with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME'): - with slim.arg_scope([slim.fully_connected], - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params) as arg_sc: - return arg_sc + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): @@ -167,54 +158,53 @@ def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): tf.concat(values=[scores, new_scores], axis=0), \ tf.concat(values=[batch_inds, new_batch_inds], axis=0) -# def build_pyramid(net_name, end_points, bilinear=True, is_training=True): -# """build pyramid features from a typical network, -# assume each stage is 2 time larger than its top feature -# Returns: -# returns several endpoints -# """ -# pyramid = {} -# if isinstance(net_name, str): -# pyramid_map = _networks_map[net_name] -# else: -# pyramid_map = net_name -# # pyramid['inputs'] = end_points['inputs'] -# if _BN is True: -# # arg_scope = _extra_conv_arg_scope_with_bn() -# arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) -# else: -# arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) -# # -# with tf.variable_scope('pyramid'): -# with slim.arg_scope(arg_scope): +def build_pyramid(net_name, end_points, bilinear=True, is_training=True): + """build pyramid features from a typical network, + assume each stage is 2 time larger than its top feature + Returns: + returns several endpoints + """ + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name + # pyramid['inputs'] = end_points['inputs'] + if _BN is True: + arg_scope = _extra_conv_arg_scope_with_bn() + # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + else: + arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + # + with tf.variable_scope('pyramid'): + with slim.arg_scope(arg_scope): -# pyramid['P5'] = \ -# slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + pyramid['P5'] = \ + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') -# for c in range(4, 1, -1): -# s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] + for c in range(4, 1, -1): + s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] -# # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) + # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) -# up_shape = tf.shape(s_) -# # out_shape = tf.stack((up_shape[1], up_shape[2])) -# # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) -# s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) -# s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + up_shape = tf.shape(s_) + # out_shape = tf.stack((up_shape[1], up_shape[2])) + # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) -# s = tf.add(s, s_, name='C%d/addition'%c) -# s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + s = tf.add(s, s_, name='C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) -# pyramid['P%d'%(c)] = s + pyramid['P%d'%(c)] = s -# return pyramid + return pyramid -def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None, bilinear=True): +def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): """Build the 3-way outputs, i.e., class, box and mask in the pyramid Algo ---- For each layer: - 0. Build pyramid features from a typical network (assume each stage is 2 time larger than its top feature) 1. Build anchor layer 2. Process the results of anchor layer, decode the output into rois 3. Sample rois @@ -223,67 +213,36 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai 6. Build the mask layer 7. Build losses """ - pyramid = {} outputs = {} - outputs['rpn'] = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + arg_scope = _extra_conv_arg_scope_with_bn() + # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): - - """Build pyramid (P2-P5) from convolutional layer (C2-C5) from Resnet - C5 160 x ?? x 256 - C4 80 x ?? x 256 - C3 40 x ?? x 256 - C2 20 x ?? x 256 - ?? is changed according to image aspect ratio - """ - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, activation_fn=None, scope='C5') - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - up_shape = tf.shape(s_) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, activation_fn=None, scope='C%d'%c) - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, activation_fn=None, scope='C%d/fusion'%c) - - pyramid['P%d'%(c)] = s - - """Build RPN head - RPN takes features from pyramid network. - strides are respectively set to [4, 8, 16, 32] for pyramid feature layer P2,P3,P4,P5 - anchor_scales are set to [2, 4, 8, 16, 32] in all pyramid layers (*This is probably inconsistent with original paper where the only scale is 8) - It generates 2 outputs. - box: an array of shape (1, pyramid_height, pyramid_width, num_anchorx4). box regression values [shift_x, shift_y, scale_width, scale_height] are stored in the last dimension of the array. - cls: an array of shape (1, pyramid_height, pyramid_width, num_anchorx2). Note that this value is before softmax - """ + + with slim.arg_scope(arg_scope): + with tf.variable_scope('pyramid'): + ### for p in pyramid + outputs['rpn'] = {} for i in range(5, 1, -1): p = 'P%d'%i - stride = 2**i - + stride = 2 ** i + + ### rpn head shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, scope='%s/rpn'%p) + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] # + anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# + print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - ### gather boxes, clses, anchors from all pyramid layers + ### gather all rois rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] @@ -291,8 +250,13 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai rpn_clses = tf.concat(values=rpn_clses, axis=0) rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) ### softmax to get probability - rpn_final_boxes, rpn_final_clses, rpn_final_scores = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) ### decode anchors and box regression values into proposed bounding boxes + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) + rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) + + outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] + for i in range(4, 1, -1): + p = 'P%d'%i + outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] outputs['rpn_boxes'] = rpn_boxes outputs['rpn_clses'] = rpn_clses @@ -300,54 +264,60 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai outputs['rpn_final_boxes'] = rpn_final_boxes outputs['rpn_final_clses'] = rpn_final_clses outputs['rpn_final_scores'] = rpn_final_scores + outputs['rpn_indexs'] = indexs if is_training is True: - ### for training, rcnn and maskrcnn take rpn proposed bounding boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, is_training=is_training, only_positive=False) + ### for training, rcnn and maskrcnn take rpn boxes as inputs + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ + # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, only_positive=False) + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) - ### assign pyramid layer indexs to rcnn network's ROIs. - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn], [2, 3, 4, 5]) + ### assign pyramid layer indexs to rcnn network's ROIs + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) - ### crop features from pyramid using ROIs. Note that this will change order of the ROIs, so ROIs are also reordered. + ### crop features from pyramid for rcnn network rcnn_cropped_features = [] rcnn_ordered_rois = [] + rcnn_ordered_index = [] for i in range(5, 1, -1): p = 'P%d'%i rcnn_splitted_roi = rcnn_assigned_rois[i-2] rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] + rcnn_index = rcnn_assigned_indexs[i-2] rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, - pooled_height=7, pooled_width=7) + pooled_height=14, pooled_width=14) rcnn_cropped_features.append(rcnn_cropped_feature) rcnn_ordered_rois.append(rcnn_splitted_roi) + rcnn_ordered_index.append(rcnn_index) rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) + rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) - """Build rcnn head - rcnn takes cropped features and generates 2 outputs. - rcnn_boxes: an array of shape (num_ROIs, num_classes x 4). Box regression values of each classes [shift_x, shift_y, scale_width, scale_height] are stored in the last dimension of the array. - rcnn_clses: an array of shape (num_ROIs, num_classes). Class prediction values (before softmax) are stored - """ - rcnn = slim.flatten(rcnn_cropped_features) + ### rcnn head + # to 7 x 7 + rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') + rcnn = slim.flatten(rcnn) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn_scores = tf.nn.softmax(rcnn_clses)### softmax to get probability + rcnn_scores = tf.nn.softmax(rcnn_clses) ### decode rcnn network final outputs - rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) ### decode ROIs and box regression values into bounding boxes + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) outputs['rcnn_ordered_rois'] = rcnn_ordered_rois + outputs['rcnn_ordered_index'] = rcnn_ordered_index outputs['rcnn_cropped_features'] = rcnn_cropped_features tf.add_to_collection('__CROPPED__', rcnn_cropped_features) outputs['rcnn_boxes'] = rcnn_boxes @@ -357,34 +327,40 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai outputs['rcnn_final_clses'] = rcnn_final_classes outputs['rcnn_final_scores'] = rcnn_final_scores - + ### assign pyramid layer indexs to mask network's ROIs if is_training: - ### assign pyramid layer indexs to mask network's ROIs - [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask], [2, 3, 4, 5]) + [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) - ### crop features from pyramid using ROIs. Again, this will change order of the ROIs, so ROIs are reordered. mask_cropped_features = [] mask_ordered_rois = [] + mask_ordered_indexs = [] + ### crop features from pyramid for mask network for i in range(5, 1, -1): p = 'P%d'%i mask_splitted_roi = mask_assigned_rois[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assigned_indexs[i-2] mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) + else: ### for testing, mask network takes rcnn boxes as inputs - rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores) - [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assigned_layer_inds] =\ - assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask], [2, 3, 4, 5]) + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) + [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ + assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) mask_cropped_features = [] mask_ordered_rois = [] + mask_ordered_indexs = [] mask_ordered_clses = [] mask_ordered_scores = [] for i in range(5, 1, -1): @@ -393,40 +369,42 @@ def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_trai mask_splitted_cls = mask_assigned_clses[i-2] mask_splitted_score = mask_assigned_scores[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] + mask_index = mask_assign_indexs[i-2] mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) + mask_ordered_indexs.append(mask_index) mask_ordered_clses.append(mask_splitted_cls) mask_ordered_scores.append(mask_splitted_score) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) + mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) outputs['mask_final_clses'] = mask_ordered_clses outputs['mask_final_scores'] = mask_ordered_scores - """Build mask rcnn head - mask rcnn takes cropped features and generates masks for each classes. - m: an array of shape (28, 28, num_classes). Note that this value is before sigmoid. - """ + ### mask head m = mask_cropped_features for _ in range(4): m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) + # to 28 x 28 m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) tf.add_to_collection('__TRANSPOSED__', m) m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) outputs['mask_ordered_rois'] = mask_ordered_rois + outputs['mask_ordered_indexs'] = mask_ordered_indexs outputs['mask_cropped_features'] = mask_cropped_features outputs['mask_mask'] = m outputs['mask_final_mask'] = tf.nn.sigmoid(m) - return pyramid, outputs + return outputs -def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, +def build_losses(pyramid, outputs, gt_boxes, gt_masks, num_classes, base_anchors, rpn_box_lw =0.1, rpn_cls_lw = 0.1, rcnn_box_lw=1.0, rcnn_cls_lw=0.1, @@ -459,8 +437,8 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, mask_batch_pos = [] if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + arg_scope = _extra_conv_arg_scope_with_bn() + # arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) with slim.arg_scope(arg_scope): @@ -472,7 +450,7 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, ## build losses for PFN for i in range(5, 1, -1): p = 'P%d' % i - stride = (2 ** i)#min(2*(2**i), 32)#strides[i]#2 ** i + stride = 2 ** i shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] @@ -481,16 +459,20 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, ### rpn losses # 1. encode ground truth # 2. compute distances + # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] + # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) all_anchors = outputs['rpn'][p]['anchor'] + all_indexs = outputs['rpn'][p]['index'] rpn_boxes = outputs['rpn'][p]['box'] rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, ih, iw, scope='AnchorEncoder') + rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') - rpn_clses_target, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ + rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ tf.reshape(rpn_clses_target, [-1]), + tf.reshape(all_indexs, [-1]), tf.reshape(rpn_clses, [-1, 2]), tf.reshape(rpn_boxes, [-1, 4]), tf.reshape(rpn_boxes_target, [-1, 4]), @@ -527,19 +509,19 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, # 1. encode ground truth # 2. compute distances rcnn_ordered_rois = outputs['rcnn_ordered_rois'] + rcnn_ordered_index = outputs['rcnn_ordered_index'] rcnn_boxes = outputs['rcnn_boxes'] rcnn_clses = outputs['rcnn_clses'] - rcnn_scores = outputs['rcnn_scores'] - rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight = \ - roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, scope='ROIEncoder') + rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') - rcnn_clses_target, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ tf.reshape(rcnn_clses_target, [-1]), + tf.reshape(rcnn_ordered_index, [-1]), tf.reshape(rcnn_ordered_rois, [-1, 4]), tf.reshape(rcnn_clses, [-1, num_classes]), - tf.reshape(rcnn_scores, [-1, num_classes]), tf.reshape(rcnn_boxes, [-1, num_classes * 4]), tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) @@ -567,25 +549,25 @@ def build_losses(pyramid, ih, iw, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) rcnn_cls_losses.append(rcnn_cls_loss) - outputs['training_rcnn_rois'] = rcnn_ordered_rois outputs['training_rcnn_clses_target'] = rcnn_clses_target outputs['training_rcnn_clses'] = rcnn_clses - outputs['training_rcnn_scores'] = rcnn_scores ### mask loss # mask of shape (N, h, w, num_classes) mask_ordered_rois = outputs['mask_ordered_rois'] + mask_ordered_indexs = outputs['mask_ordered_indexs'] masks = outputs['mask_mask'] - mask_clses_target, mask_targets, mask_inside_weights, mask_rois = \ - mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28,scope='MaskEncoder') + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, masks = \ + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ tf.reshape(mask_clses_target, [-1]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), tf.reshape(mask_rois, [-1, 4]), + tf.reshape(mask_ordered_indexs, [-1]), tf.reshape(masks, [-1, 28, 28, num_classes]), ]) @@ -641,13 +623,13 @@ def build(end_points, image_height, image_width, pyramid_map, gt_masks=None, loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): - #pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) if is_training: - pyramid, outputs = \ - build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, is_training=is_training, gt_boxes=gt_boxes) - loss, losses, batch_info = build_losses(pyramid, image_height, image_width, outputs, + loss, losses, batch_info = build_losses(pyramid, outputs, gt_boxes, gt_masks, num_classes=num_classes, base_anchors=base_anchors, rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], @@ -658,15 +640,23 @@ def build(end_points, image_height, image_width, pyramid_map, outputs['total_loss'] = loss outputs['batch_info'] = batch_info else: - pyramid, outputs = \ - build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, + outputs = \ + build_heads(pyramid, image_height, image_width, num_classes, base_anchors, is_training=is_training) ### just decode outputs into readable prediction - # pred_boxes, pred_classes, pred_masks = decode_output(outputs) - # outputs['pred_boxes'] = pred_boxes - # outputs['pred_classes'] = pred_classes - # outputs['pred_masks'] = pred_masks + pred_boxes, pred_classes, pred_masks = decode_output(outputs) + outputs['pred_boxes'] = pred_boxes + outputs['pred_classes'] = pred_classes + outputs['pred_masks'] = pred_masks + + ### for debuging + outputs['tmp_0'] = pred_classes + outputs['tmp_1'] = pred_classes + outputs['tmp_2'] = pred_classes + outputs['tmp_3'] = pred_classes + outputs['tmp_4'] = pred_classes + outputs['tmp_5'] = pred_classes # ### image and gt visualization # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) diff --git a/libs/nets/pyramid_network_.py b/libs/nets/pyramid_network_.py deleted file mode 100644 index bd7de47..0000000 --- a/libs/nets/pyramid_network_.py +++ /dev/null @@ -1,711 +0,0 @@ -# coding=utf-8 -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf -import tensorflow.contrib.slim as slim - -from libs.boxes.roi import roi_cropping -from libs.layers import anchor_encoder -from libs.layers import anchor_decoder -from libs.layers import roi_encoder -from libs.layers import roi_decoder -from libs.layers import mask_encoder -from libs.layers import mask_decoder -from libs.layers import gen_all_anchors -from libs.layers import ROIAlign -from libs.layers import sample_rpn_outputs -from libs.layers import sample_rpn_outputs_with_gt -from libs.layers import sample_rcnn_outputs -from libs.layers import assign_boxes -from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input - -_BN = True - -# mapping each stage to its' tensor features -_networks_map = { - # 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - # 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - # 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - # 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', - # 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - # }, - 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_3/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_4/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_6/bottleneck_v1', - 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - }, - 'resnet101': {'C1': '', 'C2': '', - 'C3': '', 'C4': '', - 'C5': '', - } -} - -def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, - activation_fn=None, - batch_norm_decay=0.997, - batch_norm_epsilon=1e-5, - batch_norm_scale=True, - is_training=True): - - batch_norm_params = { - 'decay': batch_norm_decay, - 'epsilon': batch_norm_epsilon, - 'scale': batch_norm_scale, - 'updates_collections': tf.GraphKeys.UPDATE_OPS, - 'is_training': is_training - } - - with slim.arg_scope( - [slim.conv2d], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(), - activation_fn=tf.nn.relu, - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params): - # with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME'): - with slim.arg_scope([slim.fully_connected], - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params) as arg_sc: - return arg_sc - -def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): - - with slim.arg_scope( - [slim.conv2d, slim.conv2d_transpose], - padding='SAME', - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), - activation_fn=tf.nn.relu, - normalizer_fn=normalizer_fn,): - with slim.arg_scope( - [slim.fully_connected], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), - activation_fn=activation_fn, - normalizer_fn=normalizer_fn): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def my_sigmoid(x): - """add an active function for the box output layer, which is linear around 0""" - return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 - -def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): - """Smooth L1 loss - Returns - ------ - dist: element-wise distance, as the same shape of x, y - """ - deltas = x - y - with tf.name_scope(name=name) as scope: - deltas_abs = tf.abs(deltas) - smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) - return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ - (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) - -def _get_valid_sample_fraction(labels, p=0): - """return fraction of non-negative examples, the ignored examples have been marked as negative""" - num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) - num_example = tf.cast(tf.size(labels), tf.float32) - frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, - lambda: tf.cast(0, tf.float32)) - frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, - lambda: tf.cast(0, tf.float32)) - return frac, frac_ - - -def _filter_negative_samples(labels, tensors): - """keeps only samples with none-negative labels - Params: - ----- - labels: of shape (N,) - tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number - - Returns: - ----- - tensors: filtered tensors - """ - # return tensors - keeps = tf.where(tf.greater_equal(labels, 0)) - keeps = tf.reshape(keeps, [-1]) - - filtered = [] - for t in tensors: - tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) - f = tf.gather(t, keeps) - filtered.append(f) - - return filtered - -def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): - ws = gt_boxes[:, 2] - gt_boxes[:, 0] - hs = gt_boxes[:, 3] - gt_boxes[:, 1] - shape = tf.shape(gt_boxes)[0] - jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) - jitter = tf.reshape(jitter, [-1]) - ws_offset = ws * jitter - hs_offset = hs * jitter - x1s = gt_boxes[:, 0] + ws_offset - x2s = gt_boxes[:, 2] + ws_offset - y1s = gt_boxes[:, 1] + hs_offset - y2s = gt_boxes[:, 3] + hs_offset - boxes = tf.concat( - values=[ - x1s[:, tf.newaxis], - y1s[:, tf.newaxis], - x2s[:, tf.newaxis], - y2s[:, tf.newaxis]], - axis=1) - new_scores = tf.ones([shape], tf.float32) - new_batch_inds = tf.zeros([shape], tf.int32) - - return tf.concat(values=[rois, boxes], axis=0), \ - tf.concat(values=[scores, new_scores], axis=0), \ - tf.concat(values=[batch_inds, new_batch_inds], axis=0) - -def build_pyramid(net_name, end_points, bilinear=True, is_training=True): - """build pyramid features from a typical network, - assume each stage is 2 time larger than its top feature - Returns: - returns several endpoints - """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): - - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') - - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) - - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) - - pyramid['P%d'%(c)] = s - - return pyramid - -def build_heads(net_name, end_points, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None, bilinear=True): - """Build the 3-way outputs, i.e., class, box and mask in the pyramid - Algo - ---- - For each layer: - 1. Build anchor layer - 2. Process the results of anchor layer, decode the output into rois - 3. Sample rois - 4. Build roi layer - 5. Process the results of roi layer, decode the output into boxes - 6. Build the mask layer - 7. Build losses - """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - - outputs = {} - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) - - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) - - pyramid['P%d'%(c)] = s - - ### for p in pyramid - outputs['rpn'] = {} - for i in range(5, 1, -1): - p = 'P%d'%i - stride = 2 ** i - - ### rpn head - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) - box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) - cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - - anchor_scales = [2, 4, 8, 16, 32]#[2 **(i-2), 2 ** (i-1), 2 **(i)] # - print("anchor_scales = " , anchor_scales) - all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - - ### gather all rois - rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] - rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] - rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] - rpn_boxes = tf.concat(values=rpn_boxes, axis=0) - rpn_clses = tf.concat(values=rpn_clses, axis=0) - rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - - outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] - for i in range(4, 1, -1): - p = 'P%d'%i - outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] - - outputs['rpn_boxes'] = rpn_boxes - outputs['rpn_clses'] = rpn_clses - outputs['rpn_anchor'] = rpn_anchors - outputs['rpn_final_boxes'] = rpn_final_boxes - outputs['rpn_final_clses'] = rpn_final_clses - outputs['rpn_final_scores'] = rpn_final_scores - outputs['rpn_indexs'] = indexs - - if is_training is True: - ### for training, rcnn and maskrcnn take rpn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) - # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) - else: - ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=False) - - ### assign pyramid layer indexs to rcnn network's ROIs - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) - - ### crop features from pyramid for rcnn network - rcnn_cropped_features = [] - rcnn_ordered_rois = [] - rcnn_ordered_index = [] - for i in range(5, 1, -1): - p = 'P%d'%i - rcnn_splitted_roi = rcnn_assigned_rois[i-2] - rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] - rcnn_index = rcnn_assigned_indexs[i-2] - rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - rcnn_cropped_features.append(rcnn_cropped_feature) - rcnn_ordered_rois.append(rcnn_splitted_roi) - rcnn_ordered_index.append(rcnn_index) - - rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) - rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) - rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) - - ### rcnn head - # to 7 x 7 - rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') - rcnn = slim.flatten(rcnn) - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - #rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training - rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn_scores = tf.nn.softmax(rcnn_clses) - - ### decode rcnn network final outputs - rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) - - outputs['rcnn_ordered_rois'] = rcnn_ordered_rois - outputs['rcnn_ordered_index'] = rcnn_ordered_index - outputs['rcnn_cropped_features'] = rcnn_cropped_features - tf.add_to_collection('__CROPPED__', rcnn_cropped_features) - outputs['rcnn_boxes'] = rcnn_boxes - outputs['rcnn_clses'] = rcnn_clses - outputs['rcnn_scores'] = rcnn_scores - outputs['rcnn_final_boxes'] = rcnn_final_boxes - outputs['rcnn_final_clses'] = rcnn_final_classes - outputs['rcnn_final_scores'] = rcnn_final_scores - - ### assign pyramid layer indexs to mask network's ROIs - if is_training: - [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) - - mask_cropped_features = [] - mask_ordered_rois = [] - mask_ordered_indexs = [] - ### crop features from pyramid for mask network - for i in range(5, 1, -1): - p = 'P%d'%i - mask_splitted_roi = mask_assigned_rois[i-2] - mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assigned_indexs[i-2] - mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_features.append(mask_cropped_feature) - mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) - - mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) - - else: - ### for testing, mask network takes rcnn boxes as inputs - rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ - assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) - - mask_cropped_features = [] - mask_ordered_rois = [] - mask_ordered_indexs = [] - mask_ordered_clses = [] - mask_ordered_scores = [] - for i in range(5, 1, -1): - p = 'P%d'%i - mask_splitted_roi = mask_assigned_rois[i-2] - mask_splitted_cls = mask_assigned_clses[i-2] - mask_splitted_score = mask_assigned_scores[i-2] - mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assign_indexs[i-2] - mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_features.append(mask_cropped_feature) - mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) - mask_ordered_clses.append(mask_splitted_cls) - mask_ordered_scores.append(mask_splitted_score) - - mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) - mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) - mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) - - outputs['mask_final_clses'] = mask_ordered_clses - outputs['mask_final_scores'] = mask_ordered_scores - - ### mask head - m = mask_cropped_features - for _ in range(4): - m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - # to 28 x 28 - m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) - tf.add_to_collection('__TRANSPOSED__', m) - m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) - - outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_indexs'] = mask_ordered_indexs - outputs['mask_cropped_features'] = mask_cropped_features - outputs['mask_mask'] = m - outputs['mask_final_mask'] = tf.nn.sigmoid(m) - - return pyramid, outputs - -def build_losses(pyramid, outputs, gt_boxes, gt_masks, - num_classes, base_anchors, - rpn_box_lw =0.1, rpn_cls_lw = 0.1, - rcnn_box_lw=1.0, rcnn_cls_lw=0.1, - mask_lw=1.0): - """Building 3-way output losses, totally 5 losses - Params: - ------ - outputs: output of build_heads - gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] - gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] - *_lw: loss weight of rpn, rcnn and mask losses - - Returns: - ------- - l: a loss tensor - """ - - # losses for pyramid - losses = [] - rpn_box_losses, rpn_cls_losses = [], [] - rcnn_box_losses, rcnn_cls_losses = [], [] - mask_losses = [] - - # watch some info during training - rpn_batch = [] - rcnn_batch = [] - mask_batch = [] - rpn_batch_pos = [] - rcnn_batch_pos = [] - mask_batch_pos = [] - - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with tf.variable_scope('pyramid', reuse=True): - with slim.arg_scope(arg_scope): - ## assigning gt_boxes - [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) - - ## build losses for PFN - for i in range(5, 1, -1): - p = 'P%d' % i - stride = 2 ** i - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - - splitted_gt_boxes = assigned_gt_boxes[i-2] - - ### rpn losses - # 1. encode ground truth - # 2. compute distances - # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - all_anchors = outputs['rpn'][p]['anchor'] - all_indexs = outputs['rpn'][p]['index'] - rpn_boxes = outputs['rpn'][p]['box'] - rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - - rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') - - rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ - _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ - tf.reshape(rpn_clses_target, [-1]), - tf.reshape(all_indexs, [-1]), - tf.reshape(rpn_clses, [-1, 2]), - tf.reshape(rpn_boxes, [-1, 4]), - tf.reshape(rpn_boxes_target, [-1, 4]), - tf.reshape(rpn_boxes_inside_weight, [-1, 4]) - ]) - - rpn_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rpn_clses_target, 0), tf.float32 - ))) - rpn_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rpn_clses_target, 1), tf.float32 - ))) - - rpn_box_loss = rpn_boxes_inside_weight * _smooth_l1_dist(rpn_boxes, rpn_boxes_target) - rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) - rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) - rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) - rpn_box_losses.append(rpn_box_loss) - - ### NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses - # BUT these examples still count when computing the average of softmax_cross_entropy, - # the loss become smaller by a factor (None_negtive_labels / all_labels) - # the BEST practise still should be gathering all none-negative examples - rpn_clses_target = slim.one_hot_encoding(rpn_clses_target, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros - rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rpn_clses_target, logits=rpn_clses) - rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) - rpn_cls_losses.append(rpn_cls_loss) - - ### rcnn losses - # 1. encode ground truth - # 2. compute distances - rcnn_ordered_rois = outputs['rcnn_ordered_rois'] - rcnn_ordered_index = outputs['rcnn_ordered_index'] - rcnn_boxes = outputs['rcnn_boxes'] - rcnn_clses = outputs['rcnn_clses'] - rcnn_scores = outputs['rcnn_scores'] - - rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ - roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') - - rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ - _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ - tf.reshape(rcnn_clses_target, [-1]), - tf.reshape(rcnn_ordered_index, [-1]), - tf.reshape(rcnn_ordered_rois, [-1, 4]), - tf.reshape(rcnn_clses, [-1, num_classes]), - tf.reshape(rcnn_scores, [-1, num_classes]), - tf.reshape(rcnn_boxes, [-1, num_classes * 4]), - tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), - tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) - ] ) - - rcnn_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rcnn_clses_target, 0), tf.float32 - ))) - rcnn_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rcnn_clses_target, 1), tf.float32 - ))) - - rcnn_box_loss = rcnn_boxes_inside_weight * _smooth_l1_dist(rcnn_boxes, rcnn_boxes_target) - rcnn_box_loss = tf.reshape(rcnn_box_loss, [-1, 4]) - rcnn_box_loss = tf.reduce_sum(rcnn_box_loss, axis=1) - rcnn_box_loss = rcnn_box_lw * tf.reduce_mean(rcnn_box_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_box_loss) - rcnn_box_losses.append(rcnn_box_loss) - - rcnn_clses_target = slim.one_hot_encoding(rcnn_clses_target, num_classes, on_value=1.0, off_value=0.0) - rcnn_cls_loss = rcnn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rcnn_clses_target, logits=rcnn_clses) - rcnn_cls_loss = tf.reduce_mean(rcnn_cls_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) - rcnn_cls_losses.append(rcnn_cls_loss) - - outputs['training_rcnn_rois'] = rcnn_ordered_rois - outputs['training_rcnn_clses_target'] = rcnn_clses_target - outputs['training_rcnn_clses'] = rcnn_clses - outputs['training_rcnn_scores'] = rcnn_scores - - ### mask loss - # mask of shape (N, h, w, num_classes) - mask_ordered_rois = outputs['mask_ordered_rois'] - mask_ordered_indexs = outputs['mask_ordered_indexs'] - masks = outputs['mask_mask'] - - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ - mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') - - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ - _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ - tf.reshape(mask_clses_target, [-1]), - tf.reshape(mask_targets, [-1, 28, 28, num_classes]), - tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), - tf.reshape(mask_rois, [-1, 4]), - tf.reshape(mask_ordered_indexs, [-1]), - tf.reshape(masks, [-1, 28, 28, num_classes]), - ]) - - mask_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(mask_clses_target, 0), tf.float32 - ))) - mask_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(mask_clses_target, 1), tf.float32 - ))) - ### NOTE: w/o competition between classes. - mask_loss = mask_inside_weights * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) - mask_loss = mask_lw * mask_loss - mask_loss = tf.reduce_mean(mask_loss) - mask_loss = tf.cond(tf.greater(tf.size(mask_clses_target), 0), lambda: mask_loss, lambda: tf.constant(0.0)) - tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) - mask_losses.append(mask_loss) - - outputs['training_mask_rois'] = mask_rois - outputs['training_mask_clses_target'] = mask_clses_target - outputs['training_mask_final_mask'] = tf.nn.sigmoid(masks) - outputs['training_mask_final_mask_target'] = mask_targets - - rpn_box_losses = tf.add_n(rpn_box_losses) - rpn_cls_losses = tf.add_n(rpn_cls_losses) - rcnn_box_losses = tf.add_n(rcnn_box_losses) - rcnn_cls_losses = tf.add_n(rcnn_cls_losses) - mask_losses = tf.add_n(mask_losses) - losses = [rpn_box_losses, rpn_cls_losses, rcnn_box_losses, rcnn_cls_losses, mask_losses] - total_loss = tf.add_n(losses) - - rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) - rcnn_batch = tf.cast(tf.add_n(rcnn_batch), tf.float32) - mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) - rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) - rcnn_batch_pos = tf.cast(tf.add_n(rcnn_batch_pos), tf.float32) - mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) - - return total_loss, losses, [rpn_batch_pos, rpn_batch, \ - rcnn_batch_pos, rcnn_batch, \ - mask_batch_pos, mask_batch] - -def decode_output(outputs): - """decode outputs into boxes and masks""" - return [], [], [] - -def build(end_points, image_height, image_width, pyramid_map, - num_classes, - base_anchors, - is_training, - gt_boxes=None, - gt_masks=None, - loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): - - #pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) - - if is_training: - # outputs = \ - # build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - # is_training=is_training, gt_boxes=gt_boxes) - pyramid, outputs = \ - build_heads(pyramid_map, end_points, image_height, image_width, num_classes, base_anchors, - is_training=is_training, gt_boxes=gt_boxes) - loss, losses, batch_info = build_losses(pyramid, outputs, - gt_boxes, gt_masks, - num_classes=num_classes, base_anchors=base_anchors, - rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], - mask_lw=loss_weights[4]) - - outputs['losses'] = losses - outputs['total_loss'] = loss - outputs['batch_info'] = batch_info - else: - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - is_training=is_training) - - ### just decode outputs into readable prediction - pred_boxes, pred_classes, pred_masks = decode_output(outputs) - outputs['pred_boxes'] = pred_boxes - outputs['pred_classes'] = pred_classes - outputs['pred_masks'] = pred_masks - - ### for debuging - outputs['tmp_0'] = pred_classes - outputs['tmp_1'] = pred_classes - outputs['tmp_2'] = pred_classes - outputs['tmp_3'] = pred_classes - outputs['tmp_4'] = pred_classes - outputs['tmp_5'] = pred_classes - - # ### image and gt visualization - # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) - - # ### rpn visualization - # visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") - - # ### mask network visualization - # first_mask = outputs['training_mask_final_mask'][:1] - # first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) - - # visualize_final_predictions(outputs['rcnn_final_boxes'], end_points["input"], first_mask) - - return outputs diff --git a/libs/nets/pyramid_network_backup.py b/libs/nets/pyramid_network_backup.py deleted file mode 100644 index 170bc3e..0000000 --- a/libs/nets/pyramid_network_backup.py +++ /dev/null @@ -1,673 +0,0 @@ -# coding=utf-8 -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import tensorflow as tf -import tensorflow.contrib.slim as slim - -from libs.boxes.roi import roi_cropping -from libs.layers import anchor_encoder -from libs.layers import anchor_decoder -from libs.layers import roi_encoder -from libs.layers import roi_decoder -from libs.layers import mask_encoder -from libs.layers import mask_decoder -from libs.layers import gen_all_anchors -from libs.layers import ROIAlign -from libs.layers import sample_rpn_outputs -from libs.layers import sample_rpn_outputs_with_gt -from libs.layers import sample_rcnn_outputs -from libs.layers import assign_boxes -from libs.visualization.summary_utils import visualize_bb, visualize_final_predictions, visualize_input - -_BN = True - -# mapping each stage to its' tensor features -_networks_map = { - 'resnet50': {'C1':'resnet_v1_50/conv1/Relu:0', - 'C2':'resnet_v1_50/block1/unit_2/bottleneck_v1', - 'C3':'resnet_v1_50/block2/unit_3/bottleneck_v1', - 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', - 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', - }, - 'resnet101': {'C1': '', 'C2': '', - 'C3': '', 'C4': '', - 'C5': '', - } -} - -def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, - activation_fn=None, - batch_norm_decay=0.997, - batch_norm_epsilon=1e-5, - batch_norm_scale=True, - is_training=True): - - batch_norm_params = { - 'decay': batch_norm_decay, - 'epsilon': batch_norm_epsilon, - 'scale': batch_norm_scale, - 'updates_collections': tf.GraphKeys.UPDATE_OPS, - 'is_training': is_training - } - - with slim.arg_scope( - [slim.conv2d], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(), - activation_fn=tf.nn.relu, - normalizer_fn=slim.batch_norm, - normalizer_params=batch_norm_params): - # with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): - - with slim.arg_scope( - [slim.conv2d, slim.conv2d_transpose], - padding='SAME', - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=slim.variance_scaling_initializer(),#tf.truncated_normal_initializer(stddev=0.001), - activation_fn=tf.nn.relu, - normalizer_fn=normalizer_fn,): - with slim.arg_scope( - [slim.fully_connected], - weights_regularizer=slim.l2_regularizer(weight_decay), - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), - activation_fn=activation_fn, - normalizer_fn=normalizer_fn): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc - -def my_sigmoid(x): - """add an active function for the box output layer, which is linear around 0""" - return (tf.nn.sigmoid(x) - tf.cast(0.5, tf.float32)) * 6.0 - -def _smooth_l1_dist(x, y, sigma2=9.0, name='smooth_l1_dist'): - """Smooth L1 loss - Returns - ------ - dist: element-wise distance, as the same shape of x, y - """ - deltas = x - y - with tf.name_scope(name=name) as scope: - deltas_abs = tf.abs(deltas) - smoothL1_sign = tf.cast(tf.less(deltas_abs, 1.0 / sigma2), tf.float32) - return tf.square(deltas) * 0.5 * sigma2 * smoothL1_sign + \ - (deltas_abs - 0.5 / sigma2) * tf.abs(smoothL1_sign - 1) - -def _get_valid_sample_fraction(labels, p=0): - """return fraction of non-negative examples, the ignored examples have been marked as negative""" - num_valid = tf.reduce_sum(tf.cast(tf.greater_equal(labels, p), tf.float32)) - num_example = tf.cast(tf.size(labels), tf.float32) - frac = tf.cond(tf.greater(num_example, 0), lambda:num_valid / num_example, - lambda: tf.cast(0, tf.float32)) - frac_ = tf.cond(tf.greater(num_valid, 0), lambda:num_example / num_valid, - lambda: tf.cast(0, tf.float32)) - return frac, frac_ - - -def _filter_negative_samples(labels, tensors): - """keeps only samples with none-negative labels - Params: - ----- - labels: of shape (N,) - tensors: a list of tensors, each of shape (N, .., ..) the first axis is sample number - - Returns: - ----- - tensors: filtered tensors - """ - # return tensors - keeps = tf.where(tf.greater_equal(labels, 0)) - keeps = tf.reshape(keeps, [-1]) - - filtered = [] - for t in tensors: - tf.assert_equal(tf.shape(t)[0], tf.shape(labels)[0]) - f = tf.gather(t, keeps) - filtered.append(f) - - return filtered - -def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): - ws = gt_boxes[:, 2] - gt_boxes[:, 0] - hs = gt_boxes[:, 3] - gt_boxes[:, 1] - shape = tf.shape(gt_boxes)[0] - jitter = tf.random_uniform([shape, 1], minval = -jitter, maxval = jitter) - jitter = tf.reshape(jitter, [-1]) - ws_offset = ws * jitter - hs_offset = hs * jitter - x1s = gt_boxes[:, 0] + ws_offset - x2s = gt_boxes[:, 2] + ws_offset - y1s = gt_boxes[:, 1] + hs_offset - y2s = gt_boxes[:, 3] + hs_offset - boxes = tf.concat( - values=[ - x1s[:, tf.newaxis], - y1s[:, tf.newaxis], - x2s[:, tf.newaxis], - y2s[:, tf.newaxis]], - axis=1) - new_scores = tf.ones([shape], tf.float32) - new_batch_inds = tf.zeros([shape], tf.int32) - - return tf.concat(values=[rois, boxes], axis=0), \ - tf.concat(values=[scores, new_scores], axis=0), \ - tf.concat(values=[batch_inds, new_batch_inds], axis=0) - -def build_pyramid(net_name, end_points, bilinear=True, is_training=True): - """build pyramid features from a typical network, - assume each stage is 2 time larger than its top feature - Returns: - returns several endpoints - """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): - - pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') - - for c in range(4, 1, -1): - s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) - - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) - - pyramid['P%d'%(c)] = s - - return pyramid - -def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): - """Build the 3-way outputs, i.e., class, box and mask in the pyramid - Algo - ---- - For each layer: - 1. Build anchor layer - 2. Process the results of anchor layer, decode the output into rois - 3. Sample rois - 4. Build roi layer - 5. Process the results of roi layer, decode the output into boxes - 6. Build the mask layer - 7. Build losses - """ - outputs = {} - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - ### for p in pyramid - outputs['rpn'] = {} - for i in range(5, 1, -1): - p = 'P%d'%i - stride = 2 ** i - - ### rpn head - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) - box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) - cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ - weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# - print("anchor_scales = " , anchor_scales) - all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - - ### gather all rois - rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] - rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] - rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] - rpn_boxes = tf.concat(values=rpn_boxes, axis=0) - rpn_clses = tf.concat(values=rpn_clses, axis=0) - rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - - outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] - for i in range(4, 1, -1): - p = 'P%d'%i - outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] - - outputs['rpn_boxes'] = rpn_boxes - outputs['rpn_clses'] = rpn_clses - outputs['rpn_anchor'] = rpn_anchors - outputs['rpn_final_boxes'] = rpn_final_boxes - outputs['rpn_final_clses'] = rpn_final_clses - outputs['rpn_final_scores'] = rpn_final_scores - outputs['rpn_indexs'] = indexs - - if is_training is True: - ### for training, rcnn and maskrcnn take rpn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=False) - # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) - else: - ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) - - ### assign pyramid layer indexs to rcnn network's ROIs - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) - - ### crop features from pyramid for rcnn network - rcnn_cropped_features = [] - rcnn_ordered_rois = [] - rcnn_ordered_index = [] - for i in range(5, 1, -1): - p = 'P%d'%i - rcnn_splitted_roi = rcnn_assigned_rois[i-2] - rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] - rcnn_index = rcnn_assigned_indexs[i-2] - rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - rcnn_cropped_features.append(rcnn_cropped_feature) - rcnn_ordered_rois.append(rcnn_splitted_roi) - rcnn_ordered_index.append(rcnn_index) - - rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) - rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) - rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) - - ### rcnn head - # to 7 x 7 - rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') - rcnn = slim.flatten(rcnn) - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) - rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn_scores = tf.nn.softmax(rcnn_clses) - - ### decode rcnn network final outputs - rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) - - outputs['rcnn_ordered_rois'] = rcnn_ordered_rois - outputs['rcnn_ordered_index'] = rcnn_ordered_index - outputs['rcnn_cropped_features'] = rcnn_cropped_features - tf.add_to_collection('__CROPPED__', rcnn_cropped_features) - outputs['rcnn_boxes'] = rcnn_boxes - outputs['rcnn_clses'] = rcnn_clses - outputs['rcnn_scores'] = rcnn_scores - outputs['rcnn_final_boxes'] = rcnn_final_boxes - outputs['rcnn_final_clses'] = rcnn_final_classes - outputs['rcnn_final_scores'] = rcnn_final_scores - - ### assign pyramid layer indexs to mask network's ROIs - if is_training: - [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) - - mask_cropped_features = [] - mask_ordered_rois = [] - mask_ordered_indexs = [] - ### crop features from pyramid for mask network - for i in range(5, 1, -1): - p = 'P%d'%i - mask_splitted_roi = mask_assigned_rois[i-2] - mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assigned_indexs[i-2] - mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_features.append(mask_cropped_feature) - mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) - - mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) - - else: - ### for testing, mask network takes rcnn boxes as inputs - rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ - assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) - - mask_cropped_features = [] - mask_ordered_rois = [] - mask_ordered_indexs = [] - mask_ordered_clses = [] - mask_ordered_scores = [] - for i in range(5, 1, -1): - p = 'P%d'%i - mask_splitted_roi = mask_assigned_rois[i-2] - mask_splitted_cls = mask_assigned_clses[i-2] - mask_splitted_score = mask_assigned_scores[i-2] - mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assign_indexs[i-2] - mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, - pooled_height=14, pooled_width=14) - mask_cropped_features.append(mask_cropped_feature) - mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) - mask_ordered_clses.append(mask_splitted_cls) - mask_ordered_scores.append(mask_splitted_score) - - mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) - mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) - mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) - mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) - - outputs['mask_final_clses'] = mask_ordered_clses - outputs['mask_final_scores'] = mask_ordered_scores - - ### mask head - m = mask_cropped_features - for _ in range(4): - m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - # to 28 x 28 - m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) - tf.add_to_collection('__TRANSPOSED__', m) - m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) - - outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_indexs'] = mask_ordered_indexs - outputs['mask_cropped_features'] = mask_cropped_features - outputs['mask_mask'] = m - outputs['mask_final_mask'] = tf.nn.sigmoid(m) - - return outputs - -def build_losses(pyramid, outputs, gt_boxes, gt_masks, - num_classes, base_anchors, - rpn_box_lw =0.1, rpn_cls_lw = 0.1, - rcnn_box_lw=1.0, rcnn_cls_lw=0.1, - mask_lw=1.0): - """Building 3-way output losses, totally 5 losses - Params: - ------ - outputs: output of build_heads - gt_boxes: A tensor of shape (G, 5), [x1, y1, x2, y2, class] - gt_masks: A tensor of shape (G, ih, iw), {0, 1}Ì[MaÌ[MaÌ]] - *_lw: loss weight of rpn, rcnn and mask losses - - Returns: - ------- - l: a loss tensor - """ - - # losses for pyramid - losses = [] - rpn_box_losses, rpn_cls_losses = [], [] - rcnn_box_losses, rcnn_cls_losses = [], [] - mask_losses = [] - - # watch some info during training - rpn_batch = [] - rcnn_batch = [] - mask_batch = [] - rpn_batch_pos = [] - rcnn_batch_pos = [] - mask_batch_pos = [] - - if _BN is True: - # arg_scope = _extra_conv_arg_scope_with_bn() - arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - - ## assigning gt_boxes - [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) - - ## build losses for PFN - for i in range(5, 1, -1): - p = 'P%d' % i - stride = 2 ** i - shape = tf.shape(pyramid[p]) - height, width = shape[1], shape[2] - - splitted_gt_boxes = assigned_gt_boxes[i-2] - - ### rpn losses - # 1. encode ground truth - # 2. compute distances - # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - all_anchors = outputs['rpn'][p]['anchor'] - all_indexs = outputs['rpn'][p]['index'] - rpn_boxes = outputs['rpn'][p]['box'] - rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - - rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') - - rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ - _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ - tf.reshape(rpn_clses_target, [-1]), - tf.reshape(all_indexs, [-1]), - tf.reshape(rpn_clses, [-1, 2]), - tf.reshape(rpn_boxes, [-1, 4]), - tf.reshape(rpn_boxes_target, [-1, 4]), - tf.reshape(rpn_boxes_inside_weight, [-1, 4]) - ]) - - rpn_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rpn_clses_target, 0), tf.float32 - ))) - rpn_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rpn_clses_target, 1), tf.float32 - ))) - - rpn_box_loss = rpn_boxes_inside_weight * _smooth_l1_dist(rpn_boxes, rpn_boxes_target) - rpn_box_loss = tf.reshape(rpn_box_loss, [-1, 4]) - rpn_box_loss = tf.reduce_sum(rpn_box_loss, axis=1) - rpn_box_loss = rpn_box_lw * tf.reduce_mean(rpn_box_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_box_loss) - rpn_box_losses.append(rpn_box_loss) - - ### NOTE: examples with negative labels are ignore when compute one_hot_encoding and entropy losses - # BUT these examples still count when computing the average of softmax_cross_entropy, - # the loss become smaller by a factor (None_negtive_labels / all_labels) - # the BEST practise still should be gathering all none-negative examples - rpn_clses_target = slim.one_hot_encoding(rpn_clses_target, 2, on_value=1.0, off_value=0.0) # this will set -1 label to all zeros - rpn_cls_loss = rpn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rpn_clses_target, logits=rpn_clses) - rpn_cls_loss = tf.reduce_mean(rpn_cls_loss) - tf.add_to_collection(tf.GraphKeys.LOSSES, rpn_cls_loss) - rpn_cls_losses.append(rpn_cls_loss) - - ### rcnn losses - # 1. encode ground truth - # 2. compute distances - rcnn_ordered_rois = outputs['rcnn_ordered_rois'] - rcnn_ordered_index = outputs['rcnn_ordered_index'] - rcnn_boxes = outputs['rcnn_boxes'] - rcnn_clses = outputs['rcnn_clses'] - - rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ - roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') - - rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ - _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ - tf.reshape(rcnn_clses_target, [-1]), - tf.reshape(rcnn_ordered_index, [-1]), - tf.reshape(rcnn_ordered_rois, [-1, 4]), - tf.reshape(rcnn_clses, [-1, num_classes]), - tf.reshape(rcnn_boxes, [-1, num_classes * 4]), - tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), - tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) - ] ) - - rcnn_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rcnn_clses_target, 0), tf.float32 - ))) - rcnn_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(rcnn_clses_target, 1), tf.float32 - ))) - - rcnn_box_loss = rcnn_boxes_inside_weight * _smooth_l1_dist(rcnn_boxes, rcnn_boxes_target) - rcnn_box_loss = tf.reshape(rcnn_box_loss, [-1, 4]) - rcnn_box_loss = tf.reduce_sum(rcnn_box_loss, axis=1) - rcnn_box_loss = rcnn_box_lw * tf.reduce_mean(rcnn_box_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_box_loss) - rcnn_box_losses.append(rcnn_box_loss) - - rcnn_clses_target = slim.one_hot_encoding(rcnn_clses_target, num_classes, on_value=1.0, off_value=0.0) - rcnn_cls_loss = rcnn_cls_lw * tf.nn.softmax_cross_entropy_with_logits(labels=rcnn_clses_target, logits=rcnn_clses) - rcnn_cls_loss = tf.reduce_mean(rcnn_cls_loss) # * frac_ - tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) - rcnn_cls_losses.append(rcnn_cls_loss) - - outputs['training_rcnn_clses_target'] = rcnn_clses_target - outputs['training_rcnn_clses'] = rcnn_clses - - ### mask loss - # mask of shape (N, h, w, num_classes) - mask_ordered_rois = outputs['mask_ordered_rois'] - mask_ordered_indexs = outputs['mask_ordered_indexs'] - masks = outputs['mask_mask'] - - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ - mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') - - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ - _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ - tf.reshape(mask_clses_target, [-1]), - tf.reshape(mask_targets, [-1, 28, 28, num_classes]), - tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), - tf.reshape(mask_rois, [-1, 4]), - tf.reshape(mask_ordered_indexs, [-1]), - tf.reshape(masks, [-1, 28, 28, num_classes]), - ]) - - mask_batch.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(mask_clses_target, 0), tf.float32 - ))) - mask_batch_pos.append( - tf.reduce_sum(tf.cast( - tf.greater_equal(mask_clses_target, 1), tf.float32 - ))) - ### NOTE: w/o competition between classes. - mask_loss = mask_inside_weights * tf.nn.sigmoid_cross_entropy_with_logits(labels=mask_targets, logits=masks) - mask_loss = mask_lw * mask_loss - mask_loss = tf.reduce_mean(mask_loss) - mask_loss = tf.cond(tf.greater(tf.size(mask_clses_target), 0), lambda: mask_loss, lambda: tf.constant(0.0)) - tf.add_to_collection(tf.GraphKeys.LOSSES, mask_loss) - mask_losses.append(mask_loss) - - outputs['training_mask_rois'] = mask_rois - outputs['training_mask_clses_target'] = mask_clses_target - outputs['training_mask_final_mask'] = tf.nn.sigmoid(masks) - outputs['training_mask_final_mask_target'] = mask_targets - - rpn_box_losses = tf.add_n(rpn_box_losses) - rpn_cls_losses = tf.add_n(rpn_cls_losses) - rcnn_box_losses = tf.add_n(rcnn_box_losses) - rcnn_cls_losses = tf.add_n(rcnn_cls_losses) - mask_losses = tf.add_n(mask_losses) - losses = [rpn_box_losses, rpn_cls_losses, rcnn_box_losses, rcnn_cls_losses, mask_losses] - total_loss = tf.add_n(losses) - - rpn_batch = tf.cast(tf.add_n(rpn_batch), tf.float32) - rcnn_batch = tf.cast(tf.add_n(rcnn_batch), tf.float32) - mask_batch = tf.cast(tf.add_n(mask_batch), tf.float32) - rpn_batch_pos = tf.cast(tf.add_n(rpn_batch_pos), tf.float32) - rcnn_batch_pos = tf.cast(tf.add_n(rcnn_batch_pos), tf.float32) - mask_batch_pos = tf.cast(tf.add_n(mask_batch_pos), tf.float32) - - return total_loss, losses, [rpn_batch_pos, rpn_batch, \ - rcnn_batch_pos, rcnn_batch, \ - mask_batch_pos, mask_batch] - -def decode_output(outputs): - """decode outputs into boxes and masks""" - return [], [], [] - -def build(end_points, image_height, image_width, pyramid_map, - num_classes, - base_anchors, - is_training, - gt_boxes=None, - gt_masks=None, - loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): - - pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) - - if is_training: - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - is_training=is_training, gt_boxes=gt_boxes) - loss, losses, batch_info = build_losses(pyramid, outputs, - gt_boxes, gt_masks, - num_classes=num_classes, base_anchors=base_anchors, - rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], - rcnn_box_lw=loss_weights[2], rcnn_cls_lw=loss_weights[3], - mask_lw=loss_weights[4]) - - outputs['losses'] = losses - outputs['total_loss'] = loss - outputs['batch_info'] = batch_info - else: - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, - is_training=is_training) - - ### just decode outputs into readable prediction - pred_boxes, pred_classes, pred_masks = decode_output(outputs) - outputs['pred_boxes'] = pred_boxes - outputs['pred_classes'] = pred_classes - outputs['pred_masks'] = pred_masks - - ### for debuging - outputs['tmp_0'] = pred_classes - outputs['tmp_1'] = pred_classes - outputs['tmp_2'] = pred_classes - outputs['tmp_3'] = pred_classes - outputs['tmp_4'] = pred_classes - outputs['tmp_5'] = pred_classes - - # ### image and gt visualization - # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) - - # ### rpn visualization - # visualize_bb(end_points["input"], outputs['rpn_final_boxes'], name="rpn_bb_visualization") - - # ### mask network visualization - # first_mask = outputs['training_mask_final_mask'][:1] - # first_mask = tf.transpose(first_mask, [3, 1, 2, 0]) - - # visualize_final_predictions(outputs['rcnn_final_boxes'], end_points["input"], first_mask) - - return outputs diff --git a/libs/nets/resnet_v1.py b/libs/nets/resnet_v1.py index cd96fd8..6d24baa 100644 --- a/libs/nets/resnet_v1.py +++ b/libs/nets/resnet_v1.py @@ -66,7 +66,6 @@ from tensorflow.python.ops import math_ops from tensorflow.python.ops import nn_ops from tensorflow.python.ops import variable_scope -import tensorflow as tf resnet_arg_scope = resnet_utils.resnet_arg_scope diff --git a/libs/preprocessings/coco_v1.py b/libs/preprocessings/coco_v1.py index cd9255f..ff1aa85 100644 --- a/libs/preprocessings/coco_v1.py +++ b/libs/preprocessings/coco_v1.py @@ -98,4 +98,4 @@ def preprocess_for_test(image, gt_boxes, gt_masks): ## rgb to bgr image = tf.reverse(image, axis=[-1]) - return image, new_ih, new_iw, gt_boxes, gt_masks + return image, new_ih, new_iw, gt_boxes, gt_masks diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index 1187271..6fe14a2 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -1,9 +1,9 @@ import numpy as np -import libs.configs.config_v1 as cfg +import tensorflow as tf from PIL import Image, ImageFont, ImageDraw, ImageEnhance from scipy.misc import imresize -FLAGS = cfg.FLAGS +FLAGS = tf.app.flags.FLAGS _DEBUG = False def draw_img(step, image, name='', image_height=1, image_width=1, rois=None): @@ -36,7 +36,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la else: color = '#0000ff' else: - text = cat_id_to_cls_name(label[i]) + ' : ' + "{:.3f}".format(prob[i][label[i]]) #str(i)#+ + text = cat_id_to_cls_name(label[i]) + ' : ' + str(i)#+ str(prob[i][label[i]])[:4] draw.text((2+bbox[i,0], 2+bbox[i,1]), text, fill=color) if _DEBUG is True: diff --git a/train/test.py b/train/test.py index 4810d24..7ef7aec 100644 --- a/train/test.py +++ b/train/test.py @@ -85,6 +85,76 @@ def _collectData(image_id, classes, boxes, probs, img_h, img_w, new_img_h, new_i instance['score'] = score[instance_index][classes[instance_index]] _writeJSON(instance) + + +# #!/usr/bin/env python +# # coding=utf-8 +# from __future__ import absolute_import +# from __future__ import division +# from __future__ import print_function + +# import functools +# import os, sys +# import time +# import numpy as np +# import tensorflow as tf +# import tensorflow.contrib.slim as slim +# from time import gmtime, strftime + +# sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) +# import libs.configs.config_v1 as cfg +# import libs.datasets.dataset_factory as datasets +# import libs.nets.nets_factory as network + +# import libs.preprocessings.coco_v1 as coco_preprocess +# import libs.nets.pyramid_network as pyramid_network +# import libs.nets.resnet_v1 as resnet_v1 +# import libs.boxes.cython_bbox as cython_bbox + +# from train.train_utils import _configure_learning_rate, _configure_optimizer, \ +# _get_variables_to_train, _get_init_fn, get_var_list_to_restore + +# from PIL import Image, ImageFont, ImageDraw, ImageEnhance +# from libs.datasets import download_and_convert_coco +# from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox + +# FLAGS = tf.app.flags.FLAGS +# resnet50 = resnet_v1.resnet_v1_50 + +# def solve(global_step): +# """add solver to losses""" +# # learning reate +# lr = _configure_learning_rate(82783, global_step) +# optimizer = _configure_optimizer(lr) +# tf.summary.scalar('learning_rate', lr) + +# # compute and apply gradient +# losses = tf.get_collection(tf.GraphKeys.LOSSES) +# regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) +# regular_loss = tf.add_n(regular_losses) +# out_loss = tf.add_n(losses) +# total_loss = tf.add_n(losses + regular_losses) + +# tf.summary.scalar('total_loss', total_loss) +# tf.summary.scalar('out_loss', out_loss) +# tf.summary.scalar('regular_loss', regular_loss) + +# update_ops = [] +# variables_to_train = _get_variables_to_train() +# # update_op = optimizer.minimize(total_loss) +# gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) +# grad_updates = optimizer.apply_gradients(gradients, +# global_step=global_step) +# update_ops.append(grad_updates) + +# # update moving mean and variance +# if FLAGS.update_bn: +# update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) +# update_bn = tf.group(*update_bns) +# update_ops.append(update_bn) + +# return tf.group(*update_ops) + def restore(sess): """choose which param to restore""" if FLAGS.restore_previous_if_exists: @@ -101,6 +171,32 @@ def restore(sess): except: print (' failed to restore in %s %s' % (FLAGS.train_dir, checkpoint_path)) raise + +def evaluate(ap_threshold, gt_boxes, gt_masks, boxes, classes, probs, masks): + num_instances = gt_boxes.shape[0] + num_prediction = boxes.shape[0] + recall = [] + precision = [] + if num_instances is not 0 and num_prediction is not 0: + m = np.array(masks) + m = np.transpose(m,(0,3,1,2)) + + overlaps = cython_bbox.bbox_overlaps( + np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), + np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) + + + overlaps_recall = np.max(overlaps, axis=0) + overlaps_precision = np.max(overlaps, axis=1) + for i, threshold in enumerate(ap_threshold): + recall.append(np.sum(overlaps_recall > threshold)) + precision.append(np.sum(overlaps_precision > threshold)) + else: + for i, threshold in enumerate(ap_threshold): + recall.append(0) + precision.append(0) + return np.array(recall), np.array(precision), num_instances, num_prediction + def test(): """The main function that runs training""" @@ -108,7 +204,7 @@ def test(): ## data image, ih, iw, new_ih, new_iw, gt_boxes, gt_masks, num_instances, img_id = \ datasets.get_dataset(FLAGS.dataset_name, - FLAGS.dataset_split_name_test, + FLAGS.dataset_split_name, FLAGS.dataset_dir, FLAGS.im_batch, is_training=False) @@ -121,7 +217,7 @@ def test(): weight_decay=FLAGS.weight_decay, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=15,#15 + base_anchors=9, is_training=False, gt_boxes=None, gt_masks=None, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) @@ -132,16 +228,6 @@ def test(): testing_mask_final_clses = outputs['mask_final_clses'] testing_mask_final_scores = outputs['mask_final_scores'] - ############################# - # tmp_0 = outputs['tmp_0'] - # tmp_1 = outputs['tmp_1'] - # tmp_2 = outputs['tmp_2'] - # tmp_3 = outputs['tmp_3'] - # tmp_4 = outputs['tmp_4'] - # tmp_5 = outputs['tmp_5'] - ############################ - - ## solvers global_step = slim.create_global_step() @@ -181,7 +267,7 @@ def test(): img_id_str, img_h, img_w, new_img_h, new_img_w, \ gt_boxesnp, gt_masksnp,\ - input_imagenp, \ + input_imagenp,\ testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ sess.run([img_id] + [ih] + [iw] + [new_ih] + [new_iw] +\ [gt_boxes] + [gt_masks] +\ @@ -221,7 +307,97 @@ def test(): _collectData(img_id_str, testing_mask_final_clsesnp, testing_mask_roisnp, testing_mask_final_scoresnp, img_h, img_w, new_img_h, new_img_w) - # writeJSON('results.json', data) + # ## solvers + # global_step = slim.create_global_step() + + # cropped_rois = tf.get_collection('__CROPPED__')[0] + # transposed = tf.get_collection('__TRANSPOSED__')[0] + + # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) + # sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) + # init_op = tf.group( + # tf.global_variables_initializer(), + # tf.local_variables_initializer() + # ) + # sess.run(init_op) + + # summary_op = tf.summary.merge_all() + # logdir = os.path.join(FLAGS.train_dir, strftime('%Y%m%d%H%M%S', gmtime())) + # if not os.path.exists(logdir): + # os.makedirs(logdir) + # summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph) + + # ## restore + # restore(sess) + + # ## main loop + # coord = tf.train.Coordinator() + # threads = [] + # # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) + # for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): + # threads.extend(qr.create_threads(sess, coord=coord, daemon=True, + # start=True)) + + # tf.train.start_queue_runners(sess=sess, coord=coord) + + # ap_threshold = [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95] + # total_recall = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + # total_precision = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + # total_instance = 0 + # total_prediction = 0 + + + # # for step in range(FLAGS.max_iters): + # for step in range(2500): + + # start_time = time.time() + + # img_id_str, \ + # gt_boxesnp, gt_masksnp,\ + # input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ + # testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ + # sess.run([img_id] + \ + # [gt_boxes] + [gt_masks] +\ + # [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + \ + # [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) + + # duration_time = time.time() - start_time + # if step % 1 == 0: + # print ( """iter %d: image-id:%07d, time:%.3f(sec), """ + # """instances: %d, """ + + # % (step, img_id_str, duration_time, + # gt_boxesnp.shape[0])) + + # if step % 1 == 0: + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='test_est', + # bbox=testing_mask_roisnp, + # label=testing_mask_final_clsesnp, + # prob=testing_mask_final_scoresnp, + # mask=testing_mask_final_masknp,) + + # if step % 1 == 0: + # draw_bbox(step, + # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), + # name='test_gt', + # bbox=gt_boxesnp[:,0:4], + # label=gt_boxesnp[:,4].astype(np.int32), + # prob=np.ones((gt_boxesnp.shape[0],81), dtype=np.float32),) + + # recall, precision, num_instances, num_prediction = evaluate(ap_threshold, gt_boxesnp, gt_masksnp, testing_mask_roisnp, testing_mask_final_clsesnp, testing_mask_final_scoresnp, testing_mask_final_masknp) + # total_recall += recall + # total_precision += precision + # total_instance += num_instances + # total_prediction += num_prediction + + # print("recall = {}".format([x / float(total_instance) for x in total_recall])) + # print("precision = {}".format([x / float(total_prediction) for x in total_precision])) + # print("recall = {}".format(total_recall / float(total_instance))) + # print("precision = {}".format(total_precision / float(total_prediction))) + + if __name__ == '__main__': test() diff --git a/train/train.py b/train/train.py index e1ae58e..c6fff36 100644 --- a/train/train.py +++ b/train/train.py @@ -6,12 +6,10 @@ import functools import os, sys -import psutil import time import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim -import gc from time import gmtime, strftime @@ -24,10 +22,10 @@ import libs.nets.pyramid_network as pyramid_network import libs.nets.resnet_v1 as resnet_v1 +from libs.logs.log import LOG from train.train_utils import _configure_learning_rate, _configure_optimizer, \ _get_variables_to_train, _get_init_fn, get_var_list_to_restore -from libs.logs.log import LOG from PIL import Image, ImageFont, ImageDraw, ImageEnhance from libs.datasets import download_and_convert_coco from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox @@ -35,9 +33,6 @@ FLAGS = tf.app.flags.FLAGS resnet50 = resnet_v1.resnet_v1_50 -def printMemUsed(discript): - print("%s:\t%d" % (discript, psutil.virtual_memory().used)) - def solve(global_step): """add solver to losses""" # learning reate @@ -47,14 +42,14 @@ def solve(global_step): # compute and apply gradient losses = tf.get_collection(tf.GraphKeys.LOSSES) - # regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) - # regular_loss = tf.add_n(regular_losses) + regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + regular_loss = tf.add_n(regular_losses) out_loss = tf.add_n(losses) - total_loss = tf.add_n(losses ) #+ regular_losses + total_loss = tf.add_n(losses + regular_losses) tf.summary.scalar('total_loss', total_loss) tf.summary.scalar('out_loss', out_loss) - # tf.summary.scalar('regular_loss', regular_loss) + tf.summary.scalar('regular_loss', regular_loss) update_ops = [] variables_to_train = _get_variables_to_train() @@ -81,45 +76,12 @@ def restore(sess): restorer = tf.train.Saver() ########### - # not_restore = [ 'pyramid/fully_connected/BatchNorm/gamma:0', - # 'pyramid/fully_connected_1/BatchNorm/gamma:0', - # 'pyramid/fully_connected_2/BatchNorm/gamma:0', - # 'pyramid/fully_connected_3/BatchNorm/gamma:0', - # 'pyramid/fully_connected/BatchNorm/beta:0', - # 'pyramid/fully_connected_1/BatchNorm/beta:0', - # 'pyramid/fully_connected_2/BatchNorm/beta:0', - # 'pyramid/fully_connected_3/BatchNorm/beta:0', - # 'pyramid/fully_connected/BatchNorm/moving_mean:0', - # 'pyramid/fully_connected_1/BatchNorm/moving_mean:0', - # 'pyramid/fully_connected_2/BatchNorm/moving_mean:0', - # 'pyramid/fully_connected_3/BatchNorm/moving_mean:0', - # 'pyramid/fully_connected/BatchNorm/moving_variance:0', - # 'pyramid/fully_connected_1/BatchNorm/moving_variance:0', - # 'pyramid/fully_connected_2/BatchNorm/moving_variance:0', - # 'pyramid/fully_connected_3/BatchNorm/moving_variance:0', - - # 'pyramid/fully_connected/BatchNorm/gamma/Momentum:0', - # 'pyramid/fully_connected_1/BatchNorm/gamma/Momentum:0', - # 'pyramid/fully_connected_2/BatchNorm/gamma/Momentum:0', - # 'pyramid/fully_connected_3/BatchNorm/gamma/Momentum:0', - # 'pyramid/fully_connected/BatchNorm/beta/Momentum:0', - # 'pyramid/fully_connected_1/BatchNorm/beta/Momentum:0', - # 'pyramid/fully_connected_2/BatchNorm/beta/Momentum:0', - # 'pyramid/fully_connected_3/BatchNorm/beta/Momentum:0', - # 'pyramid/fully_connected/BatchNorm/moving_mean/Momentum:0', - # 'pyramid/fully_connected_1/BatchNorm/moving_mean/Momentum:0', - # 'pyramid/fully_connected_2/BatchNorm/moving_mean/Momentum:0', - # 'pyramid/fully_connected_3/BatchNorm/moving_mean/Momentum:0', - # 'pyramid/fully_connected/BatchNorm/moving_variance/Momentum:0', - # 'pyramid/fully_connected_1/BatchNorm/moving_variance/Momentum:0', - # 'pyramid/fully_connected_2/BatchNorm/moving_variance/Momentum:0', - # 'pyramid/fully_connected_3/BatchNorm/moving_variance/Momentum:0',] - ########### # not_restore = [ 'pyramid/fully_connected/weights:0', # 'pyramid/fully_connected/biases:0', - # 'pyramid/fully_connected_1/weights:0', + # 'pyramid/fully_connected/weights:0', # 'pyramid/fully_connected_1/biases:0', + # 'pyramid/fully_connected_1/weights:0', # 'pyramid/fully_connected_2/weights:0', # 'pyramid/fully_connected_2/biases:0', # 'pyramid/fully_connected_3/weights:0', @@ -138,8 +100,9 @@ def restore(sess): # 'pyramid/Conv_4/biases:0', # 'pyramid/fully_connected/weights/Momentum:0', # 'pyramid/fully_connected/biases/Momentum:0', - # 'pyramid/fully_connected_1/weights/Momentum:0', + # 'pyramid/fully_connected/weights/Momentum:0', # 'pyramid/fully_connected_1/biases/Momentum:0', + # 'pyramid/fully_connected_1/weights/Momentum:0', # 'pyramid/fully_connected_2/weights/Momentum:0', # 'pyramid/fully_connected_2/biases/Momentum:0', # 'pyramid/fully_connected_3/weights/Momentum:0', @@ -156,56 +119,6 @@ def restore(sess): # 'pyramid/Conv2d_transpose/biases/Momentum:0', # 'pyramid/Conv_4/weights/Momentum:0', # 'pyramid/Conv_4/biases/Momentum:0',] - # not_restore = [ 'pyramid/P2/rpn/weights:0', - # 'pyramid/P2/rpn/biases:0', - # 'pyramid/P3/rpn/weights:0', - # 'pyramid/P3/rpn/biases:0', - # 'pyramid/P4/rpn/weights:0', - # 'pyramid/P4/rpn/biases:0', - # 'pyramid/P5/rpn/weights:0', - # 'pyramid/P5/rpn/biases:0', - # 'pyramid/P2/rpn/weights/Momentum:0', - # 'pyramid/P2/rpn/biases/Momentum:0', - # 'pyramid/P3/rpn/weights/Momentum:0', - # 'pyramid/P3/rpn/biases/Momentum:0', - # 'pyramid/P4/rpn/weights/Momentum:0', - # 'pyramid/P4/rpn/biases/Momentum:0', - # 'pyramid/P5/rpn/weights/Momentum:0', - - # 'pyramid/P2/rpn/box/weights:0', - # 'pyramid/P2/rpn/box/biases:0', - # 'pyramid/P3/rpn/box/weights:0', - # 'pyramid/P3/rpn/box/biases:0', - # 'pyramid/P4/rpn/box/weights:0', - # 'pyramid/P4/rpn/box/biases:0', - # 'pyramid/P5/rpn/box/weights:0', - # 'pyramid/P5/rpn/box/biases:0', - # 'pyramid/P2/rpn/box/weights/Momentum:0', - # 'pyramid/P2/rpn/box/biases/Momentum:0', - # 'pyramid/P3/rpn/box/weights/Momentum:0', - # 'pyramid/P3/rpn/box/biases/Momentum:0', - # 'pyramid/P4/rpn/box/weights/Momentum:0', - # 'pyramid/P4/rpn/box/biases/Momentum:0', - # 'pyramid/P5/rpn/box/weights/Momentum:0', - # 'pyramid/P5/rpn/box/biases/Momentum:0', - - # 'pyramid/P2/rpn/cls/weights:0', - # 'pyramid/P2/rpn/cls/biases:0', - # 'pyramid/P3/rpn/cls/weights:0', - # 'pyramid/P3/rpn/cls/biases:0', - # 'pyramid/P4/rpn/cls/weights:0', - # 'pyramid/P4/rpn/cls/biases:0', - # 'pyramid/P5/rpn/cls/weights:0', - # 'pyramid/P5/rpn/cls/biases:0', - # 'pyramid/P2/rpn/cls/weights/Momentum:0', - # 'pyramid/P2/rpn/cls/biases/Momentum:0', - # 'pyramid/P3/rpn/cls/weights/Momentum:0', - # 'pyramid/P3/rpn/cls/biases/Momentum:0', - # 'pyramid/P4/rpn/cls/weights/Momentum:0', - # 'pyramid/P4/rpn/cls/biases/Momentum:0', - # 'pyramid/P5/rpn/cls/weights/Momentum:0', - # 'pyramid/P5/rpn/cls/biases/Momentum:0',] - # vars_to_restore = [v for v in tf.all_variables()if v.name not in not_restore] # restorer = tf.train.Saver(vars_to_restore) # for var in vars_to_restore: @@ -251,35 +164,34 @@ def restore(sess): def train(): """The main function that runs training""" ## data - image, ih, iw, new_img_h, new_img_w, gt_boxes, gt_masks, num_instances, img_id = \ + image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ datasets.get_dataset(FLAGS.dataset_name, FLAGS.dataset_split_name, FLAGS.dataset_dir, FLAGS.im_batch, is_training=True) - # data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, - # dtypes=( - # image.dtype, ih.dtype, iw.dtype, - # gt_boxes.dtype, gt_masks.dtype, - # num_instances.dtype, img_id.dtype)) - # enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) - # data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) - # tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) - # (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() + data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, + dtypes=( + image.dtype, ih.dtype, iw.dtype, + gt_boxes.dtype, gt_masks.dtype, + num_instances.dtype, img_id.dtype)) + enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) + data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) + tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) + (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() im_shape = tf.shape(image) image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=True) - outputs = pyramid_network.build(end_points, new_img_h, new_img_w, pyramid_map, + outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=15,#9,# + base_anchors=9,#15 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[2.0, 1.0, 0.0, 0.0, 0.0]) - # loss_weights=[0.1, 1.0, 0.1, 1.0, 1.0]) + loss_weights=[10.0, 1.0, 1000.0, 1.0, 100.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) # loss_weights=[0.1, 0.01, 10.0, 0.1, 1.0]) @@ -287,18 +199,26 @@ def train(): total_loss = outputs['total_loss'] losses = outputs['losses'] batch_info = outputs['batch_info'] - #regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) + regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) input_image = end_points['input'] - training_rcnn_rois = outputs['training_rcnn_rois'] training_rcnn_clses = outputs['training_rcnn_clses'] training_rcnn_clses_target = outputs['training_rcnn_clses_target'] - training_rcnn_scores = outputs['training_rcnn_scores'] training_mask_rois = outputs['training_mask_rois'] training_mask_clses_target = outputs['training_mask_clses_target'] training_mask_final_mask = outputs['training_mask_final_mask'] training_mask_final_mask_target = outputs['training_mask_final_mask_target'] + ############################# + tmp_0 = outputs['tmp_0'] + tmp_1 = outputs['tmp_1'] + tmp_2 = outputs['tmp_2'] + tmp_3 = outputs['tmp_3'] + tmp_4 = outputs['tmp_4'] + tmp_5 = outputs['tmp_5'] + ############################ + + ## solvers global_step = slim.create_global_step() update_op = solve(global_step) @@ -326,6 +246,7 @@ def train(): ## main loop coord = tf.train.Coordinator() threads = [] + # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): threads.extend(qr.create_threads(sess, coord=coord, daemon=True, start=True)) @@ -337,74 +258,58 @@ def train(): start_time = time.time() - s_, tot_loss, img_id_str, \ + s_, tot_loss, reg_lossnp, img_id_str, \ rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, \ gt_boxesnp, \ - input_imagenp, training_rcnn_roisnp, training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_rcnn_scoresnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp, \ - rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch = sess.run([update_op, total_loss, img_id] \ - + losses \ - + [gt_boxes] \ - + [input_image] + [training_rcnn_rois] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_rcnn_scores] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target] \ - + batch_info ) - # , reg_lossnp - # regular_loss, - #, regular_loss: %.6f - # reg_lossnp , + rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch, \ + input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ + training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ + sess.run([update_op, total_loss, regular_loss, img_id] + + losses + + [gt_boxes] + + batch_info + + [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) duration_time = time.time() - start_time if step % 1 == 0: - LOG ( """iter %d: image-id:%07d, time:%.3f(sec), """ + LOG ( """iter %d: image-id:%07d, time:%.3f(sec), regular_loss: %.6f, """ """total-loss %.4f(%.4f, %.4f, %.6f, %.4f, %.4f), """ """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" - % (step, img_id_str, duration_time, + % (step, img_id_str, duration_time, reg_lossnp, tot_loss, rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch)) + # print (np.array(tmp_0np).shape) + # print (np.array(tmp_1np).shape) - # LOG ("target") - # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) - # LOG ("predict") - # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) + LOG ("target") + LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) + LOG ("predict") + LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) - - if step % 1 == 0: + if step % 50 == 0: draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_est', - bbox=training_rcnn_roisnp, - label=np.argmax(np.array(training_rcnn_scoresnp),axis=1), - prob=training_rcnn_scoresnp,#np.zeros((training_rcnn_clsesnp.shape[0],81), dtype=np.float32)+1.0, + bbox=training_mask_roisnp, + label=training_mask_clses_targetnp, + prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + mask=training_mask_final_masknp, vis_all=True) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_gt', - bbox=training_rcnn_roisnp, - label=np.argmax(np.array(training_rcnn_clses_targetnp),axis=1), - prob=np.zeros((training_rcnn_clsesnp.shape[0],81), dtype=np.float32)+1.0, + bbox=training_mask_roisnp, + label=training_mask_clses_targetnp, + prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + mask=training_mask_final_mask_targetnp, vis_all=True) - - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='train_est', - # bbox=training_mask_roisnp, - # label=training_mask_clses_targetnp, - # prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, - # mask=training_mask_final_masknp, - # vis_all=True) - - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='train_gt', - # bbox=training_mask_roisnp, - # label=training_mask_clses_targetnp, - # prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, - # mask=training_mask_final_mask_targetnp, - # vis_all=True) if np.isnan(tot_loss) or np.isinf(tot_loss): - print (gt_boxesnp) + LOG (gt_boxesnp) raise if step % 100 == 0: @@ -412,7 +317,7 @@ def train(): summary_writer.add_summary(summary_str, step) summary_writer.flush() - if (step % 500 == 0 or step + 1 == FLAGS.max_iters) and step != 0: + if (step % 10000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: checkpoint_path = os.path.join(FLAGS.train_dir, FLAGS.dataset_name + '_' + FLAGS.network + '_model.ckpt') saver.save(sess, checkpoint_path, global_step=step) @@ -420,8 +325,7 @@ def train(): if coord.should_stop(): coord.request_stop() coord.join(threads) - gc.collect() if __name__ == '__main__': - train() \ No newline at end of file + train() From 52115a54c3c40e8e058b2f293925d31f0bf54471 Mon Sep 17 00:00:00 2001 From: souryuu Date: Tue, 12 Sep 2017 18:12:43 +0900 Subject: [PATCH 32/35] test.py should now able to test bounding box AP (mask is not included yet) current mAP@50 IOU by FPN+Resnet50 (training from scratch) is 43.7% changed anchor scale to match with the original paper changed head parts of RPN RCNN and Mask rename and remove multiple variables --- libs/boxes/anchor.py | 18 +- libs/configs/config_v1.py | 783 ++++++++++---------------------- libs/layers/anchor.py | 136 ++---- libs/layers/crop.py | 8 +- libs/layers/mask.py | 76 +--- libs/layers/roi.py | 18 +- libs/layers/sample.py | 435 +++--------------- libs/layers/wrapper.py | 159 +++---- libs/nets/nets_factory.py | 6 +- libs/nets/pyramid_network.py | 177 ++++---- libs/visualization/pil_utils.py | 7 +- train/test.py | 202 +------- train/train.py | 163 ++++--- 13 files changed, 605 insertions(+), 1583 deletions(-) diff --git a/libs/boxes/anchor.py b/libs/boxes/anchor.py index 136a7d0..fbd4ca6 100644 --- a/libs/boxes/anchor.py +++ b/libs/boxes/anchor.py @@ -21,9 +21,25 @@ def anchors_plane(height, width, stride = 1.0, # ratios = kwargs.setdefault('ratios', [0.5, 1, 2.0]) # base = kwargs.setdefault('base', 16) anc = anchors(scales, ratios, base) - all_anchors = cython_anchor.anchors_plane(height, width, stride, anc) + all_anchors = cython_anchor.anchors_plane(height, width, stride, anc).astype(np.float32) return all_anchors +def jitter_gt_boxes(gt_boxes, jitter=0.1): + """ jitter the gtboxes, before adding them into rois, to be more robust for cls and rgs + gt_boxes: (G, 5) [x1 ,y1 ,x2, y2, class] int + """ + jittered_boxes = gt_boxes.copy() + ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 + hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 + width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws + height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs + jittered_boxes[:, 0] += width_offset + jittered_boxes[:, 2] += width_offset + jittered_boxes[:, 1] += height_offset + jittered_boxes[:, 3] += height_offset + + return jittered_boxes + # Written by Ross Girshick and Sean Bell def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2 ** np.arange(3, 6)): diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 5943fe4..fbee754 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -4,613 +4,310 @@ import tensorflow as tf -_IS_TRAINING = True +########################## +# restore +########################## +tf.app.flags.DEFINE_string( + 'train_dir', './output/mask_rcnn/', + 'Directory where checkpoints and event logs are written to.') -if _IS_TRAINING is True: - ########################## - # restore - ########################## - tf.app.flags.DEFINE_string( - 'train_dir', './output/mask_rcnn/', - 'Directory where checkpoints and event logs are written to.') +tf.app.flags.DEFINE_string( + 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', + 'Path to pretrained model') - tf.app.flags.DEFINE_string( - 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', - 'Path to pretrained model') +########################## +# network +########################## +tf.app.flags.DEFINE_string( + 'network', 'resnet50', + 'name of backbone network') - ########################## - # network - ########################## - tf.app.flags.DEFINE_string( - 'network', 'resnet50', - 'name of backbone network') +########################## +# dataset +########################## +tf.app.flags.DEFINE_bool( + 'update_bn', True, + 'Whether or not to update bacth normalization layer') - ########################## - # dataset - ########################## - tf.app.flags.DEFINE_bool( - 'update_bn', True, - 'Whether or not to update bacth normalization layer') +tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') - tf.app.flags.DEFINE_integer( - 'num_readers', 4, - 'The number of parallel readers that read data from the dataset.') +tf.app.flags.DEFINE_string( + 'dataset_name', 'coco', + 'The name of the dataset to load.') - tf.app.flags.DEFINE_string( - 'dataset_name', 'coco', - 'The name of the dataset to load.') +tf.app.flags.DEFINE_string( + 'dataset_split_name', 'train2014', + 'The name of the train/test/val split.') - tf.app.flags.DEFINE_string( - 'dataset_split_name', 'train2014', - 'The name of the train/test/val split.') +tf.app.flags.DEFINE_string( + 'dataset_split_name_test', 'train2014',#val2014 + 'The name of the test/val split.') - tf.app.flags.DEFINE_string( - 'dataset_dir', 'data/coco/', - 'The directory where the dataset files are stored.') +tf.app.flags.DEFINE_string( + 'dataset_dir', 'data/coco/', + 'The directory where the dataset files are stored.') - tf.app.flags.DEFINE_integer( - 'im_batch', 1, - 'number of images in a mini-batch') +tf.app.flags.DEFINE_integer( + 'im_batch', 1, + 'number of images in a mini-batch') - tf.app.flags.DEFINE_integer( - 'num_preprocessing_threads', 4, - 'The number of threads used to create the batches.') +tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') - tf.app.flags.DEFINE_integer( - 'log_every_n_steps', 10, - 'The frequency with which logs are print.') +tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') - tf.app.flags.DEFINE_integer( - 'save_summaries_secs', 60, - 'The frequency with which summaries are saved, in seconds.') +tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') - tf.app.flags.DEFINE_integer( - 'save_interval_secs', 7200, - 'The frequency with which the model is saved, in seconds.') +tf.app.flags.DEFINE_integer( + 'save_interval_secs', 7200, + 'The frequency with which the model is saved, in seconds.') - tf.app.flags.DEFINE_integer( - 'max_iters', 2500000, - 'max iterations') +tf.app.flags.DEFINE_integer( + 'max_iters', 2500000, + 'max iterations') - ###################### - # Optimization Flags # - ###################### +###################### +# Optimization Flags # +###################### - tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') +tf.app.flags.DEFINE_float( + 'weight_decay', 0.00005, 'The weight decay on the model weights.') - tf.app.flags.DEFINE_string( - 'optimizer', 'momentum', - 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' - '"ftrl", "momentum", "sgd" or "rmsprop".') +tf.app.flags.DEFINE_string( + 'optimizer', 'momentum', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') - tf.app.flags.DEFINE_float( - 'adadelta_rho', 0.95, - 'The decay rate for adadelta.') +tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') - tf.app.flags.DEFINE_float( - 'adagrad_initial_accumulator_value', 0.1, - 'Starting value for the AdaGrad accumulators.') +tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') - tf.app.flags.DEFINE_float( - 'adam_beta1', 0.9, - 'The exponential decay rate for the 1st moment estimates.') +tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') - tf.app.flags.DEFINE_float( - 'adam_beta2', 0.999, - 'The exponential decay rate for the 2nd moment estimates.') +tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') - tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') +tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') - tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, - 'The learning rate power.') +tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') - tf.app.flags.DEFINE_float( - 'ftrl_initial_accumulator_value', 0.1, - 'Starting value for the FTRL accumulators.') +tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') - tf.app.flags.DEFINE_float( - 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') +tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') - tf.app.flags.DEFINE_float( - 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') +tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') - tf.app.flags.DEFINE_float( - 'momentum', 0.99, - 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') +tf.app.flags.DEFINE_float( + 'momentum', 0.99, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') - tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') +tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') - tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') +tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') - ####################### - # Learning Rate Flags # - ####################### +####################### +# Learning Rate Flags # +####################### - tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', - 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' - ' or "polynomial"') +tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', 'exponential', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') - tf.app.flags.DEFINE_float('learning_rate', 0.0002, - 'Initial learning rate.') +tf.app.flags.DEFINE_float('learning_rate', 0.0002, + 'Initial learning rate.') - tf.app.flags.DEFINE_float( - 'end_learning_rate', 0.00001, - 'The minimal end learning rate used by a polynomial decay learning rate.') +tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.00001, + 'The minimal end learning rate used by a polynomial decay learning rate.') - tf.app.flags.DEFINE_float( - 'label_smoothing', 0.0, 'The amount of label smoothing.') +tf.app.flags.DEFINE_float( + 'label_smoothing', 0.0, 'The amount of label smoothing.') - tf.app.flags.DEFINE_float( - 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') +tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') - tf.app.flags.DEFINE_float( - 'num_epochs_per_decay', 2.0, - 'Number of epochs after which learning rate decays.') +tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays.') - tf.app.flags.DEFINE_bool( - 'sync_replicas', False, - 'Whether or not to synchronize the replicas during training.') +tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') - tf.app.flags.DEFINE_integer( - 'replicas_to_aggregate', 1, - 'The Number of gradients to collect before updating params.') +tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') - tf.app.flags.DEFINE_float( - 'moving_average_decay', None, - 'The decay to use for the moving average.' - 'If left as None, then moving averages are not used.') +tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') - ####################### - # Dataset Flags # - ####################### +####################### +# Dataset Flags # +####################### - tf.app.flags.DEFINE_string( - 'model_name', 'resnet50', - 'The name of the architecture to train.') +tf.app.flags.DEFINE_string( + 'model_name', 'resnet50', + 'The name of the architecture to train.') - tf.app.flags.DEFINE_string( - 'preprocessing_name', 'coco', - 'The name of the preprocessing to use. If left ' - 'as `None`, then the model_name flag is used.') +tf.app.flags.DEFINE_string( + 'preprocessing_name', 'coco', + 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') - tf.app.flags.DEFINE_integer( - 'batch_size', 1, - 'The number of samples in each batch.') +tf.app.flags.DEFINE_integer( + 'batch_size', 1, + 'The number of samples in each batch.') - tf.app.flags.DEFINE_integer( - 'train_image_size', None, 'Train image size') +tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') - tf.app.flags.DEFINE_integer('max_number_of_steps', None, - 'The maximum number of training steps.') +tf.app.flags.DEFINE_integer('max_number_of_steps', None, + 'The maximum number of training steps.') - tf.app.flags.DEFINE_string( - 'classes', None, - 'The classes to classify.') +tf.app.flags.DEFINE_string( + 'classes', None, + 'The classes to classify.') - tf.app.flags.DEFINE_integer( - 'image_min_size', 640, - 'resize image so that the min edge equals to image_min_size') +tf.app.flags.DEFINE_integer( + 'image_min_size', 640, + 'resize image so that the min edge equals to image_min_size') - ##################### - # Fine-Tuning Flags # - ##################### +##################### +# Fine-Tuning Flags # +##################### - tf.app.flags.DEFINE_string( - 'checkpoint_path', None, - 'The path to a checkpoint from which to fine-tune.') +tf.app.flags.DEFINE_string( + 'checkpoint_path', None, + 'The path to a checkpoint from which to fine-tune.') - tf.app.flags.DEFINE_string( - 'checkpoint_exclude_scopes', None, - 'Comma-separated list of scopes of variables to exclude when restoring ' - 'from a checkpoint.') +tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') - tf.app.flags.DEFINE_string( - 'checkpoint_include_scopes', None, - 'Comma-separated list of scopes of variables to include when restoring ' - 'from a checkpoint.') +tf.app.flags.DEFINE_string( + 'checkpoint_include_scopes', None, + 'Comma-separated list of scopes of variables to include when restoring ' + 'from a checkpoint.') - tf.app.flags.DEFINE_string( - 'trainable_scopes', None, - 'Comma-separated list of scopes to filter the set of variables to train.' - 'By default, None would train all the variables.') +tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') - tf.app.flags.DEFINE_boolean( - 'ignore_missing_vars', False, - 'When restoring a checkpoint would ignore missing variables.') +tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') - tf.app.flags.DEFINE_boolean( - 'restore_previous_if_exists', True, - 'When restoring a checkpoint would ignore missing variables.') - - ####################### - # BOX Flags # - ####################### - - tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'fg_threshold', 0.5, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be bg') - - tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'fg_roi_fraction', 0.25, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'fg_rpn_fraction', 0.25, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, - 'Number of rpn anchors that should be sampled to train this network') - - tf.app.flags.DEFINE_integer( - 'allow_border', 10, - 'How many pixels out of an image') - - ################################## - # NMS # - ################################## - - tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000, - 'Number of rpn anchors that should be sampled before nms') - - tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, - 'Number of rpn anchors that should be sampled after nms') - - tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 300, - "Number of inst after NMS") - - tf.app.flags.DEFINE_float( - 'rpn_nms_threshold', 0.7, - 'NMS threshold in RPN') - - tf.app.flags.DEFINE_float( - 'mask_nms_threshold', 0.3, - 'NMS threshold in mask network during testing') - - ################################## - # Mask # - ################################## - - tf.app.flags.DEFINE_boolean( - 'mask_allow_bg', True, - 'Allow to add bg masks in the masking stage') - - tf.app.flags.DEFINE_float( - 'mask_threshold', 0.50, - 'Least intersection of a positive mask') - tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'min_size', 2, - 'minimum size of an object') - - FLAGS = tf.app.flags.FLAGS -else: - ########################## - # restore - ########################## - tf.app.flags.DEFINE_string( - 'train_dir', './output/mask_rcnn/', - 'Directory where checkpoints and event logs are written to.') - - tf.app.flags.DEFINE_string( - 'pretrained_model', './data/pretrained_models/resnet_v1_50.ckpt', - 'Path to pretrained model') - - ########################## - # network - ########################## - tf.app.flags.DEFINE_string( - 'network', 'resnet50', - 'name of backbone network') +tf.app.flags.DEFINE_boolean( + 'restore_previous_if_exists', True, + 'When restoring a checkpoint would ignore missing variables.') - ########################## - # dataset - ########################## - tf.app.flags.DEFINE_bool( - 'update_bn', False, - 'Whether or not to update bacth normalization layer') - - tf.app.flags.DEFINE_integer( - 'num_readers', 4, - 'The number of parallel readers that read data from the dataset.') +####################### +# BOX Flags # +####################### - tf.app.flags.DEFINE_string( - 'dataset_name', 'coco', - 'The name of the dataset to load.') +tf.app.flags.DEFINE_float( + 'rpn_fg_threshold', 0.7, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') - tf.app.flags.DEFINE_string( - 'dataset_split_name', 'val2014', - 'The name of the train/test/val split.') +tf.app.flags.DEFINE_float( + 'rpn_bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be fg') - tf.app.flags.DEFINE_string( - 'dataset_dir', 'data/coco/', - 'The directory where the dataset files are stored.') +tf.app.flags.DEFINE_float( + 'fg_threshold', 0.5, + 'Only regions which intersection is larger than fg_threshold are considered to be fg') - tf.app.flags.DEFINE_integer( - 'im_batch', 1, - 'number of images in a mini-batch') +tf.app.flags.DEFINE_float( + 'bg_threshold', 0.3, + 'Only regions which intersection is less than bg_threshold are considered to be bg') +tf.app.flags.DEFINE_integer( + 'rois_per_image', 512, + 'Number of rois that should be sampled to train this network') - tf.app.flags.DEFINE_integer( - 'num_preprocessing_threads', 4, - 'The number of threads used to create the batches.') +tf.app.flags.DEFINE_float( + 'fg_roi_fraction', 0.25, + 'Number of rois that should be sampled to train this network') - tf.app.flags.DEFINE_integer( - 'log_every_n_steps', 10, - 'The frequency with which logs are print.') +tf.app.flags.DEFINE_float( + 'fg_rpn_fraction', 0.25, + 'Number of rois that should be sampled to train this network') - tf.app.flags.DEFINE_integer( - 'save_summaries_secs', 60, - 'The frequency with which summaries are saved, in seconds.') +tf.app.flags.DEFINE_integer( + 'rpn_batch_size', 512, + 'Number of rpn anchors that should be sampled to train this network') - tf.app.flags.DEFINE_integer( - 'save_interval_secs', 7200, - 'The frequency with which the model is saved, in seconds.') +tf.app.flags.DEFINE_integer( + 'allow_border', 0.0, + 'Percentage of bounding box height and length that are allowed to be out of an image boundary') - tf.app.flags.DEFINE_integer( - 'max_iters', 2500, - 'max iterations') - - ###################### - # Optimization Flags # - ###################### - - tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') - - tf.app.flags.DEFINE_string( - 'optimizer', 'momentum', - 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' - '"ftrl", "momentum", "sgd" or "rmsprop".') - - tf.app.flags.DEFINE_float( - 'adadelta_rho', 0.95, - 'The decay rate for adadelta.') - - tf.app.flags.DEFINE_float( - 'adagrad_initial_accumulator_value', 0.1, - 'Starting value for the AdaGrad accumulators.') - - tf.app.flags.DEFINE_float( - 'adam_beta1', 0.9, - 'The exponential decay rate for the 1st moment estimates.') - - tf.app.flags.DEFINE_float( - 'adam_beta2', 0.999, - 'The exponential decay rate for the 2nd moment estimates.') - - tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') - - tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, - 'The learning rate power.') - - tf.app.flags.DEFINE_float( - 'ftrl_initial_accumulator_value', 0.1, - 'Starting value for the FTRL accumulators.') - - tf.app.flags.DEFINE_float( - 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') - - tf.app.flags.DEFINE_float( - 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') - - tf.app.flags.DEFINE_float( - 'momentum', 0.99, - 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') - - tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') - - tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') - - ####################### - # Learning Rate Flags # - ####################### - - tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', - 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' - ' or "polynomial"') - - tf.app.flags.DEFINE_float('learning_rate', 0.0000, - 'Initial learning rate.') - - tf.app.flags.DEFINE_float( - 'end_learning_rate', 0.00000, - 'The minimal end learning rate used by a polynomial decay learning rate.') - - tf.app.flags.DEFINE_float( - 'label_smoothing', 0.0, 'The amount of label smoothing.') - - tf.app.flags.DEFINE_float( - 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') - - tf.app.flags.DEFINE_float( - 'num_epochs_per_decay', 2.0, - 'Number of epochs after which learning rate decays.') - - tf.app.flags.DEFINE_bool( - 'sync_replicas', False, - 'Whether or not to synchronize the replicas during training.') - - tf.app.flags.DEFINE_integer( - 'replicas_to_aggregate', 1, - 'The Number of gradients to collect before updating params.') - - tf.app.flags.DEFINE_float( - 'moving_average_decay', None, - 'The decay to use for the moving average.' - 'If left as None, then moving averages are not used.') - - ####################### - # Dataset Flags # - ####################### - - - tf.app.flags.DEFINE_string( - 'model_name', 'resnet50', - 'The name of the architecture to train.') - - tf.app.flags.DEFINE_string( - 'preprocessing_name', 'coco', - 'The name of the preprocessing to use. If left ' - 'as `None`, then the model_name flag is used.') - - tf.app.flags.DEFINE_integer( - 'batch_size', 1, - 'The number of samples in each batch.') - - tf.app.flags.DEFINE_integer( - 'train_image_size', None, 'Train image size') - - tf.app.flags.DEFINE_integer('max_number_of_steps', None, - 'The maximum number of training steps.') - - tf.app.flags.DEFINE_string( - 'classes', None, - 'The classes to classify.') - - tf.app.flags.DEFINE_integer( - 'image_min_size', 640, - 'resize image so that the min edge equals to image_min_size') - - ##################### - # Fine-Tuning Flags # - ##################### - - tf.app.flags.DEFINE_string( - 'checkpoint_path', None, - 'The path to a checkpoint from which to fine-tune.') - - tf.app.flags.DEFINE_string( - 'checkpoint_exclude_scopes', None, - 'Comma-separated list of scopes of variables to exclude when restoring ' - 'from a checkpoint.') - - tf.app.flags.DEFINE_string( - 'checkpoint_include_scopes', None, - 'Comma-separated list of scopes of variables to include when restoring ' - 'from a checkpoint.') - - tf.app.flags.DEFINE_string( - 'trainable_scopes', None, - 'Comma-separated list of scopes to filter the set of variables to train.' - 'By default, None would train all the variables.') - - tf.app.flags.DEFINE_boolean( - 'ignore_missing_vars', False, - 'When restoring a checkpoint would ignore missing variables.') - - tf.app.flags.DEFINE_boolean( - 'restore_previous_if_exists', True, - 'When restoring a checkpoint would ignore missing variables.') - - ####################### - # BOX Flags # - ####################### - - tf.app.flags.DEFINE_float( - 'rpn_fg_threshold', 0.7, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'rpn_bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'fg_threshold', 0.5, - 'Only regions which intersection is larger than fg_threshold are considered to be fg') - - tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, - 'Only regions which intersection is less than bg_threshold are considered to be bg') - - tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'fg_roi_fraction', 0.25, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'fg_rpn_fraction', 0.25, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, - 'Number of rpn anchors that should be sampled to train this network') - - tf.app.flags.DEFINE_integer( - 'allow_border', 10, - 'How many pixels out of an image') - - ################################## - # NMS # - ################################## - - tf.app.flags.DEFINE_integer( - 'pre_nms_top_n', 12000, - 'Number of rpn anchors that should be sampled before nms') - - tf.app.flags.DEFINE_integer( - 'post_nms_top_n', 2000, - 'Number of rpn anchors that should be sampled after nms') - - tf.app.flags.DEFINE_integer( - 'post_nms_inst_n', 300, - "Number of inst after NMS") - - tf.app.flags.DEFINE_float( - 'rpn_nms_threshold', 0.7, - 'NMS threshold in RPN') - - tf.app.flags.DEFINE_float( - 'mask_nms_threshold', 0.3, - 'NMS threshold in mask network during testing') - - ################################## - # Mask # - ################################## - - tf.app.flags.DEFINE_boolean( - 'mask_allow_bg', True, - 'Allow to add bg masks in the masking stage') - - tf.app.flags.DEFINE_float( - 'mask_threshold', 0.50, - 'Least intersection of a positive mask') - tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, - 'Number of rois that should be sampled to train this network') - - tf.app.flags.DEFINE_float( - 'min_size', 2, - 'minimum size of an object') - - FLAGS = tf.app.flags.FLAGS \ No newline at end of file +################################## +# NMS # +################################## + +tf.app.flags.DEFINE_integer( + 'pre_nms_top_n', 12000, + 'Number of rpn anchors that should be sampled before nms') + +tf.app.flags.DEFINE_integer( + 'post_nms_top_n', 2000, + 'Number of rpn anchors that should be sampled after nms') + +tf.app.flags.DEFINE_integer( + 'post_nms_inst_n', 300, + "Number of inst after NMS") + +tf.app.flags.DEFINE_float( + 'rpn_nms_threshold', 0.7, + 'NMS threshold in RPN') + +tf.app.flags.DEFINE_float( + 'mask_nms_threshold', 0.3, + 'NMS threshold in mask network during testing') + +################################## +# Mask # +################################## + +tf.app.flags.DEFINE_boolean( + 'mask_allow_bg', True, + 'Allow to add bg masks in the masking stage') + +tf.app.flags.DEFINE_float( + 'mask_threshold', 0.50, + 'Least intersection of a positive mask') +tf.app.flags.DEFINE_integer( + 'masks_per_image', 512, + 'Number of rois that should be sampled to train this network') + +tf.app.flags.DEFINE_float( + 'min_size', 2, + 'minimum size of an object') + +FLAGS = tf.app.flags.FLAGS diff --git a/libs/layers/anchor.py b/libs/layers/anchor.py index 876609f..fa33c2d 100644 --- a/libs/layers/anchor.py +++ b/libs/layers/anchor.py @@ -7,13 +7,13 @@ import libs.boxes.cython_bbox as cython_bbox import libs.configs.config_v1 as cfg from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes -from libs.boxes.anchor import anchors_plane +from libs.boxes.anchor import anchors_plane, jitter_gt_boxes from libs.logs.log import LOG # FLAGS = tf.app.flags.FLAGS _DEBUG = False -def encode(gt_boxes, all_anchors, height, width, stride, indexs): +def encode(gt_boxes, all_anchors, feature_height, feature_width, stride, image_height, image_width, ignore_cross_boundary=True): """Matching and Encoding groundtruth into learning targets Sampling @@ -21,8 +21,10 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): --------- gt_boxes: an array of shape (G x 5), [x1, y1, x2, y2, class] all_anchors: an array of shape (h, w, A, 4), - width: width of feature - height: height of feature + feature_height: height of feature + feature_width: width of feature + image_height: height of image + image_width: width of image stride: downscale factor w.r.t the input size, e.g., [4, 8, 16, 32] Returns -------- @@ -31,37 +33,20 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): bbox_inside_weights: N x (4), in {0, 1} indicating to which class is assigned. """ # TODO: speedup this module - # if all_anchors is None: - # all_anchors = anchors_plane(height, width, stride=stride) - - # # anchors, inds_inside, total_anchors - # border = cfg.FLAGS.allow_border - # all_anchors = all_anchors.reshape((-1, 4)) - # inds_inside = np.where( - # (all_anchors[:, 0] >= -border) & - # (all_anchors[:, 1] >= -border) & - # (all_anchors[:, 2] < (width * stride) + border) & - # (all_anchors[:, 3] < (height * stride) + border))[0] - # anchors = all_anchors[inds_inside, :] - + allow_border = cfg.FLAGS.allow_border all_anchors = all_anchors.reshape([-1, 4]) - anchors = all_anchors total_anchors = all_anchors.shape[0] - # labels = np.zeros((anchors.shape[0], ), dtype=np.float32) - labels = np.empty((anchors.shape[0], ), dtype=np.int32) + labels = np.empty((total_anchors, ), dtype=np.int32) labels.fill(-1) + jittered_gt_boxes = jitter_gt_boxes(gt_boxes[:, :4]) + clipped_gt_boxes = clip_boxes(jittered_gt_boxes, (image_height, image_width)) + if gt_boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(anchors, dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) - - # if _DEBUG: - # print ('gt_boxes shape: ', gt_boxes.shape) - # print ('anchors shape: ', anchors.shape) - # print ('overlaps shape: ', overlaps.shape) - + np.ascontiguousarray(all_anchors, dtype=np.float), + np.ascontiguousarray(clipped_gt_boxes, dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) # (A) max_overlaps = overlaps[np.arange(total_anchors), gt_assignment] @@ -69,47 +54,20 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): gt_max_overlaps = overlaps[gt_argmax_overlaps, np.arange(overlaps.shape[1])] + # bg label: less than threshold IOU labels[max_overlaps < cfg.FLAGS.rpn_bg_threshold] = 0 - - if _DEBUG: - print ('gt_assignment shape: ', gt_assignment.shape) - print ('max_overlaps shape: ', max_overlaps.shape) - print ('gt_argmax_overlaps shape: ', gt_argmax_overlaps.shape) - print ('gt_max_overlaps shape: ', gt_max_overlaps.shape) - - if True: - # this is sentive to boxes of little overlaps, no need! - # gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] - - # fg label: for each gt, hard-assign anchor with highest overlap despite its overlaps - labels[gt_argmax_overlaps] = 1 - - # exclude examples with little overlaps - # added later - # excludes = np.where(gt_max_overlaps < cfg.FLAGS.bg_threshold)[0] - # labels[gt_argmax_overlaps[excludes]] = -1 - - # if _DEBUG: - # min_ov = np.min(gt_max_overlaps) - # max_ov = np.max(gt_max_overlaps) - # mean_ov = np.mean(gt_max_overlaps) - # if min_ov < cfg.FLAGS.bg_threshold: - # LOG('ANCHOREncoder: overlaps: (min %.3f mean:%.3f max:%.3f), stride: %d, shape:(h:%d, w:%d)' - # % (min_ov, mean_ov, max_ov, stride, height, width)) - # worst = gt_boxes[np.argmin(gt_max_overlaps)] - # anc = anchors[gt_argmax_overlaps[np.argmin(gt_max_overlaps)], :] - # LOG('ANCHOREncoder: worst case: overlap: %.3f, box:(%.1f, %.1f, %.1f, %.1f %d), anchor:(%.1f, %.1f, %.1f, %.1f)' - # % (min_ov, worst[0], worst[1], worst[2], worst[3], worst[4], - # anc[0], anc[1], anc[2], anc[3])) - - - # fg label: above threshold IOU + # fg label: above threshold IOU labels[max_overlaps >= cfg.FLAGS.rpn_fg_threshold] = 1 - if _DEBUG: - print('highest cover :', gt_max_overlaps.shape) - print('more than 0.7 :', len(max_overlaps >= cfg.FLAGS.rpn_fg_threshold)) - print('labels is 1 :', len(labels == 1)) + # ignore cross-boundary anchors + if ignore_cross_boundary is True: + cb_inds = _get_cross_boundary(all_anchors, image_height, image_width, allow_border) + labels[cb_inds] = -1 + + # this is sentive to boxes of little overlaps, use with caution! + gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0] + # fg label: for each gt, hard-assign anchor with highest overlap despite its overlaps + labels[gt_argmax_overlaps] = 1 # subsample positive labels if there are too many num_fg = int(cfg.FLAGS.fg_rpn_fraction * cfg.FLAGS.rpn_batch_size) @@ -132,23 +90,17 @@ def encode(gt_boxes, all_anchors, height, width, stride, indexs): bbox_targets = np.zeros((total_anchors, 4), dtype=np.float32) if gt_boxes.size > 0: - bbox_targets = _compute_targets(anchors, gt_boxes[gt_assignment, :]) + bbox_targets = _compute_targets(all_anchors, gt_boxes[gt_assignment, :]) bbox_inside_weights = np.zeros((total_anchors, 4), dtype=np.float32) bbox_inside_weights[labels == 1, :] = 1.0#0.1 - # # mapping to whole outputs - # labels = _unmap(labels, total_anchors, inds_inside, fill=-1) - # bbox_targets = _unmap(bbox_targets, total_anchors, inds_inside, fill=0) - # bbox_inside_weights = _unmap(bbox_inside_weights, total_anchors, inds_inside, fill=0) - - labels = labels.reshape((1, height, width, -1)) - indexs = indexs.reshape((1, height, width, -1)) - bbox_targets = bbox_targets.reshape((1, height, width, -1)) - bbox_inside_weights = bbox_inside_weights.reshape((1, height, width, -1)) + labels = labels.reshape((1, feature_height, feature_width, -1)) + bbox_targets = bbox_targets.reshape((1, feature_height, feature_width, -1)) + bbox_inside_weights = bbox_inside_weights.reshape((1, feature_height, feature_width, -1)) - return labels, bbox_targets, bbox_inside_weights, indexs + return labels, bbox_targets, bbox_inside_weights -def decode(boxes, scores, all_anchors, ih, iw): +def decode(boxes, scores, all_anchors, image_height, image_width): """Decode outputs into boxes Parameters --------- @@ -162,24 +114,19 @@ def decode(boxes, scores, all_anchors, ih, iw): classes: of shape (R) in {0,1,2,3... K-1} scores: of shape (R) in [0 ~ 1] """ - # h, w = boxes.shape[1], boxes.shape[2] - # if all_anchors is None: - # stride = 2 ** int(round(np.log2((iw + 0.0) / w))) - # all_anchors = anchors_plane(h, w, stride=stride) all_anchors = all_anchors.reshape((-1, 4)) boxes = boxes.reshape((-1, 4)) scores = scores.reshape((-1, 2)) + assert scores.shape[0] == boxes.shape[0] == all_anchors.shape[0], \ - 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0],boxes.shape[0],all_anchors.reshape[0]) - index = np.arange(scores.shape[0]).astype(np.int32) + 'Anchor layer shape error %d vs %d vs %d' % (scores.shape[0], boxes.shape[0], all_anchors.reshape[0]) + boxes = bbox_transform_inv(all_anchors, boxes) - classes = np.argmax(scores, axis=1) + boxes = clip_boxes(boxes, (image_height, image_width)) + classes = np.argmax(scores, axis=1).astype(np.int32) scores = scores[:, 1] - final_boxes = boxes - final_boxes = clip_boxes(final_boxes, (ih, iw)) - classes = classes.astype(np.int32) - - return final_boxes, classes, scores, index + + return boxes, classes, scores def sample(boxes, scores, ih, iw, is_training): """ @@ -224,6 +171,15 @@ def _compute_targets(ex_rois, gt_rois): return bbox_transform(ex_rois, gt_rois[:, :4]).astype(np.float32, copy=False) +def _get_cross_boundary(anchors, image_height, image_width, allow_border): + + cb_inds = np.where((anchors[:, 0] <= -(anchors[:, 2] - anchors[:, 0]) * allow_border) & + (anchors[:, 1] <= -(anchors[:, 3] - anchors[:, 1]) * allow_border) & + (anchors[:, 2] >= image_width + (anchors[:, 2] - anchors[:, 0]) * allow_border) & + (anchors[:, 3] >= image_height + (anchors[:, 3] - anchors[:, 1]) * allow_border))[0] + + return cb_inds + if __name__ == '__main__': import time diff --git a/libs/layers/crop.py b/libs/layers/crop.py index cd18deb..eff162c 100644 --- a/libs/layers/crop.py +++ b/libs/layers/crop.py @@ -4,7 +4,7 @@ import tensorflow as tf -def crop(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, pooled_width = 7, scope='ROIAlign'): +def crop(images, boxes, batch_inds, image_height, image_width, stride = 1, pooled_height = 7, pooled_width = 7, scope='ROIAlign'): """Cropping areas of features into fixed size Params: -------- @@ -26,8 +26,8 @@ def crop(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, poole xs = boxes[:, 0] ys = boxes[:, 1] - xs = xs / tf.cast(iw, tf.float32) - ys = ys / tf.cast(ih, tf.float32) + xs = xs / tf.cast(image_width, tf.float32) + ys = ys / tf.cast(image_height, tf.float32) boxes = tf.concat([ys[:, tf.newaxis], xs[:, tf.newaxis]], axis=1) boxes = tf.reshape(boxes, [-1, 4]) # to (y1, x1, y2, x2) @@ -43,5 +43,5 @@ def crop(images, boxes, batch_inds, ih, iw, stride = 1, pooled_height = 7, poole return [tf.image.crop_and_resize(images, boxes, batch_inds, [pooled_height, pooled_width], method='bilinear', - name='Crop')] + [boxes] + [shape] + [[ih,iw]] + name='Crop')] + [boxes] diff --git a/libs/layers/mask.py b/libs/layers/mask.py index 109937d..5becd6e 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -12,7 +12,7 @@ _DEBUG = False -def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): +def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): """Encode masks groundtruth into learnable targets Sample some exmaples @@ -63,8 +63,8 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index gt_height = gt_masks.shape[1] gt_width = gt_masks.shape[2] - enlarged_width = mask_width*20 - enlarged_height = mask_height*20 + enlarged_width = mask_width*20.0 + enlarged_height = mask_height*20.0 roi = rois[i, :4] cropped = gt_masks[gt_assignment[i], :, :] @@ -77,8 +77,6 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index mask_targets[i, :, :, labels[i]] = cropped mask_inside_weights[i, :, :, labels[i]] = 1.0 - - mask_rois = rois[:, :4] else: # there is no gt @@ -87,73 +85,7 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, index mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) mask_rois = np.zeros((total_masks, 4), dtype=np.float32) - return labels, mask_targets, mask_inside_weights, mask_rois, indexs - -# def encode_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs): -# """Encode masks groundtruth into learnable targets -# Sample some exmaples - -# Params -# ------ -# gt_masks: image_height x image_width {0, 1} matrix, of shape (G, imh, imw) -# gt_boxes: ground-truth boxes of shape (G, 5), each raw is [x1, y1, x2, y2, class] -# rois: the bounding boxes of shape (N, 4), -# ## scores: scores of shape (N, 1) -# num_classes; K -# mask_height, mask_width: height and width of output masks - -# Returns -# ------- -# # rois: boxes sampled for cropping masks, of shape (M, 4) -# labels: class-ids of shape (M, 1) -# mask_targets: learning targets of shape (M, pooled_height, pooled_width, K) in {0, 1} values -# mask_inside_weights: of shape (M, pooled_height, pooled_width, K) in {0, 1}Í indicating which mask is sampled -# """ -# total_masks = rois.shape[0] -# if gt_boxes.size > 0: -# # B x G -# overlaps = cython_bbox.bbox_overlaps( -# np.ascontiguousarray(rois[:, 0:4], dtype=np.float), -# np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) -# gt_assignment = overlaps.argmax(axis=1) # shape is N -# max_overlaps = overlaps[np.arange(len(gt_assignment)), gt_assignment] # N -# # note: this will assign every rois with a positive label -# # labels = gt_boxes[gt_assignment, 4] # N -# labels = np.zeros((total_masks, ), np.int32) -# labels[:] = -1 - -# # sample positive rois which intersection is more than 0.5 -# keep_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] -# num_masks = int(min(keep_inds.size, cfg.FLAGS.masks_per_image)) -# if keep_inds.size > 0 and num_masks < keep_inds.size: -# keep_inds = np.random.choice(keep_inds, size=num_masks, replace=False) -# -# labels[keep_inds] = gt_boxes[gt_assignment[keep_inds], -1] - -# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) -# mask_inside_weights = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) -# rois [rois < 0] = 0 - -# # TODO: speed bottleneck? -# for i in keep_inds: -# roi = rois[i, :4] -# cropped = gt_masks[gt_assignment[i], int(round(roi[1])):int(round(roi[3])), int(round(roi[0])):int(round(roi[2]))] -# cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_LINEAR) - -# mask_targets[i, :, :, labels[i]] = cropped -# mask_inside_weights[i, :, :, labels[i]] = 1 -# # print("in mask.py rois: ", roi) -# mask_rois = rois[:, :4] -# # print("in mask.py rois2: ") -# # print(mask_rois) -# else: -# # there is no gt -# labels = np.zeros((total_masks, ), np.int32) -# labels[:] = -1 -# mask_targets = np.zeros((total_masks, mask_height, mask_width, num_classes), dtype=np.float32) -# mask_inside_weights = np.zeros((total_masks, mask_height, mask_height, num_classes), dtype=np.float32) -# mask_rois = np.zeros((total_masks, 4), dtype=np.float32) -# return labels, mask_targets, mask_inside_weights, mask_rois, indexs + return labels, mask_targets, mask_inside_weights, mask_rois def decode(mask_targets, rois, classes, ih, iw): """Decode outputs into final masks diff --git a/libs/layers/roi.py b/libs/layers/roi.py index a2a3286..6e9b30f 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -13,7 +13,7 @@ _DEBUG = False -def encode(gt_boxes, rois, num_classes, indexs): +def encode(gt_boxes, rois, num_classes): """Matching and Encoding groundtruth boxes (gt_boxes) into learning targets to boxes Sampling Parameters @@ -35,7 +35,7 @@ def encode(gt_boxes, rois, num_classes, indexs): # R x G matrix overlaps = cython_bbox.bbox_overlaps( np.ascontiguousarray(all_rois[:, 0:4], dtype=np.float), - np.ascontiguousarray(gt_boxes[:, :4], dtype=np.float)) + np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) # R # max_overlaps = overlaps.max(axis=1) # R max_overlaps = overlaps[np.arange(rois.shape[0]), gt_assignment] @@ -68,16 +68,6 @@ def encode(gt_boxes, rois, num_classes, indexs): labels[ignore_inds] = -1 keep_inds = np.append(fg_inds, bg_inds) - if _DEBUG: - print ('keep_inds') - print (keep_inds) - print ('fg_inds') - print (fg_inds) - print ('bg_inds') - print (bg_inds) - print ('bg_rois:', bg_rois) - print ('cfg.FLAGS.bg_threshold:', cfg.FLAGS.bg_threshold) - # print (max_overlaps) bbox_targets, bbox_inside_weights = _compute_targets( rois[keep_inds, 0:4], gt_boxes[gt_assignment[keep_inds], :4], labels[keep_inds], num_classes) @@ -97,7 +87,7 @@ def encode(gt_boxes, rois, num_classes, indexs): labels[ignore_inds] = -1 max_overlaps = labels - return labels, bbox_targets, bbox_inside_weights, max_overlaps.astype(np.float32), indexs + return labels, bbox_targets, bbox_inside_weights def decode(boxes, scores, rois, ih, iw): """Decode prediction targets into boxes and only keep only one boxes of greatest possibility for each rois @@ -149,7 +139,7 @@ def _compute_targets(ex_rois, gt_rois, labels, num_classes): start = 4 * cls end = start + 4 bbox_targets[ind, start:end] = targets[ind, 0:4] - bbox_inside_weights[ind, start:end] = 1 + bbox_inside_weights[ind, start:end] = 1.0 return bbox_targets, bbox_inside_weights def _unmap(data, count, inds, fill=0): diff --git a/libs/layers/sample.py b/libs/layers/sample.py index a3312b0..683d8ab 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -2,7 +2,6 @@ from __future__ import division from __future__ import print_function -import tensorflow as tf import numpy as np import libs.configs.config_v1 as cfg @@ -13,7 +12,7 @@ _DEBUG=False -def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False, with_nms=False, random=False): +def sample_rpn_outputs(boxes, scores, is_training=False, only_positive=False, with_nms=False, random=False): """Sample boxes according to scores and some learning strategies assuming the first class is background Params: @@ -41,22 +40,17 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F keeps = np.where(scores > 0.5)[0] boxes = boxes[keeps, :] scores = scores[keeps] - indexs = indexs[keeps] ## filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) boxes = boxes[keeps, :] scores = scores[keeps] - indexs = indexs[keeps] - - # scores_ = scores ## filter before nms if random is True: keeps = np.random.choice(np.arange(boxes.shape[0]), size=pre_nms_top_n, replace=False) boxes = boxes[keeps, :] scores = scores[keeps] - indexs = indexs[keeps] else: if len(scores) > pre_nms_top_n: partial_order = scores.ravel() @@ -64,44 +58,32 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F boxes = boxes[partial_order, :] scores = scores[partial_order] - indexs = indexs[partial_order] - - ## filter before nms - if len(scores) > pre_nms_top_n: - partial_order = scores.ravel() - partial_order = np.argpartition(-partial_order, pre_nms_top_n)[:pre_nms_top_n] - boxes = boxes[partial_order, :] - scores = scores[partial_order] - indexs = indexs[partial_order] - -## sort + ## sort order = scores.ravel().argsort()[::-1] boxes = boxes[order, :] scores = scores[order] - indexs = indexs[order] - # if len(scores_) > pre_nms_top_n: - # scores_ = scores_[scores_.ravel().argsort()[::-1][:pre_nms_top_n]] - # print(np.array_equal(scores_, scores)) - ## filter by nms if with_nms is True: det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, rpn_nms_threshold) boxes = boxes[keeps, :] scores = scores[keeps].astype(np.float32) - indexs = indexs[keeps] ## filter after nms if post_nms_top_n > 0: boxes = boxes[:post_nms_top_n, :] scores = scores[:post_nms_top_n] - indexs = indexs[:post_nms_top_n] + + #create dummpy box in case of no box remains + if boxes.size is 0: + boxes = np.array([[0,0,16,16]], dtype=np.float32) + scores = np.array([0,], dtype=np.float32) batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) - # # random sample boxes + ## random sample boxes ## try early sample later # fg_inds = np.where(scores > 0.5)[0] # num_fgs = min(len(fg_inds.size), int(rois_per_image * fg_roi_fraction)) @@ -114,55 +96,65 @@ def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=F # ws = boxes[:, 2] - boxes[:, 0] # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' # print(boxes.shape) - return boxes, scores, batch_inds, indexs + return boxes, scores, batch_inds -def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): - """sample boxes for refined output""" - boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training=is_training, only_positive=only_positive, with_nms=True) +def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, is_training=False, only_positive=False): + """sample boxes using RPN scores + only_positive: Flag to exclude bbox with RPN score less than 0.5 + with_nms: Flag to use NMS + """ + boxes, scores, batch_inds = sample_rpn_outputs(boxes, scores, is_training=is_training, only_positive=only_positive, with_nms=True) - if gt_boxes.size > 0: + if gt_boxes.size > 0 and boxes.size > 0: overlaps = cython_bbox.bbox_overlaps( np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) gt_assignment = overlaps.argmax(axis=1) # B max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B + + ## rcnn foreground bbox with high overlap fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] + ## rcnn foreground bbox with highest overlap area on gt + gt_argmax_overlaps = overlaps.argmax(axis=0) # G - if True: - gt_argmax_overlaps = overlaps.argmax(axis=0) # G - fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) + fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) + ## mask foreground bbox with high overlap mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] + ## limit mask foreground bbox if mask_fg_inds.size > cfg.FLAGS.masks_per_image: mask_fg_inds = np.random.choice(mask_fg_inds, size=cfg.FLAGS.masks_per_image, replace=False) + ## limit rcnn foreground bbox fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) if fg_inds.size > 0 and fg_rois < fg_inds.size: fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) - # TODO: sampling strategy + ## limit rcnn background bbox + ## TODO: sampling strategy bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] - bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 + bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), 8))#cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 if bg_inds.size > 0 and bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) - keep_inds = np.append(fg_inds, bg_inds) + + ## quick fix for mask foreground is null if mask_fg_inds.size is 0: mask_fg_inds = keep_inds else: bg_inds = np.arange(boxes.shape[0]) - bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 + bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), 8))# cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 if bg_rois < bg_inds.size: bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) keep_inds = bg_inds mask_fg_inds = bg_inds - return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ - boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] + return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], \ + boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds] -def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): +def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): min_size = cfg.FLAGS.min_size mask_nms_threshold = cfg.FLAGS.mask_nms_threshold post_nms_inst_n = cfg.FLAGS.post_nms_inst_n @@ -172,7 +164,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): boxes = boxes.reshape((-1, 4)) classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) - indexs = indexs.reshape((-1, 1)) probs = probs.reshape((-1, 81)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' @@ -180,7 +171,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -188,7 +178,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -196,7 +185,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -204,7 +192,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter with nms order = scores.ravel().argsort()[::-1] scores = scores[order] - indexs = indexs[order] boxes = boxes[order, :] classes = classes[order] prob = prob[order, :] @@ -216,7 +203,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): if post_nms_inst_n > 0: keeps = keeps[:post_nms_inst_n] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -225,7 +211,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): #@TODO if len(classes) is 0: scores = np.zeros((1, 1)) - indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([0]) prob = np.zeros((1,81)) @@ -236,14 +221,12 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): boxes = boxes.reshape((-1, 4)) classes = classes.reshape((-1, 1)) scores = scores.reshape((-1, 1)) - indexs = indexs.reshape((-1, 1)) prob = prob.reshape((-1, 81)) assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' # filter background keeps = np.where(classes != 0)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -251,7 +234,6 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): # filter minimum size keeps = _filter_boxes(boxes, min_size=min_size) scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] @@ -259,62 +241,55 @@ def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=False): #filter with scores keeps = np.where(scores > 0.5)[0] scores = scores[keeps] - indexs = indexs[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] - __scores = [] - __indexs = [] - __boxes = [] - __classes = [] - __prob = [] + all_scores = [] + all_boxes = [] + all_classes = [] + all_prob = [] for c in range(1,(prob.shape[1])): - _keeps = (classes == c).reshape(-1) + keeps = (classes == c).reshape(-1) - _scores = scores[_keeps] - _indexs = indexs[_keeps] - _boxes = boxes[_keeps, :] - _classes = classes[_keeps] - _prob = prob[_keeps, :] + per_class_scores = scores[keeps] + per_class_boxes = boxes[keeps, :] + per_class_classes = classes[keeps] + per_class_prob = prob[keeps, :] # filter with nms - _order = _scores.ravel().argsort()[::-1] - _scores = _scores[_order] - _indexs = _indexs[_order] - _boxes = _boxes[_order, :] - _classes = _classes[_order] - _prob = _prob[_order, :] - - _det = np.hstack((_boxes, _scores)).astype(np.float32) - _keeps = nms_wrapper.nms(_det, mask_nms_threshold) + order = per_class_scores.ravel().argsort()[::-1] + per_class_scores = per_class_scores[order] + per_class_boxes = per_class_boxes[order, :] + per_class_classes = per_class_classes[order] + per_class_prob = per_class_prob[order, :] + + det = np.hstack((per_class_boxes, per_class_scores)).astype(np.float32) + keeps = nms_wrapper.nms(det, mask_nms_threshold) # filter low score if post_nms_inst_n > 0: - _keeps = _keeps[:post_nms_inst_n] - __scores.append(_scores[_keeps]) - __indexs.append(_indexs[_keeps]) - __boxes.append(_boxes[_keeps, :]) - __classes.append(_classes[_keeps]) - __prob.append(_prob[_keeps, :]) - - scores = np.vstack(__scores) - indexs = np.vstack(__indexs) - boxes = np.vstack(__boxes) - classes = np.vstack(__classes).reshape(-1) - prob = np.vstack(__prob) + keeps = keeps[:post_nms_inst_n] + all_scores.append(per_class_scores[keeps]) + all_boxes.append(per_class_boxes[keeps, :]) + all_classes.append(per_class_classes[keeps]) + all_prob.append(per_class_prob[keeps, :]) + + scores = np.vstack(all_scores) + boxes = np.vstack(all_boxes) + classes = np.vstack(all_classes).reshape(-1) + prob = np.vstack(all_prob) if len(classes) is 0: scores = np.zeros((1, 1)) - indexs = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) classes = np.array([0]).reshape(-1) prob = np.zeros((1,81)) batch_inds = np.zeros([boxes.shape[0]]) - return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) + return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32) def _jitter_boxes(boxes, jitter=0.1): """ jitter the boxes before appending them into rois @@ -376,297 +351,11 @@ def _apply_nms(boxes, scores, threshold = 0.5): boxes = np.hstack((boxes, s)) scores = np.random.rand(N, 1) - indexs = np.arange(N) # scores_ = 1 - np.random.rand(N, 1) # scores = np.hstack((scores, scores_)) - boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, only_positive=False) + boxes, scores, batch_inds = sample_rpn_outputs(boxes, scores, only_positive=False) print ('average time %f' % ((time.time() - t) / 10)) - - - - -# from __future__ import absolute_import -# from __future__ import division -# from __future__ import print_function - -# import tensorflow as tf -# import numpy as np - -# import libs.configs.config_v1 as cfg -# import libs.boxes.nms_wrapper as nms_wrapper -# import libs.boxes.cython_bbox as cython_bbox -# from libs.boxes.bbox_transform import bbox_transform, bbox_transform_inv, clip_boxes -# from libs.logs.log import LOG - -# _DEBUG=False - -# def sample_rpn_outputs(boxes, scores, indexs, is_training=False, only_positive=False, with_nms=False): -# """Sample boxes according to scores and some learning strategies -# assuming the first class is background -# Params: -# boxes: of shape (..., Ax4), each entry is [x1, y1, x2, y2], the last axis has k*4 dims -# scores: of shape (..., A), probs of fg, in [0, 1] -# """ -# min_size = cfg.FLAGS.min_size -# rpn_nms_threshold = cfg.FLAGS.rpn_nms_threshold -# pre_nms_top_n = cfg.FLAGS.pre_nms_top_n -# post_nms_top_n = cfg.FLAGS.post_nms_top_n - -# # training: 12000, 2000 -# # testing: 6000, 400 -# # if not is_training: -# # pre_nms_top_n = int(pre_nms_top_n / 2) -# # post_nms_top_n = int(post_nms_top_n / 5) - -# boxes = boxes.reshape((-1, 4)) -# scores = scores.reshape((-1, 1)) -# assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' - -# ## filter backgrounds -# ## Hope this will filter most of background anchors, since a argsort is too slow.. -# if only_positive: -# keeps = np.where(scores > 0.5)[0] -# boxes = boxes[keeps, :] -# scores = scores[keeps] -# indexs = indexs[keeps] - -# ## filter minimum size -# keeps = _filter_boxes(boxes, min_size=min_size) -# boxes = boxes[keeps, :] -# scores = scores[keeps] -# indexs = indexs[keeps] - -# ## sort and filter before nms -# if len(scores) <= pre_nms_top_n: ##full sort -# order = scores.ravel().argsort()[::-1] -# if pre_nms_top_n > 0: -# order = order[:pre_nms_top_n] -# else: ## partial + full sort -# order = scores.ravel() -# order = np.argsort((order[np.argpartition(-order, pre_nms_top_n)])[0:pre_nms_top_n:])[::-1] -# boxes = boxes[order, :] -# scores = scores[order] -# indexs = indexs[order] - -# ## filter by nms -# if with_nms is True: -# det = np.hstack((boxes, scores)).astype(np.float32) -# keeps = nms_wrapper.nms(det, rpn_nms_threshold) - -# ## filter after nms -# if post_nms_top_n > 0: -# keeps = keeps[:post_nms_top_n] -# boxes = boxes[keeps, :] -# scores = scores[keeps].astype(np.float32) -# indexs = indexs[keeps] - - -# batch_inds = np.zeros([boxes.shape[0]], dtype=np.int32) - -# # # random sample boxes -# ## try early sample later -# # fg_inds = np.where(scores > 0.5)[0] -# # num_fgs = min(len(fg_inds.size), int(rois_per_image * fg_roi_fraction)) - -# # if _DEBUG: -# # LOG('SAMPLE: %d rois has been choosen' % len(scores)) -# # LOG('SAMPLE: a positive box: %d %d %d %d %.4f' % (boxes[0, 0], boxes[0, 1], boxes[0, 2], boxes[0, 3], scores[0])) -# # LOG('SAMPLE: a negative box: %d %d %d %d %.4f' % (boxes[-1, 0], boxes[-1, 1], boxes[-1, 2], boxes[-1, 3], scores[-1])) -# # hs = boxes[:, 3] - boxes[:, 1] -# # ws = boxes[:, 2] - boxes[:, 0] -# # assert min(np.min(hs), np.min(ws)) > 0, 'invalid boxes' - -# return boxes, scores, batch_inds, indexs - -# def sample_rpn_outputs_wrt_gt_boxes(boxes, scores, gt_boxes, indexs, is_training=False, only_positive=False): -# """sample boxes for refined output""" -# boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, is_training=is_training, only_positive=only_positive, with_nms=True) - -# if gt_boxes.size > 0: -# overlaps = cython_bbox.bbox_overlaps( -# np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), -# np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) -# gt_assignment = overlaps.argmax(axis=1) # B -# max_overlaps = overlaps[np.arange(boxes.shape[0]), gt_assignment] # B -# fg_inds = np.where(max_overlaps >= cfg.FLAGS.fg_threshold)[0] - -# if True: -# gt_argmax_overlaps = overlaps.argmax(axis=0) # G -# fg_inds = np.union1d(gt_argmax_overlaps, fg_inds) - -# mask_fg_inds = np.where(max_overlaps >= cfg.FLAGS.mask_threshold)[0] - -# if mask_fg_inds.size > cfg.FLAGS.masks_per_image: -# mask_fg_inds = np.random.choice(mask_fg_inds, size=cfg.FLAGS.masks_per_image, replace=False) - -# fg_rois = int(min(fg_inds.size, cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction)) -# if fg_inds.size > 0 and fg_rois < fg_inds.size: -# fg_inds = np.random.choice(fg_inds, size=fg_rois, replace=False) - -# # TODO: sampling strategy -# bg_inds = np.where((max_overlaps < cfg.FLAGS.bg_threshold))[0] -# bg_rois = int(max(min(cfg.FLAGS.rois_per_image - fg_rois, fg_rois * 3), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 -# if bg_inds.size > 0 and bg_rois < bg_inds.size: -# bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) - -# keep_inds = np.append(fg_inds, bg_inds) -# if mask_fg_inds.size is 0: -# mask_fg_inds = keep_inds -# else: -# bg_inds = np.arange(boxes.shape[0]) -# bg_rois = int(min(cfg.FLAGS.rois_per_image * (1-cfg.FLAGS.fg_roi_fraction), cfg.FLAGS.rois_per_image * cfg.FLAGS.fg_roi_fraction))#128 -# if bg_rois < bg_inds.size: -# bg_inds = np.random.choice(bg_inds, size=bg_rois, replace=False) - -# keep_inds = bg_inds -# mask_fg_inds = bg_inds - -# return boxes[keep_inds, :], scores[keep_inds], batch_inds[keep_inds], indexs[keep_inds],\ -# boxes[mask_fg_inds, :], scores[mask_fg_inds], batch_inds[mask_fg_inds], indexs[mask_fg_inds] - -# def sample_rcnn_outputs(boxes, classes, prob, indexs, class_agnostic=True): -# min_size = cfg.FLAGS.min_size -# mask_nms_threshold = cfg.FLAGS.mask_nms_threshold -# post_nms_inst_n = cfg.FLAGS.post_nms_inst_n -# if class_agnostic is True: -# scores = prob[range(prob.shape[0]),classes] - -# boxes = boxes.reshape((-1, 4)) -# scores = scores.reshape((-1, 1)) -# indexs = indexs.reshape((-1, 1)) -# assert scores.shape[0] == boxes.shape[0], 'scores and boxes dont match' - -# # filter background -# keeps = np.where(classes != 0)[0] -# scores = scores[keeps] -# indexs = indexs[keeps] -# boxes = boxes[keeps, :] -# classes = classes[keeps] -# prob = prob[keeps, :] - -# # filter minimum size -# keeps = _filter_boxes(boxes, min_size=min_size) -# scores = scores[keeps] -# indexs = indexs[keeps] -# boxes = boxes[keeps, :] -# classes = classes[keeps] -# prob = prob[keeps, :] - -# #filter with scores -# keeps = np.where(scores > 0.5)[0] -# scores = scores[keeps] -# indexs = indexs[keeps] -# boxes = boxes[keeps, :] -# classes = classes[keeps] -# prob = prob[keeps, :] - -# # filter with nms -# order = scores.ravel().argsort()[::-1] -# scores = scores[order] -# indexs = indexs[order] -# boxes = boxes[order, :] -# classes = classes[order] -# prob = prob[order, :] - -# det = np.hstack((boxes, scores)).astype(np.float32) -# keeps = nms_wrapper.nms(det, mask_nms_threshold) - - -# # filter low score -# if post_nms_inst_n > 0: -# keeps = keeps[:post_nms_inst_n] -# scores = scores[keeps] -# indexs = indexs[keeps] -# boxes = boxes[keeps, :] -# classes = classes[keeps] -# prob = prob[keeps, :] - -# # quick fix for tensorflow error when no bbox presents -# #@TODO -# if len(classes) is 0: -# scores = np.zeros((1, 1)) -# indexs = np.zeros((1, 1)) -# boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) -# classes = np.array([[0]]) -# prob = np.zeros((1,81)) - -# else: -# #@TODO -# raise "inference nms type error" - -# batch_inds = np.zeros([boxes.shape[0]]) - -# return boxes.astype(np.float32), classes.astype(np.int32), prob.astype(np.float32), batch_inds.astype(np.int32), indexs.astype(np.int32) - -# def _jitter_boxes(boxes, jitter=0.1): -# """ jitter the boxes before appending them into rois -# """ -# jittered_boxes = boxes.copy() -# ws = jittered_boxes[:, 2] - jittered_boxes[:, 0] + 1.0 -# hs = jittered_boxes[:, 3] - jittered_boxes[:, 1] + 1.0 -# width_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * ws -# height_offset = (np.random.rand(jittered_boxes.shape[0]) - 0.5) * jitter * hs -# jittered_boxes[:, 0] += width_offset -# jittered_boxes[:, 2] += width_offset -# jittered_boxes[:, 1] += height_offset -# jittered_boxes[:, 3] += height_offset - -# return jittered_boxes - -# def _filter_boxes(boxes, min_size): -# """Remove all boxes with any side smaller than min_size.""" -# ws = boxes[:, 2] - boxes[:, 0] + 1 -# hs = boxes[:, 3] - boxes[:, 1] + 1 -# keep = np.where((ws >= min_size) & (hs >= min_size))[0] -# return keep - -# def _apply_nms(boxes, scores, threshold = 0.5): -# """After this only positive boxes are left -# Applying this class-wise -# """ -# num_class = scores.shape[1] -# assert boxes.shape[0] == scores.shape[0], \ -# 'Shape dismatch {} vs {}'.format(boxes.shape, scores.shape) - -# final_boxes = [] -# final_scores = [] -# for cls in np.arange(1, num_class): -# cls_boxes = boxes[:, 4*cls: 4*cls+4] -# cls_scores = scores[:, cls] -# dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) -# keep = nms_wrapper.nms(dets, thresh=0.3) -# dets = dets[keep, :] -# dets = dets[np.where(dets[:, 4] > threshold)] -# final_boxes.append(dets[:, :4]) -# final_scores.append(dets[:, 4]) - -# final_boxes = np.vstack(final_boxes) -# final_scores = np.vstack(final_scores) - -# return final_boxes, final_scores - -# if __name__ == '__main__': -# import time -# t = time.time() - -# for i in range(10): -# N = 700000 -# boxes = np.random.randint(0, 50, (N, 2)) -# s = np.random.randint(10, 40, (N, 2)) -# s = boxes + s -# boxes = np.hstack((boxes, s)) - -# scores = np.random.rand(N, 1) -# indexs = np.arange(N) -# # scores_ = 1 - np.random.rand(N, 1) -# # scores = np.hstack((scores, scores_)) - -# boxes, scores, batch_inds, indexs = sample_rpn_outputs(boxes, scores, indexs, only_positive=False) - - - -# print ('average time %f' % ((time.time() - t) / 10)) diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 426f9df..2ff73c4 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -14,194 +14,148 @@ from . import assign from libs.boxes.anchor import anchors_plane -def anchor_encoder(gt_boxes, all_anchors, height, width, stride, indexs, scope='AnchorEncoder'): - +def anchor_encoder(gt_boxes, all_anchors, height, width, stride, ih, iw, scope='AnchorEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights, indexs = \ + labels, bbox_targets, bbox_inside_weights = \ tf.py_func(anchor.encode, - [gt_boxes, all_anchors, height, width, stride, indexs], - [tf.int32, tf.float32, tf.float32, tf.int32]) + [gt_boxes, all_anchors, height, width, stride, ih, iw], + [tf.int32, tf.float32, tf.float32]) labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (1, height, width, -1)) - indexs = tf.reshape(indexs, (1, height, width, -1)) bbox_targets = tf.reshape(bbox_targets, (1, height, width, -1)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (1, height, width, -1)) - - return labels, bbox_targets, bbox_inside_weights, indexs - + return labels, bbox_targets, bbox_inside_weights def anchor_decoder(boxes, scores, all_anchors, ih, iw, scope='AnchorDecoder'): - with tf.name_scope(scope) as sc: - final_boxes, classes, scores, indexs = \ + final_boxes, classes, scores = \ tf.py_func(anchor.decode, [boxes, scores, all_anchors, ih, iw], - [tf.float32, tf.int32, tf.float32, tf.int32]) + [tf.float32, tf.int32, tf.float32]) - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') - indexs = tf.reshape(indexs, (-1, )) final_boxes = tf.reshape(final_boxes, (-1, 4)) classes = tf.reshape(classes, (-1, )) scores = tf.reshape(scores, (-1, )) - return final_boxes, classes, scores, indexs + return final_boxes, classes, scores -def roi_encoder(gt_boxes, rois, num_classes, indexs, scope='ROIEncoder'): - +def roi_encoder(gt_boxes, rois, num_classes, scope='ROIEncoder'): with tf.name_scope(scope) as sc: - labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs = \ + labels, bbox_targets, bbox_inside_weights = \ tf.py_func(roi.encode, - [gt_boxes, rois, num_classes, indexs], - [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32] + [gt_boxes, rois, num_classes], + [tf.int32, tf.float32, tf.float32] ) - labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='labels') - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='indexs') + labels = tf.convert_to_tensor(labels, name='labels') bbox_targets = tf.convert_to_tensor(bbox_targets, name='bbox_targets') bbox_inside_weights = tf.convert_to_tensor(bbox_inside_weights, name='bbox_inside_weights') labels = tf.reshape(labels, (-1, )) - indexs = tf.reshape(indexs, (-1, )) bbox_targets = tf.reshape(bbox_targets, (-1, num_classes * 4)) bbox_inside_weights = tf.reshape(bbox_inside_weights, (-1, num_classes * 4)) - max_overlaps = tf.reshape(max_overlaps,(-1, )) - return labels, bbox_targets, bbox_inside_weights, max_overlaps, indexs + return labels, bbox_targets, bbox_inside_weights def roi_decoder(boxes, scores, rois, ih, iw, scope='ROIDecoder'): - with tf.name_scope(scope) as sc: - final_boxes, classes, scores = \ + boxes, classes, scores = \ tf.py_func(roi.decode, [boxes, scores, rois, ih, iw], [tf.float32, tf.int32, tf.float32]) - final_boxes = tf.convert_to_tensor(final_boxes, name='boxes') + boxes = tf.convert_to_tensor(boxes, name='boxes') classes = tf.convert_to_tensor(tf.cast(classes, tf.int32), name='classes') scores = tf.convert_to_tensor(scores, name='scores') - final_boxes = tf.reshape(final_boxes, (-1, 4)) + boxes = tf.reshape(boxes, (-1, 4)) - return final_boxes, classes, scores - -# def mask_encoder_(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): - -# with tf.name_scope(scope) as sc: -# labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ -# tf.py_func(mask.encode_, -# [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], -# [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) - -# labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') -# indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') -# mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') -# mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') - -# labels = tf.reshape(labels, (-1,)) -# indexs = tf.reshape(indexs, (-1,)) -# mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) -# mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) -# mask_rois = tf.reshape(mask_rois,(-1, 4)) - -# return labels, mask_targets, mask_inside_weights, mask_rois, indexs + return boxes, classes, scores -def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs, scope='MaskEncoder'): - +def mask_encoder(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, scope='MaskEncoder'): with tf.name_scope(scope) as sc: - labels, mask_targets, mask_inside_weights, mask_rois, indexs = \ + labels, mask_targets, mask_inside_weights, mask_rois = \ tf.py_func(mask.encode, - [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width, indexs], - [tf.int32, tf.float32, tf.float32, tf.float32, tf.int32]) + [gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width], + [tf.int32, tf.float32, tf.float32, tf.float32]) - labels = tf.convert_to_tensor(tf.cast(labels, tf.int32), name='classes') - indexs = tf.convert_to_tensor(tf.cast(indexs, tf.int32), name='classes') + labels = tf.convert_to_tensor(labels, name='labels') mask_targets = tf.convert_to_tensor(mask_targets, name='mask_targets') mask_inside_weights = tf.convert_to_tensor(mask_inside_weights, name='mask_inside_weights') mask_rois = tf.convert_to_tensor(mask_rois, name='mask_rois') labels = tf.reshape(labels, (-1,)) - indexs = tf.reshape(indexs, (-1,)) mask_targets = tf.reshape(mask_targets, (-1, mask_height, mask_width, num_classes)) mask_inside_weights = tf.reshape(mask_inside_weights, (-1, mask_height, mask_width, num_classes)) mask_rois = tf.reshape(mask_rois,(-1, 4)) - return labels, mask_targets, mask_inside_weights, mask_rois, indexs + return labels, mask_targets, mask_inside_weights, mask_rois def mask_decoder(mask_targets, rois, classes, ih, iw, scope='MaskDecoder'): - with tf.name_scope(scope) as sc: Mask = \ tf.py_func(mask.decode, [mask_targets, rois, classes, ih, iw,], [tf.float32]) - Mask = tf.convert_to_tensor(Mask, name='MaskImage') + Mask = tf.convert_to_tensor(Mask, name='Mask') Mask = tf.reshape(Mask, (ih, iw)) return Mask -def sample_wrapper(boxes, scores, indexs, is_training=True, only_positive=True, scope='SampleBoxes'): - +def sample_wrapper(boxes, scores, is_training=True, only_positive=True, scope='SampleBoxes'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, indexs = \ + boxes, scores, batch_inds = \ tf.py_func(sample.sample_rpn_outputs, - [boxes, scores, indexs, is_training, only_positive], - [tf.float32, tf.float32, tf.int32, tf.int32]) - boxes = tf.convert_to_tensor(boxes, name='Boxes') - scores = tf.convert_to_tensor(scores, name='Scores') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - indexs = tf.convert_to_tensor(indexs, name='Indexs') + [boxes, scores, is_training, only_positive], + [tf.float32, tf.float32, tf.int32]) + boxes = tf.convert_to_tensor(boxes, name='boxes') + scores = tf.convert_to_tensor(scores, name='scores') + batch_inds = tf.convert_to_tensor(batch_inds, name='batchInds') boxes = tf.reshape(boxes, (-1, 4)) batch_inds = tf.reshape(batch_inds, [-1]) - indexs = tf.reshape(indexs, [-1]) - return boxes, scores, batch_inds, indexs + return boxes, scores, batch_inds -def sample_with_gt_wrapper(boxes, scores, gt_boxes, indexs, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): - +def sample_with_gt_wrapper(boxes, scores, gt_boxes, is_training=True, only_positive=True, scope='SampleBoxesWithGT'): with tf.name_scope(scope) as sc: - boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs = \ + rcnn_boxes, rcnn_scores, rcnn_batch_inds, mask_boxes, mask_scores, mask_batch_inds = \ tf.py_func(sample.sample_rpn_outputs_wrt_gt_boxes, - [boxes, scores, gt_boxes, indexs, is_training, only_positive], - [tf.float32, tf.float32, tf.int32, tf.int32, tf.float32, tf.float32, tf.int32, tf.int32]) - boxes = tf.convert_to_tensor(boxes, name='Boxes') - scores = tf.convert_to_tensor(scores, name='Scores') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - indexs = tf.convert_to_tensor(indexs, name='Indexs') + [boxes, scores, gt_boxes, is_training, only_positive], + [tf.float32, tf.float32, tf.int32, tf.float32, tf.float32, tf.int32]) + rcnn_boxes = tf.convert_to_tensor(rcnn_boxes, name='boxes') + rcnn_scores = tf.convert_to_tensor(rcnn_scores, name='scores') + rcnn_batch_inds = tf.convert_to_tensor(rcnn_batch_inds, name='batch_inds') - mask_boxes = tf.convert_to_tensor(mask_boxes, name='MaskBoxes') - mask_scores = tf.convert_to_tensor(mask_scores, name='MaskScores') - mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='MaskBatchInds') - mask_indexs = tf.convert_to_tensor(mask_indexs, name='Indexs') + mask_boxes = tf.convert_to_tensor(mask_boxes, name='mask_boxes') + mask_scores = tf.convert_to_tensor(mask_scores, name='mask_scores') + mask_batch_inds = tf.convert_to_tensor(mask_batch_inds, name='mask_batch_inds') - return boxes, scores, batch_inds, indexs, mask_boxes, mask_scores, mask_batch_inds, mask_indexs + return rcnn_boxes, rcnn_scores, rcnn_batch_inds, mask_boxes, mask_scores, mask_batch_inds -def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): - +def gen_all_anchors(height, width, stride, scales, scope='GenAnchors'): with tf.name_scope(scope) as sc: all_anchors = \ tf.py_func(anchors_plane, [height, width, stride, scales], - [tf.float64] + [tf.float32] ) - all_anchors = tf.convert_to_tensor(tf.cast(all_anchors, tf.float32), name='AllAnchors') + all_anchors = tf.convert_to_tensor(tf.cast(all_anchors, tf.float32), name='all_anchors') all_anchors = tf.reshape(all_anchors, (height, width, -1)) return all_anchors def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): - with tf.name_scope(scope) as sc: min_k = layers[0] max_k = layers[-1] @@ -223,17 +177,16 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] -def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, indexs, scope='instInference'): +def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, scope='instInference'): with tf.name_scope(scope) as sc: - inst_boxes, inst_classes, inst_prob, batch_inds, inst_indexs = \ + inst_boxes, inst_classes, inst_prob, batch_inds = \ tf.py_func(sample.sample_rcnn_outputs, - [final_boxes, classes, cls2_prob, indexs], - [tf.float32, tf.int32, tf.float32, tf.int32, tf.int32]) + [final_boxes, classes, cls2_prob], + [tf.float32, tf.int32, tf.float32, tf.int32]) - inst_boxes = tf.convert_to_tensor(inst_boxes, name='instBoxes') - inst_classes = tf.convert_to_tensor(inst_classes, name='instClasses') - inst_prob = tf.convert_to_tensor(inst_prob, name='instProb') - batch_inds = tf.convert_to_tensor(batch_inds, name='BatchInds') - inst_indexs = tf.convert_to_tensor(inst_indexs, name='inst_indexs') + inst_boxes = tf.convert_to_tensor(inst_boxes, name='inst_boxes') + inst_classes = tf.convert_to_tensor(inst_classes, name='inst_classes') + inst_prob = tf.convert_to_tensor(inst_prob, name='inst_prob') + batch_inds = tf.convert_to_tensor(batch_inds, name='batch_inds') - return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] + [inst_indexs] \ No newline at end of file + return [inst_boxes] + [inst_classes] + [inst_prob] + [batch_inds] \ No newline at end of file diff --git a/libs/nets/nets_factory.py b/libs/nets/nets_factory.py index 4e260c6..90fc472 100644 --- a/libs/nets/nets_factory.py +++ b/libs/nets/nets_factory.py @@ -25,19 +25,19 @@ } } -def get_network(name, image, weight_decay=0.000005, is_training=False): +def get_network(name, image, weight_decay=0.000005, is_training=True): if name == 'resnet50': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet50(image, 1000, is_training=is_training) with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): - logits, end_points = resnet50(image, 1000) + logits, end_points = resnet50(image) if name == 'resnet101': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet101(image, 1000, is_training=is_training) with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): - logits, end_points = resnet101(image, 1000) + logits, end_points = resnet101(image) if name == 'resnext50': name diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index db8fa37..bca77be 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -159,7 +159,7 @@ def _add_jittered_boxes(rois, scores, batch_inds, gt_boxes, jitter=0.1): tf.concat(values=[batch_inds, new_batch_inds], axis=0) def build_pyramid(net_name, end_points, bilinear=True, is_training=True): - """build pyramid features from a typical network, + """Build pyramid (P2-P5) from typical network (convolutional layer C2-C5 of Resnet), assume each stage is 2 time larger than its top feature Returns: returns several endpoints @@ -169,10 +169,9 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): pyramid_map = _networks_map[net_name] else: pyramid_map = net_name - # pyramid['inputs'] = end_points['inputs'] if _BN is True: arg_scope = _extra_conv_arg_scope_with_bn() - # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + #arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) # @@ -185,11 +184,8 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): for c in range(4, 1, -1): s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] - # s_ = slim.conv2d(s_, 256, [3, 3], stride=1, scope='C%d'%c) - up_shape = tf.shape(s_) - # out_shape = tf.stack((up_shape[1], up_shape[2])) - # s = slim.conv2d(s, 256, [3, 3], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) @@ -200,7 +196,7 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): return pyramid -def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, gt_boxes=None): +def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, is_training=False, gt_boxes=None): """Build the 3-way outputs, i.e., class, box and mask in the pyramid Algo ---- @@ -228,7 +224,14 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g p = 'P%d'%i stride = 2 ** i - ### rpn head + """Build RPN head + RPN takes features from each layer of pyramid network. + strides are respectively set to [4, 8, 16, 32] for pyramid feature layer P2,P3,P4,P5 + anchor_scales are set to [2 **(i-2), 2 ** (i-1), 2 **(i)] in all pyramid layers (*This is probably inconsistent with original paper where the only scale is 8) + It generates 2 outputs. + box: an array of shape (1, pyramid_height, pyramid_width, num_anchorx4). box regression values [shift_x, shift_y, scale_width, scale_height] are stored in the last dimension of the array. + cls: an array of shape (1, pyramid_height, pyramid_width, num_anchorx2). Note that this value is before softmax + """ shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) @@ -237,12 +240,12 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) - anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] #[2, 4, 8, 16, 32]# + anchor_scales = [8]#[2 **(i-2), 2 ** (i-1), 2 **(i)] print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} - ### gather all rois + ### gather boxes, clses, anchors from all pyramid layers rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] rpn_clses = [tf.reshape(outputs['rpn']['P%d'%p]['cls'], [-1, 1]) for p in range(5, 1, -1)] rpn_anchors = [tf.reshape(outputs['rpn']['P%d'%p]['anchor'], [-1, 4]) for p in range(5, 1, -1)] @@ -250,74 +253,69 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g rpn_clses = tf.concat(values=rpn_clses, axis=0) rpn_anchors = tf.concat(values=rpn_anchors, axis=0) - rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) - rpn_final_boxes, rpn_final_clses, rpn_final_scores, indexs = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, ih, iw) - - outputs['rpn']['P5']['index'] = indexs[0:(tf.shape(tf.reshape(outputs['rpn']['P5']['box'], [-1, 4]))[0])] - for i in range(4, 1, -1): - p = 'P%d'%i - outputs['rpn'][p]['index'] = indexs[outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 :outputs['rpn']['P%d'%(i+1)]['index'][-1] + 1 + tf.shape(tf.reshape(outputs['rpn']['P%d'%(i)]['box'], [-1, 4]))[0]] - + ### softmax to get probability + rpn_probs = tf.nn.softmax(tf.reshape(rpn_clses, [-1, 2])) + ### decode anchors and box regression values into proposed bounding boxes + rpn_final_boxes, rpn_final_clses, rpn_final_scores = anchor_decoder(rpn_boxes, rpn_probs, rpn_anchors, image_height, image_width) + outputs['rpn_boxes'] = rpn_boxes outputs['rpn_clses'] = rpn_clses outputs['rpn_anchor'] = rpn_anchors outputs['rpn_final_boxes'] = rpn_final_boxes outputs['rpn_final_clses'] = rpn_final_clses outputs['rpn_final_scores'] = rpn_final_scores - outputs['rpn_indexs'] = indexs if is_training is True: - ### for training, rcnn and maskrcnn take rpn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask = \ - sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) - # rcnn_rois, rcnn_scores, rcnn_batch_inds, rcnn_indexs, mask_rois, mask_scores, mask_batch_inds, mask_indexs = \ - # sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, indexs, is_training=is_training, only_positive=True) + ### for training, rcnn and maskrcnn take rpn proposed bounding boxes as inputs + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_rois_to_mask, rpn_scores_to_mask, rpn_batch_inds_to_mask = \ + sample_rpn_outputs_with_gt(rpn_final_boxes, rpn_final_scores, gt_boxes, is_training=is_training, only_positive=False)#True else: ### for testing, only rcnn takes rpn boxes as inputs. maskrcnn takes rcnn boxes as inputs - rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, indexs, only_positive=True) - - ### assign pyramid layer indexs to rcnn network's ROIs - [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_indexs, rcnn_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn, rpn_indexs_to_rcnn], [2, 3, 4, 5]) - - ### crop features from pyramid for rcnn network + rpn_rois_to_rcnn, rpn_scores_to_rcnn, rpn_batch_inds_to_rcnn = sample_rpn_outputs(rpn_final_boxes, rpn_final_scores, only_positive=False) + + ### assign pyramid layer indexs to rcnn network's ROIs. + [rcnn_assigned_rois, rcnn_assigned_batch_inds, rcnn_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_rcnn, [rpn_rois_to_rcnn, rpn_batch_inds_to_rcnn], [2, 3, 4, 5]) + + ### crop features from pyramid using ROIs. Note that this will change order of the ROIs, so ROIs are also reordered. rcnn_cropped_features = [] rcnn_ordered_rois = [] - rcnn_ordered_index = [] for i in range(5, 1, -1): p = 'P%d'%i rcnn_splitted_roi = rcnn_assigned_rois[i-2] rcnn_batch_ind = rcnn_assigned_batch_inds[i-2] - rcnn_index = rcnn_assigned_indexs[i-2] - rcnn_cropped_feature, rcnn_rois_to_crop_and_resize, rcnn_py_shape, rcnn_ihiw = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, ih, iw, stride=2**i, + rcnn_cropped_feature, rcnn_rois_to_crop_and_resize = ROIAlign(pyramid[p], rcnn_splitted_roi, rcnn_batch_ind, image_height, image_width, stride=2**i, pooled_height=14, pooled_width=14) rcnn_cropped_features.append(rcnn_cropped_feature) rcnn_ordered_rois.append(rcnn_splitted_roi) - rcnn_ordered_index.append(rcnn_index) rcnn_cropped_features = tf.concat(values=rcnn_cropped_features, axis=0) rcnn_ordered_rois = tf.concat(values=rcnn_ordered_rois, axis=0) - rcnn_ordered_index = tf.concat(values=rcnn_ordered_index, axis=0) - ### rcnn head - # to 7 x 7 + """Build rcnn head + rcnn takes cropped features and generates 2 outputs. + rcnn_boxes: an array of shape (num_ROIs, num_classes x 4). Box regression values of each classes [shift_x, shift_y, scale_width, scale_height] are stored in the last dimension of the array. + rcnn_clses: an array of shape (num_ROIs, num_classes). Class prediction values (before softmax) are stored + """ rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') rcnn = slim.flatten(rcnn) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training) + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + + ### softmax to get probability rcnn_scores = tf.nn.softmax(rcnn_clses) - ### decode rcnn network final outputs - rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, ih, iw) - + ### decode ROIs and box regression values into bounding boxes + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, image_height, image_width) + rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, image_height, image_width) + outputs['rcnn_ordered_rois'] = rcnn_ordered_rois - outputs['rcnn_ordered_index'] = rcnn_ordered_index outputs['rcnn_cropped_features'] = rcnn_cropped_features tf.add_to_collection('__CROPPED__', rcnn_cropped_features) outputs['rcnn_boxes'] = rcnn_boxes @@ -327,40 +325,36 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g outputs['rcnn_final_clses'] = rcnn_final_classes outputs['rcnn_final_scores'] = rcnn_final_scores - ### assign pyramid layer indexs to mask network's ROIs if is_training: - [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_indexs, mask_assigned_layer_inds] = \ - assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask, rpn_indexs_to_mask], [2, 3, 4, 5]) + ### assign pyramid layer indexs to mask network's ROIs + [mask_assigned_rois, mask_assigned_batch_inds, mask_assigned_layer_inds] = \ + assign_boxes(rpn_rois_to_mask, [rpn_rois_to_mask, rpn_batch_inds_to_mask], [2, 3, 4, 5]) + ### crop features from pyramid using ROIs. Again, this will change order of the ROIs, so ROIs are reordered. mask_cropped_features = [] mask_ordered_rois = [] - mask_ordered_indexs = [] + ### crop features from pyramid for mask network for i in range(5, 1, -1): p = 'P%d'%i mask_splitted_roi = mask_assigned_rois[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assigned_indexs[i-2] - mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + mask_cropped_feature, mask_rois_to_crop_and_resize = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, image_height, image_width, stride=2**i, pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) - + else: ### for testing, mask network takes rcnn boxes as inputs - rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - # mask_rois, mask_clses, mask_scores, mask_batch_inds, mask_indexs = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, rcnn_ordered_index) - [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assign_indexs, mask_assigned_layer_inds] =\ - assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask, rcnn_indexs_to_mask], [2, 3, 4, 5]) - + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores) + [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assigned_layer_inds] =\ + assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask], [2, 3, 4, 5]) + mask_cropped_features = [] mask_ordered_rois = [] - mask_ordered_indexs = [] mask_ordered_clses = [] mask_ordered_scores = [] for i in range(5, 1, -1): @@ -369,42 +363,40 @@ def build_heads(pyramid, ih, iw, num_classes, base_anchors, is_training=False, g mask_splitted_cls = mask_assigned_clses[i-2] mask_splitted_score = mask_assigned_scores[i-2] mask_batch_ind = mask_assigned_batch_inds[i-2] - mask_index = mask_assign_indexs[i-2] - mask_cropped_feature, mask_rois_to_crop_and_resize, mask_py_shape, mask_ihiw = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, ih, iw, stride=2**i, + mask_cropped_feature, mask_rois_to_crop_and_resize = ROIAlign(pyramid[p], mask_splitted_roi, mask_batch_ind, image_height, image_width, stride=2**i, pooled_height=14, pooled_width=14) mask_cropped_features.append(mask_cropped_feature) mask_ordered_rois.append(mask_splitted_roi) - mask_ordered_indexs.append(mask_index) mask_ordered_clses.append(mask_splitted_cls) mask_ordered_scores.append(mask_splitted_score) mask_cropped_features = tf.concat(values=mask_cropped_features, axis=0) mask_ordered_rois = tf.concat(values=mask_ordered_rois, axis=0) - mask_ordered_indexs = tf.concat(values=mask_ordered_indexs, axis=0) mask_ordered_clses = tf.concat(values=mask_ordered_clses, axis=0) mask_ordered_scores = tf.concat(values=mask_ordered_scores, axis=0) outputs['mask_final_clses'] = mask_ordered_clses outputs['mask_final_scores'] = mask_ordered_scores - ### mask head + """Build mask rcnn head + mask rcnn takes cropped features and generates masks for each classes. + m: an array of shape (28, 28, num_classes). Note that this value is before sigmoid. + """ m = mask_cropped_features for _ in range(4): m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - # to 28 x 28 m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) tf.add_to_collection('__TRANSPOSED__', m) m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) outputs['mask_ordered_rois'] = mask_ordered_rois - outputs['mask_ordered_indexs'] = mask_ordered_indexs outputs['mask_cropped_features'] = mask_cropped_features outputs['mask_mask'] = m outputs['mask_final_mask'] = tf.nn.sigmoid(m) return outputs -def build_losses(pyramid, outputs, gt_boxes, gt_masks, +def build_losses(pyramid, image_height, image_width, outputs, gt_boxes, gt_masks, num_classes, base_anchors, rpn_box_lw =0.1, rpn_cls_lw = 0.1, rcnn_box_lw=1.0, rcnn_cls_lw=0.1, @@ -459,20 +451,16 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, ### rpn losses # 1. encode ground truth # 2. compute distances - # anchor_scales = [2 **(i-2), 2 ** (i-1), 2 **(i)] - # all_anchors = gen_all_anchors(height, width, stride, anchor_scales) all_anchors = outputs['rpn'][p]['anchor'] - all_indexs = outputs['rpn'][p]['index'] rpn_boxes = outputs['rpn'][p]['box'] rpn_clses = tf.reshape(outputs['rpn'][p]['cls'], (1, height, width, base_anchors, 2)) - rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight, all_indexs = \ - anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, all_indexs, scope='AnchorEncoder') + rpn_clses_target, rpn_boxes_target, rpn_boxes_inside_weight = \ + anchor_encoder(splitted_gt_boxes, all_anchors, height, width, stride, image_height, image_width, scope='AnchorEncoder') - rpn_clses_target, all_indexs, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ + rpn_clses_target, rpn_clses, rpn_boxes, rpn_boxes_target, rpn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rpn_clses_target, [-1]), [ tf.reshape(rpn_clses_target, [-1]), - tf.reshape(all_indexs, [-1]), tf.reshape(rpn_clses, [-1, 2]), tf.reshape(rpn_boxes, [-1, 4]), tf.reshape(rpn_boxes_target, [-1, 4]), @@ -509,19 +497,19 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, # 1. encode ground truth # 2. compute distances rcnn_ordered_rois = outputs['rcnn_ordered_rois'] - rcnn_ordered_index = outputs['rcnn_ordered_index'] rcnn_boxes = outputs['rcnn_boxes'] rcnn_clses = outputs['rcnn_clses'] + rcnn_scores = outputs['rcnn_scores'] - rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight, max_overlaps, rcnn_ordered_index = \ - roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, rcnn_ordered_index, scope='ROIEncoder') + rcnn_clses_target, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + roi_encoder(gt_boxes, rcnn_ordered_rois, num_classes, scope='ROIEncoder') - rcnn_clses_target, rcnn_ordered_index, rcnn_ordered_rois, rcnn_clses, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ + rcnn_clses_target, rcnn_ordered_rois, rcnn_clses, rcnn_scores, rcnn_boxes, rcnn_boxes_target, rcnn_boxes_inside_weight = \ _filter_negative_samples(tf.reshape(rcnn_clses_target, [-1]),[ tf.reshape(rcnn_clses_target, [-1]), - tf.reshape(rcnn_ordered_index, [-1]), tf.reshape(rcnn_ordered_rois, [-1, 4]), tf.reshape(rcnn_clses, [-1, num_classes]), + tf.reshape(rcnn_scores, [-1, num_classes]), tf.reshape(rcnn_boxes, [-1, num_classes * 4]), tf.reshape(rcnn_boxes_target, [-1, num_classes * 4]), tf.reshape(rcnn_boxes_inside_weight, [-1, num_classes * 4]) @@ -549,25 +537,25 @@ def build_losses(pyramid, outputs, gt_boxes, gt_masks, tf.add_to_collection(tf.GraphKeys.LOSSES, rcnn_cls_loss) rcnn_cls_losses.append(rcnn_cls_loss) + outputs['training_rcnn_rois'] = rcnn_ordered_rois outputs['training_rcnn_clses_target'] = rcnn_clses_target outputs['training_rcnn_clses'] = rcnn_clses + outputs['training_rcnn_scores'] = rcnn_scores ### mask loss # mask of shape (N, h, w, num_classes) mask_ordered_rois = outputs['mask_ordered_rois'] - mask_ordered_indexs = outputs['mask_ordered_indexs'] masks = outputs['mask_mask'] - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs= \ - mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28, mask_ordered_indexs,scope='MaskEncoder') + mask_clses_target, mask_targets, mask_inside_weights, mask_rois = \ + mask_encoder(gt_masks, gt_boxes, mask_ordered_rois, num_classes, 28, 28,scope='MaskEncoder') - mask_clses_target, mask_targets, mask_inside_weights, mask_rois, mask_ordered_indexs, masks = \ + mask_clses_target, mask_targets, mask_inside_weights, mask_rois, masks = \ _filter_negative_samples(tf.reshape(mask_clses_target, [-1]), [ tf.reshape(mask_clses_target, [-1]), tf.reshape(mask_targets, [-1, 28, 28, num_classes]), tf.reshape(mask_inside_weights, [-1, 28, 28, num_classes]), tf.reshape(mask_rois, [-1, 4]), - tf.reshape(mask_ordered_indexs, [-1]), tf.reshape(masks, [-1, 28, 28, num_classes]), ]) @@ -629,7 +617,7 @@ def build(end_points, image_height, image_width, pyramid_map, outputs = \ build_heads(pyramid, image_height, image_width, num_classes, base_anchors, is_training=is_training, gt_boxes=gt_boxes) - loss, losses, batch_info = build_losses(pyramid, outputs, + loss, losses, batch_info = build_losses(pyramid, image_height, image_width, outputs, gt_boxes, gt_masks, num_classes=num_classes, base_anchors=base_anchors, rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], @@ -645,18 +633,11 @@ def build(end_points, image_height, image_width, pyramid_map, is_training=is_training) ### just decode outputs into readable prediction - pred_boxes, pred_classes, pred_masks = decode_output(outputs) - outputs['pred_boxes'] = pred_boxes - outputs['pred_classes'] = pred_classes - outputs['pred_masks'] = pred_masks - - ### for debuging - outputs['tmp_0'] = pred_classes - outputs['tmp_1'] = pred_classes - outputs['tmp_2'] = pred_classes - outputs['tmp_3'] = pred_classes - outputs['tmp_4'] = pred_classes - outputs['tmp_5'] = pred_classes + # pred_boxes, pred_classes, pred_masks = decode_output(outputs) + # outputs['pred_boxes'] = pred_boxes + # outputs['pred_classes'] = pred_classes + # outputs['pred_masks'] = pred_masks + # ### image and gt visualization # visualize_input(gt_boxes, end_points["input"], tf.expand_dims(gt_masks, axis=3)) diff --git a/libs/visualization/pil_utils.py b/libs/visualization/pil_utils.py index 6fe14a2..35ce837 100644 --- a/libs/visualization/pil_utils.py +++ b/libs/visualization/pil_utils.py @@ -1,9 +1,9 @@ import numpy as np -import tensorflow as tf +import libs.configs.config_v1 as cfg from PIL import Image, ImageFont, ImageDraw, ImageEnhance from scipy.misc import imresize -FLAGS = tf.app.flags.FLAGS +FLAGS = cfg.FLAGS _DEBUG = False def draw_img(step, image, name='', image_height=1, image_width=1, rois=None): @@ -36,7 +36,7 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la else: color = '#0000ff' else: - text = cat_id_to_cls_name(label[i]) + ' : ' + str(i)#+ str(prob[i][label[i]])[:4] + text = cat_id_to_cls_name(label[i]) + ' : ' + "{:.3f}".format(prob[i][label[i]]) #str(i)#+ draw.text((2+bbox[i,0], 2+bbox[i,1]), text, fill=color) if _DEBUG is True: @@ -52,7 +52,6 @@ def draw_bbox(step, image, name='', image_height=1, image_width=1, bbox=None, la color_img = color_id_to_color_code(mask_color_id)* np.ones((bbox_h,bbox_w,1)) * 255 color_img = Image.fromarray(color_img.astype('uint8')).convert('RGBA') #color_img = Image.new("RGBA", (bbox_w,bbox_h), np.random.rand(1,3) * 255 ) - # print(bbox_w, bbox_h, i, label[i], bbox.shape) resized_m = imresize(m[i][label[i]], [bbox_h, bbox_w], interp='bilinear') #label[i] resized_m[resized_m >= 128] = 128 resized_m[resized_m < 128] = 0 diff --git a/train/test.py b/train/test.py index 7ef7aec..5431033 100644 --- a/train/test.py +++ b/train/test.py @@ -85,76 +85,6 @@ def _collectData(image_id, classes, boxes, probs, img_h, img_w, new_img_h, new_i instance['score'] = score[instance_index][classes[instance_index]] _writeJSON(instance) - - -# #!/usr/bin/env python -# # coding=utf-8 -# from __future__ import absolute_import -# from __future__ import division -# from __future__ import print_function - -# import functools -# import os, sys -# import time -# import numpy as np -# import tensorflow as tf -# import tensorflow.contrib.slim as slim -# from time import gmtime, strftime - -# sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) -# import libs.configs.config_v1 as cfg -# import libs.datasets.dataset_factory as datasets -# import libs.nets.nets_factory as network - -# import libs.preprocessings.coco_v1 as coco_preprocess -# import libs.nets.pyramid_network as pyramid_network -# import libs.nets.resnet_v1 as resnet_v1 -# import libs.boxes.cython_bbox as cython_bbox - -# from train.train_utils import _configure_learning_rate, _configure_optimizer, \ -# _get_variables_to_train, _get_init_fn, get_var_list_to_restore - -# from PIL import Image, ImageFont, ImageDraw, ImageEnhance -# from libs.datasets import download_and_convert_coco -# from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox - -# FLAGS = tf.app.flags.FLAGS -# resnet50 = resnet_v1.resnet_v1_50 - -# def solve(global_step): -# """add solver to losses""" -# # learning reate -# lr = _configure_learning_rate(82783, global_step) -# optimizer = _configure_optimizer(lr) -# tf.summary.scalar('learning_rate', lr) - -# # compute and apply gradient -# losses = tf.get_collection(tf.GraphKeys.LOSSES) -# regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) -# regular_loss = tf.add_n(regular_losses) -# out_loss = tf.add_n(losses) -# total_loss = tf.add_n(losses + regular_losses) - -# tf.summary.scalar('total_loss', total_loss) -# tf.summary.scalar('out_loss', out_loss) -# tf.summary.scalar('regular_loss', regular_loss) - -# update_ops = [] -# variables_to_train = _get_variables_to_train() -# # update_op = optimizer.minimize(total_loss) -# gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) -# grad_updates = optimizer.apply_gradients(gradients, -# global_step=global_step) -# update_ops.append(grad_updates) - -# # update moving mean and variance -# if FLAGS.update_bn: -# update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) -# update_bn = tf.group(*update_bns) -# update_ops.append(update_bn) - -# return tf.group(*update_ops) - def restore(sess): """choose which param to restore""" if FLAGS.restore_previous_if_exists: @@ -171,40 +101,14 @@ def restore(sess): except: print (' failed to restore in %s %s' % (FLAGS.train_dir, checkpoint_path)) raise - -def evaluate(ap_threshold, gt_boxes, gt_masks, boxes, classes, probs, masks): - num_instances = gt_boxes.shape[0] - num_prediction = boxes.shape[0] - recall = [] - precision = [] - if num_instances is not 0 and num_prediction is not 0: - m = np.array(masks) - m = np.transpose(m,(0,3,1,2)) - - overlaps = cython_bbox.bbox_overlaps( - np.ascontiguousarray(boxes[:, 0:4], dtype=np.float), - np.ascontiguousarray(gt_boxes[:, 0:4], dtype=np.float)) - - - overlaps_recall = np.max(overlaps, axis=0) - overlaps_precision = np.max(overlaps, axis=1) - for i, threshold in enumerate(ap_threshold): - recall.append(np.sum(overlaps_recall > threshold)) - precision.append(np.sum(overlaps_precision > threshold)) - else: - for i, threshold in enumerate(ap_threshold): - recall.append(0) - precision.append(0) - return np.array(recall), np.array(precision), num_instances, num_prediction - def test(): """The main function that runs training""" ## data - image, ih, iw, new_ih, new_iw, gt_boxes, gt_masks, num_instances, img_id = \ + image, original_image_height, original_image_width, image_height, image_width, gt_boxes, gt_masks, num_instances, image_id = \ datasets.get_dataset(FLAGS.dataset_name, - FLAGS.dataset_split_name, + FLAGS.dataset_split_name_test, FLAGS.dataset_dir, FLAGS.im_batch, is_training=False) @@ -261,15 +165,15 @@ def test(): tf.train.start_queue_runners(sess=sess, coord=coord) # for step in range(FLAGS.max_iters): - for step in range(10000):#range(40503): + for step in range(1000):#range(40503): start_time = time.time() - img_id_str, img_h, img_w, new_img_h, new_img_w, \ + image_id_str, img_h, img_w, new_img_h, new_img_w, \ gt_boxesnp, gt_masksnp,\ input_imagenp,\ testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ - sess.run([img_id] + [ih] + [iw] + [new_ih] + [new_iw] +\ + sess.run([image_id] + [ih] + [iw] + [new_ih] + [new_iw] +\ [gt_boxes] + [gt_masks] +\ [input_image] + \ [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) @@ -279,7 +183,7 @@ def test(): print ( """iter %d: image-id:%07d, time:%.3f(sec), """ """instances: %d, """ - % (step, img_id_str, duration_time, + % (step, image_id_str, duration_time, gt_boxesnp.shape[0])) if step % 1 == 0: @@ -305,99 +209,7 @@ def test(): print (cat_id_to_cls_name(testing_mask_final_clsesnp)) print (np.max(np.array(testing_mask_final_scoresnp),axis=1)) - _collectData(img_id_str, testing_mask_final_clsesnp, testing_mask_roisnp, testing_mask_final_scoresnp, img_h, img_w, new_img_h, new_img_w) - - # ## solvers - # global_step = slim.create_global_step() - - # cropped_rois = tf.get_collection('__CROPPED__')[0] - # transposed = tf.get_collection('__TRANSPOSED__')[0] - - # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) - # sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) - # init_op = tf.group( - # tf.global_variables_initializer(), - # tf.local_variables_initializer() - # ) - # sess.run(init_op) - - # summary_op = tf.summary.merge_all() - # logdir = os.path.join(FLAGS.train_dir, strftime('%Y%m%d%H%M%S', gmtime())) - # if not os.path.exists(logdir): - # os.makedirs(logdir) - # summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph) - - # ## restore - # restore(sess) - - # ## main loop - # coord = tf.train.Coordinator() - # threads = [] - # # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) - # for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): - # threads.extend(qr.create_threads(sess, coord=coord, daemon=True, - # start=True)) - - # tf.train.start_queue_runners(sess=sess, coord=coord) - - # ap_threshold = [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95] - # total_recall = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - # total_precision = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - # total_instance = 0 - # total_prediction = 0 - - - # # for step in range(FLAGS.max_iters): - # for step in range(2500): - - # start_time = time.time() - - # img_id_str, \ - # gt_boxesnp, gt_masksnp,\ - # input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ - # testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ - # sess.run([img_id] + \ - # [gt_boxes] + [gt_masks] +\ - # [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + \ - # [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) - - # duration_time = time.time() - start_time - # if step % 1 == 0: - # print ( """iter %d: image-id:%07d, time:%.3f(sec), """ - # """instances: %d, """ - - # % (step, img_id_str, duration_time, - # gt_boxesnp.shape[0])) - - # if step % 1 == 0: - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='test_est', - # bbox=testing_mask_roisnp, - # label=testing_mask_final_clsesnp, - # prob=testing_mask_final_scoresnp, - # mask=testing_mask_final_masknp,) - - # if step % 1 == 0: - # draw_bbox(step, - # np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), - # name='test_gt', - # bbox=gt_boxesnp[:,0:4], - # label=gt_boxesnp[:,4].astype(np.int32), - # prob=np.ones((gt_boxesnp.shape[0],81), dtype=np.float32),) - - # recall, precision, num_instances, num_prediction = evaluate(ap_threshold, gt_boxesnp, gt_masksnp, testing_mask_roisnp, testing_mask_final_clsesnp, testing_mask_final_scoresnp, testing_mask_final_masknp) - # total_recall += recall - # total_precision += precision - # total_instance += num_instances - # total_prediction += num_prediction - - # print("recall = {}".format([x / float(total_instance) for x in total_recall])) - # print("precision = {}".format([x / float(total_prediction) for x in total_precision])) - # print("recall = {}".format(total_recall / float(total_instance))) - # print("precision = {}".format(total_precision / float(total_prediction))) - - + _collectData(image_id_str, testing_mask_final_clsesnp, testing_mask_roisnp, testing_mask_final_scoresnp, img_h, img_w, new_img_h, new_img_w) if __name__ == '__main__': test() diff --git a/train/train.py b/train/train.py index c6fff36..32c13ef 100644 --- a/train/train.py +++ b/train/train.py @@ -10,6 +10,7 @@ import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim +import gc from time import gmtime, strftime @@ -77,48 +78,56 @@ def restore(sess): ########### ########### - # not_restore = [ 'pyramid/fully_connected/weights:0', - # 'pyramid/fully_connected/biases:0', - # 'pyramid/fully_connected/weights:0', - # 'pyramid/fully_connected_1/biases:0', - # 'pyramid/fully_connected_1/weights:0', - # 'pyramid/fully_connected_2/weights:0', - # 'pyramid/fully_connected_2/biases:0', - # 'pyramid/fully_connected_3/weights:0', - # 'pyramid/fully_connected_3/biases:0', - # 'pyramid/Conv/weights:0', - # 'pyramid/Conv/biases:0', - # 'pyramid/Conv_1/weights:0', - # 'pyramid/Conv_1/biases:0', - # 'pyramid/Conv_2/weights:0', - # 'pyramid/Conv_2/biases:0', - # 'pyramid/Conv_3/weights:0', - # 'pyramid/Conv_3/biases:0', - # 'pyramid/Conv2d_transpose/weights:0', - # 'pyramid/Conv2d_transpose/biases:0', - # 'pyramid/Conv_4/weights:0', - # 'pyramid/Conv_4/biases:0', - # 'pyramid/fully_connected/weights/Momentum:0', - # 'pyramid/fully_connected/biases/Momentum:0', - # 'pyramid/fully_connected/weights/Momentum:0', - # 'pyramid/fully_connected_1/biases/Momentum:0', - # 'pyramid/fully_connected_1/weights/Momentum:0', - # 'pyramid/fully_connected_2/weights/Momentum:0', - # 'pyramid/fully_connected_2/biases/Momentum:0', - # 'pyramid/fully_connected_3/weights/Momentum:0', - # 'pyramid/fully_connected_3/biases/Momentum:0', - # 'pyramid/Conv/weights/Momentum:0', - # 'pyramid/Conv/biases/Momentum:0', - # 'pyramid/Conv_1/weights/Momentum:0', - # 'pyramid/Conv_1/biases/Momentum:0', - # 'pyramid/Conv_2/weights/Momentum:0', - # 'pyramid/Conv_2/biases/Momentum:0', - # 'pyramid/Conv_3/weights/Momentum:0', - # 'pyramid/Conv_3/biases/Momentum:0', - # 'pyramid/Conv2d_transpose/weights/Momentum:0', - # 'pyramid/Conv2d_transpose/biases/Momentum:0', - # 'pyramid/Conv_4/weights/Momentum:0', - # 'pyramid/Conv_4/biases/Momentum:0',] + # not_restore = [ 'pyramid/P2/rpn/weights:0', + # 'pyramid/P2/rpn/biases:0', + # 'pyramid/P3/rpn/weights:0', + # 'pyramid/P3/rpn/biases:0', + # 'pyramid/P4/rpn/weights:0', + # 'pyramid/P4/rpn/biases:0', + # 'pyramid/P5/rpn/weights:0', + # 'pyramid/P5/rpn/biases:0', + # 'pyramid/P2/rpn/weights/Momentum:0', + # 'pyramid/P2/rpn/biases/Momentum:0', + # 'pyramid/P3/rpn/weights/Momentum:0', + # 'pyramid/P3/rpn/biases/Momentum:0', + # 'pyramid/P4/rpn/weights/Momentum:0', + # 'pyramid/P4/rpn/biases/Momentum:0', + # 'pyramid/P5/rpn/weights/Momentum:0', + + # 'pyramid/P2/rpn/box/weights:0', + # 'pyramid/P2/rpn/box/biases:0', + # 'pyramid/P3/rpn/box/weights:0', + # 'pyramid/P3/rpn/box/biases:0', + # 'pyramid/P4/rpn/box/weights:0', + # 'pyramid/P4/rpn/box/biases:0', + # 'pyramid/P5/rpn/box/weights:0', + # 'pyramid/P5/rpn/box/biases:0', + # 'pyramid/P2/rpn/box/weights/Momentum:0', + # 'pyramid/P2/rpn/box/biases/Momentum:0', + # 'pyramid/P3/rpn/box/weights/Momentum:0', + # 'pyramid/P3/rpn/box/biases/Momentum:0', + # 'pyramid/P4/rpn/box/weights/Momentum:0', + # 'pyramid/P4/rpn/box/biases/Momentum:0', + # 'pyramid/P5/rpn/box/weights/Momentum:0', + # 'pyramid/P5/rpn/box/biases/Momentum:0', + + # 'pyramid/P2/rpn/cls/weights:0', + # 'pyramid/P2/rpn/cls/biases:0', + # 'pyramid/P3/rpn/cls/weights:0', + # 'pyramid/P3/rpn/cls/biases:0', + # 'pyramid/P4/rpn/cls/weights:0', + # 'pyramid/P4/rpn/cls/biases:0', + # 'pyramid/P5/rpn/cls/weights:0', + # 'pyramid/P5/rpn/cls/biases:0', + # 'pyramid/P2/rpn/cls/weights/Momentum:0', + # 'pyramid/P2/rpn/cls/biases/Momentum:0', + # 'pyramid/P3/rpn/cls/weights/Momentum:0', + # 'pyramid/P3/rpn/cls/biases/Momentum:0', + # 'pyramid/P4/rpn/cls/weights/Momentum:0', + # 'pyramid/P4/rpn/cls/biases/Momentum:0', + # 'pyramid/P5/rpn/cls/weights/Momentum:0', + # 'pyramid/P5/rpn/cls/biases/Momentum:0',] + # vars_to_restore = [v for v in tf.all_variables()if v.name not in not_restore] # restorer = tf.train.Saver(vars_to_restore) # for var in vars_to_restore: @@ -164,34 +173,26 @@ def restore(sess): def train(): """The main function that runs training""" ## data - image, ih, iw, gt_boxes, gt_masks, num_instances, img_id = \ + image, original_image_height, original_image_width, image_height, image_width, gt_boxes, gt_masks, num_instances, image_id = \ datasets.get_dataset(FLAGS.dataset_name, FLAGS.dataset_split_name, FLAGS.dataset_dir, FLAGS.im_batch, is_training=True) - data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, - dtypes=( - image.dtype, ih.dtype, iw.dtype, - gt_boxes.dtype, gt_masks.dtype, - num_instances.dtype, img_id.dtype)) - enqueue_op = data_queue.enqueue((image, ih, iw, gt_boxes, gt_masks, num_instances, img_id)) - data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) - tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) - (image, ih, iw, gt_boxes, gt_masks, num_instances, img_id) = data_queue.dequeue() im_shape = tf.shape(image) image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, weight_decay=FLAGS.weight_decay, is_training=True) - outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, + outputs = pyramid_network.build(end_points, image_height, image_width, pyramid_map, num_classes=81, - base_anchors=9,#15 + base_anchors=3,#9#15 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, loss_weights=[10.0, 1.0, 1000.0, 1.0, 100.0]) + # loss_weights=[10.0, 1.0, 0.0, 0.0, 0.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) # loss_weights=[0.1, 0.01, 10.0, 0.1, 1.0]) @@ -202,23 +203,15 @@ def train(): regular_loss = tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) input_image = end_points['input'] + training_rcnn_rois = outputs['training_rcnn_rois'] training_rcnn_clses = outputs['training_rcnn_clses'] training_rcnn_clses_target = outputs['training_rcnn_clses_target'] + training_rcnn_scores = outputs['training_rcnn_scores'] training_mask_rois = outputs['training_mask_rois'] training_mask_clses_target = outputs['training_mask_clses_target'] training_mask_final_mask = outputs['training_mask_final_mask'] training_mask_final_mask_target = outputs['training_mask_final_mask_target'] - ############################# - tmp_0 = outputs['tmp_0'] - tmp_1 = outputs['tmp_1'] - tmp_2 = outputs['tmp_2'] - tmp_3 = outputs['tmp_3'] - tmp_4 = outputs['tmp_4'] - tmp_5 = outputs['tmp_5'] - ############################ - - ## solvers global_step = slim.create_global_step() update_op = solve(global_step) @@ -246,7 +239,6 @@ def train(): ## main loop coord = tf.train.Coordinator() threads = [] - # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): threads.extend(qr.create_threads(sess, coord=coord, daemon=True, start=True)) @@ -258,18 +250,18 @@ def train(): start_time = time.time() - s_, tot_loss, reg_lossnp, img_id_str, \ + s_, tot_loss, reg_lossnp, image_id_str, \ rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, \ gt_boxesnp, \ rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch, \ - input_imagenp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, tmp_4np, tmp_5np, \ - training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ - sess.run([update_op, total_loss, regular_loss, img_id] + + input_imagenp, \ + training_rcnn_roisnp, training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_rcnn_scoresnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ + sess.run([update_op, total_loss, regular_loss, image_id] + losses + [gt_boxes] + batch_info + - [input_image] + [tmp_0] + [tmp_1] + [tmp_2] + [tmp_3] + [tmp_4] + [tmp_5] + - [training_rcnn_clses] + [training_rcnn_clses_target] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) + [input_image] + + [training_rcnn_rois] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_rcnn_scores] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) duration_time = time.time() - start_time if step % 1 == 0: @@ -277,12 +269,10 @@ def train(): """total-loss %.4f(%.4f, %.4f, %.6f, %.4f, %.4f), """ """instances: %d, """ """batch:(%d|%d, %d|%d, %d|%d)""" - % (step, img_id_str, duration_time, reg_lossnp, + % (step, image_id_str, duration_time, reg_lossnp, tot_loss, rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, gt_boxesnp.shape[0], rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch)) - # print (np.array(tmp_0np).shape) - # print (np.array(tmp_1np).shape) LOG ("target") LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) @@ -293,19 +283,25 @@ def train(): draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_est', - bbox=training_mask_roisnp, - label=training_mask_clses_targetnp, - prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, - mask=training_mask_final_masknp, + bbox=training_rcnn_roisnp, + label=np.argmax(np.array(training_rcnn_scoresnp),axis=1), + prob=training_rcnn_scoresnp, + # bbox=training_mask_roisnp, + # label=training_mask_clses_targetnp, + # prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + # mask=training_mask_final_masknp, vis_all=True) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), name='train_gt', - bbox=training_mask_roisnp, - label=training_mask_clses_targetnp, - prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, - mask=training_mask_final_mask_targetnp, + bbox=training_rcnn_roisnp, + label=np.argmax(np.array(training_rcnn_clses_targetnp),axis=1), + prob=np.zeros((training_rcnn_clsesnp.shape[0],81), dtype=np.float32)+1.0, + # bbox=training_mask_roisnp, + # label=training_mask_clses_targetnp, + # prob=np.zeros((training_mask_final_masknp.shape[0],81), dtype=np.float32)+1.0, + # mask=training_mask_final_mask_targetnp, vis_all=True) if np.isnan(tot_loss) or np.isinf(tot_loss): @@ -317,7 +313,7 @@ def train(): summary_writer.add_summary(summary_str, step) summary_writer.flush() - if (step % 10000 == 0 or step + 1 == FLAGS.max_iters) and step != 0: + if (step % 500 == 0 or step + 1 == FLAGS.max_iters) and step != 0: checkpoint_path = os.path.join(FLAGS.train_dir, FLAGS.dataset_name + '_' + FLAGS.network + '_model.ckpt') saver.save(sess, checkpoint_path, global_step=step) @@ -325,6 +321,7 @@ def train(): if coord.should_stop(): coord.request_stop() coord.join(threads) + gc.collect() if __name__ == '__main__': From 2f636d81a39f0396d757b2a82be46035cb1e7b82 Mon Sep 17 00:00:00 2001 From: souryuu Date: Wed, 13 Sep 2017 13:47:53 +0900 Subject: [PATCH 33/35] added segmentation evaluation --- train/test.py | 75 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/train/test.py b/train/test.py index 5431033..2944e5c 100644 --- a/train/test.py +++ b/train/test.py @@ -11,12 +11,14 @@ import tensorflow as tf import tensorflow.contrib.slim as slim import json +import cv2 from time import gmtime, strftime sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) import libs.configs.config_v1 as cfg import libs.datasets.dataset_factory as datasets import libs.nets.nets_factory as network +import libs.datasets.pycocotools.mask as pycoco_mask import libs.preprocessings.coco_v1 as coco_preprocess import libs.nets.pyramid_network as pyramid_network @@ -60,28 +62,70 @@ def _writeJSON(_dict): f.close() return -def _convertBoxes(boxes, img_h, img_w, new_img_h, new_img_w): - new_boxes = boxes - new_boxes[:,2] = (boxes[:,2]*img_h/new_img_h - boxes[:,0]*img_h/new_img_h).astype(np.float32) - new_boxes[:,3] = (boxes[:,3]*img_w/new_img_w - boxes[:,1]*img_w/new_img_w).astype(np.float32) - new_boxes[:,0] = (boxes[:,0]*img_h/new_img_h).astype(np.float32) - new_boxes[:,1] = (boxes[:,1]*img_w/new_img_w).astype(np.float32) - return new_boxes +def _convertBoxes(image_id, boxes, original_image_height, original_image_width, image_height, image_width): + original_image_boxes = boxes + height_ratio = original_image_height / image_height + width_ratio = original_image_width / image_width + original_image_boxes[:,2] = (boxes[:,2] * width_ratio - boxes[:,0] * width_ratio ).astype(np.float32) + original_image_boxes[:,3] = (boxes[:,3] * height_ratio - boxes[:,1] * height_ratio).astype(np.float32) + original_image_boxes[:,0] = (boxes[:,0] * width_ratio ).astype(np.float32) + original_image_boxes[:,1] = (boxes[:,1] * height_ratio).astype(np.float32) + return original_image_boxes + +def _convertMasks(image_id, masks, classes, boxes, image_height, image_width): + assert masks.shape[0] == classes.shape[0] == boxes.shape[0], \ + 'convertMasks error %d vs %d ' % (masks.shape[0], classes.shape[0], boxes.shape[0]) + original_image_masks = [] + for instance_index, (mask, cls, box) in enumerate(zip(masks, classes, boxes)): + mask = np.transpose(mask, [2, 0, 1]) + box = np.round(box) + box_offset_x = box[0] + box_offset_y = box[1] + box_width = box[2] + box_height = box[3] + #create blank image + size = (image_height, image_width) + original_image_mask = np.zeros(size, np.uint8) + #fit mask to box + mask = cv2.resize(mask[cls], (box_width, box_height)) + #place box on blank image + y1 = int(box_offset_y) + y2 = int(box_offset_y + mask.shape[0]) + x1 = int(box_offset_x) + x2 = int(box_offset_x + mask.shape[1]) + + original_image_mask[y1:y2, x1:x2] = mask*255 + #threshold by 0.5 + original_image_mask = (original_image_mask >= 127) * 255 + original_image_masks.append(original_image_mask) + # print(mask[cls].shape) + # print(box) + #original_image_masks = np.array(original_image_masks, order='F') + #original_image_masks = np.transpose(original_image_masks, [1, 2, 0]) + + return original_image_masks -def _collectData(image_id, classes, boxes, probs, img_h, img_w, new_img_h, new_img_w): +def _collectData(image_id, classes, boxes, probs, original_image_height, original_image_width, image_height, image_width, masks=None): instance_num = probs.shape[0] - boxes = _convertBoxes(boxes, img_h, img_w, new_img_h, new_img_w) + original_image_boxes = _convertBoxes(image_id, boxes, original_image_height, original_image_width, image_height, image_width) + #TODO: convert masks to original_image_masks + if masks is not None: + original_image_masks = _convertMasks(image_id, masks, classes, original_image_boxes, original_image_height, original_image_width) image_ids = [image_id] * instance_num real_category_id = _cat_id_to_real_id(classes).tolist() - bbox = boxes.tolist()#change format + original_image_boxes = original_image_boxes.tolist()#change format score = probs.tolist() for instance_index in range(instance_num): instance = {} instance['image_id'] = int(image_ids[instance_index]) instance['category_id'] = real_category_id[instance_index] - instance['bbox'] = bbox[instance_index] + instance['bbox'] = original_image_boxes[instance_index] + if masks is not None: + RLE = np.array(original_image_masks[instance_index], order='F', dtype= np.uint8) + RLE = pycoco_mask.encode(RLE) + instance['segmentation'] = RLE instance['score'] = score[instance_index][classes[instance_index]] _writeJSON(instance) @@ -121,7 +165,7 @@ def test(): weight_decay=FLAGS.weight_decay, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, - base_anchors=9, + base_anchors=3, is_training=False, gt_boxes=None, gt_masks=None, loss_weights=[0.0, 0.0, 0.0, 0.0, 0.0]) @@ -169,11 +213,11 @@ def test(): start_time = time.time() - image_id_str, img_h, img_w, new_img_h, new_img_w, \ + image_id_str, original_image_heightnp, original_image_widthnp, image_heightnp, image_widthnp, \ gt_boxesnp, gt_masksnp,\ input_imagenp,\ testing_mask_roisnp, testing_mask_final_masknp, testing_mask_final_clsesnp, testing_mask_final_scoresnp = \ - sess.run([image_id] + [ih] + [iw] + [new_ih] + [new_iw] +\ + sess.run([image_id] + [original_image_height] + [original_image_width] + [image_height] + [image_width] +\ [gt_boxes] + [gt_masks] +\ [input_image] + \ [testing_mask_rois] + [testing_mask_final_mask] + [testing_mask_final_clses] + [testing_mask_final_scores]) @@ -203,13 +247,12 @@ def test(): label=gt_boxesnp[:,4].astype(np.int32), prob=np.ones((gt_boxesnp.shape[0],81), dtype=np.float32),) - print ("predict") # LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) print (cat_id_to_cls_name(testing_mask_final_clsesnp)) print (np.max(np.array(testing_mask_final_scoresnp),axis=1)) - _collectData(image_id_str, testing_mask_final_clsesnp, testing_mask_roisnp, testing_mask_final_scoresnp, img_h, img_w, new_img_h, new_img_w) + _collectData(image_id_str, testing_mask_final_clsesnp, testing_mask_roisnp, testing_mask_final_scoresnp, original_image_heightnp, original_image_widthnp, image_heightnp, image_widthnp, testing_mask_final_masknp) if __name__ == '__main__': test() From 569a0aa25c2f8fd1169a116ab6b3b0312993ba70 Mon Sep 17 00:00:00 2001 From: souryuu Date: Mon, 25 Sep 2017 18:57:45 +0900 Subject: [PATCH 34/35] fixed shuffle and queue during training changed some hyper params to reduce overfitting (mAP@1M train:0.47 test:0.36) --- libs/configs/config_v1.py | 12 +++++---- libs/layers/roi.py | 9 ++++--- libs/layers/sample.py | 14 ++++++---- libs/layers/wrapper.py | 4 +-- libs/nets/nets_factory.py | 6 ++--- libs/nets/pyramid_network.py | 20 +++++++++----- pycocoEval.py | 2 +- train/test.py | 38 ++++++++------------------- train/train.py | 51 +++++++++++++++++++++++++++--------- 9 files changed, 90 insertions(+), 66 deletions(-) diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index fbee754..00e8ff9 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -79,7 +79,7 @@ ###################### tf.app.flags.DEFINE_float( - 'weight_decay', 0.00005, 'The weight decay on the model weights.') + 'weight_decay', 0.00001, 'The weight decay on the model weights.') tf.app.flags.DEFINE_string( 'optimizer', 'momentum', @@ -118,23 +118,25 @@ 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') tf.app.flags.DEFINE_float( - 'momentum', 0.99, + 'momentum', 0.9, 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') tf.app.flags.DEFINE_float('rmsprop_momentum', 0.99, 'Momentum.') tf.app.flags.DEFINE_float('rmsprop_decay', 0.99, 'Decay term for RMSProp.') +tf.app.flags.DEFINE_float('batch_norm_decay', 0.9, 'Decay term for batch normalization.') + ####################### # Learning Rate Flags # ####################### tf.app.flags.DEFINE_string( - 'learning_rate_decay_type', 'exponential', + 'learning_rate_decay_type', 'fixed', 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.0002, +tf.app.flags.DEFINE_float('learning_rate', 0.0002,#0.0002 'Initial learning rate.') tf.app.flags.DEFINE_float( @@ -244,7 +246,7 @@ 'Only regions which intersection is larger than fg_threshold are considered to be fg') tf.app.flags.DEFINE_float( - 'bg_threshold', 0.3, + 'bg_threshold', 0.5, 'Only regions which intersection is less than bg_threshold are considered to be bg') tf.app.flags.DEFINE_integer( diff --git a/libs/layers/roi.py b/libs/layers/roi.py index 6e9b30f..4056271 100644 --- a/libs/layers/roi.py +++ b/libs/layers/roi.py @@ -70,9 +70,12 @@ def encode(gt_boxes, rois, num_classes): keep_inds = np.append(fg_inds, bg_inds) bbox_targets, bbox_inside_weights = _compute_targets( - rois[keep_inds, 0:4], gt_boxes[gt_assignment[keep_inds], :4], labels[keep_inds], num_classes) - bbox_targets = _unmap(bbox_targets, num_rois, keep_inds, 0) - bbox_inside_weights = _unmap(bbox_inside_weights, num_rois, keep_inds, 0) + rois, gt_boxes[gt_assignment, :4], labels, num_classes) + + # bbox_targets, bbox_inside_weights = _compute_targets( + # rois[keep_inds, 0:4], gt_boxes[gt_assignment[keep_inds], :4], labels[keep_inds], num_classes) + # bbox_targets = _unmap(bbox_targets, num_rois, keep_inds, 0) + # bbox_inside_weights = _unmap(bbox_inside_weights, num_rois, keep_inds, 0) else: # there is no gt diff --git a/libs/layers/sample.py b/libs/layers/sample.py index 683d8ab..e92ee38 100644 --- a/libs/layers/sample.py +++ b/libs/layers/sample.py @@ -198,21 +198,25 @@ def sample_rcnn_outputs(boxes, classes, prob, class_agnostic=False): det = np.hstack((boxes, scores)).astype(np.float32) keeps = nms_wrapper.nms(det, mask_nms_threshold) - - # filter low score - if post_nms_inst_n > 0: - keeps = keeps[:post_nms_inst_n] + scores = scores[keeps] boxes = boxes[keeps, :] classes = classes[keeps] prob = prob[keeps, :] + + # filter low score + if post_nms_inst_n > 0: + scores = scores[:post_nms_inst_n] + boxes = boxes[:post_nms_inst_n, :] + classes = classes[:post_nms_inst_n] + prob = prob[:post_nms_inst_n, :] # quick fix for tensorflow error when no bbox presents #@TODO if len(classes) is 0: scores = np.zeros((1, 1)) boxes = np.array([[0.0, 0.0, 2.0, 2.0]]) - classes = np.array([0]) + classes = np.array([0]).reshape(-1) prob = np.zeros((1,81)) else: diff --git a/libs/layers/wrapper.py b/libs/layers/wrapper.py index 2ff73c4..2a379a3 100644 --- a/libs/layers/wrapper.py +++ b/libs/layers/wrapper.py @@ -177,11 +177,11 @@ def assign_boxes(gt_boxes, tensors, layers, scope='AssignGTBoxes'): return assigned_tensors + [assigned_layers] -def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, scope='instInference'): +def sample_rcnn_outputs_wrapper(final_boxes, classes, cls2_prob, class_agnostic=False, scope='instInference'): with tf.name_scope(scope) as sc: inst_boxes, inst_classes, inst_prob, batch_inds = \ tf.py_func(sample.sample_rcnn_outputs, - [final_boxes, classes, cls2_prob], + [final_boxes, classes, cls2_prob, class_agnostic], [tf.float32, tf.int32, tf.float32, tf.int32]) inst_boxes = tf.convert_to_tensor(inst_boxes, name='inst_boxes') diff --git a/libs/nets/nets_factory.py b/libs/nets/nets_factory.py index 90fc472..e2637d2 100644 --- a/libs/nets/nets_factory.py +++ b/libs/nets/nets_factory.py @@ -25,18 +25,18 @@ } } -def get_network(name, image, weight_decay=0.000005, is_training=True): +def get_network(name, image, weight_decay=0.000005, batch_norm_decay=0.997, is_training=True): if name == 'resnet50': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet50(image, 1000, is_training=is_training) - with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): + with slim.arg_scope(resnet_v1.resnet_arg_scope(is_training=is_training, weight_decay=weight_decay, batch_norm_decay=batch_norm_decay)): logits, end_points = resnet50(image) if name == 'resnet101': # with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay)): # logits, end_points = resnet101(image, 1000, is_training=is_training) - with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=weight_decay, is_training=is_training)): + with slim.arg_scope(resnet_v1.resnet_arg_scope(is_training=is_training, weight_decay=weight_decay, batch_norm_decay=batch_norm_decay)): logits, end_points = resnet101(image) if name == 'resnext50': diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index bca77be..8fc5227 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -39,7 +39,7 @@ def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, activation_fn=None, - batch_norm_decay=0.997, + batch_norm_decay=0.9, batch_norm_epsilon=1e-5, batch_norm_scale=True, is_training=True): @@ -170,7 +170,10 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): else: pyramid_map = net_name if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() + if is_training is True: + arg_scope = _extra_conv_arg_scope_with_bn() + else: + arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0) #arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) @@ -211,7 +214,10 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i """ outputs = {} if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() + if is_training is True: + arg_scope = _extra_conv_arg_scope_with_bn() + else: + arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0) # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) @@ -300,9 +306,9 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') rcnn = slim.flatten(rcnn) rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training)#is_training rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) - rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=True)#is_training + rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training)#is_training rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, @@ -349,7 +355,7 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i else: ### for testing, mask network takes rcnn boxes as inputs - rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores) + rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask = sample_rcnn_outputs(rcnn_final_boxes, rcnn_final_classes, rcnn_scores, class_agnostic=False) [mask_assigned_rois, mask_assigned_clses, mask_assigned_scores, mask_assigned_batch_inds, mask_assigned_layer_inds] =\ assign_boxes(rcnn_rois_to_mask, [rcnn_rois_to_mask, rcnn_clses_to_mask, rcnn_scores_to_mask, rcnn_batch_inds_to_mask], [2, 3, 4, 5]) @@ -429,7 +435,7 @@ def build_losses(pyramid, image_height, image_width, outputs, gt_boxes, gt_masks mask_batch_pos = [] if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() + arg_scope = _extra_conv_arg_scope_with_bn() # arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) diff --git a/pycocoEval.py b/pycocoEval.py index d43193e..c6bc054 100644 --- a/pycocoEval.py +++ b/pycocoEval.py @@ -12,7 +12,7 @@ pylab.rcParams['figure.figsize'] = (10.0, 8.0) annType = ['segm','bbox','keypoints'] -annType = annType[1] #specify type here +annType = annType[0] #specify type here prefix = 'person_keypoints' if annType=='keypoints' else 'instances' print 'Running demo for *%s* results.'%(annType) diff --git a/train/test.py b/train/test.py index 2944e5c..5bed4ed 100644 --- a/train/test.py +++ b/train/test.py @@ -93,22 +93,16 @@ def _convertMasks(image_id, masks, classes, boxes, image_height, image_width): y2 = int(box_offset_y + mask.shape[0]) x1 = int(box_offset_x) x2 = int(box_offset_x + mask.shape[1]) - original_image_mask[y1:y2, x1:x2] = mask*255 #threshold by 0.5 original_image_mask = (original_image_mask >= 127) * 255 original_image_masks.append(original_image_mask) - # print(mask[cls].shape) - # print(box) - #original_image_masks = np.array(original_image_masks, order='F') - #original_image_masks = np.transpose(original_image_masks, [1, 2, 0]) - + return original_image_masks def _collectData(image_id, classes, boxes, probs, original_image_height, original_image_width, image_height, image_width, masks=None): instance_num = probs.shape[0] original_image_boxes = _convertBoxes(image_id, boxes, original_image_height, original_image_width, image_height, image_width) - #TODO: convert masks to original_image_masks if masks is not None: original_image_masks = _convertMasks(image_id, masks, classes, original_image_boxes, original_image_height, original_image_width) @@ -162,7 +156,7 @@ def test(): ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, - weight_decay=FLAGS.weight_decay, is_training=True) + weight_decay=0.0, batch_norm_decay=0.0, is_training=True) outputs = pyramid_network.build(end_points, im_shape[1], im_shape[2], pyramid_map, num_classes=81, base_anchors=3, @@ -179,18 +173,15 @@ def test(): ## solvers global_step = slim.create_global_step() - cropped_rois = tf.get_collection('__CROPPED__')[0] - transposed = tf.get_collection('__TRANSPOSED__')[0] - gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) - init_op = tf.group( - tf.global_variables_initializer(), - tf.local_variables_initializer() - ) - sess.run(init_op) + # init_op = tf.group( + # tf.global_variables_initializer(), + # tf.local_variables_initializer() + # ) + # sess.run(init_op) - summary_op = tf.summary.merge_all() + # summary_op = tf.summary.merge_all() logdir = os.path.join(FLAGS.train_dir, strftime('%Y%m%d%H%M%S', gmtime())) if not os.path.exists(logdir): os.makedirs(logdir) @@ -198,18 +189,11 @@ def test(): ## restore restore(sess) + tf.train.start_queue_runners(sess=sess) ## main loop - coord = tf.train.Coordinator() - threads = [] - # print (tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)) - for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): - threads.extend(qr.create_threads(sess, coord=coord, start=True)) - - tf.train.start_queue_runners(sess=sess, coord=coord) - # for step in range(FLAGS.max_iters): - for step in range(1000):#range(40503): + for step in range(82783):#range(40503): start_time = time.time() @@ -238,7 +222,7 @@ def test(): label=testing_mask_final_clsesnp, prob=testing_mask_final_scoresnp, mask=testing_mask_final_masknp, - vis_th=0.2) + vis_th=0.5) draw_bbox(step, np.uint8((np.array(input_imagenp[0])/2.0+0.5)*255.0), diff --git a/train/train.py b/train/train.py index 32c13ef..d35bd3c 100644 --- a/train/train.py +++ b/train/train.py @@ -10,6 +10,7 @@ import numpy as np import tensorflow as tf import tensorflow.contrib.slim as slim +from tensorflow.python.ops import control_flow_ops import gc from time import gmtime, strftime @@ -52,21 +53,32 @@ def solve(global_step): tf.summary.scalar('out_loss', out_loss) tf.summary.scalar('regular_loss', regular_loss) - update_ops = [] - variables_to_train = _get_variables_to_train() + # update_ops = [] + # variables_to_train = _get_variables_to_train() # update_op = optimizer.minimize(total_loss) - gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) - grad_updates = optimizer.apply_gradients(gradients, - global_step=global_step) - update_ops.append(grad_updates) - + + # gradients = optimizer.compute_gradients(total_loss, var_list=variables_to_train) + # grad_updates = optimizer.apply_gradients(gradients, + # global_step=global_step) + # update_ops.append(grad_updates) + # update moving mean and variance if FLAGS.update_bn: update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) update_bn = tf.group(*update_bns) - update_ops.append(update_bn) + # update_ops.append(update_bn) + total_loss = control_flow_ops.with_dependencies([update_bn], total_loss) + train_step = slim.learning.create_train_op(total_loss, optimizer) + return train_step - return tf.group(*update_ops) + # if FLAGS.update_bn: + # update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + # with tf.control_dependencies(update_ops): + # train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step) + # else: + # train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step) + + # return train_op#train_step#tf.group(*update_ops) def restore(sess): """choose which param to restore""" @@ -180,18 +192,29 @@ def train(): FLAGS.im_batch, is_training=True) + + data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, + dtypes=( + image.dtype, original_image_height.dtype, original_image_width.dtype, image_height.dtype, image_width.dtype, + gt_boxes.dtype, gt_masks.dtype, + num_instances.dtype, image_id.dtype)) + enqueue_op = data_queue.enqueue((image, original_image_height, original_image_width, image_height, image_width, gt_boxes, gt_masks, num_instances, image_id)) + data_queue_runner = tf.train.QueueRunner(data_queue, [enqueue_op] * 4) + tf.add_to_collection(tf.GraphKeys.QUEUE_RUNNERS, data_queue_runner) + (image, original_image_height, original_image_width, image_height, image_width, gt_boxes, gt_masks, num_instances, image_id) = data_queue.dequeue() + im_shape = tf.shape(image) image = tf.reshape(image, (im_shape[0], im_shape[1], im_shape[2], 3)) ## network logits, end_points, pyramid_map = network.get_network(FLAGS.network, image, - weight_decay=FLAGS.weight_decay, is_training=True) + weight_decay=FLAGS.weight_decay, batch_norm_decay=FLAGS.batch_norm_decay, is_training=True) outputs = pyramid_network.build(end_points, image_height, image_width, pyramid_map, num_classes=81, base_anchors=3,#9#15 is_training=True, gt_boxes=gt_boxes, gt_masks=gt_masks, - loss_weights=[10.0, 1.0, 1000.0, 1.0, 100.0]) + loss_weights=[1.0, 1.0, 10.0, 1.0, 10.0]) # loss_weights=[10.0, 1.0, 0.0, 0.0, 0.0]) # loss_weights=[100.0, 100.0, 1000.0, 10.0, 100.0]) # loss_weights=[0.2, 0.2, 1.0, 0.2, 1.0]) @@ -219,7 +242,7 @@ def train(): cropped_rois = tf.get_collection('__CROPPED__')[0] transposed = tf.get_collection('__TRANSPOSED__')[0] - gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) + gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) init_op = tf.group( tf.global_variables_initializer(), @@ -242,8 +265,10 @@ def train(): for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): threads.extend(qr.create_threads(sess, coord=coord, daemon=True, start=True)) - tf.train.start_queue_runners(sess=sess, coord=coord) + + #tf.train.start_queue_runners(sess=sess) + saver = tf.train.Saver(max_to_keep=20) for step in range(FLAGS.max_iters): From eec8946e66a75e3186b4f2603c22f534728d2844 Mon Sep 17 00:00:00 2001 From: souryuu Date: Fri, 29 Sep 2017 14:23:23 +0900 Subject: [PATCH 35/35] fixed some memory issues (use script/train.sh for training) removed images with extreme aspect ratio which cause OOM from tfrecords (records must be re-created) --- libs/configs/config_v1.py | 8 +- libs/datasets/download_and_convert_coco.py | 31 +++++- libs/layers/mask.py | 25 +++-- libs/nets/pyramid_network.py | 122 ++++++++++----------- script/train.sh | 22 ++++ train/train.py | 62 +++++++---- 6 files changed, 163 insertions(+), 107 deletions(-) create mode 100644 script/train.sh diff --git a/libs/configs/config_v1.py b/libs/configs/config_v1.py index 00e8ff9..63fd543 100644 --- a/libs/configs/config_v1.py +++ b/libs/configs/config_v1.py @@ -136,7 +136,7 @@ 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' ' or "polynomial"') -tf.app.flags.DEFINE_float('learning_rate', 0.0002,#0.0002 +tf.app.flags.DEFINE_float('learning_rate', 0.0001,#0.0002 'Initial learning rate.') tf.app.flags.DEFINE_float( @@ -250,7 +250,7 @@ 'Only regions which intersection is less than bg_threshold are considered to be bg') tf.app.flags.DEFINE_integer( - 'rois_per_image', 512, + 'rois_per_image', 256, 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_float( @@ -262,7 +262,7 @@ 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_integer( - 'rpn_batch_size', 512, + 'rpn_batch_size', 256, 'Number of rpn anchors that should be sampled to train this network') tf.app.flags.DEFINE_integer( @@ -305,7 +305,7 @@ 'mask_threshold', 0.50, 'Least intersection of a positive mask') tf.app.flags.DEFINE_integer( - 'masks_per_image', 512, + 'masks_per_image', 256, 'Number of rois that should be sampled to train this network') tf.app.flags.DEFINE_float( diff --git a/libs/datasets/download_and_convert_coco.py b/libs/datasets/download_and_convert_coco.py index 3d0ec94..8ba3870 100644 --- a/libs/datasets/download_and_convert_coco.py +++ b/libs/datasets/download_and_convert_coco.py @@ -218,8 +218,11 @@ def _get_coco_masks(coco, img_id, height, width, img_name): if bboxes.shape[0] <= 0: bboxes = np.zeros([0, 4], dtype=np.float32) classes = np.zeros([0], dtype=np.float32) - print ('None Annotations %s' % img_name) - LOG('None Annotations %s' % img_name) + #print ('None Annotations %s' % img_name) + #LOG('None Annotations %s' % img_name) + no_annotation_flag = True + else: + no_annotation_flag = False bboxes[:, 2] = bboxes[:, 0] + bboxes[:, 2] bboxes[:, 3] = bboxes[:, 1] + bboxes[:, 3] gt_boxes = np.hstack((bboxes, classes[:, np.newaxis])) @@ -228,7 +231,7 @@ def _get_coco_masks(coco, img_id, height, width, img_name): mask = mask.astype(np.uint8) assert masks.shape[0] == gt_boxes.shape[0], 'Shape Error' - return gt_boxes, masks, mask + return gt_boxes, masks, mask, no_annotation_flag @@ -286,11 +289,24 @@ def _add_to_tfrecord(record_dir, image_dir, annotation_dir, split_name): # jump over the damaged images if str(img_id) == '320612': + sys.stdout.write('\r>> skipping image %d/%d shard %d\n' % ( + i + 1, len(imgs), shard_id)) + sys.stdout.flush() continue # process anns height, width = imgs[i][1]['height'], imgs[i][1]['width'] - gt_boxes, masks, mask = _get_coco_masks(coco, img_id, height, width, img_name) + if float(height)/float(width) > 3.02 or float(width)/float(height) > 3.02: + sys.stdout.write('\r>> skipping image %d/%d shard %d height:%d width:%d\n' % ( + i + 1, len(imgs), shard_id, height, width)) + sys.stdout.flush() + continue + gt_boxes, masks, mask, no_annotation_flag = _get_coco_masks(coco, img_id, height, width, img_name) + if no_annotation_flag is True: + sys.stdout.write('\r>> skipping image %d/%d shard %d no annotation \n' % ( + i + 1, len(imgs), shard_id)) + sys.stdout.flush() + continue # read image as RGB numpy img = np.array(Image.open(img_name)) @@ -402,7 +418,12 @@ def is_in_minival(img_id, minival): height, width = imgs[i][1]['height'], imgs[i][1]['width'] coco = coco_train if i < num_of_train else coco_val - gt_boxes, masks, mask = _get_coco_masks(coco, img_id, height, width, img_name) + gt_boxes, masks, mask, no_annotation_flag = _get_coco_masks(coco, img_id, height, width, img_name) + if no_annotation_flag is True: + sys.stdout.write('\r>> skipping image %d/%d shard %d no annotation \n' % ( + i + 1, len(imgs), shard_id)) + sys.stdout.flush() + continue # read image as RGB numpy img = np.array(Image.open(img_name)) diff --git a/libs/layers/mask.py b/libs/layers/mask.py index 5becd6e..df96548 100644 --- a/libs/layers/mask.py +++ b/libs/layers/mask.py @@ -60,19 +60,22 @@ def encode(gt_masks, gt_boxes, rois, num_classes, mask_height, mask_width): # TODO: speed bottleneck? # TODO: mask ground truth accuracy check for i in keep_inds: + roi = rois[i, :4] + cropped = gt_masks[gt_assignment[i], int(roi[1]):int(roi[3])+1, int(roi[0]):int(roi[2])+1] + cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32))) - gt_height = gt_masks.shape[1] - gt_width = gt_masks.shape[2] - enlarged_width = mask_width*20.0 - enlarged_height = mask_height*20.0 + # gt_height = gt_masks.shape[1] + # gt_width = gt_masks.shape[2] + # enlarged_width = mask_width*15.0 + # enlarged_height = mask_height*15.0 - roi = rois[i, :4] - cropped = gt_masks[gt_assignment[i], :, :] - cropped = cv2.resize(cropped.astype(np.float32), (enlarged_width.astype(np.float32), enlarged_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) - cropped = cropped[ int(round(roi[1]*enlarged_height/float(gt_height))) : int(round(roi[3]*enlarged_height/float(gt_height))), - int(round(roi[0]*enlarged_width /float(gt_width ))) : int(round(roi[2]*enlarged_width /float(gt_width ))) - ] - cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) + # roi = rois[i, :4] + # cropped = gt_masks[gt_assignment[i], :, :] + # cropped = cv2.resize(cropped.astype(np.float32), (enlarged_width.astype(np.float32), enlarged_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) + # cropped = cropped[ int(round(roi[1]*enlarged_height/float(gt_height))) : int(round(roi[3]*enlarged_height/float(gt_height))), + # int(round(roi[0]*enlarged_width /float(gt_width ))) : int(round(roi[2]*enlarged_width /float(gt_width ))) + # ] + # cropped = cv2.resize(cropped.astype(np.float32), (mask_width.astype(np.float32), mask_height.astype(np.float32)), interpolation=cv2.INTER_CUBIC ) mask_targets[i, :, :, labels[i]] = cropped mask_inside_weights[i, :, :, labels[i]] = 1.0 diff --git a/libs/nets/pyramid_network.py b/libs/nets/pyramid_network.py index 8fc5227..6b8b01f 100644 --- a/libs/nets/pyramid_network.py +++ b/libs/nets/pyramid_network.py @@ -31,10 +31,6 @@ 'C4':'resnet_v1_50/block3/unit_5/bottleneck_v1', 'C5':'resnet_v1_50/block4/unit_3/bottleneck_v1', }, - 'resnet101': {'C1': '', 'C2': '', - 'C3': '', 'C4': '', - 'C5': '', - } } def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, @@ -59,9 +55,9 @@ def _extra_conv_arg_scope_with_bn(weight_decay=0.00001, activation_fn=tf.nn.relu, normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params): - # with slim.arg_scope([slim.batch_norm], **batch_norm_params): - with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: - return arg_sc + with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc def _extra_conv_arg_scope(weight_decay=0.00001, activation_fn=None, normalizer_fn=None): @@ -164,42 +160,43 @@ def build_pyramid(net_name, end_points, bilinear=True, is_training=True): Returns: returns several endpoints """ - pyramid = {} - if isinstance(net_name, str): - pyramid_map = _networks_map[net_name] - else: - pyramid_map = net_name + if _BN is True: if is_training is True: arg_scope = _extra_conv_arg_scope_with_bn() else: - arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0) - #arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0, weight_decay=0.0) + #arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0, weight_decay=0.0, is_training=is_training) else: arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) # - with tf.variable_scope('pyramid'): - with slim.arg_scope(arg_scope): + with tf.name_scope('pyramid') as py_scope: + with slim.arg_scope(arg_scope) as slim_scope: + pyramid = {} + if isinstance(net_name, str): + pyramid_map = _networks_map[net_name] + else: + pyramid_map = net_name pyramid['P5'] = \ - slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='C5') + slim.conv2d(end_points[pyramid_map['C5']], 256, [1, 1], stride=1, scope='pyramid/C5') for c in range(4, 1, -1): s, s_ = pyramid['P%d'%(c+1)], end_points[pyramid_map['C%d' % (c)]] up_shape = tf.shape(s_) - s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='C%d/upscale'%c) - s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='C%d'%c) + s = tf.image.resize_bilinear(s, [up_shape[1], up_shape[2]], name='pyramid/C%d/upscale'%c) + s_ = slim.conv2d(s_, 256, [1,1], stride=1, scope='pyramid/C%d'%c) - s = tf.add(s, s_, name='C%d/addition'%c) - s = slim.conv2d(s, 256, [3,3], stride=1, scope='C%d/fusion'%c) + s = tf.add(s, s_, name='pyramid/C%d/addition'%c) + s = slim.conv2d(s, 256, [3,3], stride=1, scope='pyramid/C%d/fusion'%c) pyramid['P%d'%(c)] = s - return pyramid + return pyramid, py_scope, slim_scope -def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, is_training=False, gt_boxes=None): +def build_heads(pyramid, py_scope, slim_scope, image_height, image_width, num_classes, base_anchors, is_training=False, gt_boxes=None): """Build the 3-way outputs, i.e., class, box and mask in the pyramid Algo ---- @@ -213,17 +210,16 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i 7. Build losses """ outputs = {} - if _BN is True: - if is_training is True: - arg_scope = _extra_conv_arg_scope_with_bn() - else: - arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0) - # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): + # if _BN is True: + # if is_training is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + # else: + # arg_scope = _extra_conv_arg_scope_with_bn(batch_norm_decay=0.0) + # # arg_scope = _extra_conv_arg_scope_with_bn(is_training=is_training) + # else: + # arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with tf.name_scope(py_scope) as py_scope: + with slim.arg_scope(slim_scope) as slim_scope: ### for p in pyramid outputs['rpn'] = {} for i in range(5, 1, -1): @@ -240,16 +236,16 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i """ shape = tf.shape(pyramid[p]) height, width = shape[1], shape[2] - rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='%s/rpn'%p) - box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='%s/rpn/box' % p, \ + rpn = slim.conv2d(pyramid[p], 256, [3, 3], stride=1, activation_fn=tf.nn.relu, scope='pyramid/%s/rpn'%p) + box = slim.conv2d(rpn, base_anchors * 4, [1, 1], stride=1, scope='pyramid/%s/rpn/box' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.001), activation_fn=None, normalizer_fn=None) - cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='%s/rpn/cls' % p, \ + cls = slim.conv2d(rpn, base_anchors * 2, [1, 1], stride=1, scope='pyramid/%s/rpn/cls' % p, \ weights_initializer=tf.truncated_normal_initializer(stddev=0.01), activation_fn=None, normalizer_fn=None) anchor_scales = [8]#[2 **(i-2), 2 ** (i-1), 2 **(i)] print("anchor_scales = " , anchor_scales) all_anchors = gen_all_anchors(height, width, stride, anchor_scales) - outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors} + outputs['rpn'][p]={'box':box, 'cls':cls, 'anchor':all_anchors, 'shape':shape} ### gather boxes, clses, anchors from all pyramid layers rpn_boxes = [tf.reshape(outputs['rpn']['P%d'%p]['box'], [-1, 4]) for p in range(5, 1, -1)] @@ -305,21 +301,20 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i """ rcnn = slim.max_pool2d(rcnn_cropped_features, [3, 3], stride=2, padding='SAME') rcnn = slim.flatten(rcnn) - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001), scope="pyramid/fully_connected") rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training)#is_training - rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + rcnn = slim.fully_connected(rcnn, 1024, activation_fn=tf.nn.relu, weights_initializer=tf.truncated_normal_initializer(stddev=0.001), scope="pyramid/fully_connected_1") rcnn = slim.dropout(rcnn, keep_prob=0.75, is_training=is_training)#is_training rcnn_clses = slim.fully_connected(rcnn, num_classes, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), scope="pyramid/fully_connected_2") rcnn_boxes = slim.fully_connected(rcnn, num_classes*4, activation_fn=None, normalizer_fn=None, - weights_initializer=tf.truncated_normal_initializer(stddev=0.001)) + weights_initializer=tf.truncated_normal_initializer(stddev=0.001), scope="pyramid/fully_connected_3") ### softmax to get probability rcnn_scores = tf.nn.softmax(rcnn_clses) ### decode ROIs and box regression values into bounding boxes rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, image_height, image_width) - rcnn_final_boxes, rcnn_final_classes, rcnn_final_scores = roi_decoder(rcnn_boxes, rcnn_scores, rcnn_ordered_rois, image_height, image_width) outputs['rcnn_ordered_rois'] = rcnn_ordered_rois outputs['rcnn_cropped_features'] = rcnn_cropped_features @@ -389,20 +384,22 @@ def build_heads(pyramid, image_height, image_width, num_classes, base_anchors, i m: an array of shape (28, 28, num_classes). Note that this value is before sigmoid. """ m = mask_cropped_features - for _ in range(4): - m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu) - m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu) + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu, scope="pyramid/Conv") + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu, scope="pyramid/Conv_1") + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu, scope="pyramid/Conv_2") + m = slim.conv2d(m, 256, [3, 3], stride=1, padding='SAME', activation_fn=tf.nn.relu, scope="pyramid/Conv_3") + m = slim.conv2d_transpose(m, 256, 2, stride=2, padding='VALID', activation_fn=tf.nn.relu, scope="pyramid/Conv2d_transpose") tf.add_to_collection('__TRANSPOSED__', m) - m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None) + m = slim.conv2d(m, num_classes, [1, 1], stride=1, padding='VALID', activation_fn=None, normalizer_fn=None, scope="pyramid/Conv_4") outputs['mask_ordered_rois'] = mask_ordered_rois outputs['mask_cropped_features'] = mask_cropped_features outputs['mask_mask'] = m outputs['mask_final_mask'] = tf.nn.sigmoid(m) - return outputs + return outputs, py_scope, slim_scope -def build_losses(pyramid, image_height, image_width, outputs, gt_boxes, gt_masks, +def build_losses(pyramid, py_scope, slim_scope, image_height, image_width, outputs, gt_boxes, gt_masks, num_classes, base_anchors, rpn_box_lw =0.1, rpn_cls_lw = 0.1, rcnn_box_lw=1.0, rcnn_cls_lw=0.1, @@ -434,14 +431,13 @@ def build_losses(pyramid, image_height, image_width, outputs, gt_boxes, gt_masks rcnn_batch_pos = [] mask_batch_pos = [] - if _BN is True: - arg_scope = _extra_conv_arg_scope_with_bn() - # arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) - else: - arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) - with slim.arg_scope(arg_scope): - with tf.variable_scope('pyramid'): - + # if _BN is True: + # arg_scope = _extra_conv_arg_scope_with_bn() + # # arg_scope = _extra_conv_arg_scope_with_bn(is_training=True) + # else: + # arg_scope = _extra_conv_arg_scope(activation_fn=tf.nn.relu) + with tf.name_scope(py_scope) as py_scope: + with slim.arg_scope(slim_scope) as slim_scope: ## assigning gt_boxes [assigned_gt_boxes, assigned_layer_inds] = assign_boxes(gt_boxes, [gt_boxes], [2, 3, 4, 5]) @@ -617,13 +613,13 @@ def build(end_points, image_height, image_width, pyramid_map, gt_masks=None, loss_weights=[0.1, 0.1, 1.0, 0.1, 1.0]): - pyramid = build_pyramid(pyramid_map, end_points, is_training=is_training) + pyramid, py_scope, slim_scope = build_pyramid(pyramid_map, end_points, is_training=is_training) if is_training: - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + outputs, py_scope, slim_scope = \ + build_heads(pyramid, py_scope, slim_scope, image_height, image_width, num_classes, base_anchors, is_training=is_training, gt_boxes=gt_boxes) - loss, losses, batch_info = build_losses(pyramid, image_height, image_width, outputs, + loss, losses, batch_info = build_losses(pyramid, py_scope, slim_scope, image_height, image_width, outputs, gt_boxes, gt_masks, num_classes=num_classes, base_anchors=base_anchors, rpn_box_lw=loss_weights[0], rpn_cls_lw=loss_weights[1], @@ -634,8 +630,8 @@ def build(end_points, image_height, image_width, pyramid_map, outputs['total_loss'] = loss outputs['batch_info'] = batch_info else: - outputs = \ - build_heads(pyramid, image_height, image_width, num_classes, base_anchors, + outputs, py_scope, slim_scope = \ + build_heads(pyramid, py_scope, slim_scope, image_height, image_width, num_classes, base_anchors, is_training=is_training) ### just decode outputs into readable prediction diff --git a/script/train.sh b/script/train.sh new file mode 100644 index 0000000..fae926a --- /dev/null +++ b/script/train.sh @@ -0,0 +1,22 @@ +#https://stackoverflow.com/documentation/tensorflow/3883/how-to-debug-a-memory-leak-in-tensorflow#t=201612280142239281993 + +#To improve memory allocation performance, many TensorFlow users often use tcmalloc instead of the default malloc() implementation, as tcmalloc suffers less from fragmentation when allocating and deallocating #large objects (such as many tensors). Some memory-intensive TensorFlow programs have been known to leak heap address space (while freeing all of the individual objects they use) with the default malloc(), but #performed just fine after switching to tcmalloc. In addition, tcmalloc includes a heap profiler, which makes it possible to track down where any remaining leaks might have occurred. + +#The installation for tcmalloc will depend on your operating system, but the following works on Ubuntu 14.04 (trusty) (where script.py is the name of your TensorFlow Python program): + +#sudo apt-get install google-perftools4 +LD_PRELOAD=/usr/lib/libtcmalloc.so.4 python train/train.py + +#As noted above, simply switching to tcmalloc can fix a lot of apparent leaks. However, if the memory usage is still growing, you can use the heap profiler as follows: + +#LD_PRELOAD=/usr/lib/libtcmalloc.so.4 HEAPPROFILE=/tmp/profile python script.py ... +#After you run the above command, the program will periodically write profiles to the filesystem. The sequence of profiles will be named: + +#/tmp/profile.0000.heap +#/tmp/profile.0001.heap +#/tmp/profile.0002.heap +#... +#You can read the profiles using the google-pprof tool, which (for example, on Ubuntu 14.04) can be installed as part of the google-perftools package. For example, to look at the third snapshot collected above: + +#google-pprof --gv `which python` /tmp/profile.0002.heap +#Running the above command will pop up a GraphViz window, showing the profile information as a directed graph. \ No newline at end of file diff --git a/train/train.py b/train/train.py index d35bd3c..7e53a1c 100644 --- a/train/train.py +++ b/train/train.py @@ -33,7 +33,7 @@ from libs.visualization.pil_utils import cat_id_to_cls_name, draw_img, draw_bbox FLAGS = tf.app.flags.FLAGS -resnet50 = resnet_v1.resnet_v1_50 +#resnet50 = resnet_v1.resnet_v1_50 def solve(global_step): """add solver to losses""" @@ -44,13 +44,14 @@ def solve(global_step): # compute and apply gradient losses = tf.get_collection(tf.GraphKeys.LOSSES) + loss = tf.add_n(losses) regular_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) regular_loss = tf.add_n(regular_losses) - out_loss = tf.add_n(losses) - total_loss = tf.add_n(losses + regular_losses) + + total_loss = loss + regular_loss tf.summary.scalar('total_loss', total_loss) - tf.summary.scalar('out_loss', out_loss) + tf.summary.scalar('loss', loss) tf.summary.scalar('regular_loss', regular_loss) # update_ops = [] @@ -62,23 +63,23 @@ def solve(global_step): # global_step=global_step) # update_ops.append(grad_updates) - # update moving mean and variance + ## update moving mean and variance + # if FLAGS.update_bn: + # update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + # update_bn = tf.group(*update_bns) + # # update_ops.append(update_bn) + # total_loss = control_flow_ops.with_dependencies([update_bn], total_loss) + # train_op = slim.learning.create_train_op(total_loss, optimizer) + if FLAGS.update_bn: - update_bns = tf.get_collection(tf.GraphKeys.UPDATE_OPS) - update_bn = tf.group(*update_bns) - # update_ops.append(update_bn) - total_loss = control_flow_ops.with_dependencies([update_bn], total_loss) - train_step = slim.learning.create_train_op(total_loss, optimizer) - return train_step + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + with tf.control_dependencies(update_ops): + train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step) + else: + train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step) - # if FLAGS.update_bn: - # update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) - # with tf.control_dependencies(update_ops): - # train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step) - # else: - # train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step) + return train_op - # return train_op#train_step#tf.group(*update_ops) def restore(sess): """choose which param to restore""" @@ -192,7 +193,7 @@ def train(): FLAGS.im_batch, is_training=True) - + ## queuing data data_queue = tf.RandomShuffleQueue(capacity=32, min_after_dequeue=16, dtypes=( image.dtype, original_image_height.dtype, original_image_width.dtype, image_height.dtype, image_width.dtype, @@ -234,6 +235,10 @@ def train(): training_mask_clses_target = outputs['training_mask_clses_target'] training_mask_final_mask = outputs['training_mask_final_mask'] training_mask_final_mask_target = outputs['training_mask_final_mask_target'] + tmp_0 = outputs['rpn']['P2']['shape'] + tmp_1 = outputs['rpn']['P3']['shape'] + tmp_2 = outputs['rpn']['P4']['shape'] + tmp_3 = outputs['rpn']['P5']['shape'] ## solvers global_step = slim.create_global_step() @@ -243,7 +248,9 @@ def train(): transposed = tf.get_collection('__TRANSPOSED__')[0] gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95) + #gpu_options = tf.GPUOptions(allow_growth=True) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) + #sess = tf.InteractiveSession(config=tf.ConfigProto(gpu_options=gpu_options)) init_op = tf.group( tf.global_variables_initializer(), tf.local_variables_initializer() @@ -259,7 +266,7 @@ def train(): ## restore restore(sess) - ## main loop + ## coord settings coord = tf.train.Coordinator() threads = [] for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS): @@ -267,23 +274,26 @@ def train(): start=True)) tf.train.start_queue_runners(sess=sess, coord=coord) - #tf.train.start_queue_runners(sess=sess) - + ## saver init saver = tf.train.Saver(max_to_keep=20) + ## finalize the graph for checking memory leak + sess.graph.finalize() + + ## main loop for step in range(FLAGS.max_iters): start_time = time.time() s_, tot_loss, reg_lossnp, image_id_str, \ rpn_box_loss, rpn_cls_loss, rcnn_box_loss, rcnn_cls_loss, mask_loss, \ - gt_boxesnp, \ + gt_boxesnp, tmp_0np, tmp_1np, tmp_2np, tmp_3np, \ rpn_batch_pos, rpn_batch, rcnn_batch_pos, rcnn_batch, mask_batch_pos, mask_batch, \ input_imagenp, \ training_rcnn_roisnp, training_rcnn_clsesnp, training_rcnn_clses_targetnp, training_rcnn_scoresnp, training_mask_roisnp, training_mask_clses_targetnp, training_mask_final_masknp, training_mask_final_mask_targetnp = \ sess.run([update_op, total_loss, regular_loss, image_id] + losses + - [gt_boxes] + + [gt_boxes] + [tmp_0] + [tmp_1] + [tmp_2] +[tmp_3] + batch_info + [input_image] + [training_rcnn_rois] + [training_rcnn_clses] + [training_rcnn_clses_target] + [training_rcnn_scores] + [training_mask_rois] + [training_mask_clses_target] + [training_mask_final_mask] + [training_mask_final_mask_target]) @@ -303,6 +313,10 @@ def train(): LOG (cat_id_to_cls_name(np.unique(np.argmax(np.asarray(training_rcnn_clses_targetnp),axis=1)))) LOG ("predict") LOG (cat_id_to_cls_name(np.unique(np.argmax(np.array(training_rcnn_clsesnp),axis=1)))) + LOG (tmp_0np) + LOG (tmp_1np) + LOG (tmp_2np) + LOG (tmp_3np) if step % 50 == 0: draw_bbox(step,