Merge pull request #19341 from mpashchenkov:mp/ocv-gapi-parsessd-fix

G-API: Removing ParseSSD overload.

* Removed specialization.

* Removed united
pull/20272/head
Maxim Pashchenkov 4 years ago committed by GitHub
parent 438e2dc228
commit 651967b95c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      modules/gapi/include/opencv2/gapi/infer/parsers.hpp
  2. 15
      modules/gapi/src/backends/cpu/gcpucore.cpp
  3. 47
      modules/gapi/src/backends/cpu/gnnparsers.cpp
  4. 13
      modules/gapi/src/backends/cpu/gnnparsers.hpp

@ -69,7 +69,8 @@ GAPI_EXPORTS std::tuple<GArray<Rect>, GArray<int>> parseSSD(const GMat& in,
const float confidenceThreshold = 0.5f, const float confidenceThreshold = 0.5f,
const int filterLabel = -1); const int filterLabel = -1);
/** @overload /** @brief Parses output of SSD network.
Extracts detection information (box, confidence) from SSD output and Extracts detection information (box, confidence) from SSD output and
filters it by given confidence and by going out of bounds. filters it by given confidence and by going out of bounds.
@ -87,9 +88,9 @@ the larger side of the rectangle.
*/ */
GAPI_EXPORTS_W GArray<Rect> parseSSD(const GMat& in, GAPI_EXPORTS_W GArray<Rect> parseSSD(const GMat& in,
const GOpaque<Size>& inSz, const GOpaque<Size>& inSz,
const float confidenceThreshold = 0.5f, const float confidenceThreshold,
const bool alignmentToSquare = false, const bool alignmentToSquare,
const bool filterOutOfBounds = false); const bool filterOutOfBounds);
/** @brief Parses output of Yolo network. /** @brief Parses output of Yolo network.

@ -652,7 +652,12 @@ GAPI_OCV_KERNEL(GCPUParseSSDBL, cv::gapi::nn::parsers::GParseSSDBL)
std::vector<cv::Rect>& out_boxes, std::vector<cv::Rect>& out_boxes,
std::vector<int>& out_labels) std::vector<int>& out_labels)
{ {
cv::parseSSDBL(in_ssd_result, in_size, confidence_threshold, filter_label, out_boxes, out_labels); cv::ParseSSD(in_ssd_result, in_size,
confidence_threshold,
filter_label,
false,
false,
out_boxes, out_labels);
} }
}; };
@ -665,7 +670,13 @@ GAPI_OCV_KERNEL(GOCVParseSSD, cv::gapi::nn::parsers::GParseSSD)
const bool filter_out_of_bounds, const bool filter_out_of_bounds,
std::vector<cv::Rect>& out_boxes) std::vector<cv::Rect>& out_boxes)
{ {
cv::parseSSD(in_ssd_result, in_size, confidence_threshold, alignment_to_square, filter_out_of_bounds, out_boxes); std::vector<int> unused_labels;
cv::ParseSSD(in_ssd_result, in_size,
confidence_threshold,
-1,
alignment_to_square,
filter_out_of_bounds,
out_boxes, unused_labels);
} }
}; };

@ -170,48 +170,18 @@ private:
} // namespace nn } // namespace nn
} // namespace gapi } // namespace gapi
void parseSSDBL(const cv::Mat& in_ssd_result, void ParseSSD(const cv::Mat& in_ssd_result,
const cv::Size& in_size,
const float confidence_threshold,
const int filter_label,
std::vector<cv::Rect>& out_boxes,
std::vector<int>& out_labels)
{
cv::gapi::nn::SSDParser parser(in_ssd_result.size, in_size, in_ssd_result.ptr<float>());
out_boxes.clear();
out_labels.clear();
cv::Rect rc;
float image_id, confidence;
int label;
const size_t range = parser.getMaxProposals();
for (size_t i = 0; i < range; ++i)
{
std::tie(rc, image_id, confidence, label) = parser.extract(i);
if (image_id < 0.f)
{
break; // marks end-of-detections
}
if (confidence < confidence_threshold ||
(filter_label != -1 && label != filter_label))
{
continue; // filter out object classes if filter is specified
} // and skip objects with low confidence
out_boxes.emplace_back(rc & parser.getSurface());
out_labels.emplace_back(label);
}
}
void parseSSD(const cv::Mat& in_ssd_result,
const cv::Size& in_size, const cv::Size& in_size,
const float confidence_threshold, const float confidence_threshold,
const int filter_label,
const bool alignment_to_square, const bool alignment_to_square,
const bool filter_out_of_bounds, const bool filter_out_of_bounds,
std::vector<cv::Rect>& out_boxes) std::vector<cv::Rect>& out_boxes,
std::vector<int>& out_labels)
{ {
cv::gapi::nn::SSDParser parser(in_ssd_result.size, in_size, in_ssd_result.ptr<float>()); cv::gapi::nn::SSDParser parser(in_ssd_result.size, in_size, in_ssd_result.ptr<float>());
out_boxes.clear(); out_boxes.clear();
out_labels.clear();
cv::Rect rc; cv::Rect rc;
float image_id, confidence; float image_id, confidence;
int label; int label;
@ -228,12 +198,14 @@ void parseSSD(const cv::Mat& in_ssd_result,
{ {
continue; // skip objects with low confidence continue; // skip objects with low confidence
} }
if((filter_label != -1) && (label != filter_label))
{
continue; // filter out object classes if filter is specified
}
if (alignment_to_square) if (alignment_to_square)
{ {
parser.adjustBoundingBox(rc); parser.adjustBoundingBox(rc);
} }
const auto clipped_rc = rc & parser.getSurface(); const auto clipped_rc = rc & parser.getSurface();
if (filter_out_of_bounds) if (filter_out_of_bounds)
{ {
@ -243,6 +215,7 @@ void parseSSD(const cv::Mat& in_ssd_result,
} }
} }
out_boxes.emplace_back(clipped_rc); out_boxes.emplace_back(clipped_rc);
out_labels.emplace_back(label);
} }
} }

@ -11,19 +11,14 @@
namespace cv namespace cv
{ {
void parseSSDBL(const cv::Mat& in_ssd_result, void ParseSSD(const cv::Mat& in_ssd_result,
const cv::Size& in_size,
const float confidence_threshold,
const int filter_label,
std::vector<cv::Rect>& out_boxes,
std::vector<int>& out_labels);
void parseSSD(const cv::Mat& in_ssd_result,
const cv::Size& in_size, const cv::Size& in_size,
const float confidence_threshold, const float confidence_threshold,
const int filter_label,
const bool alignment_to_square, const bool alignment_to_square,
const bool filter_out_of_bounds, const bool filter_out_of_bounds,
std::vector<cv::Rect>& out_boxes); std::vector<cv::Rect>& out_boxes,
std::vector<int>& out_labels);
void parseYolo(const cv::Mat& in_yolo_result, void parseYolo(const cv::Mat& in_yolo_result,
const cv::Size& in_size, const cv::Size& in_size,

Loading…
Cancel
Save