#pragma once #include "test/common/random_state.h" #include "test/common/rng.h" #include "test/common/workspace_wrapper.h" #include "megdnn/opr_param_defs.h" #include "megdnn/oprs/imgproc.h" namespace megdnn { namespace test { struct WarpPerspectiveMatIdxProxy { WorkspaceWrapper W; static void deduce_layout(WarpPerspective*, TensorLayoutArray&); static void deduce_layout(WarpPerspectiveBackwardData*, TensorLayoutArray&); static void deduce_layout(WarpPerspectiveBackwardMat*, TensorLayoutArray&); void exec(WarpPerspective* opr, const TensorNDArray& tensors); void exec(WarpPerspectiveBackwardData* opr, const TensorNDArray& tensors); void exec(WarpPerspectiveBackwardMat* opr, const TensorNDArray& tensors); }; struct WarpPerspectiveMultiSrcProxy { WorkspaceWrapper W; static void deduce_layout(WarpPerspectiveForward*, TensorLayoutArray&); void exec(WarpPerspectiveForward* opr, const TensorNDArray& tensors); }; class WarpPerspectiveMatRNG final : public IIDRNG { public: WarpPerspectiveMatRNG() : idx(0) {} dt_float32 gen_single_val() override { std::normal_distribution dist; switch (idx) { case 6: case 7: dist = std::normal_distribution(0.0f, 0.01f); break; case 8: dist = std::normal_distribution(1.0f, 0.1f); break; default: dist = std::normal_distribution(0.0f, 1.0f); break; } auto res = dist(RandomState::generator()); idx = (idx + 1) % 9; return res; } private: size_t idx; }; class WarpPerspectiveMatRNG_V2 final : public IIDRNG { public: WarpPerspectiveMatRNG_V2() : idx(0) {} void set_hw(size_t h, size_t w) { ih = h; iw = w; idx = 0; rng.seed(time(NULL)); } dt_float32 gen_single_val() override { auto rand_real = [&](double lo, double hi) { return rng() / (std::mt19937::max() + 1.0) * (hi - lo) + lo; }; auto rand_real2 = [&](double range) { return rand_real(-range, range); }; dt_float32 res = 0; switch (idx) { case 0: rot = rand_real(0, M_PI * 2); scale = rand_real(0.8, 1.2); sheer = rand_real(0.9, 1.1); res = cos(rot) * scale; break; case 1: res = -sin(rot) * scale; break; case 2: res = rand_real2(iw * 0.5); break; case 3: res = sin(rot) * scale * sheer; break; case 4: res = cos(rot) * scale * sheer; break; case 5: res = rand_real2(ih * 0.5); break; case 6: res = rand_real2(0.1 / iw); break; case 7: res = rand_real2(0.1 / ih); break; case 8: res = rand_real2(0.1) + 1; break; } idx = (idx + 1) % 9; return res; } private: size_t idx, ih, iw; float rot, scale, sheer; std::mt19937 rng; }; namespace warp_perspective { struct TestArg { param::WarpPerspective param; TensorShape src; TensorShape trans; TensorShape mat_idx; TensorShape dst; TestArg(param::WarpPerspective param_, TensorShape src_, TensorShape trans_, TensorShape mat_idx_, TensorShape dst_) : param(param_), src(src_), trans(trans_), mat_idx(mat_idx_), dst(dst_) {} }; //! Test args for the WarpPerspective with format NHWC std::vector get_cv_args(); void run_mat_idx_test(Handle* handle); void run_int8_test(Handle* handle); void run_int8_test_record(int debug_level); void run_quint8_test(Handle* handle); } // namespace warp_perspective } // namespace test } // namespace megdnn // vim: syntax=cpp.doxygen