#ifndef CAFFE2_OPERATORS_UTILS_NMS_GPU_H_ #define CAFFE2_OPERATORS_UTILS_NMS_GPU_H_ #include #include "caffe2/core/context_gpu.h" namespace caffe2 { namespace utils { // Computes Non-Maximum Suppression on the GPU // Reject a bounding box if its region has an intersection-overunion (IoU) // overlap with a higher scoring selected bounding box larger than a // threshold. // // d_desc_sorted_boxes : pixel coordinates of proposed bounding boxes // size: (N,4), format: [x1; y1; x2; y2] // the boxes are sorted by scores in descending order // N : number of boxes // d_keep_sorted_list : row indices of the selected proposals, sorted by score // h_nkeep : number of selected proposals // dev_delete_mask, host_delete_mask : Tensors that will be used as temp storage // by NMS // Those tensors will be resized to the necessary size // context : current CUDA context CAFFE2_API void nms_gpu_upright( const float* d_desc_sorted_boxes, const int N, const float thresh, const bool legacy_plus_one, int* d_keep_sorted_list, int* h_nkeep, TensorCUDA& dev_delete_mask, TensorCPU& host_delete_mask, CUDAContext* context); struct RotatedBox { float x_ctr, y_ctr, w, h, a; }; // Same as nms_gpu_upright, but for rotated boxes with angle info. // d_desc_sorted_boxes : pixel coordinates of proposed bounding boxes // size: (N,5), format: [x_ct; y_ctr; width; height; angle] // the boxes are sorted by scores in descending order CAFFE2_API void nms_gpu_rotated( const float* d_desc_sorted_boxes, const int N, const float thresh, int* d_keep_sorted_list, int* h_nkeep, TensorCUDA& dev_delete_mask, TensorCPU& host_delete_mask, CUDAContext* context); CAFFE2_API void nms_gpu( const float* d_desc_sorted_boxes, const int N, const float thresh, const bool legacy_plus_one, int* d_keep_sorted_list, int* h_nkeep, TensorCUDA& dev_delete_mask, TensorCPU& host_delete_mask, CUDAContext* context, const int box_dim); } // namespace utils } // namespace caffe2 #endif // CAFFE2_OPERATORS_UTILS_NMS_GPU_H_