|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
|
|
#include <torch/torch.h> |
|
|
|
|
|
#include "nms_common.h" |
|
|
#include "../geometry.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef std::tuple<torch::Tensor, torch::Tensor, torch::Tensor> nms_result_t; |
|
|
|
|
|
nms_result_t quad_non_maximal_suppression( |
|
|
torch::Tensor quads, torch::Tensor probs, |
|
|
float probThreshold, float iouThreshold, |
|
|
int64_t kernelHeight, int64_t kernelWidth, |
|
|
int64_t maxRegions, |
|
|
bool verbose = false); |
|
|
|
|
|
|
|
|
template<typename T> |
|
|
struct TrackedInPlaceQuad_ : InPlaceQuad_<T> { |
|
|
Point_<int64_t> ImgCoords; |
|
|
|
|
|
TrackedInPlaceQuad_(Point_<int64_t> imgCoords) : ImgCoords(std::move(imgCoords)) {} |
|
|
TrackedInPlaceQuad_(int64_t row, int64_t col) : ImgCoords(col, row) {} |
|
|
}; |
|
|
|
|
|
template<typename T> |
|
|
struct TrackedEmbedQuad_ : EmbedQuad_<T> { |
|
|
std::vector<Point_<int64_t>> ImgCoords; |
|
|
|
|
|
TrackedEmbedQuad_(T confidence = 0): EmbedQuad_<T>(confidence) {} |
|
|
TrackedEmbedQuad_(const TrackedEmbedQuad_ &other) = default; |
|
|
|
|
|
void swap(TrackedEmbedQuad_ &other) noexcept { |
|
|
using std::swap; |
|
|
|
|
|
swap(ImgCoords, other.ImgCoords); |
|
|
|
|
|
EmbedQuad_<T>::swap(other); |
|
|
} |
|
|
|
|
|
TrackedEmbedQuad_(TrackedEmbedQuad_ &&other) : TrackedEmbedQuad_() { |
|
|
other.swap(*this); |
|
|
} |
|
|
|
|
|
TrackedEmbedQuad_ &operator=(TrackedEmbedQuad_ other) { |
|
|
other.swap(*this); |
|
|
return *this; |
|
|
} |
|
|
|
|
|
void Append(const TrackedInPlaceQuad_<T> &q, T conf, T numQuads = 1) { |
|
|
ImgCoords.push_back(q.ImgCoords); |
|
|
|
|
|
EmbedQuad_<T>::Append(q, conf, numQuads); |
|
|
} |
|
|
|
|
|
void Append(const TrackedEmbedQuad_<T> &other) { |
|
|
ImgCoords.insert(end(ImgCoords), begin(other.ImgCoords), end(other.ImgCoords)); |
|
|
|
|
|
EmbedQuad_<T>::Append(other); |
|
|
} |
|
|
|
|
|
void Reset() { |
|
|
ImgCoords.clear(); |
|
|
|
|
|
EmbedQuad_<T>::Reset(); |
|
|
} |
|
|
}; |
|
|
|
|
|
typedef TrackedInPlaceQuad_<float> TIPQuad; |
|
|
typedef TrackedEmbedQuad_<float> TEFQuad; |
|
|
|
|
|
|
|
|
std::vector<TEFQuad> reduced_quad_non_maximal_suppression( |
|
|
const std::vector<TIPQuad> &rowQuads, float iouThreshold, int64_t imageHeight, int64_t imageWidth); |
|
|
|
|
|
std::vector<torch::Tensor> quad_non_maximal_suppression_backward( |
|
|
torch::Tensor quads, torch::Tensor probs, |
|
|
torch::Tensor gradOutQuads, torch::Tensor gradOutProbs); |
|
|
|
|
|
nms_result_t cuda_quad_non_maximal_suppression( |
|
|
torch::Tensor quads, torch::Tensor probs, |
|
|
float probThreshold, float iouThreshold, |
|
|
int64_t kernelHeight, int64_t kernelWidth, |
|
|
int64_t maxRegions, |
|
|
bool verbose); |
|
|
|