当前位置:   article > 正文

Delphi调用百度飞桨(PaddleOCR)OCR模型库识别验证码_delphi ocr

delphi ocr

PaddleOCR是百度开源的超轻量级OCR模型库,本文旨在分享如何通过Delphi使用其框架进行验证码识别。

调用事例基于Git上(https://gitee.com/raoyutian/paddle-ocrsharp)项目开源代码C++使用PaddleOCR中的代码转化而来

  1. unit uPPOCRApi;
  2. interface
  3. /// <summary>
  4. /// OCR识别参数
  5. /// </summary>
  6. type
  7. OCRParameter = packed record
  8. // 通用参数
  9. use_gpu: Boolean; // 是否使用GPU;默认false
  10. gpu_id: Integer; // GPU id,使用GPU时有效;默认0;
  11. gpu_mem: Integer; // 申请的GPU内存;默认4000
  12. cpu_math_library_num_threads: Integer; // CPU预测时的线程数,在机器核数充足的情况下,该值越大,预测速度越快;默认10
  13. enable_mkldnn: Boolean; // 是否使用mkldnn库;默认true
  14. // 前向相关
  15. det: Boolean; // 是否执行文字检测;默认true
  16. rec: Boolean; // 是否执行文字识别;默认true
  17. cls: Boolean; // 是否执行文字方向分类;默认false
  18. // 检测模型相关
  19. max_side_len: Integer; // 输入图像长宽大于960时,等比例缩放图像,使得图像最长边为960,;默认960
  20. det_db_thresh: Single; // 用于过滤DB预测的二值化图像,设置为0.-0.3对结果影响不明显;默认0.3
  21. det_db_box_thresh: Single; // DB后处理过滤box的阈值,如果检测存在漏框情况,可酌情减小;默认0.5
  22. det_db_unclip_ratio: Single; // 表示文本框的紧致程度,越小则文本框更靠近文本;默认1.6
  23. use_dilation: Boolean; // 是否在输出映射上使用膨胀,默认false
  24. det_db_score_mode: Boolean; // 1:使用多边形框计算bbox score,0:使用矩形框计算。矩形框计算速度更快,多边形框对弯曲文本区域计算更准确。
  25. visualize: Boolean; // 是否对结果进行可视化,为1时,预测结果会保存在output字段指定的文件夹下和输入图像同名的图像上。默认false
  26. // 方向分类器相关
  27. use_angle_cls: Boolean; // 是否使用方向分类器,默认false
  28. cls_thresh: Single; // 方向分类器的得分阈值,默认0.9
  29. cls_batch_num: Integer; // 方向分类器batchsize,默认1
  30. // 识别模型相关
  31. rec_batch_num: Integer; // 识别模型batchsize,默认6
  32. rec_img_h: Integer; // 识别模型输入图像高度,默认48
  33. rec_img_w: Integer; // 识别模型输入图像宽度,默认320
  34. show_img_vis: Boolean; // 是否显示预测结果,默认false
  35. use_tensorrt: Boolean; // 使用GPU预测时,是否启动tensorrt,默认false
  36. ///初始化属性默认值
  37. procedure InitPropertyDefaultValue;
  38. end;
  39. /// <summary>
  40. /// 表格识别参数
  41. /// </summary>
  42. StructureParameter = record
  43. OCRParameter: OCRParameter;
  44. table_max_len: Integer; // 输入图像长宽大于488时,等比例缩放图像,默认488
  45. merge_no_span_structure: Boolean; // 是否合并空单元格,默认true
  46. table_batch_num: Integer; // 批量识别数量,默认1
  47. end;
  48. /// <summary>
  49. /// 获取最后一次错误信息
  50. /// </summary>
  51. /// <returns></returns>
  52. function GetError: PAnsiChar; stdcall; external 'PaddleOCR.dll';
  53. /// <summary>
  54. /// 是否使用单字节编码(适用于go,rust),C#,Python不用打开此开关
  55. /// </summary>
  56. /// <param name="useANSI"></param>
  57. procedure EnableANSIResult(useANSI: Boolean); stdcall; external 'PaddleOCR.dll';
  58. /// <summary>
  59. /// 文字识别引擎初始化
  60. /// </summary>
  61. /// <param name="det_infer">det模型全路径</param>
  62. /// <param name="cls_infer">cls模型全路径</param>
  63. /// <param name="rec_infer">rec模型全路径</param>
  64. /// <param name="keys">字典全路径</param>
  65. /// <param name="parameter">识别参数对象</param>
  66. /// <returns></returns>
  67. function Initialize(det_infer: PAnsiChar; cls_infer: PAnsiChar; rec_infer: PAnsiChar; keys: PAnsiChar; parameter: OCRParameter): Boolean; stdcall; external 'PaddleOCR.dll';
  68. /// <summary>
  69. /// PaddleOCREngine引擎初始化
  70. /// </summary>
  71. /// <param name="det_infer">det模型全路径</param>
  72. /// <param name="cls_infer">cls模型全路径</param>
  73. /// <param name="rec_infer">rec模型全路径</param>
  74. /// <param name="keys">字典全路径</param>
  75. /// <param name="parameterjson">识别参数对象json字符串</param>
  76. /// <returns></returns>
  77. function Initializejson(modelPath_det_infer: PAnsiChar; modelPath_cls_infer: PAnsiChar; modelPath_rec_infer: PAnsiChar; keys: PAnsiChar; parameterjson: PAnsiChar): Boolean; stdcall; external 'PaddleOCR.dll';
  78. /// <summary>
  79. /// 文本检测识别-图像文件路径
  80. /// </summary>
  81. /// <param name="imagebytedata">图像文件路径</param>
  82. /// <returns></returns>
  83. function Detect(imagefile: PAnsiChar): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  84. /// <summary>
  85. /// 文本检测识别-OpenCV Mat
  86. /// </summary>
  87. /// <param name="cvmat">Mat对象</param>
  88. /// <returns></returns>
  89. //function DetectMat(var cvmat: TMat): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  90. /// <summary>
  91. /// 文本检测识别-图像字节流
  92. /// </summary>
  93. /// <param name="imagebytedata">图像字节流</param>
  94. /// <param name="size">图像字节流长度</param>
  95. /// <returns></returns>
  96. function DetectByte(imagebytedata: PAnsiChar; var size: Integer): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  97. /// <summary>
  98. /// 文本检测识别-图像字节流
  99. /// </summary>
  100. /// <param name="img">图像地址</param>
  101. /// <param name="nWidth">图像宽度</param>
  102. /// <param name="nHeight">图像高度</param>
  103. /// <param name="nChannel">图像通道数</param>
  104. /// <returns></returns>
  105. function DetectByteData(img: PAnsiChar; nWidth: Integer; nHeight: Integer; nChannel: Integer): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  106. /// <summary>
  107. /// 文本检测识别-图像base64
  108. /// </summary>
  109. /// <param name="imagebase64">图像base64</param>
  110. /// <returns></returns>
  111. function DetectBase64(imagebase64: PAnsiChar): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  112. /// <summary>
  113. /// 释放引擎对象
  114. /// </summary>
  115. procedure FreeEngine; stdcall; external 'PaddleOCR.dll';
  116. {/// <summary>
  117. /// 表格识别引擎初始化
  118. /// </summary>
  119. /// <param name="modelPath_det_infer">det模型全路径</param>
  120. /// <param name="modelPath_rec_infer">cls模型全路径</param>
  121. /// <param name="keys">字典全路径</param>
  122. /// <param name="table_model_dir">表格模型全路径</param>
  123. /// <param name="table_char_dict_path">表格字典全路径</param>
  124. /// <param name="parameter">参数对象</param>
  125. /// <returns></returns>
  126. function StructureInitialize(modelPath_det_infer: PAnsiChar; modelPath_rec_infer: PAnsiChar; keys: PAnsiChar; table_model_dir: PAnsiChar; table_char_dict_path: PAnsiChar; parameter: StructureParameter): Boolean; stdcall; external 'PaddleOCR.dll';
  127. /// <summary>
  128. /// 表格识别引擎初始化json格式
  129. /// </summary>
  130. /// <param name="modelPath_det_infer">det模型全路径</param>
  131. /// <param name="modelPath_rec_infer">cls模型全路径</param>
  132. /// <param name="keys">字典全路径</param>
  133. /// <param name="table_model_dir">表格模型全路径</param>
  134. /// <param name="table_char_dict_path">表格字典全路径</param>
  135. /// <param name="parameterjson">参数对象json格式</param>
  136. /// <returns></returns>
  137. function StructureInitializejson(modelPath_det_infer: PAnsiChar; modelPath_rec_infer: PAnsiChar; keys: PAnsiChar; table_model_dir: PAnsiChar; table_char_dict_path: PAnsiChar; parameterjson: PAnsiChar): Boolean; stdcall; external 'PaddleOCR.dll';
  138. /// <summary>
  139. /// 表格识别
  140. /// </summary>
  141. /// <param name="imagefile">文件路径</param>
  142. /// <returns></returns>
  143. function GetStructureDetectFile(imagefile: PAnsiChar): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  144. // <summary>
  145. // 表格识别
  146. // </summary>
  147. // <param name="cvmat">opencv Mat对象</param>
  148. // <returns></returns>
  149. // function GetStructureDetectMat(var cvmat: TMat): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  150. /// <summary>
  151. /// 表格识别
  152. /// </summary>
  153. /// <param name="imagebytedata">图像字节流</param>
  154. /// <param name="size">图像字节流长度</param>
  155. /// <returns></returns>
  156. function GetStructureDetectByte(imagebytedata: PAnsiChar; var size: Integer): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  157. /// <summary>
  158. /// 表格识别
  159. /// </summary>
  160. /// <param name="imagebase64">图像base64</param>
  161. /// <returns></returns>
  162. function GetStructureDetectBase64(imagebase64: PAnsiChar): PAnsiChar; stdcall; external 'PaddleOCR.dll';
  163. /// <summary>
  164. /// 释放引擎对象
  165. /// </summary>
  166. procedure FreeStructureEngine; stdcall; external 'PaddleOCR.dll';}
  167. implementation
  168. { OCRParameter }
  169. procedure OCRParameter.InitPropertyDefaultValue;
  170. begin
  171. use_gpu := False;
  172. gpu_id := 0;
  173. gpu_mem := 4000;
  174. cpu_math_library_num_threads := 10;
  175. enable_mkldnn := True;
  176. det := True;
  177. rec := True;
  178. cls := False;
  179. max_side_len := 960;
  180. det_db_thresh := 0.3;
  181. det_db_box_thresh := 0.5;
  182. det_db_unclip_ratio := 1.6;
  183. use_dilation := False;
  184. det_db_score_mode := True;
  185. visualize := False;
  186. use_angle_cls := False;
  187. cls_thresh := 0.9;
  188. cls_batch_num := 1;
  189. rec_batch_num := 6;
  190. rec_img_h := 48;
  191. rec_img_w := 320;
  192. show_img_vis := False;
  193. use_tensorrt := False;
  194. end;
  195. end.

调用代码

  1. function GetFiles(const Directory: string; Filenames: TStrings): Boolean;
  2. var
  3. h: THandle;
  4. FindData: TWin32FindData;
  5. begin
  6. Result := False;
  7. h := FindFirstFile(PChar(Directory + '\*.*'), FindData);
  8. if h <> INVALID_HANDLE_VALUE then
  9. begin
  10. repeat
  11. if (StrComp(FindData.cFileName, '.') <> 0) and (StrComp(FindData.cFileName, '..') <> 0) then
  12. begin
  13. Filenames.Add(Directory + '\' + FindData.cFileName);
  14. if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then
  15. GetFiles(Filenames[Filenames.Count - 1], Filenames);
  16. end;
  17. until not FindNextFile(h, FindData);
  18. Windows.FindClose(h);
  19. end;
  20. Result := True;
  21. end;
  22. procedure TMainForm.Button1Click(Sender: TObject);
  23. var
  24. parameter: OCRParameter;
  25. sPath, cls_infer, rec_infer, det_infer, ocrkeys, imagepath: string;
  26. images: TStringList;
  27. i: Integer;
  28. start, finish: TDateTime;
  29. duration: Int64;
  30. resultText: string;
  31. sparameterjson: string;
  32. begin
  33. // Set up paths and parameters
  34. parameter.InitPropertyDefaultValue;
  35. sPath := ExtractFilePath(ParamStr(0));
  36. cls_infer := sPath + 'inference\ch_ppocr_mobile_v2.0_cls_infer';
  37. rec_infer := sPath + 'inference\ch_PP-OCRv4_rec_infer';
  38. det_infer := sPath + 'inference\ch_PP-OCRv4_det_infer';
  39. ocrkeys := sPath + 'inference\ppocr_keys.txt';
  40. imagepath := sPath + 'images';
  41. // Get image paths
  42. images := TStringList.Create;
  43. try
  44. if getFiles(imagepath, images) and (images.Count > 0) then
  45. begin
  46. // Initialize OCR engine
  47. EnableANSIResult(True);
  48. Initialize(PAnsiChar(AnsiString(det_infer)), PAnsiChar(AnsiString(cls_infer)),
  49. PAnsiChar(AnsiString(rec_infer)), PAnsiChar(AnsiString(ocrkeys)), parameter);
  50. {Initializejson(PAnsiChar(AnsiString(det_infer)), PAnsiChar(AnsiString(cls_infer)),
  51. PAnsiChar(AnsiString(rec_infer)), PAnsiChar(AnsiString(ocrkeys)), PAnsiChar(AnsiString(sparameterjson)));}
  52. // Perform OCR on each image
  53. for i := 0 to images.Count - 1 do
  54. begin
  55. start := Now;
  56. resultText := string(Detect(PAnsiChar(AnsiString(images[i]))));
  57. mmo_Log.Lines.Add(resultText);
  58. finish := Now;
  59. //duration := MillisecondsBetween(finish, start);
  60. //Writeln(IntToStr(duration) + 'ms');
  61. end;
  62. end;
  63. finally
  64. images.Free;
  65. end;
  66. // Free OCR engine
  67. FreeEngine;
  68. end;

 项目核心组件PaddleOCR.dll,由C++编写,只支持64位程序,只能在Delphi XE2及以上版本64位平台调用。

年前接到一个爬虫任务,由于平台登录有验证码校验,必须登录该平台后才能爬取数据,该平台验证码如下,是计算式验证码带干扰线的。

   

验证码是gif格式,转成Bmp后,对图片进行二值化后的结果

之后调用PaddleOCR.dll进行识别,识别结果准确率还是很高的,针对每张验证码图片识别结果返回的是一个json串。

通过PaddleOCR框架识别验证码,省去了针对验证码做字模库的繁杂步骤,当然识别前提是针对验证码图片进行了相应的过滤步骤,使图片相对清晰,该框架用途不限于此,感兴趣的朋友可参照上边调用源码去解锁更多用途。

有爬虫及验证码识别业务的朋友,可以站内联系合作。                                                                   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/946236
推荐阅读
相关标签
  

闽ICP备14008679号