| 56 | } // namespace |
| 57 | |
| 58 | TEST_F(NAIVE, WARP_PERSPECTIVE_MULTI_SRC) { |
| 59 | using Param = WarpPerspective::Param; |
| 60 | |
| 61 | WarpPerspective::Param param; |
| 62 | auto extra_impl = [¶m, this](const TensorNDArray& tensors) { |
| 63 | //! split src |
| 64 | TensorND src = tensors[0]; // n h w c |
| 65 | size_t n = src.layout[0]; |
| 66 | TensorNDArray srcs; // n 个 1 h w c |
| 67 | TensorLayoutArray srcs_layouts; |
| 68 | for (size_t i = 0; i < n; i++) { |
| 69 | TensorLayout ly; |
| 70 | ly = TensorLayout{ |
| 71 | {1, src.layout[1], src.layout[2], src.layout[3]}, src.layout.dtype}; |
| 72 | srcs.emplace_back(malloc(ly.span().dist_byte()), ly); |
| 73 | srcs_layouts.emplace_back(ly); |
| 74 | } |
| 75 | |
| 76 | auto split = handle()->create_operator<SplitForward>(); |
| 77 | split->param().axis = 0; |
| 78 | auto split_ws_size = split->get_workspace_in_bytes(src.layout, srcs_layouts); |
| 79 | dt_byte* split_ws_ptr = static_cast<dt_byte*>(malloc(split_ws_size)); |
| 80 | Workspace split_ws{split_ws_ptr, split_ws_size}; |
| 81 | split->exec(src, srcs, split_ws); |
| 82 | |
| 83 | auto warp_perspective = handle()->create_operator<WarpPerspective>(); |
| 84 | warp_perspective->param() = param; |
| 85 | auto warp_ws_size = warp_perspective->get_workspace_in_bytes( |
| 86 | srcs_layouts, tensors[1].layout, tensors[2].layout); |
| 87 | dt_byte* warp_ws_ptr = static_cast<dt_byte*>(malloc(warp_ws_size)); |
| 88 | Workspace warp_ws{warp_ws_ptr, warp_ws_size}; |
| 89 | warp_perspective->exec(srcs, tensors[1], tensors[2], warp_ws); |
| 90 | |
| 91 | free(split_ws_ptr); |
| 92 | free(warp_ws_ptr); |
| 93 | for (auto&& s : srcs) { |
| 94 | free(s.raw_ptr()); |
| 95 | } |
| 96 | }; |
| 97 | |
| 98 | { |
| 99 | // Float32 |
| 100 | Checker<WarpPerspectiveForward> checker(handle()); |
| 101 | WarpPerspectiveMatRNG rng; |
| 102 | checker.set_rng(1, &rng); |
| 103 | checker.set_extra_opr_impl(extra_impl); |
| 104 | // NHWC |
| 105 | for (auto bmode : |
| 106 | {WarpPerspective::BorderMode::WRAP, WarpPerspective::BorderMode::REFLECT, |
| 107 | WarpPerspective::BorderMode::REPLICATE, |
| 108 | WarpPerspective::BorderMode::CONSTANT}) { |
| 109 | param.border_val = 0.3f; |
| 110 | param.bmode = bmode; |
| 111 | param.imode = Param::InterpolationMode::LINEAR; |
| 112 | |
| 113 | param.format = Param::Format::NHWC; |
| 114 | checker.set_param(param); |
| 115 | checker.execs({{1, 2, 2, 4}, {1, 3, 3}, {1, 2, 2, 4}}); |
nothing calls this directly
no test coverage detected