| @@ -587,6 +587,97 @@ std::optional<ValueRefList> fastpathcopy_grad_rule( | |||
| 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 { | |||
| Init() { | |||
| 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( | |||
| 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.jit as jit | |||
| 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.autodiff.grad import Grad | |||
| 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)) | |||
| 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]) | |||
| def test_warp_perspective_mat_idx(dt): | |||
| 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 | |||
| 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 | |||
| @@ -6941,4 +6941,300 @@ OP_TRAIT_REG(WarpPerspective, WarpPerspective) | |||
| .props(WarpPerspective_props_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 | |||
| @@ -18185,6 +18185,346 @@ void _init_py_WarpPerspective(py::module m) { | |||
| m.add_object("WarpPerspective", reinterpret_cast<PyObject*>(&py_type)); | |||
| 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) \ | |||
| _init_py_AdaptivePooling(m); \ | |||
| _init_py_AddAxis(m); \ | |||
| @@ -18290,5 +18630,7 @@ void _init_py_WarpPerspective(py::module m) { | |||
| _init_py_TypeCvt(m); \ | |||
| _init_py_UniformRNG(m); \ | |||
| _init_py_WarpAffine(m); \ | |||
| _init_py_WarpPerspective(m); | |||
| _init_py_WarpPerspective(m); \ | |||
| _init_py_WarpPerspectiveBackwardData(m); \ | |||
| _init_py_WarpPerspectiveBackwardMat(m); | |||
| // 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 | |||
| @@ -1858,4 +1858,34 @@ WarpPerspectiveInst | |||
| .def_readwrite("format", &WarpPerspective::format) | |||
| .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 | |||
| @@ -104,6 +104,10 @@ def WarpPerspective: MgbHashableOp<"WarpPerspective", [WarpPerspectiveParam]>; | |||
| def WarpAffine: MgbHashableOp<"WarpAffine", [WarpAffineParam]>; | |||
| def WarpPerspectiveBackwardData: MgbHashableOp<"WarpPerspectiveBackwardData", [WarpPerspectiveParam]>; | |||
| def WarpPerspectiveBackwardMat: MgbHashableOp<"WarpPerspectiveBackwardMat", [WarpPerspectiveParam]>; | |||
| def Remap: MgbHashableOp<"Remap", [RemapParam]>; | |||
| def Resize: MgbHashableOp<"Resize", [ResizeParam]>; | |||