| @@ -587,6 +587,97 @@ std::optional<ValueRefList> fastpathcopy_grad_rule( | |||||
| return imperative::apply(op, inputs); | return imperative::apply(op, inputs); | ||||
| } | } | ||||
| std::optional<ValueRefList> warp_affine_grad_rule( | |||||
| const OpDef& op, Span<ValueRef> inputs, Span<bool> inputs_require_grad, | |||||
| CustomBackward& backward) { | |||||
| auto&& warp_affine = op.cast_final_safe<WarpAffine>(); | |||||
| auto&& param = warp_affine.param(); | |||||
| mgb_assert(inputs.size() == 3); | |||||
| SmallVector<ValueRef> inps; | |||||
| if (inputs_require_grad[0] || inputs_require_grad[1]) { | |||||
| for (size_t i = 0; i < inputs.size(); ++i) { | |||||
| inps.push_back(inputs[i]); | |||||
| } | |||||
| } | |||||
| auto maker = CustomGradMaker(backward, inputs.size()); | |||||
| maker.output_size(1).output_captured(0, false); | |||||
| maker.backward([inputs = std::move(inps), &warp_affine, | |||||
| param](Span<ValueRef> grads) { | |||||
| mgb_assert(grads.size() == 1); | |||||
| ValueRef grad = grads[0]; | |||||
| SmallVector<ValueRef> ret(2); | |||||
| if (!grad) { | |||||
| return ret; | |||||
| } | |||||
| CompNodeValue::ref_t device = inputs[0].device(); | |||||
| DTypeValue::ref_t dtype = inputs[0].dtype(); | |||||
| HostTensorStorage storage(*device); | |||||
| storage.ensure_size(3 * (dtype->size())); | |||||
| auto* ptr = reinterpret_cast<dt_float32*>(storage.ptr()); | |||||
| ptr[0] = 0; | |||||
| ptr[1] = 0; | |||||
| ptr[2] = 1; | |||||
| auto t = imperative::apply( | |||||
| CreateTensor( | |||||
| CreateTensor::Unique, *device, dtype::Float32(), | |||||
| ValueShape({1, 1, 3})), | |||||
| HostStorage::make(storage))[0]; | |||||
| auto mat = inputs[1]; | |||||
| auto&& concat = Concat::make(); | |||||
| concat->axis = 1; | |||||
| mat = imperative::apply(*concat, inputs[1], t)[0]; | |||||
| if (inputs[0]) { | |||||
| auto&& grad_op = WarpPerspectiveBackwardData::make( | |||||
| param.imode, param.border_mode, param.format, param.border_val); | |||||
| ValueRefList args_(inputs.size()); | |||||
| args_[0] = mat; | |||||
| args_[1] = grads[0]; | |||||
| args_[2] = inputs[0]; | |||||
| ret[0] = imperative::apply(*grad_op, args_)[0]; | |||||
| } | |||||
| if (inputs[1]) { | |||||
| auto&& grad_op = WarpPerspectiveBackwardMat::make( | |||||
| param.imode, param.border_mode, param.format, param.border_val); | |||||
| ValueRefList args_(inputs.size()); | |||||
| args_[0] = inputs[0]; | |||||
| args_[1] = mat; | |||||
| args_[2] = grads[0]; | |||||
| ret[1] = imperative::apply(*grad_op, args_)[0]; | |||||
| std::vector<std::tuple<int8_t, bool, bool, bool, bool>> items; | |||||
| items.push_back(std::make_tuple(1, true, true, false, false)); | |||||
| auto&& subtensor = Subtensor::make(items); | |||||
| CompNodeValue::ref_t device = inputs[0].device(); | |||||
| DTypeValue::ref_t dtype = inputs[0].dtype(); | |||||
| int start_idx = 0; | |||||
| int stop_idx = 2; | |||||
| auto get_subtensor_index = [&](int idx) { | |||||
| HostTensorStorage storage(*device); | |||||
| storage.ensure_size(dtype::Int32().size()); | |||||
| auto* ptr = reinterpret_cast<dt_int32*>(storage.ptr()); | |||||
| ptr[0] = idx; | |||||
| return imperative::apply( | |||||
| CreateTensor( | |||||
| CreateTensor::Unique, *device, dtype::Int32(), | |||||
| ValueShape({1})), | |||||
| HostStorage::make(storage))[0]; | |||||
| }; | |||||
| auto start = get_subtensor_index(start_idx); | |||||
| auto stop = get_subtensor_index(stop_idx); | |||||
| auto data = ret[1]; | |||||
| mgb_assert(data); | |||||
| ret[1] = imperative::apply(*subtensor, data, start, stop)[0]; | |||||
| } | |||||
| return ret; | |||||
| }); | |||||
| maker.finalize(); | |||||
| return imperative::apply(ApplyOp(op), inputs); | |||||
| } | |||||
| struct Init { | struct Init { | ||||
| Init() { | Init() { | ||||
| CustomBackward::register_grad_rule(Elemwise::typeinfo(), elemwise_grad_rule); | CustomBackward::register_grad_rule(Elemwise::typeinfo(), elemwise_grad_rule); | ||||
| @@ -610,6 +701,8 @@ struct Init { | |||||
| CustomBackward::register_grad_rule(MatrixMul::typeinfo(), matrix_mul_grad_rule); | CustomBackward::register_grad_rule(MatrixMul::typeinfo(), matrix_mul_grad_rule); | ||||
| CustomBackward::register_grad_rule( | CustomBackward::register_grad_rule( | ||||
| BatchedMatrixMul::typeinfo(), batched_matrix_mul_grad_rule); | BatchedMatrixMul::typeinfo(), batched_matrix_mul_grad_rule); | ||||
| CustomBackward::register_grad_rule( | |||||
| WarpAffine::typeinfo(), warp_affine_grad_rule); | |||||
| } | } | ||||
| } _; | } _; | ||||
| @@ -14,6 +14,7 @@ import megengine.core.tensor.dtype as dtype | |||||
| import megengine.functional as F | import megengine.functional as F | ||||
| import megengine.jit as jit | import megengine.jit as jit | ||||
| from megengine import Parameter, Tensor, is_cuda_available, tensor | from megengine import Parameter, Tensor, is_cuda_available, tensor | ||||
| from megengine.autodiff import GradManager | |||||
| from megengine.core._trace_option import use_symbolic_shape | from megengine.core._trace_option import use_symbolic_shape | ||||
| from megengine.core.autodiff.grad import Grad | from megengine.core.autodiff.grad import Grad | ||||
| from megengine.core.tensor.utils import make_shape_tuple | from megengine.core.tensor.utils import make_shape_tuple | ||||
| @@ -571,6 +572,48 @@ def test_warp_perspective(dt): | |||||
| np.testing.assert_equal(outp.numpy(), np.array([[[[5, 6], [9, 10]]]], dtype=dt)) | np.testing.assert_equal(outp.numpy(), np.array([[[[5, 6], [9, 10]]]], dtype=dt)) | ||||
| def test_warp_affine_grad(): | |||||
| dy_np = np.arange(1, 10, dtype=np.float32).reshape(1, 1, 3, 3) | |||||
| x_np = np.arange(1, 10, dtype=np.float32).reshape(1, 1, 3, 3) | |||||
| mat_np_affine = np.array([[[0.5, 0, 0], [0, 0.5, 0],]]).astype("float32") | |||||
| mat_np_perspective = np.array([[[0.5, 0, 0], [0, 0.5, 0], [0, 0, 1]]]).astype( | |||||
| "float32" | |||||
| ) | |||||
| dmat_affine = Tensor(np.ones((1, 2, 3), dtype=np.float32)) | |||||
| dy_affine = Tensor(dy_np) | |||||
| x_affine = Tensor(x_np) | |||||
| mat_affine = Tensor(mat_np_affine) | |||||
| target_shape_affine = x_affine.shape[2:] | |||||
| dmat_perspective = Tensor(np.ones((1, 3, 3), dtype=np.float32)) | |||||
| dy_perspective = Tensor(dy_np) | |||||
| x_perspective = Tensor(x_np) | |||||
| mat_perspective = Tensor(mat_np_perspective) | |||||
| target_shape_perspective = x_perspective.shape[2:] | |||||
| gm = GradManager().attach([x_affine, mat_affine, x_perspective, mat_perspective]) | |||||
| with gm: | |||||
| y_affine = F.warp_affine( | |||||
| x_affine, mat_affine, target_shape_affine, format="NCHW" | |||||
| ) | |||||
| y_perspective = F.warp_perspective( | |||||
| x_perspective, mat_perspective, target_shape_perspective | |||||
| ) | |||||
| gm.backward([y_affine, y_perspective], [dy_affine, dy_perspective]) | |||||
| np.testing.assert_allclose( | |||||
| x_affine.grad.numpy(), x_perspective.grad.numpy(), rtol=1e-5, atol=1e-5 | |||||
| ) | |||||
| np.testing.assert_allclose( | |||||
| mat_affine.grad.numpy(), | |||||
| mat_perspective.grad.numpy()[0:1, 0:2, 0:3], | |||||
| rtol=1e-5, | |||||
| atol=1e-5, | |||||
| ) | |||||
| @pytest.mark.parametrize("dt", [np.float32, np.int8, np.uint8, np.float16]) | @pytest.mark.parametrize("dt", [np.float32, np.int8, np.uint8, np.float16]) | ||||
| def test_warp_perspective_mat_idx(dt): | def test_warp_perspective_mat_idx(dt): | ||||
| inp_shape = (2, 1, 4, 4) | inp_shape = (2, 1, 4, 4) | ||||
| @@ -0,0 +1,38 @@ | |||||
| #include "../op_trait.h" | |||||
| #include "megbrain/imperative/ops/autogen.h" | |||||
| #include "megbrain/opr/imgproc.h" | |||||
| namespace mgb::imperative { | |||||
| namespace { | |||||
| namespace warp_perspective_backward_data { | |||||
| auto apply_on_var_node(const OpDef& def, const VarNodeArray& inputs) { | |||||
| mgb_assert(inputs.size() == 3); | |||||
| auto&& op = static_cast<const WarpPerspectiveBackwardData&>(def); | |||||
| OperatorNodeConfig config{op.make_name()}; | |||||
| return opr::WarpPerspectiveBackwardData::make( | |||||
| inputs[0], inputs[1], inputs[2], op.param(), config); | |||||
| } | |||||
| OP_TRAIT_REG(WarpPerspectiveBackwardData, WarpPerspectiveBackwardData) | |||||
| .apply_on_var_node(apply_on_var_node) | |||||
| .fallback(); | |||||
| } // namespace warp_perspective_backward_data | |||||
| namespace warp_perspective_backward_mat { | |||||
| auto apply_on_var_node(const OpDef& def, const VarNodeArray& inputs) { | |||||
| mgb_assert(inputs.size() == 3); | |||||
| auto&& op = static_cast<const WarpPerspectiveBackwardMat&>(def); | |||||
| OperatorNodeConfig config{op.make_name()}; | |||||
| return opr::WarpPerspectiveBackwardMat::make( | |||||
| inputs[0], inputs[1], inputs[2], op.param(), config); | |||||
| } | |||||
| OP_TRAIT_REG(WarpPerspectiveBackwardMat, WarpPerspectiveBackwardMat) | |||||
| .apply_on_var_node(apply_on_var_node) | |||||
| .fallback(); | |||||
| } // namespace warp_perspective_backward_mat | |||||
| } // namespace | |||||
| } // namespace mgb::imperative | |||||
| @@ -1,7 +1,7 @@ | |||||
| 905bdf78e5413b06873be64b4ba55db9 ../../dnn/scripts/opr_param_defs.py | 905bdf78e5413b06873be64b4ba55db9 ../../dnn/scripts/opr_param_defs.py | ||||
| 759bfbf27fd3f0dd6b6edf06377e1d6b ../../src/core/include/megbrain/ir/ops.td | |||||
| 2a5851d0e2470d4d045811e7a20b1a3f generated/opdef.h.inl | |||||
| 55b862badeed19aed8e84c5d6f468ff2 generated/opdef.cpp.inl | |||||
| f3f4c7f0ee1b39392df8a679f6d22596 generated/opdef.py.inl | |||||
| 6b11ca844a7855fdc5eebffaf563a89c generated/opdef.cpy.inl | |||||
| e35e13523f43b7bea4034a0bf75937b7 ../../src/core/include/megbrain/ir/ops.td | |||||
| 240dccd6f8d42cadfd08c6ca90fe61b1 generated/opdef.h.inl | |||||
| a79a4058ff18ffd9593ee5db3deef6c4 generated/opdef.cpp.inl | |||||
| 83c179ee7416824fbfab978a097cd4d3 generated/opdef.py.inl | |||||
| 86f70b1052331130f5e4c0ca53e68423 generated/opdef.cpy.inl | |||||
| 71e1462bf4d882e2615c3c632cb671cc generated/enum_macro.h | 71e1462bf4d882e2615c3c632cb671cc generated/enum_macro.h | ||||
| @@ -6941,4 +6941,300 @@ OP_TRAIT_REG(WarpPerspective, WarpPerspective) | |||||
| .props(WarpPerspective_props_impl) | .props(WarpPerspective_props_impl) | ||||
| .make_name(WarpPerspective_make_name_impl); | .make_name(WarpPerspective_make_name_impl); | ||||
| MGB_DYN_TYPE_OBJ_FINAL_IMPL(WarpPerspectiveBackwardData); | |||||
| namespace { | |||||
| size_t WarpPerspectiveBackwardData_hash_impl(const OpDef& def_) { | |||||
| auto&& op_ = def_.cast_final_safe<WarpPerspectiveBackwardData>(); | |||||
| static_cast<void>(op_); | |||||
| size_t val = mgb::hash(op_.dyn_typeinfo()); | |||||
| val = mgb::hash_pair_combine(val, mgb::enumhash()(op_.imode)); | |||||
| val = mgb::hash_pair_combine(val, mgb::enumhash()(op_.bmode)); | |||||
| val = mgb::hash_pair_combine(val, mgb::enumhash()(op_.format)); | |||||
| val = mgb::hash_pair_combine(val, mgb::hash(op_.border_val)); | |||||
| return val; | |||||
| } | |||||
| bool WarpPerspectiveBackwardData_is_same_st_impl(const OpDef& lhs_, const OpDef& rhs_) { | |||||
| auto &&a_ = lhs_.cast_final_safe<WarpPerspectiveBackwardData>(), | |||||
| &&b_ = rhs_.cast_final_safe<WarpPerspectiveBackwardData>(); | |||||
| static_cast<void>(a_); | |||||
| static_cast<void>(b_); | |||||
| if (a_.imode != b_.imode) return false; | |||||
| if (a_.bmode != b_.bmode) return false; | |||||
| if (a_.format != b_.format) return false; | |||||
| if (a_.border_val != b_.border_val) return false; | |||||
| return true; | |||||
| } | |||||
| std::vector<std::pair<const char*, std::string>> WarpPerspectiveBackwardData_props_impl(const OpDef& def_) { | |||||
| auto&& op_ = def_.cast_final_safe<WarpPerspectiveBackwardData>(); | |||||
| static_cast<void>(op_); | |||||
| std::vector<std::pair<const char*, std::string>> props_; | |||||
| switch (op_.imode){ | |||||
| case WarpPerspectiveBackwardData::InterpolationMode::NEAREST: | |||||
| props_.emplace_back("imode", "NEAREST"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::InterpolationMode::LINEAR: | |||||
| props_.emplace_back("imode", "LINEAR"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::InterpolationMode::AREA: | |||||
| props_.emplace_back("imode", "AREA"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::InterpolationMode::CUBIC: | |||||
| props_.emplace_back("imode", "CUBIC"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::InterpolationMode::LANCZOS4: | |||||
| props_.emplace_back("imode", "LANCZOS4"); | |||||
| break; | |||||
| default: | |||||
| props_.emplace_back("imode", "INVALID"); | |||||
| break; | |||||
| } | |||||
| switch (op_.bmode){ | |||||
| case WarpPerspectiveBackwardData::BorderMode::REPLICATE: | |||||
| props_.emplace_back("bmode", "REPLICATE"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::BorderMode::REFLECT: | |||||
| props_.emplace_back("bmode", "REFLECT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::BorderMode::REFLECT_101: | |||||
| props_.emplace_back("bmode", "REFLECT_101"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::BorderMode::WRAP: | |||||
| props_.emplace_back("bmode", "WRAP"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::BorderMode::CONSTANT: | |||||
| props_.emplace_back("bmode", "CONSTANT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::BorderMode::TRANSPARENT: | |||||
| props_.emplace_back("bmode", "TRANSPARENT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::BorderMode::ISOLATED: | |||||
| props_.emplace_back("bmode", "ISOLATED"); | |||||
| break; | |||||
| default: | |||||
| props_.emplace_back("bmode", "INVALID"); | |||||
| break; | |||||
| } | |||||
| switch (op_.format){ | |||||
| case WarpPerspectiveBackwardData::Format::NCHW: | |||||
| props_.emplace_back("format", "NCHW"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NHWC: | |||||
| props_.emplace_back("format", "NHWC"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NHWCD4: | |||||
| props_.emplace_back("format", "NHWCD4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW4: | |||||
| props_.emplace_back("format", "NCHW4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW8: | |||||
| props_.emplace_back("format", "NCHW8"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW32: | |||||
| props_.emplace_back("format", "NCHW32"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW88: | |||||
| props_.emplace_back("format", "NCHW88"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW44: | |||||
| props_.emplace_back("format", "NCHW44"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW44_DOT: | |||||
| props_.emplace_back("format", "NCHW44_DOT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW4_NCHW32: | |||||
| props_.emplace_back("format", "NCHW4_NCHW32"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW32_NCHW4: | |||||
| props_.emplace_back("format", "NCHW32_NCHW4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW4_NCHW: | |||||
| props_.emplace_back("format", "NCHW4_NCHW"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NHWC_NCHW: | |||||
| props_.emplace_back("format", "NHWC_NCHW"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NHWC_NCHW4_IC_SMALL: | |||||
| props_.emplace_back("format", "NHWC_NCHW4_IC_SMALL"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW_NCHW4_IC_SMALL: | |||||
| props_.emplace_back("format", "NCHW_NCHW4_IC_SMALL"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::CHWN4: | |||||
| props_.emplace_back("format", "CHWN4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW64: | |||||
| props_.emplace_back("format", "NCHW64"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardData::Format::NCHW4_NHWC: | |||||
| props_.emplace_back("format", "NCHW4_NHWC"); | |||||
| break; | |||||
| default: | |||||
| props_.emplace_back("format", "INVALID"); | |||||
| break; | |||||
| } | |||||
| props_.emplace_back("border_val", std::to_string(op_.border_val)); | |||||
| return props_; | |||||
| } | |||||
| std::string WarpPerspectiveBackwardData_make_name_impl(const OpDef& def_) { | |||||
| auto&& op_ = def_.cast_final_safe<WarpPerspectiveBackwardData>(); | |||||
| static_cast<void>(op_); | |||||
| return "WarpPerspectiveBackwardData"; | |||||
| } | |||||
| } // anonymous namespace | |||||
| OP_TRAIT_REG(WarpPerspectiveBackwardData, WarpPerspectiveBackwardData) | |||||
| .hash(WarpPerspectiveBackwardData_hash_impl) | |||||
| .is_same_st(WarpPerspectiveBackwardData_is_same_st_impl) | |||||
| .props(WarpPerspectiveBackwardData_props_impl) | |||||
| .make_name(WarpPerspectiveBackwardData_make_name_impl); | |||||
| MGB_DYN_TYPE_OBJ_FINAL_IMPL(WarpPerspectiveBackwardMat); | |||||
| namespace { | |||||
| size_t WarpPerspectiveBackwardMat_hash_impl(const OpDef& def_) { | |||||
| auto&& op_ = def_.cast_final_safe<WarpPerspectiveBackwardMat>(); | |||||
| static_cast<void>(op_); | |||||
| size_t val = mgb::hash(op_.dyn_typeinfo()); | |||||
| val = mgb::hash_pair_combine(val, mgb::enumhash()(op_.imode)); | |||||
| val = mgb::hash_pair_combine(val, mgb::enumhash()(op_.bmode)); | |||||
| val = mgb::hash_pair_combine(val, mgb::enumhash()(op_.format)); | |||||
| val = mgb::hash_pair_combine(val, mgb::hash(op_.border_val)); | |||||
| return val; | |||||
| } | |||||
| bool WarpPerspectiveBackwardMat_is_same_st_impl(const OpDef& lhs_, const OpDef& rhs_) { | |||||
| auto &&a_ = lhs_.cast_final_safe<WarpPerspectiveBackwardMat>(), | |||||
| &&b_ = rhs_.cast_final_safe<WarpPerspectiveBackwardMat>(); | |||||
| static_cast<void>(a_); | |||||
| static_cast<void>(b_); | |||||
| if (a_.imode != b_.imode) return false; | |||||
| if (a_.bmode != b_.bmode) return false; | |||||
| if (a_.format != b_.format) return false; | |||||
| if (a_.border_val != b_.border_val) return false; | |||||
| return true; | |||||
| } | |||||
| std::vector<std::pair<const char*, std::string>> WarpPerspectiveBackwardMat_props_impl(const OpDef& def_) { | |||||
| auto&& op_ = def_.cast_final_safe<WarpPerspectiveBackwardMat>(); | |||||
| static_cast<void>(op_); | |||||
| std::vector<std::pair<const char*, std::string>> props_; | |||||
| switch (op_.imode){ | |||||
| case WarpPerspectiveBackwardMat::InterpolationMode::NEAREST: | |||||
| props_.emplace_back("imode", "NEAREST"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::InterpolationMode::LINEAR: | |||||
| props_.emplace_back("imode", "LINEAR"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::InterpolationMode::AREA: | |||||
| props_.emplace_back("imode", "AREA"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::InterpolationMode::CUBIC: | |||||
| props_.emplace_back("imode", "CUBIC"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::InterpolationMode::LANCZOS4: | |||||
| props_.emplace_back("imode", "LANCZOS4"); | |||||
| break; | |||||
| default: | |||||
| props_.emplace_back("imode", "INVALID"); | |||||
| break; | |||||
| } | |||||
| switch (op_.bmode){ | |||||
| case WarpPerspectiveBackwardMat::BorderMode::REPLICATE: | |||||
| props_.emplace_back("bmode", "REPLICATE"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::BorderMode::REFLECT: | |||||
| props_.emplace_back("bmode", "REFLECT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::BorderMode::REFLECT_101: | |||||
| props_.emplace_back("bmode", "REFLECT_101"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::BorderMode::WRAP: | |||||
| props_.emplace_back("bmode", "WRAP"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::BorderMode::CONSTANT: | |||||
| props_.emplace_back("bmode", "CONSTANT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::BorderMode::TRANSPARENT: | |||||
| props_.emplace_back("bmode", "TRANSPARENT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::BorderMode::ISOLATED: | |||||
| props_.emplace_back("bmode", "ISOLATED"); | |||||
| break; | |||||
| default: | |||||
| props_.emplace_back("bmode", "INVALID"); | |||||
| break; | |||||
| } | |||||
| switch (op_.format){ | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW: | |||||
| props_.emplace_back("format", "NCHW"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NHWC: | |||||
| props_.emplace_back("format", "NHWC"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NHWCD4: | |||||
| props_.emplace_back("format", "NHWCD4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW4: | |||||
| props_.emplace_back("format", "NCHW4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW8: | |||||
| props_.emplace_back("format", "NCHW8"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW32: | |||||
| props_.emplace_back("format", "NCHW32"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW88: | |||||
| props_.emplace_back("format", "NCHW88"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW44: | |||||
| props_.emplace_back("format", "NCHW44"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW44_DOT: | |||||
| props_.emplace_back("format", "NCHW44_DOT"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW4_NCHW32: | |||||
| props_.emplace_back("format", "NCHW4_NCHW32"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW32_NCHW4: | |||||
| props_.emplace_back("format", "NCHW32_NCHW4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW4_NCHW: | |||||
| props_.emplace_back("format", "NCHW4_NCHW"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NHWC_NCHW: | |||||
| props_.emplace_back("format", "NHWC_NCHW"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NHWC_NCHW4_IC_SMALL: | |||||
| props_.emplace_back("format", "NHWC_NCHW4_IC_SMALL"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW_NCHW4_IC_SMALL: | |||||
| props_.emplace_back("format", "NCHW_NCHW4_IC_SMALL"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::CHWN4: | |||||
| props_.emplace_back("format", "CHWN4"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW64: | |||||
| props_.emplace_back("format", "NCHW64"); | |||||
| break; | |||||
| case WarpPerspectiveBackwardMat::Format::NCHW4_NHWC: | |||||
| props_.emplace_back("format", "NCHW4_NHWC"); | |||||
| break; | |||||
| default: | |||||
| props_.emplace_back("format", "INVALID"); | |||||
| break; | |||||
| } | |||||
| props_.emplace_back("border_val", std::to_string(op_.border_val)); | |||||
| return props_; | |||||
| } | |||||
| std::string WarpPerspectiveBackwardMat_make_name_impl(const OpDef& def_) { | |||||
| auto&& op_ = def_.cast_final_safe<WarpPerspectiveBackwardMat>(); | |||||
| static_cast<void>(op_); | |||||
| return "WarpPerspectiveBackwardMat"; | |||||
| } | |||||
| } // anonymous namespace | |||||
| OP_TRAIT_REG(WarpPerspectiveBackwardMat, WarpPerspectiveBackwardMat) | |||||
| .hash(WarpPerspectiveBackwardMat_hash_impl) | |||||
| .is_same_st(WarpPerspectiveBackwardMat_is_same_st_impl) | |||||
| .props(WarpPerspectiveBackwardMat_props_impl) | |||||
| .make_name(WarpPerspectiveBackwardMat_make_name_impl); | |||||
| // clang-format on | // clang-format on | ||||
| @@ -18185,6 +18185,346 @@ void _init_py_WarpPerspective(py::module m) { | |||||
| m.add_object("WarpPerspective", reinterpret_cast<PyObject*>(&py_type)); | m.add_object("WarpPerspective", reinterpret_cast<PyObject*>(&py_type)); | ||||
| mgb_assert(PyOp(OpDef)::ctype2pytype.emplace(WarpPerspective::typeinfo(), &py_type).second); | mgb_assert(PyOp(OpDef)::ctype2pytype.emplace(WarpPerspective::typeinfo(), &py_type).second); | ||||
| } | } | ||||
| void _init_py_WarpPerspectiveBackwardData_InterpolationMode(PyTypeObject& py_type) { | |||||
| auto& e_type = EnumWrapper<WarpPerspectiveBackwardData::InterpolationMode>::type; | |||||
| Py_INCREF(e_type); | |||||
| mgb_assert(PyDict_SetItemString( | |||||
| py_type.tp_dict, "InterpolationMode", reinterpret_cast<PyObject*>(e_type)) >= 0); | |||||
| } | |||||
| void _init_py_WarpPerspectiveBackwardData_BorderMode(PyTypeObject& py_type) { | |||||
| auto& e_type = EnumWrapper<WarpPerspectiveBackwardData::BorderMode>::type; | |||||
| Py_INCREF(e_type); | |||||
| mgb_assert(PyDict_SetItemString( | |||||
| py_type.tp_dict, "BorderMode", reinterpret_cast<PyObject*>(e_type)) >= 0); | |||||
| } | |||||
| void _init_py_WarpPerspectiveBackwardData_Format(PyTypeObject& py_type) { | |||||
| auto& e_type = EnumWrapper<WarpPerspectiveBackwardData::Format>::type; | |||||
| Py_INCREF(e_type); | |||||
| mgb_assert(PyDict_SetItemString( | |||||
| py_type.tp_dict, "Format", reinterpret_cast<PyObject*>(e_type)) >= 0); | |||||
| } | |||||
| PyOpDefBegin(WarpPerspectiveBackwardData) // { | |||||
| static PyGetSetDef py_getsetters[]; | |||||
| static PyMethodDef tp_methods[]; | |||||
| static PyObject* getstate(PyObject* self, PyObject*) { | |||||
| auto& opdef = reinterpret_cast<PyOp(WarpPerspectiveBackwardData)*>(self)->inst(); | |||||
| static_cast<void>(opdef); | |||||
| std::unordered_map<std::string, py::object> state { | |||||
| {"imode", serialization<decltype(opdef.imode)>::dump(opdef.imode)}, | |||||
| {"bmode", serialization<decltype(opdef.bmode)>::dump(opdef.bmode)}, | |||||
| {"format", serialization<decltype(opdef.format)>::dump(opdef.format)}, | |||||
| {"border_val", serialization<decltype(opdef.border_val)>::dump(opdef.border_val)} | |||||
| }; | |||||
| return py::cast(state).release().ptr(); | |||||
| } | |||||
| static PyObject* setstate(PyObject* self, PyObject* args) { | |||||
| PyObject* dict = PyTuple_GetItem(args, 0); | |||||
| if (!dict) return NULL; | |||||
| auto state = py::cast<std::unordered_map<std::string, py::object>>(dict); | |||||
| auto& opdef = reinterpret_cast<PyOp(WarpPerspectiveBackwardData)*>(self)->inst(); | |||||
| static_cast<void>(opdef); | |||||
| { | |||||
| auto&& iter = state.find("imode"); | |||||
| if (iter != state.end()) { | |||||
| opdef.imode = serialization<decltype(opdef.imode)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| { | |||||
| auto&& iter = state.find("bmode"); | |||||
| if (iter != state.end()) { | |||||
| opdef.bmode = serialization<decltype(opdef.bmode)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| { | |||||
| auto&& iter = state.find("format"); | |||||
| if (iter != state.end()) { | |||||
| opdef.format = serialization<decltype(opdef.format)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| { | |||||
| auto&& iter = state.find("border_val"); | |||||
| if (iter != state.end()) { | |||||
| opdef.border_val = serialization<decltype(opdef.border_val)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| Py_RETURN_NONE; | |||||
| } | |||||
| static int py_init(PyObject *self, PyObject *args, PyObject *kwds); | |||||
| // }; | |||||
| PyOpDefEnd(WarpPerspectiveBackwardData) | |||||
| int PyOp(WarpPerspectiveBackwardData)::py_init(PyObject *self, PyObject *args, PyObject *kwds) { | |||||
| static const char* kwlist[] = {"imode", "bmode", "format", "border_val", "scope", NULL}; | |||||
| PyObject *imode = NULL, *bmode = NULL, *format = NULL, *border_val = NULL, *scope = NULL; | |||||
| if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", const_cast<char**>(kwlist), &imode, &bmode, &format, &border_val, &scope)) | |||||
| return -1; | |||||
| if (imode) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardData)*>(self)->inst().imode = | |||||
| py::cast<decltype(WarpPerspectiveBackwardData::imode)>(py::handle(imode)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (bmode) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardData)*>(self)->inst().bmode = | |||||
| py::cast<decltype(WarpPerspectiveBackwardData::bmode)>(py::handle(bmode)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (format) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardData)*>(self)->inst().format = | |||||
| py::cast<decltype(WarpPerspectiveBackwardData::format)>(py::handle(format)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (border_val) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardData)*>(self)->inst().border_val = | |||||
| py::cast<decltype(WarpPerspectiveBackwardData::border_val)>(py::handle(border_val)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (scope) { | |||||
| try { | |||||
| reinterpret_cast<PyOp(OpDef)*>(self)->op | |||||
| ->set_scope(py::cast<std::string>(py::handle(scope))); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| PyGetSetDef PyOp(WarpPerspectiveBackwardData)::py_getsetters[] = { | |||||
| {const_cast<char*>("imode"), py_get_generic(WarpPerspectiveBackwardData, imode), py_set_generic(WarpPerspectiveBackwardData, imode), const_cast<char*>("imode"), NULL}, | |||||
| {const_cast<char*>("bmode"), py_get_generic(WarpPerspectiveBackwardData, bmode), py_set_generic(WarpPerspectiveBackwardData, bmode), const_cast<char*>("bmode"), NULL}, | |||||
| {const_cast<char*>("format"), py_get_generic(WarpPerspectiveBackwardData, format), py_set_generic(WarpPerspectiveBackwardData, format), const_cast<char*>("format"), NULL}, | |||||
| {const_cast<char*>("border_val"), py_get_generic(WarpPerspectiveBackwardData, border_val), py_set_generic(WarpPerspectiveBackwardData, border_val), const_cast<char*>("border_val"), NULL}, | |||||
| {NULL} /* Sentinel */ | |||||
| }; | |||||
| PyMethodDef PyOp(WarpPerspectiveBackwardData)::tp_methods[] = { | |||||
| {const_cast<char*>("__getstate__"), PyOp(WarpPerspectiveBackwardData)::getstate, METH_NOARGS, "WarpPerspectiveBackwardData getstate"}, | |||||
| {const_cast<char*>("__setstate__"), PyOp(WarpPerspectiveBackwardData)::setstate, METH_VARARGS, "WarpPerspectiveBackwardData setstate"}, | |||||
| {NULL} /* Sentinel */ | |||||
| }; | |||||
| void _init_py_WarpPerspectiveBackwardData(py::module m) { | |||||
| using py_op = PyOp(WarpPerspectiveBackwardData); | |||||
| auto& py_type = PyOpType(WarpPerspectiveBackwardData); | |||||
| py_type = {PyVarObject_HEAD_INIT(NULL, 0)}; | |||||
| py_type.tp_name = "megengine.core._imperative_rt.ops.WarpPerspectiveBackwardData"; | |||||
| py_type.tp_basicsize = sizeof(PyOp(WarpPerspectiveBackwardData)); | |||||
| py_type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; | |||||
| py_type.tp_doc = "WarpPerspectiveBackwardData"; | |||||
| py_type.tp_base = &PyOpType(OpDef); | |||||
| py_type.tp_dealloc = py_dealloc_generic<py_op>; | |||||
| py_type.tp_new = py_new_generic<py_op>; | |||||
| py_type.tp_init = py_op::py_init; | |||||
| py_type.tp_methods = py_op::tp_methods; | |||||
| py_type.tp_getset = py_op::py_getsetters; | |||||
| mgb_assert(PyType_Ready(&py_type) >= 0); | |||||
| _init_py_WarpPerspectiveBackwardData_InterpolationMode(py_type); | |||||
| _init_py_WarpPerspectiveBackwardData_BorderMode(py_type); | |||||
| _init_py_WarpPerspectiveBackwardData_Format(py_type); | |||||
| PyType_Modified(&py_type); | |||||
| m.add_object("WarpPerspectiveBackwardData", reinterpret_cast<PyObject*>(&py_type)); | |||||
| mgb_assert(PyOp(OpDef)::ctype2pytype.emplace(WarpPerspectiveBackwardData::typeinfo(), &py_type).second); | |||||
| } | |||||
| void _init_py_WarpPerspectiveBackwardMat_InterpolationMode(PyTypeObject& py_type) { | |||||
| auto& e_type = EnumWrapper<WarpPerspectiveBackwardMat::InterpolationMode>::type; | |||||
| Py_INCREF(e_type); | |||||
| mgb_assert(PyDict_SetItemString( | |||||
| py_type.tp_dict, "InterpolationMode", reinterpret_cast<PyObject*>(e_type)) >= 0); | |||||
| } | |||||
| void _init_py_WarpPerspectiveBackwardMat_BorderMode(PyTypeObject& py_type) { | |||||
| auto& e_type = EnumWrapper<WarpPerspectiveBackwardMat::BorderMode>::type; | |||||
| Py_INCREF(e_type); | |||||
| mgb_assert(PyDict_SetItemString( | |||||
| py_type.tp_dict, "BorderMode", reinterpret_cast<PyObject*>(e_type)) >= 0); | |||||
| } | |||||
| void _init_py_WarpPerspectiveBackwardMat_Format(PyTypeObject& py_type) { | |||||
| auto& e_type = EnumWrapper<WarpPerspectiveBackwardMat::Format>::type; | |||||
| Py_INCREF(e_type); | |||||
| mgb_assert(PyDict_SetItemString( | |||||
| py_type.tp_dict, "Format", reinterpret_cast<PyObject*>(e_type)) >= 0); | |||||
| } | |||||
| PyOpDefBegin(WarpPerspectiveBackwardMat) // { | |||||
| static PyGetSetDef py_getsetters[]; | |||||
| static PyMethodDef tp_methods[]; | |||||
| static PyObject* getstate(PyObject* self, PyObject*) { | |||||
| auto& opdef = reinterpret_cast<PyOp(WarpPerspectiveBackwardMat)*>(self)->inst(); | |||||
| static_cast<void>(opdef); | |||||
| std::unordered_map<std::string, py::object> state { | |||||
| {"imode", serialization<decltype(opdef.imode)>::dump(opdef.imode)}, | |||||
| {"bmode", serialization<decltype(opdef.bmode)>::dump(opdef.bmode)}, | |||||
| {"format", serialization<decltype(opdef.format)>::dump(opdef.format)}, | |||||
| {"border_val", serialization<decltype(opdef.border_val)>::dump(opdef.border_val)} | |||||
| }; | |||||
| return py::cast(state).release().ptr(); | |||||
| } | |||||
| static PyObject* setstate(PyObject* self, PyObject* args) { | |||||
| PyObject* dict = PyTuple_GetItem(args, 0); | |||||
| if (!dict) return NULL; | |||||
| auto state = py::cast<std::unordered_map<std::string, py::object>>(dict); | |||||
| auto& opdef = reinterpret_cast<PyOp(WarpPerspectiveBackwardMat)*>(self)->inst(); | |||||
| static_cast<void>(opdef); | |||||
| { | |||||
| auto&& iter = state.find("imode"); | |||||
| if (iter != state.end()) { | |||||
| opdef.imode = serialization<decltype(opdef.imode)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| { | |||||
| auto&& iter = state.find("bmode"); | |||||
| if (iter != state.end()) { | |||||
| opdef.bmode = serialization<decltype(opdef.bmode)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| { | |||||
| auto&& iter = state.find("format"); | |||||
| if (iter != state.end()) { | |||||
| opdef.format = serialization<decltype(opdef.format)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| { | |||||
| auto&& iter = state.find("border_val"); | |||||
| if (iter != state.end()) { | |||||
| opdef.border_val = serialization<decltype(opdef.border_val)>::load(iter->second); | |||||
| } | |||||
| } | |||||
| Py_RETURN_NONE; | |||||
| } | |||||
| static int py_init(PyObject *self, PyObject *args, PyObject *kwds); | |||||
| // }; | |||||
| PyOpDefEnd(WarpPerspectiveBackwardMat) | |||||
| int PyOp(WarpPerspectiveBackwardMat)::py_init(PyObject *self, PyObject *args, PyObject *kwds) { | |||||
| static const char* kwlist[] = {"imode", "bmode", "format", "border_val", "scope", NULL}; | |||||
| PyObject *imode = NULL, *bmode = NULL, *format = NULL, *border_val = NULL, *scope = NULL; | |||||
| if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOO", const_cast<char**>(kwlist), &imode, &bmode, &format, &border_val, &scope)) | |||||
| return -1; | |||||
| if (imode) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardMat)*>(self)->inst().imode = | |||||
| py::cast<decltype(WarpPerspectiveBackwardMat::imode)>(py::handle(imode)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (bmode) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardMat)*>(self)->inst().bmode = | |||||
| py::cast<decltype(WarpPerspectiveBackwardMat::bmode)>(py::handle(bmode)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (format) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardMat)*>(self)->inst().format = | |||||
| py::cast<decltype(WarpPerspectiveBackwardMat::format)>(py::handle(format)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (border_val) { | |||||
| try { | |||||
| // TODO: remove this guard which is used for pybind11 implicit conversion | |||||
| py::detail::loader_life_support guard{}; | |||||
| reinterpret_cast<PyOp(WarpPerspectiveBackwardMat)*>(self)->inst().border_val = | |||||
| py::cast<decltype(WarpPerspectiveBackwardMat::border_val)>(py::handle(border_val)); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| if (scope) { | |||||
| try { | |||||
| reinterpret_cast<PyOp(OpDef)*>(self)->op | |||||
| ->set_scope(py::cast<std::string>(py::handle(scope))); | |||||
| } CATCH_ALL(-1) | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| PyGetSetDef PyOp(WarpPerspectiveBackwardMat)::py_getsetters[] = { | |||||
| {const_cast<char*>("imode"), py_get_generic(WarpPerspectiveBackwardMat, imode), py_set_generic(WarpPerspectiveBackwardMat, imode), const_cast<char*>("imode"), NULL}, | |||||
| {const_cast<char*>("bmode"), py_get_generic(WarpPerspectiveBackwardMat, bmode), py_set_generic(WarpPerspectiveBackwardMat, bmode), const_cast<char*>("bmode"), NULL}, | |||||
| {const_cast<char*>("format"), py_get_generic(WarpPerspectiveBackwardMat, format), py_set_generic(WarpPerspectiveBackwardMat, format), const_cast<char*>("format"), NULL}, | |||||
| {const_cast<char*>("border_val"), py_get_generic(WarpPerspectiveBackwardMat, border_val), py_set_generic(WarpPerspectiveBackwardMat, border_val), const_cast<char*>("border_val"), NULL}, | |||||
| {NULL} /* Sentinel */ | |||||
| }; | |||||
| PyMethodDef PyOp(WarpPerspectiveBackwardMat)::tp_methods[] = { | |||||
| {const_cast<char*>("__getstate__"), PyOp(WarpPerspectiveBackwardMat)::getstate, METH_NOARGS, "WarpPerspectiveBackwardMat getstate"}, | |||||
| {const_cast<char*>("__setstate__"), PyOp(WarpPerspectiveBackwardMat)::setstate, METH_VARARGS, "WarpPerspectiveBackwardMat setstate"}, | |||||
| {NULL} /* Sentinel */ | |||||
| }; | |||||
| void _init_py_WarpPerspectiveBackwardMat(py::module m) { | |||||
| using py_op = PyOp(WarpPerspectiveBackwardMat); | |||||
| auto& py_type = PyOpType(WarpPerspectiveBackwardMat); | |||||
| py_type = {PyVarObject_HEAD_INIT(NULL, 0)}; | |||||
| py_type.tp_name = "megengine.core._imperative_rt.ops.WarpPerspectiveBackwardMat"; | |||||
| py_type.tp_basicsize = sizeof(PyOp(WarpPerspectiveBackwardMat)); | |||||
| py_type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; | |||||
| py_type.tp_doc = "WarpPerspectiveBackwardMat"; | |||||
| py_type.tp_base = &PyOpType(OpDef); | |||||
| py_type.tp_dealloc = py_dealloc_generic<py_op>; | |||||
| py_type.tp_new = py_new_generic<py_op>; | |||||
| py_type.tp_init = py_op::py_init; | |||||
| py_type.tp_methods = py_op::tp_methods; | |||||
| py_type.tp_getset = py_op::py_getsetters; | |||||
| mgb_assert(PyType_Ready(&py_type) >= 0); | |||||
| _init_py_WarpPerspectiveBackwardMat_InterpolationMode(py_type); | |||||
| _init_py_WarpPerspectiveBackwardMat_BorderMode(py_type); | |||||
| _init_py_WarpPerspectiveBackwardMat_Format(py_type); | |||||
| PyType_Modified(&py_type); | |||||
| m.add_object("WarpPerspectiveBackwardMat", reinterpret_cast<PyObject*>(&py_type)); | |||||
| mgb_assert(PyOp(OpDef)::ctype2pytype.emplace(WarpPerspectiveBackwardMat::typeinfo(), &py_type).second); | |||||
| } | |||||
| #define INIT_ALL_OP(m) \ | #define INIT_ALL_OP(m) \ | ||||
| _init_py_AdaptivePooling(m); \ | _init_py_AdaptivePooling(m); \ | ||||
| _init_py_AddAxis(m); \ | _init_py_AddAxis(m); \ | ||||
| @@ -18290,5 +18630,7 @@ void _init_py_WarpPerspective(py::module m) { | |||||
| _init_py_TypeCvt(m); \ | _init_py_TypeCvt(m); \ | ||||
| _init_py_UniformRNG(m); \ | _init_py_UniformRNG(m); \ | ||||
| _init_py_WarpAffine(m); \ | _init_py_WarpAffine(m); \ | ||||
| _init_py_WarpPerspective(m); | |||||
| _init_py_WarpPerspective(m); \ | |||||
| _init_py_WarpPerspectiveBackwardData(m); \ | |||||
| _init_py_WarpPerspectiveBackwardMat(m); | |||||
| // clang-format on | // clang-format on | ||||
| @@ -1795,4 +1795,42 @@ public: | |||||
| } | } | ||||
| }; | }; | ||||
| class WarpPerspectiveBackwardData : public OpDefImplBase<WarpPerspectiveBackwardData> { | |||||
| MGB_DYN_TYPE_OBJ_FINAL_DECL; | |||||
| public: | |||||
| using InterpolationMode = ::megdnn::param::WarpPerspective::InterpolationMode; | |||||
| using BorderMode = ::megdnn::param::WarpPerspective::BorderMode; | |||||
| using Format = ::megdnn::param::WarpPerspective::Format; | |||||
| InterpolationMode imode = ::megdnn::param::WarpPerspective::InterpolationMode::LINEAR; | |||||
| BorderMode bmode = ::megdnn::param::WarpPerspective::BorderMode::REPLICATE; | |||||
| Format format = ::megdnn::param::WarpPerspective::Format::NCHW; | |||||
| float border_val = .0f; | |||||
| WarpPerspectiveBackwardData() = default; | |||||
| WarpPerspectiveBackwardData(InterpolationMode imode_, BorderMode bmode_, Format format_, float border_val_, std::string scope_ = {}): imode(imode_), bmode(bmode_), format(format_), border_val(border_val_) { set_scope(scope_); } | |||||
| WarpPerspectiveBackwardData(::megdnn::param::WarpPerspective packed_param_0): imode(packed_param_0.imode), bmode(packed_param_0.bmode), format(packed_param_0.format), border_val(packed_param_0.border_val) {} | |||||
| ::megdnn::param::WarpPerspective param() const { | |||||
| return {imode, bmode, format, border_val}; | |||||
| } | |||||
| }; | |||||
| class WarpPerspectiveBackwardMat : public OpDefImplBase<WarpPerspectiveBackwardMat> { | |||||
| MGB_DYN_TYPE_OBJ_FINAL_DECL; | |||||
| public: | |||||
| using InterpolationMode = ::megdnn::param::WarpPerspective::InterpolationMode; | |||||
| using BorderMode = ::megdnn::param::WarpPerspective::BorderMode; | |||||
| using Format = ::megdnn::param::WarpPerspective::Format; | |||||
| InterpolationMode imode = ::megdnn::param::WarpPerspective::InterpolationMode::LINEAR; | |||||
| BorderMode bmode = ::megdnn::param::WarpPerspective::BorderMode::REPLICATE; | |||||
| Format format = ::megdnn::param::WarpPerspective::Format::NCHW; | |||||
| float border_val = .0f; | |||||
| WarpPerspectiveBackwardMat() = default; | |||||
| WarpPerspectiveBackwardMat(InterpolationMode imode_, BorderMode bmode_, Format format_, float border_val_, std::string scope_ = {}): imode(imode_), bmode(bmode_), format(format_), border_val(border_val_) { set_scope(scope_); } | |||||
| WarpPerspectiveBackwardMat(::megdnn::param::WarpPerspective packed_param_0): imode(packed_param_0.imode), bmode(packed_param_0.bmode), format(packed_param_0.format), border_val(packed_param_0.border_val) {} | |||||
| ::megdnn::param::WarpPerspective param() const { | |||||
| return {imode, bmode, format, border_val}; | |||||
| } | |||||
| }; | |||||
| // clang-format on | // clang-format on | ||||
| @@ -1858,4 +1858,34 @@ WarpPerspectiveInst | |||||
| .def_readwrite("format", &WarpPerspective::format) | .def_readwrite("format", &WarpPerspective::format) | ||||
| .def_readwrite("border_val", &WarpPerspective::border_val); | .def_readwrite("border_val", &WarpPerspective::border_val); | ||||
| py::class_<WarpPerspectiveBackwardData, std::shared_ptr<WarpPerspectiveBackwardData>, OpDef> WarpPerspectiveBackwardDataInst(m, "WarpPerspectiveBackwardData"); | |||||
| WarpPerspectiveBackwardDataInst.attr("InterpolationMode") = RemapInst.attr("InterpolationMode"); | |||||
| WarpPerspectiveBackwardDataInst.attr("BorderMode") = RemapInst.attr("BorderMode"); | |||||
| WarpPerspectiveBackwardDataInst.attr("Format") = AdaptivePoolingInst.attr("Format"); | |||||
| WarpPerspectiveBackwardDataInst | |||||
| .def(py::init<::megdnn::param::WarpPerspective::InterpolationMode, ::megdnn::param::WarpPerspective::BorderMode, ::megdnn::param::WarpPerspective::Format, float, std::string>(), py::arg("imode") = ::megdnn::param::WarpPerspective::InterpolationMode::LINEAR, py::arg("bmode") = ::megdnn::param::WarpPerspective::BorderMode::REPLICATE, py::arg("format") = ::megdnn::param::WarpPerspective::Format::NCHW, py::arg("border_val") = .0f, py::arg("scope") = {}) | |||||
| .def_readwrite("imode", &WarpPerspectiveBackwardData::imode) | |||||
| .def_readwrite("bmode", &WarpPerspectiveBackwardData::bmode) | |||||
| .def_readwrite("format", &WarpPerspectiveBackwardData::format) | |||||
| .def_readwrite("border_val", &WarpPerspectiveBackwardData::border_val); | |||||
| py::class_<WarpPerspectiveBackwardMat, std::shared_ptr<WarpPerspectiveBackwardMat>, OpDef> WarpPerspectiveBackwardMatInst(m, "WarpPerspectiveBackwardMat"); | |||||
| WarpPerspectiveBackwardMatInst.attr("InterpolationMode") = RemapInst.attr("InterpolationMode"); | |||||
| WarpPerspectiveBackwardMatInst.attr("BorderMode") = RemapInst.attr("BorderMode"); | |||||
| WarpPerspectiveBackwardMatInst.attr("Format") = AdaptivePoolingInst.attr("Format"); | |||||
| WarpPerspectiveBackwardMatInst | |||||
| .def(py::init<::megdnn::param::WarpPerspective::InterpolationMode, ::megdnn::param::WarpPerspective::BorderMode, ::megdnn::param::WarpPerspective::Format, float, std::string>(), py::arg("imode") = ::megdnn::param::WarpPerspective::InterpolationMode::LINEAR, py::arg("bmode") = ::megdnn::param::WarpPerspective::BorderMode::REPLICATE, py::arg("format") = ::megdnn::param::WarpPerspective::Format::NCHW, py::arg("border_val") = .0f, py::arg("scope") = {}) | |||||
| .def_readwrite("imode", &WarpPerspectiveBackwardMat::imode) | |||||
| .def_readwrite("bmode", &WarpPerspectiveBackwardMat::bmode) | |||||
| .def_readwrite("format", &WarpPerspectiveBackwardMat::format) | |||||
| .def_readwrite("border_val", &WarpPerspectiveBackwardMat::border_val); | |||||
| // clang-format on | // clang-format on | ||||
| @@ -104,6 +104,10 @@ def WarpPerspective: MgbHashableOp<"WarpPerspective", [WarpPerspectiveParam]>; | |||||
| def WarpAffine: MgbHashableOp<"WarpAffine", [WarpAffineParam]>; | def WarpAffine: MgbHashableOp<"WarpAffine", [WarpAffineParam]>; | ||||
| def WarpPerspectiveBackwardData: MgbHashableOp<"WarpPerspectiveBackwardData", [WarpPerspectiveParam]>; | |||||
| def WarpPerspectiveBackwardMat: MgbHashableOp<"WarpPerspectiveBackwardMat", [WarpPerspectiveParam]>; | |||||
| def Remap: MgbHashableOp<"Remap", [RemapParam]>; | def Remap: MgbHashableOp<"Remap", [RemapParam]>; | ||||
| def Resize: MgbHashableOp<"Resize", [ResizeParam]>; | def Resize: MgbHashableOp<"Resize", [ResizeParam]>; | ||||