GitOrigin-RevId: 9eb0cdda5c
release-0.6
@@ -28,8 +28,8 @@ void WarpPerspectiveImpl::exec(_megdnn_tensor_in src, | |||
check_exec(src.layout, mat.layout, mat_idx.layout, dst.layout, | |||
workspace.size); | |||
if (warp::is_cv_available(src.layout, mat.layout, dst.layout, param().imode, | |||
param().format) && !mat_idx.layout.ndim) { | |||
warp_perspective_cv_exec(src, mat, dst, param().border_val, | |||
param().format)) { | |||
warp_perspective_cv_exec(src, mat, mat_idx, dst, param().border_val, | |||
param().bmode, param().imode, handle()); | |||
} else { | |||
//! Use arm_common implementation | |||
@@ -190,9 +190,9 @@ void warp_perspective_cv(const Mat<T>& src, Mat<T>& dst, const float* trans, | |||
} | |||
} // anonymous namespace | |||
void megdnn::aarch64::warp_perspective_cv_exec( | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, _megdnn_tensor_in dst, | |||
float border_value, BorderMode bmode, InterpolationMode imode, | |||
Handle* handle) { | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, float border_value, | |||
BorderMode bmode, InterpolationMode imode, Handle* handle) { | |||
size_t ch = dst.layout[3]; | |||
size_t width = dst.layout[2]; | |||
size_t height = dst.layout[1]; | |||
@@ -208,13 +208,26 @@ void megdnn::aarch64::warp_perspective_cv_exec( | |||
"unsupported src channel: %zu, avaiable channel size: 1/2/3", | |||
ch); | |||
const float* trans_ptr = trans.ptr<dt_float32>(); | |||
if (dst.layout.dtype.enumv() == DTypeEnum::Float32) { | |||
const int* midx_ptr = nullptr; | |||
if (mat_idx.raw_ptr) { | |||
megdnn_assert(mat_idx.layout.ndim == 1); | |||
midx_ptr = mat_idx.ptr<int>(); | |||
} | |||
if (dst.layout.dtype.enumv() == DTypeEnum::Float32) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, src_id); \ | |||
Mat<float> dst_mat = TensorND2Mat<float>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<float MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -230,11 +243,19 @@ void megdnn::aarch64::warp_perspective_cv_exec( | |||
#undef cb | |||
} else if (dst.layout.dtype.enumv() == DTypeEnum::Uint8) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, src_id); \ | |||
Mat<uchar> dst_mat = TensorND2Mat<uchar>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<uchar MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -250,8 +271,7 @@ void megdnn::aarch64::warp_perspective_cv_exec( | |||
#undef cb | |||
} else { | |||
megdnn_throw( | |||
megdnn_mangle("Unsupported datatype of WarpAffine optr.")); | |||
megdnn_mangle("Unsupported datatype of WarpPerspective optr.")); | |||
} | |||
} | |||
// vim: syntax=cpp.doxygen |
@@ -21,7 +21,8 @@ namespace aarch64 { | |||
* \brief Used if the format is NHWC, transfer from megcv | |||
*/ | |||
void warp_perspective_cv_exec(_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in dst, float border_value, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, | |||
float border_value, | |||
param::WarpPerspective::BorderMode border_mode, | |||
param::WarpPerspective::InterpolationMode imode, | |||
Handle* handle); | |||
@@ -28,10 +28,9 @@ void WarpPerspectiveImpl::exec(_megdnn_tensor_in src, _megdnn_tensor_in mat, | |||
check_exec_allow_nhwc_mat_idx(src.layout, mat.layout, mat_idx.layout, | |||
dst.layout, workspace.size); | |||
if (warp::is_cv_available(src.layout, mat.layout, dst.layout, param().imode, | |||
param().format) && | |||
!mat_idx.layout.ndim) { | |||
param().format)) { | |||
MIDOUT_BEGIN(megdnn_arm_warpperspective, void) { | |||
warp_perspective_cv_exec(src, mat, dst, param().border_val, | |||
warp_perspective_cv_exec(src, mat, mat_idx, dst, param().border_val, | |||
param().bmode, param().imode, handle()); | |||
} | |||
MIDOUT_END(); | |||
@@ -149,9 +149,9 @@ void warp_perspective_cv(const Mat<T>& src, Mat<T>& dst, const float* trans, | |||
} // anonymous namespace | |||
void megdnn::arm_common::warp_perspective_cv_exec( | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, _megdnn_tensor_in dst, | |||
float border_value, BorderMode bmode, InterpolationMode imode, | |||
Handle* handle) { | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, float border_value, | |||
BorderMode bmode, InterpolationMode imode, Handle* handle) { | |||
size_t ch = dst.layout[3]; | |||
size_t width = dst.layout[2]; | |||
size_t height = dst.layout[1]; | |||
@@ -167,13 +167,26 @@ void megdnn::arm_common::warp_perspective_cv_exec( | |||
"unsupported src channel: %zu, avaiable channel size: 1/2/3", | |||
ch); | |||
const float* trans_ptr = trans.ptr<dt_float32>(); | |||
const int* midx_ptr = nullptr; | |||
if (mat_idx.raw_ptr) { | |||
megdnn_assert(mat_idx.layout.ndim == 1); | |||
midx_ptr = mat_idx.ptr<int>(); | |||
} | |||
if (dst.layout.dtype.enumv() == DTypeEnum::Float32) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, src_id); \ | |||
Mat<float> dst_mat = TensorND2Mat<float>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<float MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -189,11 +202,19 @@ void megdnn::arm_common::warp_perspective_cv_exec( | |||
#undef cb | |||
} else if (dst.layout.dtype.enumv() == DTypeEnum::Uint8) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, src_id); \ | |||
Mat<uchar> dst_mat = TensorND2Mat<uchar>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<uchar MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -21,7 +21,8 @@ namespace arm_common { | |||
* \brief Used if the format is NHWC, transfer from megcv | |||
*/ | |||
void warp_perspective_cv_exec(_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in dst, float border_value, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, | |||
float border_value, | |||
param::WarpPerspective::BorderMode border_mode, | |||
param::WarpPerspective::InterpolationMode imode, | |||
Handle* handle); | |||
@@ -236,10 +236,6 @@ void WarpPerspectiveForward::check_exec(const TensorLayout &src, | |||
size_t workspace_in_bytes) | |||
{ | |||
check_exec_allow_nhwc_mat_idx(src, mat, mat_idx, dst, workspace_in_bytes); | |||
if (param().format == Param::Format::NHWC) { | |||
megdnn_assert(!mat_idx.ndim, | |||
"mat_idx not supported for current format"); | |||
} | |||
} | |||
void WarpPerspectiveForward::check_exec_allow_nhwc_mat_idx( | |||
@@ -320,10 +320,9 @@ void WarpPerspectiveForwardImpl::exec(_megdnn_tensor_in src, | |||
.c_str()); | |||
} | |||
if (warp::is_cv_available(src.layout, mat.layout, dst.layout, param().imode, | |||
param().format) && | |||
!mat_idx.layout.ndim) { | |||
param().format)) { | |||
MIDOUT_BEGIN(megdnn_naive_warpperspective, void) { | |||
warp_perspective_cv_exec(src, mat, dst, param().border_val, | |||
warp_perspective_cv_exec(src, mat, mat_idx, dst, param().border_val, | |||
param().bmode, param().imode, handle()); | |||
} | |||
MIDOUT_END(); | |||
@@ -151,9 +151,9 @@ void warp_perspective_cv(const Mat<T>& src, Mat<T>& dst, const float* trans, | |||
} // anonymous namespace | |||
void megdnn::naive::warp_perspective_cv_exec( | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, _megdnn_tensor_in dst, | |||
float border_value, BorderMode bmode, InterpolationMode imode, | |||
Handle* handle) { | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, float border_value, | |||
BorderMode bmode, InterpolationMode imode, Handle* handle) { | |||
size_t ch = dst.layout[3]; | |||
size_t width = dst.layout[2]; | |||
size_t height = dst.layout[1]; | |||
@@ -169,13 +169,26 @@ void megdnn::naive::warp_perspective_cv_exec( | |||
"unsupported src channel: %zu, avaiable channel size: 1/2/3", | |||
ch); | |||
const float* trans_ptr = trans.ptr<dt_float32>(); | |||
const int* midx_ptr = nullptr; | |||
if (mat_idx.raw_ptr) { | |||
megdnn_assert(mat_idx.layout.ndim == 1); | |||
midx_ptr = mat_idx.ptr<int>(); | |||
} | |||
if (dst.layout.dtype.enumv() == DTypeEnum::Float32) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, src_id); \ | |||
Mat<float> dst_mat = TensorND2Mat<float>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<float MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -191,11 +204,19 @@ void megdnn::naive::warp_perspective_cv_exec( | |||
#undef cb | |||
} else if (dst.layout.dtype.enumv() == DTypeEnum::Uint8) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, src_id); \ | |||
Mat<uchar> dst_mat = TensorND2Mat<uchar>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<uchar MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -210,7 +231,8 @@ void megdnn::naive::warp_perspective_cv_exec( | |||
DISPATCH_IMODE(imode, bmode, ch, cb) | |||
#undef cb | |||
} else { | |||
megdnn_throw(megdnn_mangle("Unsupported datatype of WarpAffine optr.")); | |||
megdnn_throw( | |||
megdnn_mangle("Unsupported datatype of WarpPerspective optr.")); | |||
} | |||
} | |||
@@ -21,7 +21,8 @@ namespace naive { | |||
* \brief Used if the format is NHWC, transfer from megcv | |||
*/ | |||
void warp_perspective_cv_exec(_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in dst, float border_value, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, | |||
float border_value, | |||
param::WarpPerspective::BorderMode border_mode, | |||
param::WarpPerspective::InterpolationMode imode, | |||
Handle* handle); | |||
@@ -27,8 +27,8 @@ void WarpPerspectiveImpl::exec(_megdnn_tensor_in src, _megdnn_tensor_in mat, | |||
dst.layout, workspace.size); | |||
if (warp::is_cv_available(src.layout, mat.layout, dst.layout, param().imode, | |||
param().format) && | |||
!mat_idx.layout.ndim && is_supported(SIMDType::SSE4_2)) { | |||
warp_perspective_cv_exec(src, mat, dst, param().border_val, | |||
is_supported(SIMDType::SSE4_2)) { | |||
warp_perspective_cv_exec(src, mat, mat_idx, dst, param().border_val, | |||
param().bmode, param().imode, handle()); | |||
} else { | |||
//! Use fallback implementation | |||
@@ -59,7 +59,6 @@ | |||
* --------------------------------------------------------------------------- | |||
*/ | |||
#include "src/x86/warp_perspective/warp_perspective_cv.h" | |||
#include "src/common/cv/common.h" | |||
#include "src/common/cv/helper.h" | |||
@@ -154,12 +153,10 @@ void warp_perspective_cv(const Mat<T>& src, Mat<T>& dst, const float* trans, | |||
} | |||
} // anonymous namespace | |||
void megdnn::x86::warp_perspective_cv_exec(_megdnn_tensor_in src, | |||
_megdnn_tensor_in trans, | |||
_megdnn_tensor_in dst, | |||
float border_value, BorderMode bmode, | |||
InterpolationMode imode, | |||
Handle* handle) { | |||
void megdnn::x86::warp_perspective_cv_exec( | |||
_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, float border_value, | |||
BorderMode bmode, InterpolationMode imode, Handle* handle) { | |||
size_t ch = dst.layout[3]; | |||
size_t width = dst.layout[2]; | |||
size_t height = dst.layout[1]; | |||
@@ -175,13 +172,26 @@ void megdnn::x86::warp_perspective_cv_exec(_megdnn_tensor_in src, | |||
"unsupported src channel: %zu, avaiable channel size: 1/2/3", | |||
ch); | |||
const float* trans_ptr = trans.ptr<dt_float32>(); | |||
const int* midx_ptr = nullptr; | |||
if (mat_idx.raw_ptr) { | |||
megdnn_assert(mat_idx.layout.ndim == 1); | |||
midx_ptr = mat_idx.ptr<int>(); | |||
} | |||
if (dst.layout.dtype.enumv() == DTypeEnum::Float32) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<float> src_mat = TensorND2Mat<float>(src, src_id); \ | |||
Mat<float> dst_mat = TensorND2Mat<float>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<float MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -197,11 +207,19 @@ void megdnn::x86::warp_perspective_cv_exec(_megdnn_tensor_in src, | |||
#undef cb | |||
} else if (dst.layout.dtype.enumv() == DTypeEnum::Uint8) { | |||
#define cb(_imode, _bmode, _ch) \ | |||
auto task = [src, trans_ptr, dst, border_value, parallelism_batch]( \ | |||
size_t index, size_t) { \ | |||
auto task = [src, trans_ptr, midx_ptr, dst, border_value, \ | |||
parallelism_batch](size_t index, size_t) { \ | |||
size_t batch_id = index / parallelism_batch; \ | |||
size_t task_id = index % parallelism_batch; \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, batch_id); \ | |||
size_t src_id = batch_id; \ | |||
if (midx_ptr) { \ | |||
src_id = midx_ptr[batch_id]; \ | |||
megdnn_assert( \ | |||
src_id < src.layout.shape[0], \ | |||
"mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", \ | |||
batch_id, src_id, src.layout.shape[0]); \ | |||
} \ | |||
Mat<uchar> src_mat = TensorND2Mat<uchar>(src, src_id); \ | |||
Mat<uchar> dst_mat = TensorND2Mat<uchar>(dst, batch_id); \ | |||
const float* task_trans_ptr = trans_ptr + batch_id * 3 * 3; \ | |||
warp_perspective_cv<uchar MEGDNN_COMMA _imode MEGDNN_COMMA _bmode \ | |||
@@ -21,12 +21,13 @@ namespace x86 { | |||
* \brief Used if the format is NHWC, transfer from megcv | |||
*/ | |||
void warp_perspective_cv_exec(_megdnn_tensor_in src, _megdnn_tensor_in trans, | |||
_megdnn_tensor_in dst, float border_value, | |||
_megdnn_tensor_in mat_idx, _megdnn_tensor_in dst, | |||
float border_value, | |||
param::WarpPerspective::BorderMode border_mode, | |||
param::WarpPerspective::InterpolationMode imode, | |||
Handle* handle); | |||
} // x86 | |||
} // megdnn | |||
} // x86 | |||
} // megdnn | |||
// vim: syntax=cpp.doxygen |
@@ -25,7 +25,7 @@ namespace test { | |||
TEST_F(AARCH64, WARP_PERSPECTIVE_CV) { | |||
//! Just for the format NHWC | |||
Checker<WarpPerspective> checker(handle()); | |||
Checker<WarpPerspective, WarpPerspectiveMatIdxProxy> checker(handle()); | |||
param::WarpPerspective param; | |||
class ResizeMatRNG : public RNG { | |||
void gen(const TensorND& tensor_) override { | |||
@@ -82,7 +82,10 @@ TEST_F(AARCH64, WARP_PERSPECTIVE_CV) { | |||
param.bmode = mode; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10, 56, 128, 3}}); | |||
UniformIntRNG rng(0, 1); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec({{2, 5, 5, 1}, {4, 3, 3}, {4}, {4, 5, 5, 1}}); | |||
} | |||
// resize nan case | |||
UniformFloatRNG rng_zero(0, 0); | |||
@@ -91,7 +94,11 @@ TEST_F(AARCH64, WARP_PERSPECTIVE_CV) { | |||
param.bmode = BMode::CONSTANT; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{1000, 2, 10, 3}, {1000, 3, 3}, {1000, 2, 12, 3}}); | |||
UniformIntRNG rng(0, 999); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec( | |||
{{1000, 2, 10, 3}, {2000, 3, 3}, {2000}, {2000, 2, 12, 3}}); | |||
} | |||
// add linear test | |||
@@ -101,7 +108,10 @@ TEST_F(AARCH64, WARP_PERSPECTIVE_CV) { | |||
param.bmode = mode; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10, 56, 128, 3}}); | |||
UniformIntRNG rng(0, 9); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec({{10, 128, 108, 3}, {20, 3, 3}, {20}, {20, 56, 128, 3}}); | |||
} | |||
// resize nan case | |||
checker.set_rng(1, &rng_zero); | |||
@@ -109,24 +119,34 @@ TEST_F(AARCH64, WARP_PERSPECTIVE_CV) { | |||
param.bmode = BMode::CONSTANT; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{1000, 2, 10, 3}, {1000, 3, 3}, {1000, 2, 12, 3}}); | |||
UniformIntRNG rng(0, 999); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec( | |||
{{1000, 2, 10, 3}, {2000, 3, 3}, {2000}, {2000, 2, 12, 3}}); | |||
} | |||
auto args = warp_perspective::get_cv_args(); | |||
for (auto&& arg : args) { | |||
ConstValue rng(0.f); | |||
checker.set_param(arg.param) | |||
.set_rng(2, &rng) | |||
.set_dtype(0, dtype::Uint8()) | |||
.set_dtype(1, dtype::Float32()) | |||
.set_dtype(2, dtype::Uint8()) | |||
.execs({arg.src, arg.trans, arg.dst}); | |||
.set_dtype(2, dtype::Int32()) | |||
.set_dtype(3, dtype::Uint8()) | |||
.execs({arg.src, arg.trans, arg.mat_idx, arg.dst}); | |||
} | |||
for (auto&& arg : args) { | |||
ConstValue rng(0.f); | |||
checker.set_param(arg.param) | |||
.set_rng(2, &rng) | |||
.set_dtype(0, dtype::Float32()) | |||
.set_dtype(1, dtype::Float32()) | |||
.set_dtype(2, dtype::Float32()) | |||
.execs({arg.src, arg.trans, arg.dst}); | |||
.set_dtype(2, dtype::Int32()) | |||
.set_dtype(3, dtype::Float32()) | |||
.execs({arg.src, arg.trans, arg.mat_idx, arg.dst}); | |||
} | |||
} | |||
@@ -25,7 +25,7 @@ namespace test { | |||
TEST_F(ARM_COMMON, WARP_PERSPECTIVE_CV) { | |||
//! Just for the format NHWC | |||
Checker<WarpPerspective> checker(handle()); | |||
Checker<WarpPerspective, WarpPerspectiveMatIdxProxy> checker(handle()); | |||
param::WarpPerspective param; | |||
class ResizeMatRNG : public RNG { | |||
void gen(const TensorND& tensor_) override { | |||
@@ -82,7 +82,10 @@ TEST_F(ARM_COMMON, WARP_PERSPECTIVE_CV) { | |||
param.bmode = mode; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10, 56, 128, 3}}); | |||
UniformIntRNG rng(0, 9); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec({{10, 128, 108, 3}, {20, 3, 3}, {20}, {20, 56, 128, 3}}); | |||
} | |||
// resize nan case | |||
UniformFloatRNG rng_zero(0, 0); | |||
@@ -91,7 +94,11 @@ TEST_F(ARM_COMMON, WARP_PERSPECTIVE_CV) { | |||
param.bmode = BMode::CONSTANT; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{1000, 2, 10, 3}, {1000, 3, 3}, {1000, 2, 12, 3}}); | |||
UniformIntRNG rng(0, 999); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec( | |||
{{1000, 2, 10, 3}, {1000, 3, 3}, {1000}, {1000, 2, 12, 3}}); | |||
} | |||
// add linear test | |||
@@ -101,7 +108,10 @@ TEST_F(ARM_COMMON, WARP_PERSPECTIVE_CV) { | |||
param.bmode = mode; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10, 56, 128, 3}}); | |||
UniformIntRNG rng(0, 9); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec({{10, 128, 108, 3}, {20, 3, 3}, {20}, {20, 56, 128, 3}}); | |||
} | |||
// resize nan case | |||
checker.set_rng(1, &rng_zero); | |||
@@ -109,30 +119,40 @@ TEST_F(ARM_COMMON, WARP_PERSPECTIVE_CV) { | |||
param.bmode = BMode::CONSTANT; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{1000, 2, 10, 3}, {1000, 3, 3}, {1000, 2, 12, 3}}); | |||
UniformIntRNG rng(0, 999); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec( | |||
{{1000, 2, 10, 3}, {2000, 3, 3}, {2000}, {2000, 2, 12, 3}}); | |||
} | |||
auto args = warp_perspective::get_cv_args(); | |||
for (auto&& arg : args) { | |||
ConstValue rng(0.f); | |||
checker.set_param(arg.param) | |||
.set_rng(2, &rng) | |||
.set_dtype(0, dtype::Uint8()) | |||
.set_dtype(1, dtype::Float32()) | |||
.set_dtype(2, dtype::Uint8()) | |||
.execs({arg.src, arg.trans, arg.dst}); | |||
.set_dtype(2, dtype::Int32()) | |||
.set_dtype(3, dtype::Uint8()) | |||
.execs({arg.src, arg.trans, arg.mat_idx, arg.dst}); | |||
} | |||
for (auto&& arg : args) { | |||
ConstValue rng(0.f); | |||
checker.set_param(arg.param) | |||
.set_rng(2, &rng) | |||
.set_dtype(0, dtype::Float32()) | |||
.set_dtype(1, dtype::Float32()) | |||
.set_dtype(2, dtype::Float32()) | |||
.execs({arg.src, arg.trans, arg.dst}); | |||
.set_dtype(2, dtype::Int32()) | |||
.set_dtype(3, dtype::Float32()) | |||
.execs({arg.src, arg.trans, arg.mat_idx, arg.dst}); | |||
} | |||
} | |||
TEST_F(ARM_COMMON_MULTI_THREADS, WARP_PERSPECTIVE_CV) { | |||
//! Just for the format NHWC | |||
Checker<WarpPerspective> checker(handle()); | |||
Checker<WarpPerspective, WarpPerspectiveMatIdxProxy> checker(handle()); | |||
param::WarpPerspective param; | |||
class ResizeMatRNG : public RNG { | |||
void gen(const TensorND& tensor_) override { | |||
@@ -189,7 +209,10 @@ TEST_F(ARM_COMMON_MULTI_THREADS, WARP_PERSPECTIVE_CV) { | |||
param.bmode = mode; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10, 56, 128, 3}}); | |||
UniformIntRNG rng(0, 9); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10}, {10, 56, 128, 3}}); | |||
} | |||
// resize nan case | |||
UniformFloatRNG rng_zero(0, 0); | |||
@@ -198,7 +221,11 @@ TEST_F(ARM_COMMON_MULTI_THREADS, WARP_PERSPECTIVE_CV) { | |||
param.bmode = BMode::CONSTANT; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{1000, 2, 10, 3}, {1000, 3, 3}, {1000, 2, 12, 3}}); | |||
UniformIntRNG rng(0, 999); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec( | |||
{{1000, 2, 10, 3}, {2000, 3, 3}, {2000}, {2000, 2, 12, 3}}); | |||
} | |||
// add linear test | |||
@@ -208,7 +235,10 @@ TEST_F(ARM_COMMON_MULTI_THREADS, WARP_PERSPECTIVE_CV) { | |||
param.bmode = mode; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10, 56, 128, 3}}); | |||
UniformIntRNG rng(0, 9); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec({{10, 128, 108, 3}, {10, 3, 3}, {10}, {10, 56, 128, 3}}); | |||
} | |||
// resize nan case | |||
checker.set_rng(1, &rng_zero); | |||
@@ -216,24 +246,34 @@ TEST_F(ARM_COMMON_MULTI_THREADS, WARP_PERSPECTIVE_CV) { | |||
param.bmode = BMode::CONSTANT; | |||
param.border_val = 1.737; | |||
checker.set_param(param); | |||
checker.exec({{1000, 2, 10, 3}, {1000, 3, 3}, {1000, 2, 12, 3}}); | |||
UniformIntRNG rng(0, 999); | |||
checker.set_rng(2, &rng); | |||
checker.set_dtype(2, dtype::Int32()); | |||
checker.exec( | |||
{{1000, 2, 10, 3}, {1000, 3, 3}, {1000}, {1000, 2, 12, 3}}); | |||
} | |||
auto args = warp_perspective::get_cv_args(); | |||
for (auto&& arg : args) { | |||
ConstValue rng(0.f); | |||
checker.set_param(arg.param) | |||
.set_rng(2, &rng) | |||
.set_dtype(0, dtype::Uint8()) | |||
.set_dtype(1, dtype::Float32()) | |||
.set_dtype(2, dtype::Uint8()) | |||
.execs({arg.src, arg.trans, arg.dst}); | |||
.set_dtype(2, dtype::Int32()) | |||
.set_dtype(3, dtype::Uint8()) | |||
.execs({arg.src, arg.trans, arg.mat_idx, arg.dst}); | |||
} | |||
for (auto&& arg : args) { | |||
ConstValue rng(0.f); | |||
checker.set_param(arg.param) | |||
.set_rng(2, &rng) | |||
.set_dtype(0, dtype::Float32()) | |||
.set_dtype(1, dtype::Float32()) | |||
.set_dtype(2, dtype::Float32()) | |||
.execs({arg.src, arg.trans, arg.dst}); | |||
.set_dtype(2, dtype::Int32()) | |||
.set_dtype(3, dtype::Float32()) | |||
.execs({arg.src, arg.trans, arg.mat_idx, arg.dst}); | |||
} | |||
} | |||
@@ -56,24 +56,24 @@ std::vector<TestArg> warp_perspective::get_cv_args() { | |||
cur_param.imode = imode; | |||
args.emplace_back(cur_param, TensorShape{1, i, i, ic}, | |||
TensorShape{1, 3, 3}, | |||
TensorShape{1, 3, 3}, TensorShape{1}, | |||
TensorShape{1, i, i, ic}); | |||
args.emplace_back(cur_param, TensorShape{1, i, i * 2, ic}, | |||
TensorShape{1, 3, 3}, | |||
TensorShape{1, 3, 3}, TensorShape{1}, | |||
TensorShape{1, i, i * 2, ic}); | |||
args.emplace_back(cur_param, TensorShape{1, i * 3, i, ic}, | |||
TensorShape{1, 3, 3}, | |||
TensorShape{1, 3, 3}, TensorShape{1}, | |||
TensorShape{1, i * 3, i, ic}); | |||
cur_param.border_val = 0.78f; | |||
args.emplace_back(cur_param, TensorShape{1, i, i, ic}, | |||
TensorShape{1, 3, 3}, | |||
TensorShape{1, 3, 3}, TensorShape{1}, | |||
TensorShape{1, 8, 8, ic}); | |||
args.emplace_back(cur_param, TensorShape{1, i, i * 2, ic}, | |||
TensorShape{1, 3, 3}, | |||
TensorShape{1, 3, 3}, TensorShape{1}, | |||
TensorShape{1, 8, 8, ic}); | |||
args.emplace_back(cur_param, TensorShape{1, i * 3, i, ic}, | |||
TensorShape{1, 3, 3}, | |||
TensorShape{1, 3, 3}, TensorShape{1}, | |||
TensorShape{1, 8, 8, ic}); | |||
} | |||
} | |||
@@ -101,7 +101,10 @@ void warp_perspective::run_mat_idx_test(Handle* handle) { | |||
// test NHWC | |||
param.format = WarpPerspective::Param::Format::NHWC; | |||
checker.set_param(param); | |||
checker.set_param(param) | |||
.set_rng(2, &mat_idx_rng) | |||
.set_epsilon(1e-1) | |||
.set_dtype(2, dtype::Int32()); | |||
checker.execs({{N_SRC, 10, 11, 3}, {2, 3, 3}, {2}, {2, 11, 12, 3}}); | |||
} | |||
@@ -57,10 +57,11 @@ struct TestArg { | |||
param::WarpPerspective param; | |||
TensorShape src; | |||
TensorShape trans; | |||
TensorShape mat_idx; | |||
TensorShape dst; | |||
TestArg(param::WarpPerspective param_, TensorShape src_, TensorShape trans_, | |||
TestArg(param::WarpPerspective param_, TensorShape src_, TensorShape trans_, TensorShape mat_idx_, | |||
TensorShape dst_) | |||
: param(param_), src(src_), trans(trans_), dst(dst_) {} | |||
: param(param_), src(src_), trans(trans_), mat_idx(mat_idx_), dst(dst_) {} | |||
}; | |||
//! Test args for the WarpPerspective with format NHWC | |||