Skip to content

Commit

Permalink
版本推进:v1.4.1 dev
Browse files Browse the repository at this point in the history
1. 跟进 [PaddleOCR #10441](PaddlePaddle/PaddleOCR#10441)
- 使用智能指针代替原始指针
- 修复 detector_ classifier_ recognizer_ 可能造成的内存泄漏

2. 跟进 [PaddleOCR #10512](PaddlePaddle/PaddleOCR#10512)
- 修复时间记录的初始化过程

3. 格式化代码,补充部分注释
  • Loading branch information
hiroi-sora committed Jul 28, 2024
1 parent 169a274 commit e61e10e
Show file tree
Hide file tree
Showing 9 changed files with 849 additions and 744 deletions.
75 changes: 42 additions & 33 deletions cpp/include/paddleocr.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,38 +18,47 @@
#include <include/ocr_det.h>
#include <include/ocr_rec.h>

namespace PaddleOCR {

class PPOCR {
public:
explicit PPOCR();
~PPOCR();

std::vector<std::vector<OCRPredictResult>> ocr(std::vector<cv::Mat> img_list,
bool det = true,
bool rec = true,
bool cls = true);
std::vector<OCRPredictResult> ocr(cv::Mat img, bool det = true,
bool rec = true, bool cls = true);

void reset_timer();
void benchmark_log(int img_num);

protected:
std::vector<double> time_info_det = {0, 0, 0};
std::vector<double> time_info_rec = {0, 0, 0};
std::vector<double> time_info_cls = {0, 0, 0};

void det(cv::Mat img, std::vector<OCRPredictResult> &ocr_results);
void rec(std::vector<cv::Mat> img_list,
std::vector<OCRPredictResult> &ocr_results);
void cls(std::vector<cv::Mat> img_list,
std::vector<OCRPredictResult> &ocr_results);

private:
DBDetector *detector_ = nullptr;
Classifier *classifier_ = nullptr;
CRNNRecognizer *recognizer_ = nullptr;
};
namespace PaddleOCR
{
class PPOCR
{
public:
explicit PPOCR();
~PPOCR() = default; // 默认析构函数

// OCR方法,处理图像列表,返回每个图像的OCR结果向量
std::vector<std::vector<OCRPredictResult>> ocr(std::vector<cv::Mat> img_list,
bool det = true,
bool rec = true,
bool cls = true);
// OCR方法,处理单个图像,返回OCR结果
std::vector<OCRPredictResult> ocr(cv::Mat img, bool det = true,
bool rec = true, bool cls = true);

void reset_timer(); // 重置计时器
void benchmark_log(int img_num); // 记录基准测试日志,参数为图像数量

protected:
// 时间信息
std::vector<double> time_info_det = {0, 0, 0};
std::vector<double> time_info_rec = {0, 0, 0};
std::vector<double> time_info_cls = {0, 0, 0};

// 文本检测:输入单张图片,在ocr_results向量中存放单行文本碎图的检测信息
void det(cv::Mat img,
std::vector<OCRPredictResult> &ocr_results);
// 方向分类:输入单行碎图向量,在ocr_results向量中存放每个碎图的方向标志
void cls(std::vector<cv::Mat> img_list,
std::vector<OCRPredictResult> &ocr_results);
// 文本识别:输入单行碎图向量,在ocr_results向量中存放每个碎图的文本
void rec(std::vector<cv::Mat> img_list,
std::vector<OCRPredictResult> &ocr_results);

private:
// 智能指针
std::unique_ptr<DBDetector> detector_; // 指向 文本检测器实例
std::unique_ptr<Classifier> classifier_; // 指向 方向分类器实例
std::unique_ptr<CRNNRecognizer> recognizer_; // 指向 文本识别器实例
};

} // namespace PaddleOCR
76 changes: 42 additions & 34 deletions cpp/include/paddlestructure.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,49 +18,57 @@
#include <include/structure_layout.h>
#include <include/structure_table.h>

namespace PaddleOCR {
namespace PaddleOCR
{

class PaddleStructure : public PPOCR {
public:
explicit PaddleStructure();
~PaddleStructure();
class PaddleStructure : public PPOCR
{
public:
explicit PaddleStructure();
~PaddleStructure() = default;

std::vector<StructurePredictResult> structure(cv::Mat img,
bool layout = false,
bool table = true,
bool ocr = false);
std::vector<StructurePredictResult> structure(cv::Mat img,
bool layout = false,
bool table = true,
bool ocr = false);

void reset_timer();
void benchmark_log(int img_num);
void reset_timer();
void benchmark_log(int img_num);

private:
std::vector<double> time_info_table = {0, 0, 0};
std::vector<double> time_info_layout = {0, 0, 0};
private:
std::vector<double> time_info_table = {0, 0, 0};
std::vector<double> time_info_layout = {0, 0, 0};

StructureTableRecognizer *table_model_ = nullptr;
StructureLayoutRecognizer *layout_model_ = nullptr;
std::unique_ptr<StructureTableRecognizer> table_model_;
std::unique_ptr<StructureLayoutRecognizer> layout_model_;

void layout(cv::Mat img,
std::vector<StructurePredictResult> &structure_result);
void layout(cv::Mat img,
std::vector<StructurePredictResult> &structure_result);

void table(cv::Mat img, StructurePredictResult &structure_result);
void table(cv::Mat img, StructurePredictResult &structure_result);

std::string rebuild_table(std::vector<std::string> rec_html_tags,
std::vector<std::vector<int>> rec_boxes,
std::vector<OCRPredictResult> &ocr_result);
std::string rebuild_table(std::vector<std::string> rec_html_tags,
std::vector<std::vector<int>> rec_boxes,
std::vector<OCRPredictResult> &ocr_result);

float dis(std::vector<int> &box1, std::vector<int> &box2);
float dis(std::vector<int> &box1, std::vector<int> &box2);

static bool comparison_dis(const std::vector<float> &dis1,
const std::vector<float> &dis2) {
if (dis1[1] < dis2[1]) {
return true;
} else if (dis1[1] == dis2[1]) {
return dis1[0] < dis2[0];
} else {
return false;
}
}
};
static bool comparison_dis(const std::vector<float> &dis1,
const std::vector<float> &dis2)
{
if (dis1[1] < dis2[1])
{
return true;
}
else if (dis1[1] == dis2[1])
{
return dis1[0] < dis2[0];
}
else
{
return false;
}
}
};

} // namespace PaddleOCR
59 changes: 29 additions & 30 deletions cpp/include/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,18 +46,18 @@ namespace PaddleOCR
#endif

// base64读图,失败
#define CODE_ERR_BASE64_DECODE 300 // base64字符串解析为string失败
#define CODE_ERR_BASE64_DECODE 300 // base64字符串解析为string失败
#define MSG_ERR_BASE64_DECODE "Base64 decode failed."
#define CODE_ERR_BASE64_IM_DECODE 301 // base64字符串解析成功,但读取到的内容无法被opencv解码
#define CODE_ERR_BASE64_IM_DECODE 301 // base64字符串解析成功,但读取到的内容无法被opencv解码
#define MSG_ERR_BASE64_IM_DECODE "Base64 data imdecode failed."
// json相关
#define CODE_ERR_JSON_DUMP 400 // json对象 转字符串失败
#define CODE_ERR_JSON_DUMP 400 // json对象 转字符串失败
#define MSG_ERR_JSON_DUMP "Json dump failed."
#define CODE_ERR_JSON_PARSE 401 // json字符串 转对象失败
#define CODE_ERR_JSON_PARSE 401 // json字符串 转对象失败
#define MSG_ERR_JSON_PARSE "Json parse failed."
#define CODE_ERR_JSON_PARSE_KEY 402 // json对象 解析某个键时失败
#define CODE_ERR_JSON_PARSE_KEY 402 // json对象 解析某个键时失败
#define MSG_ERR_JSON_PARSE_KEY(k) "Json parse key [" + k + "] failed."
#define CODE_ERR_NO_TASK 403 // 未发现有效任务
#define CODE_ERR_NO_TASK 403 // 未发现有效任务
#define MSG_ERR_NO_TASK "No valid tasks."

// ==================== 任务调用类 ====================
Expand All @@ -68,37 +68,36 @@ namespace PaddleOCR
int ocr(); // OCR图片

private:
bool is_exit = false; // 为true时退出任务循环
PPOCR *ppocr; // OCR引擎指针
int t_code; // 本轮任务状态码
std::string t_msg; // 本轮任务状态消息
bool is_exit = false; // 为true时退出任务循环
std::unique_ptr<PPOCR> ppocr; // OCR引擎智能指针
int t_code; // 本轮任务状态码
std::string t_msg; // 本轮任务状态消息

private:
// 任务流程
std::string run_ocr(std::string); // 输入用户传入值(字符串),返回结果json字符串
int single_image_mode(); // 单次识别模式
int socket_mode(); // 套接字模式
int anonymous_pipe_mode(); // 匿名管道模式

// 输出相关
void set_state(int code = CODE_INIT, std::string msg = ""); // 设置状态
std::string get_state_json(int code = CODE_INIT, std::string msg = ""); // 获取状态json字符串
std::string get_ocr_result_json(const std::vector<OCRPredictResult> &); // 传入OCR结果,返回json字符串

// 输入相关
std::string json_dump(nlohmann::json); // json对象转字符串
cv::Mat imread_json(std::string &); // 输入json字符串,解析json并返回图片Mat
cv::Mat imread_u8(std::string path, int flag = cv::IMREAD_COLOR); // 代替cv imread,输入utf-8字符串,返回Mat。失败时设置错误码,并返回空Mat。
cv::Mat imread_clipboard(int flag = cv::IMREAD_COLOR); // 从当前剪贴板中读取图片
cv::Mat imread_base64(std::string&, int flag = cv::IMREAD_COLOR); // 输入base64编码的字符串,返回Mat
int single_image_mode(); // 单次识别模式
int socket_mode(); // 套接字模式
int anonymous_pipe_mode(); // 匿名管道模式

// 输出相关
void set_state(int code = CODE_INIT, std::string msg = ""); // 设置状态
std::string get_state_json(int code = CODE_INIT, std::string msg = ""); // 获取状态json字符串
std::string get_ocr_result_json(const std::vector<OCRPredictResult> &); // 传入OCR结果,返回json字符串

// 输入相关
std::string json_dump(nlohmann::json); // json对象转字符串
cv::Mat imread_json(std::string &); // 输入json字符串,解析json并返回图片Mat
cv::Mat imread_u8(std::string path, int flag = cv::IMREAD_COLOR); // 代替cv imread,输入utf-8字符串,返回Mat。失败时设置错误码,并返回空Mat。
cv::Mat imread_clipboard(int flag = cv::IMREAD_COLOR); // 从当前剪贴板中读取图片
cv::Mat imread_base64(std::string &, int flag = cv::IMREAD_COLOR); // 输入base64编码的字符串,返回Mat
#ifdef _WIN32
cv::Mat imread_wstr(std::wstring pathW, int flags = cv::IMREAD_COLOR); // 输入unicode wstring字符串,返回Mat。
cv::Mat imread_wstr(std::wstring pathW, int flags = cv::IMREAD_COLOR); // 输入unicode wstring字符串,返回Mat。
#endif

// 其他

// ipv4 地址转 uint32_t
int addr_to_uint32(const std::string& addr, uint32_t& addr_out);
int addr_to_uint32(const std::string &addr, uint32_t &addr_out);
};

} // namespace PaddleOCR
Expand Down
4 changes: 2 additions & 2 deletions cpp/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// limitations under the License.

// 版本信息
#define PROJECT_VER "v1.4.0"
#define PROJECT_VER "v1.4.1 dev"
#define PROJECT_NAME "PaddleOCR-json " PROJECT_VER

#include "opencv2/core.hpp"
Expand All @@ -31,7 +31,7 @@ using namespace PaddleOCR;

void structure(std::vector<cv::String> &cv_all_img_names)
{
PaddleOCR::PaddleStructure engine = PaddleOCR::PaddleStructure();
PaddleOCR::PaddleStructure engine;

if (FLAGS_benchmark)
{
Expand Down
Loading

0 comments on commit e61e10e

Please sign in to comment.