@@ -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]>; | ||||