// 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(std::vector> box, const float &unclip_ratio); float **Mat2Vec(cv::Mat mat); std::vector> OrderPointsClockwise(std::vector> pts); std::vector> GetMiniBoxes(cv::RotatedRect box, float &ssid); float BoxScoreFast(std::vector> box_array, cv::Mat pred); float PolygonScoreAcc(std::vector contour, 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); std::vector>> FilterTagDetRes(std::vector>> boxes, float ratio_h, float ratio_w, cv::Mat srcimg); private: static bool XsortInt(std::vector a, std::vector b); static bool XsortFp32(std::vector a, std::vector b); std::vector> Mat2Vector(cv::Mat mat); inline int _max(int a, int b) { return a >= b ? a : b; } inline int _min(int a, int b) { return a >= b ? b : a; } template inline T clamp(T x, T min, T max) { if (x > max) return max; if (x < min) return min; return x; } inline float clampf(float x, float min, float max) { if (x > max) return max; if (x < min) return min; return x; } }; class TablePostProcessor { public: void init(std::string label_path, bool merge_no_span_structure = true); void Run(std::vector &loc_preds, std::vector &structure_probs, std::vector &rec_scores, std::vector &loc_preds_shape, std::vector &structure_probs_shape, std::vector> &rec_html_tag_batch, std::vector>> &rec_boxes_batch, std::vector &width_list, std::vector &height_list); private: std::vector label_list_; std::string end = "eos"; std::string beg = "sos"; }; class PicodetPostProcessor { public: void init(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, std::vector> outs, std::vector ori_shape, std::vector resize_shape, int eg_max); std::vector fpn_stride_ = {8, 16, 32, 64}; private: StructurePredictResult disPred2Bbox(std::vector bbox_pred, int label, float score, int x, int y, int stride, std::vector im_shape, int reg_max); void nms(std::vector &input_boxes, float nms_threshold); std::vector label_list_; double score_threshold_ = 0.4; double nms_threshold_ = 0.5; int num_class_ = 5; }; } // namespace PaddleOCR