// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include "include/clipper.h" #include "include/utility.h" namespace PaddleOCR { class DBPostProcessor { public: void GetContourArea(const std::vector> &box, float unclip_ratio, float &distance); cv::RotatedRect UnClip(const std::vector> &box, const float &unclip_ratio); float **Mat2Vec(const cv::Mat &mat); std::vector> OrderPointsClockwise(const std::vector> &pts); std::vector> GetMiniBoxes(const cv::RotatedRect &box, float &ssid); float BoxScoreFast(const std::vector> &box_array, const cv::Mat &pred); float PolygonScoreAcc(const std::vector &contour, const cv::Mat &pred); std::vector>> BoxesFromBitmap(const cv::Mat &pred, const cv::Mat &bitmap, const float &box_thresh, const float &det_db_unclip_ratio, const std::string &det_db_score_mode); void FilterTagDetRes(std::vector>> &boxes, float ratio_h, float ratio_w, const cv::Mat &srcimg); private: static bool XsortInt(const std::vector &a, const std::vector &b); static bool XsortFp32(const std::vector &a, const std::vector &b); std::vector> Mat2Vector(const cv::Mat &mat); inline int _max(int a, int b) const noexcept { return a >= b ? a : b; } inline int _min(int a, int b) const noexcept { return a >= b ? b : a; } template inline T clamp(T x, T min, T max) const noexcept { if (x > max) return max; if (x < min) return min; return x; } inline float clampf(float x, float min, float max) const noexcept { if (x > max) return max; if (x < min) return min; return x; } }; class TablePostProcessor { public: void init(const std::string &label_path, bool merge_no_span_structure = true); void Run(const std::vector &loc_preds, const std::vector &structure_probs, std::vector &rec_scores, const std::vector &loc_preds_shape, const std::vector &structure_probs_shape, std::vector> &rec_html_tag_batch, std::vector>> &rec_boxes_batch, const std::vector &width_list, const std::vector &height_list); private: std::vector label_list_; const std::string end = "eos"; const std::string beg = "sos"; }; class PicodetPostProcessor { public: void init(const std::string &label_path, const double score_threshold = 0.4, const double nms_threshold = 0.5, const std::vector &fpn_stride = {8, 16, 32, 64}); void Run(std::vector &results, const std::vector> &outs, const std::vector &ori_shape, const std::vector &resize_shape, int eg_max); inline size_t fpn_stride_size() const { return fpn_stride_.size(); } private: StructurePredictResult disPred2Bbox(const std::vector &bbox_pred, int label, float score, int x, int y, int stride, const std::vector &im_shape, int reg_max); void nms(std::vector &input_boxes, float nms_threshold); std::vector fpn_stride_ = {8, 16, 32, 64}; std::vector label_list_; double score_threshold_ = 0.4; double nms_threshold_ = 0.5; int num_class_ = 5; }; } // namespace PaddleOCR