// Copyright (c) OpenMMLab. All rights reserved. #include "codebase/mmocr/panet.h" #include "opencv2/imgproc.hpp" namespace mmdeploy::mmocr { class PaHeadCpuImpl : public PaHeadImpl { public: Result Process(Tensor text_pred, // Tensor kernel_pred, // Tensor embed_pred, // float min_text_confidence, // float min_kernel_confidence, // cv::Mat_& text_score, // cv::Mat_& text, // cv::Mat_& kernel, // cv::Mat_& label, // cv::Mat_& embed, // int& region_num) override { OUTCOME_TRY(stream_.Wait()); auto height = static_cast(text_pred.shape(1)); auto width = static_cast(text_pred.shape(2)); text_score = cv::Mat_(height, width, text_pred.data()); sigmoid(text_score); text = text_score > min_text_confidence; cv::Mat_ kernel_score(height, width, kernel_pred.data()); sigmoid(kernel_score); kernel = kernel_score > min_kernel_confidence & text; auto n_embed_channels = static_cast(embed_pred.shape(0)); embed = cv::Mat_(n_embed_channels, height * width, embed_pred.data()); cv::transpose(embed, embed); region_num = cv::connectedComponents(kernel, label, 4, CV_32S); return success(); } static void sigmoid(cv::Mat_& score) { cv::exp(-score, score); score = 1 / (1 + score); } }; class PaHeadCpuImplCreator : public ::mmdeploy::Creator { public: const char* GetName() const override { return "cpu"; } int GetVersion() const override { return 0; } std::unique_ptr Create(const Value&) override { return std::make_unique(); } }; REGISTER_MODULE(PaHeadImpl, PaHeadCpuImplCreator); } // namespace mmdeploy::mmocr