在Visual Studio 2019中将Paddle OCR部署到现有项目
PaddleOCR的GitHub地址
1. 资源下载
需要下载以下四个资源:
- opencv
下载OpenCV,并解压安装,这里使用的是OpenCV4.5.2版本。 - PaddleOCR的GitHub源码
将Paddle OCR源码打包下载,解压为PaddleOCR目录 - 预测库
下载Windows预测库,这里选择CPU版本的cpu_avx_mkl版paddle_inference.zip,解压为paddle_inference目录 - 推理模型
推理模型有超轻量级(9.4M)和通用级(143.4M),这里我们下载的是超轻量级推理模型识别速度快,精度也不错。
在PaddleOCR的github页的PP-OCR 2.0 series model list处下载inference model,
共需要下载三个模型,分别为:- 文字检测模型:Detection model
- 文字方向分类器模型:Derection classifier
- 文字识别模型:Recognition model
将三个模型文件解压到models目录下
2. 环境部署
-
由于我们是C++环境,因此实际上只需要PaddleOCR/deploy/cpp_infer下的C++源码文件, 将cpp_infer, paddle_inference, models三个文件夹放到当前项目路径下。将cpp_infer/src/目录下的cpp文件添加到项目源文件,将cpp_infer/include/目录下的.h文件添加到项目头文件。
-
在Visual Studio 2019下打开属性管理器,选择配置Release|x64属性
- 在Release属性页的 C/C++ --> 附加包含目录 中添加以下路径, 在这里
$(SolutionDir)test\
代表的是项目的相对路径, 项目名称为test:$(SolutionDir)test\cpp_infer $(SolutionDir)test\paddle_inference\paddle\include $(SolutionDir)test\paddle_inference\third_party\install\protobuf\include $(SolutionDir)test\paddle_inference\third_party\install\glog\include $(SolutionDir)test\paddle_inference\third_party\install\gflags\include $(SolutionDir)test\paddle_inference\third_party\install\xxhash\include $(SolutionDir)test\paddle_inference\third_party\install\zlib\include $(SolutionDir)test\paddle_inference\third_party\boost $(SolutionDir)test\paddle_inference\third_party\eigen3 $(SolutionDir)test\paddle_inference\third_party\install\mklml\include $(SolutionDir)test\paddle_inference\third_party\install\mkldnn\include
- 在Release属性页的 链接器 --> 输入 --> 附加依赖项 添加以下路径:
$(SolutionDir)test\paddle_inference\paddle\lib\paddle_inference.lib $(SolutionDir)test\paddle_inference\third_party\install\mklml\lib\mklml.lib $(SolutionDir)test\paddle_inference\third_party\install\mklml\lib\libiomp5md.lib $(SolutionDir)test\paddle_inference\third_party\install\mkldnn\lib\mkldnn.lib
至此就可以生成解决方案,如果报错如下:错误 C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. test E:\test_Paddle_OCR\test\test\cpp_infer\src\config.cpp 25
- 在Release属性页的 C/C++ --> 附加包含目录 中添加以下路径, 在这里
解决方法:
打开属性管理器中的Release|x64属性设置页–> C/C++ --> 预处理器 --> 预处理器定义中添加:_CRT_SECURE_NO_WARNINGS
再次重新生成解决方案,成功生成解决方案。
此时运行main.cpp文件,会提示找不到paddle_inference.dll动态库文件。
-
在当前项目下exe运行的目录x64/Release中添加以下所需的dll文件, dll文件分别在以下目录。建议直接将dll文件复制到x64/Release目录下:
$(SolutionDir)test\paddle_inference\paddle\lib\paddle_inference.dll $(SolutionDir)test\paddle_inference\third_party\install\mklml\lib\mklml.dll $(SolutionDir)test\paddle_inference\third_party\install\mklml\lib\libiomp5md.dll $(SolutionDir)test\paddle_inference\third_party\install\mkldnn\lib\mkldnn.dll
-
配置文件设置
将deploy\cpp_infer\tools
目录下的config.txt文件、test\ppocr\utils\
目录下的ppocr_keys_v1.txt文件复制到项目目录,并修改config.txt中的路径配置如下:det_model_dir ./models/ch_ppocr_mobile_v2.0_det_infer/ # cls config use_angle_cls 0 cls_model_dir ./models/ch_ppocr_mobile_v2.0_cls_infer/ cls_thresh 0.9 # rec config rec_model_dir ./models/ch_ppocr_mobile_v2.0_rec_infer/ char_list_file ./ppocr_keys_v1.txt
整个项目的文件目录如下图所示,cpp_infer为源码目录src和头文件目录include,models为模型目录,paddle_inference为解压的推理模型目录。config中设置的相对路径都是相对于config.txt的路径位置。
6. 设置调试参数,在项目属性页中 配置属性 --> 调试 --> 命令参数中写入config.txt文件和要识别的图片路径。
或是修改main.cpp文件如下:
int main(int argc, char** argv) {
//if (argc < 3) {
// std::cerr << "[ERROR] usage: " << argv[0]
// << " configure_filepath image_path\n";
// exit(1);
//}
string config_path = "./config.txt";
string image_path = "./news.png";
//OCRConfig config(argv[1]);
OCRConfig config(config_path);
config.PrintConfigInfo();
//std::string img_path(argv[2]);
std::string img_path(image_path);
cv::Mat srcimg = cv::imread(img_path, cv::IMREAD_COLOR);
if (!srcimg.data) {
std::cerr << "[ERROR] image read failed! image path: " << img_path << "\n";
exit(1);
}
...
后面不修改,
...
3. 运行
至此,再次生成解决方案成功后,点击本地Windows调试运行,即可在弹出来的命令窗口看到OCR文字识别的结果。
测试图片和结果如下:
识别的结果:
识别出的文本位置图
需要注意的是,识别的结果是倒序输出,也即从最后一行开始输出,可通过修改源码进行正序输出。
可以看到识别效果非常不错,其背后的原理是先识别到每一行,然后再识别每一行的文字,并且是带有前后语义的识别模型,因此对于正常的文本识别精度非常可靠,同时给出了每一行的置信度。
除了能够获取文本内容外,源码里实际上还能够获取到每一行文本的四个顶点坐标,遗憾的是无法给出每一个文字的坐标。具体可以阅读cpp_infer中的源码查看源码。
更多推荐
Visual Studio 2019现有项目下部署Paddle OCR
发布评论