openocr-python 0.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. openocr/__init__.py +11 -0
  2. openocr/configs/det/dbnet/repvit_db.yml +173 -0
  3. openocr/configs/rec/abinet/resnet45_trans_abinet_lang.yml +94 -0
  4. openocr/configs/rec/abinet/resnet45_trans_abinet_wo_lang.yml +93 -0
  5. openocr/configs/rec/abinet/svtrv2_abinet_lang.yml +130 -0
  6. openocr/configs/rec/abinet/svtrv2_abinet_wo_lang.yml +128 -0
  7. openocr/configs/rec/aster/resnet31_lstm_aster_tps_on.yml +93 -0
  8. openocr/configs/rec/aster/svtrv2_aster.yml +127 -0
  9. openocr/configs/rec/aster/svtrv2_aster_tps_on.yml +102 -0
  10. openocr/configs/rec/autostr/autostr_lstm_aster_tps_on.yml +95 -0
  11. openocr/configs/rec/busnet/svtrv2_busnet.yml +135 -0
  12. openocr/configs/rec/busnet/svtrv2_busnet_pretraining.yml +134 -0
  13. openocr/configs/rec/busnet/vit_busnet.yml +104 -0
  14. openocr/configs/rec/busnet/vit_busnet_pretraining.yml +104 -0
  15. openocr/configs/rec/cam/convnextv2_cam_tps_on.yml +118 -0
  16. openocr/configs/rec/cam/convnextv2_tiny_cam_tps_on.yml +118 -0
  17. openocr/configs/rec/cam/svtrv2_cam_tps_on.yml +123 -0
  18. openocr/configs/rec/cdistnet/resnet45_trans_cdistnet.yml +93 -0
  19. openocr/configs/rec/cdistnet/svtrv2_cdistnet.yml +139 -0
  20. openocr/configs/rec/cppd/svtr_base_cppd.yml +123 -0
  21. openocr/configs/rec/cppd/svtr_base_cppd_ch.yml +126 -0
  22. openocr/configs/rec/cppd/svtr_base_cppd_h8.yml +123 -0
  23. openocr/configs/rec/cppd/svtr_base_cppd_syn.yml +124 -0
  24. openocr/configs/rec/cppd/svtrv2_cppd.yml +150 -0
  25. openocr/configs/rec/dan/resnet45_fpn_dan.yml +98 -0
  26. openocr/configs/rec/dan/svtrv2_dan.yml +130 -0
  27. openocr/configs/rec/focalsvtr/focalsvtr_ctc.yml +137 -0
  28. openocr/configs/rec/gtc/svtrv2_lnconv_nrtr_gtc.yml +168 -0
  29. openocr/configs/rec/gtc/svtrv2_lnconv_smtr_gtc_long_infer.yml +151 -0
  30. openocr/configs/rec/gtc/svtrv2_lnconv_smtr_gtc_smtr_long.yml +150 -0
  31. openocr/configs/rec/gtc/svtrv2_lnconv_smtr_gtc_stream.yml +152 -0
  32. openocr/configs/rec/igtr/svtr_base_ds_igtr.yml +157 -0
  33. openocr/configs/rec/lister/focalsvtr_lister_wo_fem_maxratio12.yml +133 -0
  34. openocr/configs/rec/lister/svtrv2_lister_wo_fem_maxratio12.yml +138 -0
  35. openocr/configs/rec/lpv/svtr_base_lpv.yml +124 -0
  36. openocr/configs/rec/lpv/svtr_base_lpv_wo_glrm.yml +123 -0
  37. openocr/configs/rec/lpv/svtrv2_lpv.yml +147 -0
  38. openocr/configs/rec/lpv/svtrv2_lpv_wo_glrm.yml +146 -0
  39. openocr/configs/rec/maerec/vit_nrtr.yml +116 -0
  40. openocr/configs/rec/matrn/resnet45_trans_matrn.yml +95 -0
  41. openocr/configs/rec/matrn/svtrv2_matrn.yml +130 -0
  42. openocr/configs/rec/mgpstr/svtrv2_mgpstr_only_char.yml +140 -0
  43. openocr/configs/rec/mgpstr/vit_base_mgpstr_only_char.yml +111 -0
  44. openocr/configs/rec/mgpstr/vit_large_mgpstr_only_char.yml +110 -0
  45. openocr/configs/rec/mgpstr/vit_mgpstr.yml +110 -0
  46. openocr/configs/rec/mgpstr/vit_mgpstr_only_char.yml +110 -0
  47. openocr/configs/rec/moran/resnet31_lstm_moran.yml +92 -0
  48. openocr/configs/rec/nrtr/focalsvtr_nrtr_maxraio12.yml +145 -0
  49. openocr/configs/rec/nrtr/nrtr.yml +107 -0
  50. openocr/configs/rec/nrtr/svtr_base_nrtr.yml +118 -0
  51. openocr/configs/rec/nrtr/svtr_base_nrtr_syn.yml +119 -0
  52. openocr/configs/rec/nrtr/svtrv2_nrtr.yml +146 -0
  53. openocr/configs/rec/ote/svtr_base_h8_ote.yml +117 -0
  54. openocr/configs/rec/ote/svtr_base_ote.yml +116 -0
  55. openocr/configs/rec/parseq/focalsvtr_parseq_maxratio12.yml +140 -0
  56. openocr/configs/rec/parseq/svrtv2_parseq.yml +136 -0
  57. openocr/configs/rec/parseq/vit_parseq.yml +100 -0
  58. openocr/configs/rec/robustscanner/resnet31_robustscanner.yml +102 -0
  59. openocr/configs/rec/robustscanner/svtrv2_robustscanner.yml +134 -0
  60. openocr/configs/rec/sar/resnet31_lstm_sar.yml +94 -0
  61. openocr/configs/rec/sar/svtrv2_sar.yml +128 -0
  62. openocr/configs/rec/seed/resnet31_lstm_seed_tps_on.yml +96 -0
  63. openocr/configs/rec/smtr/focalsvtr_smtr.yml +150 -0
  64. openocr/configs/rec/smtr/focalsvtr_smtr_long.yml +133 -0
  65. openocr/configs/rec/smtr/svtrv2_smtr.yml +150 -0
  66. openocr/configs/rec/smtr/svtrv2_smtr_bi.yml +136 -0
  67. openocr/configs/rec/srn/resnet50_fpn_srn.yml +97 -0
  68. openocr/configs/rec/srn/svtrv2_srn.yml +131 -0
  69. openocr/configs/rec/svtrs/convnextv2_ctc.yml +105 -0
  70. openocr/configs/rec/svtrs/convnextv2_h8_ctc.yml +105 -0
  71. openocr/configs/rec/svtrs/convnextv2_h8_rctc.yml +106 -0
  72. openocr/configs/rec/svtrs/convnextv2_rctc.yml +106 -0
  73. openocr/configs/rec/svtrs/convnextv2_tiny_h8_ctc.yml +105 -0
  74. openocr/configs/rec/svtrs/convnextv2_tiny_h8_rctc.yml +106 -0
  75. openocr/configs/rec/svtrs/crnn_ctc.yml +99 -0
  76. openocr/configs/rec/svtrs/crnn_ctc_long.yml +116 -0
  77. openocr/configs/rec/svtrs/focalnet_base_ctc.yml +108 -0
  78. openocr/configs/rec/svtrs/focalnet_base_rctc.yml +109 -0
  79. openocr/configs/rec/svtrs/focalsvtr_ctc.yml +106 -0
  80. openocr/configs/rec/svtrs/focalsvtr_rctc.yml +107 -0
  81. openocr/configs/rec/svtrs/resnet45_trans_ctc.yml +103 -0
  82. openocr/configs/rec/svtrs/resnet45_trans_rctc.yml +104 -0
  83. openocr/configs/rec/svtrs/svtr_base_ctc.yml +110 -0
  84. openocr/configs/rec/svtrs/svtr_base_rctc.yml +111 -0
  85. openocr/configs/rec/svtrs/svtrnet_ctc_syn.yml +111 -0
  86. openocr/configs/rec/svtrs/vit_ctc.yml +103 -0
  87. openocr/configs/rec/svtrs/vit_rctc.yml +103 -0
  88. openocr/configs/rec/svtrv2/repsvtr_ch.yml +121 -0
  89. openocr/configs/rec/svtrv2/svtrv2_ch.yml +133 -0
  90. openocr/configs/rec/svtrv2/svtrv2_ctc.yml +136 -0
  91. openocr/configs/rec/svtrv2/svtrv2_rctc.yml +135 -0
  92. openocr/configs/rec/svtrv2/svtrv2_small_rctc.yml +135 -0
  93. openocr/configs/rec/svtrv2/svtrv2_smtr_gtc_rctc.yml +162 -0
  94. openocr/configs/rec/svtrv2/svtrv2_smtr_gtc_rctc_ch.yml +153 -0
  95. openocr/configs/rec/svtrv2/svtrv2_tiny_rctc.yml +135 -0
  96. openocr/configs/rec/visionlan/resnet45_trans_visionlan_LA.yml +103 -0
  97. openocr/configs/rec/visionlan/resnet45_trans_visionlan_LF_1.yml +102 -0
  98. openocr/configs/rec/visionlan/resnet45_trans_visionlan_LF_2.yml +103 -0
  99. openocr/configs/rec/visionlan/svtrv2_visionlan_LA.yml +112 -0
  100. openocr/configs/rec/visionlan/svtrv2_visionlan_LF_1.yml +111 -0
  101. openocr/configs/rec/visionlan/svtrv2_visionlan_LF_2.yml +112 -0
  102. openocr/demo_gradio.py +128 -0
  103. openocr/opendet/modeling/__init__.py +11 -0
  104. openocr/opendet/modeling/backbones/__init__.py +14 -0
  105. openocr/opendet/modeling/backbones/repvit.py +340 -0
  106. openocr/opendet/modeling/base_detector.py +69 -0
  107. openocr/opendet/modeling/heads/__init__.py +14 -0
  108. openocr/opendet/modeling/heads/db_head.py +73 -0
  109. openocr/opendet/modeling/necks/__init__.py +14 -0
  110. openocr/opendet/modeling/necks/db_fpn.py +609 -0
  111. openocr/opendet/postprocess/__init__.py +18 -0
  112. openocr/opendet/postprocess/db_postprocess.py +273 -0
  113. openocr/opendet/preprocess/__init__.py +154 -0
  114. openocr/opendet/preprocess/crop_resize.py +121 -0
  115. openocr/opendet/preprocess/db_resize_for_test.py +135 -0
  116. openocr/openrec/losses/__init__.py +62 -0
  117. openocr/openrec/losses/abinet_loss.py +42 -0
  118. openocr/openrec/losses/ar_loss.py +23 -0
  119. openocr/openrec/losses/cam_loss.py +48 -0
  120. openocr/openrec/losses/cdistnet_loss.py +34 -0
  121. openocr/openrec/losses/ce_loss.py +68 -0
  122. openocr/openrec/losses/cppd_loss.py +77 -0
  123. openocr/openrec/losses/ctc_loss.py +33 -0
  124. openocr/openrec/losses/igtr_loss.py +12 -0
  125. openocr/openrec/losses/lister_loss.py +14 -0
  126. openocr/openrec/losses/lpv_loss.py +30 -0
  127. openocr/openrec/losses/mgp_loss.py +34 -0
  128. openocr/openrec/losses/parseq_loss.py +12 -0
  129. openocr/openrec/losses/robustscanner_loss.py +20 -0
  130. openocr/openrec/losses/seed_loss.py +46 -0
  131. openocr/openrec/losses/smtr_loss.py +12 -0
  132. openocr/openrec/losses/srn_loss.py +40 -0
  133. openocr/openrec/losses/visionlan_loss.py +58 -0
  134. openocr/openrec/metrics/__init__.py +19 -0
  135. openocr/openrec/metrics/rec_metric.py +270 -0
  136. openocr/openrec/metrics/rec_metric_gtc.py +58 -0
  137. openocr/openrec/metrics/rec_metric_long.py +142 -0
  138. openocr/openrec/metrics/rec_metric_mgp.py +93 -0
  139. openocr/openrec/modeling/__init__.py +11 -0
  140. openocr/openrec/modeling/base_recognizer.py +69 -0
  141. openocr/openrec/modeling/common.py +238 -0
  142. openocr/openrec/modeling/decoders/__init__.py +109 -0
  143. openocr/openrec/modeling/decoders/abinet_decoder.py +283 -0
  144. openocr/openrec/modeling/decoders/aster_decoder.py +170 -0
  145. openocr/openrec/modeling/decoders/bus_decoder.py +133 -0
  146. openocr/openrec/modeling/decoders/cam_decoder.py +43 -0
  147. openocr/openrec/modeling/decoders/cdistnet_decoder.py +334 -0
  148. openocr/openrec/modeling/decoders/cppd_decoder.py +393 -0
  149. openocr/openrec/modeling/decoders/ctc_decoder.py +203 -0
  150. openocr/openrec/modeling/decoders/dan_decoder.py +203 -0
  151. openocr/openrec/modeling/decoders/igtr_decoder.py +815 -0
  152. openocr/openrec/modeling/decoders/lister_decoder.py +535 -0
  153. openocr/openrec/modeling/decoders/lpv_decoder.py +119 -0
  154. openocr/openrec/modeling/decoders/matrn_decoder.py +236 -0
  155. openocr/openrec/modeling/decoders/mgp_decoder.py +99 -0
  156. openocr/openrec/modeling/decoders/nrtr_decoder.py +439 -0
  157. openocr/openrec/modeling/decoders/ote_decoder.py +205 -0
  158. openocr/openrec/modeling/decoders/parseq_decoder.py +504 -0
  159. openocr/openrec/modeling/decoders/rctc_decoder.py +70 -0
  160. openocr/openrec/modeling/decoders/robustscanner_decoder.py +749 -0
  161. openocr/openrec/modeling/decoders/sar_decoder.py +236 -0
  162. openocr/openrec/modeling/decoders/smtr_decoder.py +621 -0
  163. openocr/openrec/modeling/decoders/smtr_decoder_nattn.py +521 -0
  164. openocr/openrec/modeling/decoders/srn_decoder.py +283 -0
  165. openocr/openrec/modeling/decoders/visionlan_decoder.py +321 -0
  166. openocr/openrec/modeling/encoders/__init__.py +39 -0
  167. openocr/openrec/modeling/encoders/autostr_encoder.py +327 -0
  168. openocr/openrec/modeling/encoders/cam_encoder.py +760 -0
  169. openocr/openrec/modeling/encoders/convnextv2.py +213 -0
  170. openocr/openrec/modeling/encoders/focalsvtr.py +631 -0
  171. openocr/openrec/modeling/encoders/nrtr_encoder.py +28 -0
  172. openocr/openrec/modeling/encoders/rec_hgnet.py +346 -0
  173. openocr/openrec/modeling/encoders/rec_lcnetv3.py +488 -0
  174. openocr/openrec/modeling/encoders/rec_mobilenet_v3.py +132 -0
  175. openocr/openrec/modeling/encoders/rec_mv1_enhance.py +254 -0
  176. openocr/openrec/modeling/encoders/rec_nrtr_mtb.py +37 -0
  177. openocr/openrec/modeling/encoders/rec_resnet_31.py +213 -0
  178. openocr/openrec/modeling/encoders/rec_resnet_45.py +183 -0
  179. openocr/openrec/modeling/encoders/rec_resnet_fpn.py +216 -0
  180. openocr/openrec/modeling/encoders/rec_resnet_vd.py +252 -0
  181. openocr/openrec/modeling/encoders/repvit.py +338 -0
  182. openocr/openrec/modeling/encoders/resnet31_rnn.py +123 -0
  183. openocr/openrec/modeling/encoders/svtrnet.py +574 -0
  184. openocr/openrec/modeling/encoders/svtrnet2dpos.py +616 -0
  185. openocr/openrec/modeling/encoders/svtrv2.py +470 -0
  186. openocr/openrec/modeling/encoders/svtrv2_lnconv.py +503 -0
  187. openocr/openrec/modeling/encoders/svtrv2_lnconv_two33.py +517 -0
  188. openocr/openrec/modeling/encoders/vit.py +120 -0
  189. openocr/openrec/modeling/transforms/__init__.py +15 -0
  190. openocr/openrec/modeling/transforms/aster_tps.py +262 -0
  191. openocr/openrec/modeling/transforms/moran.py +136 -0
  192. openocr/openrec/modeling/transforms/tps.py +246 -0
  193. openocr/openrec/optimizer/__init__.py +73 -0
  194. openocr/openrec/optimizer/lr.py +227 -0
  195. openocr/openrec/postprocess/__init__.py +72 -0
  196. openocr/openrec/postprocess/abinet_postprocess.py +37 -0
  197. openocr/openrec/postprocess/ar_postprocess.py +63 -0
  198. openocr/openrec/postprocess/ce_postprocess.py +43 -0
  199. openocr/openrec/postprocess/char_postprocess.py +108 -0
  200. openocr/openrec/postprocess/cppd_postprocess.py +42 -0
  201. openocr/openrec/postprocess/ctc_postprocess.py +119 -0
  202. openocr/openrec/postprocess/igtr_postprocess.py +100 -0
  203. openocr/openrec/postprocess/lister_postprocess.py +59 -0
  204. openocr/openrec/postprocess/mgp_postprocess.py +143 -0
  205. openocr/openrec/postprocess/nrtr_postprocess.py +75 -0
  206. openocr/openrec/postprocess/smtr_postprocess.py +73 -0
  207. openocr/openrec/postprocess/srn_postprocess.py +80 -0
  208. openocr/openrec/postprocess/visionlan_postprocess.py +81 -0
  209. openocr/openrec/preprocess/__init__.py +173 -0
  210. openocr/openrec/preprocess/abinet_aug.py +473 -0
  211. openocr/openrec/preprocess/abinet_label_encode.py +36 -0
  212. openocr/openrec/preprocess/ar_label_encode.py +36 -0
  213. openocr/openrec/preprocess/auto_augment.py +1012 -0
  214. openocr/openrec/preprocess/cam_label_encode.py +141 -0
  215. openocr/openrec/preprocess/ce_label_encode.py +116 -0
  216. openocr/openrec/preprocess/char_label_encode.py +36 -0
  217. openocr/openrec/preprocess/cppd_label_encode.py +173 -0
  218. openocr/openrec/preprocess/ctc_label_encode.py +124 -0
  219. openocr/openrec/preprocess/ep_label_encode.py +38 -0
  220. openocr/openrec/preprocess/igtr_label_encode.py +360 -0
  221. openocr/openrec/preprocess/mgp_label_encode.py +95 -0
  222. openocr/openrec/preprocess/parseq_aug.py +150 -0
  223. openocr/openrec/preprocess/rec_aug.py +211 -0
  224. openocr/openrec/preprocess/resize.py +534 -0
  225. openocr/openrec/preprocess/smtr_label_encode.py +125 -0
  226. openocr/openrec/preprocess/srn_label_encode.py +37 -0
  227. openocr/openrec/preprocess/visionlan_label_encode.py +67 -0
  228. openocr/tools/create_lmdb_dataset.py +118 -0
  229. openocr/tools/data/__init__.py +94 -0
  230. openocr/tools/data/collate_fn.py +100 -0
  231. openocr/tools/data/lmdb_dataset.py +142 -0
  232. openocr/tools/data/lmdb_dataset_test.py +166 -0
  233. openocr/tools/data/multi_scale_sampler.py +177 -0
  234. openocr/tools/data/ratio_dataset.py +217 -0
  235. openocr/tools/data/ratio_dataset_test.py +273 -0
  236. openocr/tools/data/ratio_dataset_tvresize.py +213 -0
  237. openocr/tools/data/ratio_dataset_tvresize_test.py +276 -0
  238. openocr/tools/data/ratio_sampler.py +190 -0
  239. openocr/tools/data/simple_dataset.py +263 -0
  240. openocr/tools/data/strlmdb_dataset.py +143 -0
  241. openocr/tools/engine/__init__.py +5 -0
  242. openocr/tools/engine/config.py +158 -0
  243. openocr/tools/engine/trainer.py +621 -0
  244. openocr/tools/eval_rec.py +41 -0
  245. openocr/tools/eval_rec_all_ch.py +184 -0
  246. openocr/tools/eval_rec_all_en.py +206 -0
  247. openocr/tools/eval_rec_all_long.py +119 -0
  248. openocr/tools/eval_rec_all_long_simple.py +122 -0
  249. openocr/tools/export_rec.py +118 -0
  250. openocr/tools/infer/onnx_engine.py +65 -0
  251. openocr/tools/infer/predict_rec.py +140 -0
  252. openocr/tools/infer/utility.py +234 -0
  253. openocr/tools/infer_det.py +449 -0
  254. openocr/tools/infer_e2e.py +462 -0
  255. openocr/tools/infer_e2e_parallel.py +184 -0
  256. openocr/tools/infer_rec.py +371 -0
  257. openocr/tools/train_rec.py +37 -0
  258. openocr/tools/utility.py +45 -0
  259. openocr/tools/utils/EN_symbol_dict.txt +94 -0
  260. openocr/tools/utils/__init__.py +0 -0
  261. openocr/tools/utils/ckpt.py +87 -0
  262. openocr/tools/utils/dict/ar_dict.txt +117 -0
  263. openocr/tools/utils/dict/arabic_dict.txt +161 -0
  264. openocr/tools/utils/dict/be_dict.txt +145 -0
  265. openocr/tools/utils/dict/bg_dict.txt +140 -0
  266. openocr/tools/utils/dict/chinese_cht_dict.txt +8421 -0
  267. openocr/tools/utils/dict/cyrillic_dict.txt +163 -0
  268. openocr/tools/utils/dict/devanagari_dict.txt +167 -0
  269. openocr/tools/utils/dict/en_dict.txt +63 -0
  270. openocr/tools/utils/dict/fa_dict.txt +136 -0
  271. openocr/tools/utils/dict/french_dict.txt +136 -0
  272. openocr/tools/utils/dict/german_dict.txt +143 -0
  273. openocr/tools/utils/dict/hi_dict.txt +162 -0
  274. openocr/tools/utils/dict/it_dict.txt +118 -0
  275. openocr/tools/utils/dict/japan_dict.txt +4399 -0
  276. openocr/tools/utils/dict/ka_dict.txt +153 -0
  277. openocr/tools/utils/dict/kie_dict/xfund_class_list.txt +4 -0
  278. openocr/tools/utils/dict/korean_dict.txt +3688 -0
  279. openocr/tools/utils/dict/latex_symbol_dict.txt +111 -0
  280. openocr/tools/utils/dict/latin_dict.txt +185 -0
  281. openocr/tools/utils/dict/layout_dict/layout_cdla_dict.txt +10 -0
  282. openocr/tools/utils/dict/layout_dict/layout_publaynet_dict.txt +5 -0
  283. openocr/tools/utils/dict/layout_dict/layout_table_dict.txt +1 -0
  284. openocr/tools/utils/dict/mr_dict.txt +153 -0
  285. openocr/tools/utils/dict/ne_dict.txt +153 -0
  286. openocr/tools/utils/dict/oc_dict.txt +96 -0
  287. openocr/tools/utils/dict/pu_dict.txt +130 -0
  288. openocr/tools/utils/dict/rs_dict.txt +91 -0
  289. openocr/tools/utils/dict/rsc_dict.txt +134 -0
  290. openocr/tools/utils/dict/ru_dict.txt +125 -0
  291. openocr/tools/utils/dict/spin_dict.txt +68 -0
  292. openocr/tools/utils/dict/ta_dict.txt +128 -0
  293. openocr/tools/utils/dict/table_dict.txt +277 -0
  294. openocr/tools/utils/dict/table_master_structure_dict.txt +39 -0
  295. openocr/tools/utils/dict/table_structure_dict.txt +28 -0
  296. openocr/tools/utils/dict/table_structure_dict_ch.txt +48 -0
  297. openocr/tools/utils/dict/te_dict.txt +151 -0
  298. openocr/tools/utils/dict/ug_dict.txt +114 -0
  299. openocr/tools/utils/dict/uk_dict.txt +142 -0
  300. openocr/tools/utils/dict/ur_dict.txt +137 -0
  301. openocr/tools/utils/dict/xi_dict.txt +110 -0
  302. openocr/tools/utils/dict90.txt +90 -0
  303. openocr/tools/utils/e2e_metric/Deteval.py +802 -0
  304. openocr/tools/utils/e2e_metric/polygon_fast.py +70 -0
  305. openocr/tools/utils/e2e_utils/extract_batchsize.py +86 -0
  306. openocr/tools/utils/e2e_utils/extract_textpoint_fast.py +479 -0
  307. openocr/tools/utils/e2e_utils/extract_textpoint_slow.py +582 -0
  308. openocr/tools/utils/e2e_utils/pgnet_pp_utils.py +159 -0
  309. openocr/tools/utils/e2e_utils/visual.py +152 -0
  310. openocr/tools/utils/en_dict.txt +95 -0
  311. openocr/tools/utils/gen_label.py +68 -0
  312. openocr/tools/utils/ic15_dict.txt +36 -0
  313. openocr/tools/utils/logging.py +56 -0
  314. openocr/tools/utils/poly_nms.py +132 -0
  315. openocr/tools/utils/ppocr_keys_v1.txt +6623 -0
  316. openocr/tools/utils/stats.py +58 -0
  317. openocr/tools/utils/utility.py +165 -0
  318. openocr/tools/utils/visual.py +117 -0
  319. openocr_python-0.0.2.dist-info/LICENCE +201 -0
  320. openocr_python-0.0.2.dist-info/METADATA +98 -0
  321. openocr_python-0.0.2.dist-info/RECORD +323 -0
  322. openocr_python-0.0.2.dist-info/WHEEL +5 -0
  323. openocr_python-0.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,371 @@
1
+ import os
2
+ from pathlib import Path
3
+ import sys
4
+ import time
5
+
6
+ __dir__ = os.path.dirname(os.path.abspath(__file__))
7
+
8
+ sys.path.append(__dir__)
9
+ sys.path.insert(0, os.path.abspath(os.path.join(__dir__, '..')))
10
+
11
+ import numpy as np
12
+ import torch
13
+ from torchvision import transforms as T
14
+ from torchvision.transforms import functional as F
15
+ from tools.engine import Config
16
+ from tools.utility import ArgsParser
17
+ from tools.utils.ckpt import load_ckpt
18
+ from tools.utils.logging import get_logger
19
+ from tools.utils.utility import get_image_file_list
20
+ from tools.infer_det import replace_batchnorm
21
+
22
+ logger = get_logger()
23
+
24
+ root_dir = Path(__file__).resolve().parent
25
+ DEFAULT_CFG_PATH_REC_SERVER = str(root_dir / '../configs/det/svtrv2/svtrv2_ch.yml')
26
+ DEFAULT_CFG_PATH_REC = str(root_dir / '../configs/rec/svtrv2/repsvtr_ch.yml')
27
+ DEFAULT_DICT_PATH_REC = str(root_dir / './utils/ppocr_keys_v1.txt')
28
+
29
+ MODEL_NAME_REC = './openocr_repsvtr_ch.pth' # 模型文件名称
30
+ DOWNLOAD_URL_REC = 'https://github.com/Topdu/OpenOCR/releases/download/develop0.0.1/openocr_repsvtr_ch.pth' # 模型文件 URL
31
+ MODEL_NAME_REC_SERVER = './openocr_svtrv2_ch.pth' # 模型文件名称
32
+ DOWNLOAD_URL_REC_SERVER = 'https://github.com/Topdu/OpenOCR/releases/download/develop0.0.1/openocr_svtrv2_ch.pth' # 模型文件 URL
33
+
34
+
35
+ def check_and_download_model(model_name: str, url: str):
36
+ """
37
+ 检查预训练模型是否存在,若不存在则从指定 URL 下载到固定缓存目录。
38
+
39
+ Args:
40
+ model_name (str): 模型文件的名称,例如 "model.pt"
41
+ url (str): 模型文件的下载地址
42
+
43
+ Returns:
44
+ str: 模型文件的完整路径
45
+ """
46
+ if os.path.exists(model_name):
47
+ return model_name
48
+
49
+ # 固定缓存路径为用户主目录下的 ".cache/openocr"
50
+ cache_dir = Path.home() / '.cache' / 'openocr'
51
+ model_path = cache_dir / model_name
52
+
53
+ # 如果模型文件已存在,直接返回路径
54
+ if model_path.exists():
55
+ logger.info(f'Model already exists at: {model_path}')
56
+ return str(model_path)
57
+
58
+ # 如果文件不存在,下载模型
59
+ logger.info(f'Model not found. Downloading from {url}...')
60
+
61
+ # 创建缓存目录(如果不存在)
62
+ cache_dir.mkdir(parents=True, exist_ok=True)
63
+
64
+ try:
65
+ # 下载文件
66
+ import urllib.request
67
+ with urllib.request.urlopen(url) as response, open(model_path,
68
+ 'wb') as out_file:
69
+ out_file.write(response.read())
70
+ logger.info(f'Model downloaded and saved at: {model_path}')
71
+ return str(model_path)
72
+
73
+ except Exception as e:
74
+ logger.info(f'Error downloading the model: {e}')
75
+ raise
76
+
77
+
78
+ class RatioRecTVReisze(object):
79
+
80
+ def __init__(self, cfg):
81
+ self.max_ratio = cfg['Eval']['loader'].get('max_ratio', 12)
82
+ self.base_shape = cfg['Eval']['dataset'].get(
83
+ 'base_shape', [[64, 64], [96, 48], [112, 40], [128, 32]])
84
+ self.base_h = cfg['Eval']['dataset'].get('base_h', 32)
85
+ self.interpolation = T.InterpolationMode.BICUBIC
86
+ transforms = []
87
+ transforms.extend([
88
+ T.ToTensor(),
89
+ T.Normalize(0.5, 0.5),
90
+ ])
91
+ self.transforms = T.Compose(transforms)
92
+ self.ceil = cfg['Eval']['dataset'].get('ceil', False),
93
+
94
+ def __call__(self, data):
95
+ img = data['image']
96
+ imgH = self.base_h
97
+ w, h = img.size
98
+ if self.ceil:
99
+ gen_ratio = int(float(w) / float(h)) + 1
100
+ else:
101
+ gen_ratio = max(1, round(float(w) / float(h)))
102
+ ratio_resize = min(gen_ratio, self.max_ratio)
103
+ imgW, imgH = self.base_shape[ratio_resize -
104
+ 1] if ratio_resize <= 4 else [
105
+ self.base_h *
106
+ ratio_resize, self.base_h
107
+ ]
108
+ resized_w = imgW
109
+ resized_image = F.resize(img, (imgH, resized_w),
110
+ interpolation=self.interpolation)
111
+ img = self.transforms(resized_image)
112
+ data['image'] = img
113
+ return data
114
+
115
+
116
+ def build_rec_process(cfg):
117
+ transforms = []
118
+ ratio_resize_flag = True
119
+ for op in cfg['Eval']['dataset']['transforms']:
120
+ op_name = list(op)[0]
121
+ if 'Resize' in op_name:
122
+ ratio_resize_flag = False
123
+ if 'Label' in op_name:
124
+ continue
125
+ elif op_name in ['RecResizeImg']:
126
+ op[op_name]['infer_mode'] = True
127
+ elif op_name == 'KeepKeys':
128
+ if cfg['Architecture']['algorithm'] in ['SAR', 'RobustScanner']:
129
+ if 'valid_ratio' in op[op_name]['keep_keys']:
130
+ op[op_name]['keep_keys'] = ['image', 'valid_ratio']
131
+ else:
132
+ op[op_name]['keep_keys'] = ['image']
133
+ else:
134
+ op[op_name]['keep_keys'] = ['image']
135
+ transforms.append(op)
136
+ return transforms, ratio_resize_flag
137
+
138
+
139
+ def set_device(device, numId=0):
140
+ if device == 'gpu' and torch.cuda.is_available():
141
+ device = torch.device(f'cuda:{numId}')
142
+ else:
143
+ device = torch.device('cpu')
144
+ return device
145
+
146
+
147
+ class OpenRecognizer(object):
148
+
149
+ def __init__(self, config=None, mode='mobile', numId=0):
150
+ """
151
+ 初始化方法。
152
+
153
+ Args:
154
+ config (dict, optional): 配置信息。默认为None。
155
+ mode (str, optional): 模式,'server' 或 'mobile'。默认为'mobile'。
156
+ numId (int, optional): 设备编号。默认为0。
157
+
158
+ Returns:
159
+ None
160
+
161
+ Raises:
162
+
163
+
164
+ """
165
+ if config is None:
166
+ if mode == 'server':
167
+ config = Config(
168
+ DEFAULT_CFG_PATH_REC_SERVER).cfg # server model
169
+ model_dir = check_and_download_model(MODEL_NAME_REC_SERVER,
170
+ DOWNLOAD_URL_REC_SERVER)
171
+ else:
172
+ config = Config(DEFAULT_CFG_PATH_REC).cfg # mobile model
173
+ model_dir = check_and_download_model(MODEL_NAME_REC,
174
+ DOWNLOAD_URL_REC)
175
+ config['Global']['pretrained_model'] = model_dir
176
+ config['Global']['character_dict_path'] = DEFAULT_DICT_PATH_REC
177
+ global_config = config['Global']
178
+ self.cfg = config
179
+ if global_config['pretrained_model'] is None:
180
+ global_config[
181
+ 'pretrained_model'] = global_config['output_dir'] + '/best.pth'
182
+ # build post process
183
+ from openrec.modeling import build_model as build_rec_model
184
+ from openrec.postprocess import build_post_process
185
+ from openrec.preprocess import create_operators, transform
186
+ self.transform = transform
187
+ self.post_process_class = build_post_process(config['PostProcess'],
188
+ global_config)
189
+
190
+ char_num = self.post_process_class.get_character_num()
191
+ config['Architecture']['Decoder']['out_channels'] = char_num
192
+ # print(char_num)
193
+ self.model = build_rec_model(config['Architecture'])
194
+ load_ckpt(self.model, config)
195
+
196
+ # exit(0)
197
+ self.device = set_device(global_config['device'], numId=numId)
198
+ self.model.eval()
199
+ replace_batchnorm(self.model.encoder)
200
+ self.model.to(device=self.device)
201
+
202
+ transforms, ratio_resize_flag = build_rec_process(self.cfg)
203
+ global_config['infer_mode'] = True
204
+ self.ops = create_operators(transforms, global_config)
205
+ if ratio_resize_flag:
206
+ ratio_resize = RatioRecTVReisze(cfg=self.cfg)
207
+ self.ops.insert(-1, ratio_resize)
208
+
209
+ def __call__(self,
210
+ img_path=None,
211
+ img_numpy_list=None,
212
+ img_numpy=None,
213
+ batch_num=1):
214
+ """
215
+ 调用函数,处理输入图像,并返回识别结果。
216
+
217
+ Args:
218
+ img_path (str, optional): 图像文件的路径。默认为 None。
219
+ img_numpy_list (list, optional): 包含多个图像 numpy 数组的列表。默认为 None。
220
+ img_numpy (numpy.ndarray, optional): 单个图像的 numpy 数组。默认为 None。
221
+ batch_num (int, optional): 每次处理的图像数量。默认为 1。
222
+
223
+ Returns:
224
+ list: 包含识别结果的列表,每个元素为一个字典,包含文件路径(如果有的话)、文本、分数和延迟时间。
225
+
226
+ Raises:
227
+ Exception: 如果没有提供图像路径或 numpy 数组,则引发异常。
228
+ """
229
+
230
+ if img_numpy is not None:
231
+ img_numpy_list = [img_numpy]
232
+ num_img = 1
233
+ elif img_path is not None:
234
+ img_path = get_image_file_list(img_path)
235
+ num_img = len(img_path)
236
+ elif img_numpy_list is not None:
237
+ num_img = len(img_numpy_list)
238
+ else:
239
+ raise Exception('No input image path or numpy array.')
240
+ results = []
241
+ for start_idx in range(0, num_img, batch_num):
242
+ batch_data = []
243
+ batch_others = []
244
+ batch_file_names = []
245
+
246
+ max_width, max_height = 0, 0
247
+ # Prepare batch data
248
+ for img_idx in range(start_idx, min(start_idx + batch_num,
249
+ num_img)):
250
+ if img_numpy_list is not None:
251
+ img = img_numpy_list[img_idx]
252
+ data = {'image': img}
253
+ elif img_path is not None:
254
+ file_name = img_path[img_idx]
255
+ with open(file_name, 'rb') as f:
256
+ img = f.read()
257
+ data = {'image': img}
258
+ data = self.transform(data, self.ops[:1])
259
+ batch_file_names.append(file_name)
260
+ batch = self.transform(data, self.ops[1:])
261
+ others = None
262
+ if self.cfg['Architecture']['algorithm'] in [
263
+ 'SAR', 'RobustScanner'
264
+ ]:
265
+ valid_ratio = np.expand_dims(batch[-1], axis=0)
266
+ batch_others.append(valid_ratio)
267
+ # others = [torch.from_numpy(valid_ratio).to(device=self.device)]
268
+ resized_image = batch[0]
269
+ h, w = resized_image.shape[-2:]
270
+ max_width = max(max_width, w)
271
+ max_height = max(max_height, h)
272
+ batch_data.append(batch[0])
273
+
274
+ padded_batch_data = []
275
+ for resized_image in batch_data:
276
+ padded_image = np.zeros([1, 3, max_height, max_width],
277
+ dtype=np.float32)
278
+ h, w = resized_image.shape[-2:]
279
+
280
+ # Apply padding (bottom-right padding)
281
+ padded_image[:, :, :h, :
282
+ w] = resized_image # 0 is typically used for padding
283
+ padded_batch_data.append(padded_image)
284
+
285
+ if batch_others:
286
+ others = np.concatenate(batch_others, axis=0)
287
+ else:
288
+ others = None
289
+ images = np.concatenate(padded_batch_data, axis=0)
290
+ images = torch.from_numpy(images).to(device=self.device)
291
+
292
+ with torch.no_grad():
293
+ t_start = time.time()
294
+ preds = self.model(images, others)
295
+ torch.cuda.synchronize()
296
+ t_cost = time.time() - t_start
297
+ post_results = self.post_process_class(preds)
298
+
299
+ for i, post_result in enumerate(post_results):
300
+ if img_path is not None:
301
+ info = {
302
+ 'file': batch_file_names[i],
303
+ 'text': post_result[0],
304
+ 'score': post_result[1],
305
+ 'elapse': t_cost
306
+ }
307
+ else:
308
+ info = {
309
+ 'text': post_result[0],
310
+ 'score': post_result[1],
311
+ 'elapse': t_cost
312
+ }
313
+ results.append(info)
314
+
315
+ return results
316
+
317
+
318
+ def main(cfg):
319
+ model = OpenRecognizer(cfg)
320
+
321
+ save_res_path = cfg['Global']['output_dir']
322
+ if not os.path.exists(save_res_path):
323
+ os.makedirs(save_res_path)
324
+
325
+ t_sum = 0
326
+ sample_num = 0
327
+ max_len = cfg['Global']['max_text_length']
328
+ text_len_time = [0 for _ in range(max_len)]
329
+ text_len_num = [0 for _ in range(max_len)]
330
+
331
+ sample_num = 0
332
+ with open(save_res_path + '/rec_results.txt', 'wb') as fout:
333
+ for file in get_image_file_list(cfg['Global']['infer_img']):
334
+
335
+ preds_result = model(img_path=file, batch_num=1)[0]
336
+
337
+ rec_text = preds_result['text']
338
+ score = preds_result['score']
339
+ t_cost = preds_result['elapse']
340
+ info = rec_text + '\t' + str(score)
341
+ text_len_num[min(max_len - 1, len(rec_text))] += 1
342
+ text_len_time[min(max_len - 1, len(rec_text))] += t_cost
343
+ logger.info(
344
+ f'{sample_num} {file}\t result: {info}, time cost: {t_cost}')
345
+ otstr = file + '\t' + info + '\n'
346
+ t_sum += t_cost
347
+ fout.write(otstr.encode())
348
+ sample_num += 1
349
+
350
+ print(text_len_num)
351
+ w_avg_t_cost = []
352
+ for l_t_cost, l_num in zip(text_len_time, text_len_num):
353
+ if l_num != 0:
354
+ w_avg_t_cost.append(l_t_cost / l_num)
355
+ print(w_avg_t_cost)
356
+ w_avg_t_cost = sum(w_avg_t_cost) / len(w_avg_t_cost)
357
+
358
+ logger.info(
359
+ f'Sample num: {sample_num}, Weighted Avg time cost: {t_sum/sample_num}, Avg time cost: {w_avg_t_cost}'
360
+ )
361
+ logger.info('success!')
362
+
363
+
364
+ if __name__ == '__main__':
365
+ FLAGS = ArgsParser().parse_args()
366
+ cfg = Config(FLAGS.config)
367
+ FLAGS = vars(FLAGS)
368
+ opt = FLAGS.pop('opt')
369
+ cfg.merge_dict(FLAGS)
370
+ cfg.merge_dict(opt)
371
+ main(cfg.cfg)
@@ -0,0 +1,37 @@
1
+ import os
2
+ import sys
3
+
4
+ __dir__ = os.path.dirname(os.path.abspath(__file__))
5
+
6
+ sys.path.append(__dir__)
7
+ sys.path.insert(0, os.path.abspath(os.path.join(__dir__, '..')))
8
+
9
+ from tools.engine import Config, Trainer
10
+ from tools.utility import ArgsParser
11
+
12
+
13
+ def parse_args():
14
+ parser = ArgsParser()
15
+ parser.add_argument(
16
+ '--eval',
17
+ action='store_true',
18
+ default=True,
19
+ help='Whether to perform evaluation in train',
20
+ )
21
+ args = parser.parse_args()
22
+ return args
23
+
24
+
25
+ def main():
26
+ FLAGS = parse_args()
27
+ cfg = Config(FLAGS.config)
28
+ FLAGS = vars(FLAGS)
29
+ opt = FLAGS.pop('opt')
30
+ cfg.merge_dict(FLAGS)
31
+ cfg.merge_dict(opt)
32
+ trainer = Trainer(cfg, mode='train_eval' if FLAGS['eval'] else 'train')
33
+ trainer.train()
34
+
35
+
36
+ if __name__ == '__main__':
37
+ main()
@@ -0,0 +1,45 @@
1
+ from argparse import ArgumentParser, RawDescriptionHelpFormatter
2
+
3
+ import yaml
4
+
5
+
6
+ class ArgsParser(ArgumentParser):
7
+
8
+ def __init__(self):
9
+ super(ArgsParser,
10
+ self).__init__(formatter_class=RawDescriptionHelpFormatter)
11
+ self.add_argument('-c', '--config', help='configuration file to use')
12
+ self.add_argument('-o',
13
+ '--opt',
14
+ nargs='*',
15
+ help='set configuration options')
16
+ self.add_argument('--local_rank')
17
+ self.add_argument('--local-rank')
18
+
19
+ def parse_args(self, argv=None):
20
+ args = super(ArgsParser, self).parse_args(argv)
21
+ assert args.config is not None, 'Please specify --config=configure_file_path.'
22
+ args.opt = self._parse_opt(args.opt)
23
+ return args
24
+
25
+ def _parse_opt(self, opts):
26
+ config = {}
27
+ if not opts:
28
+ return config
29
+ for s in opts:
30
+ s = s.strip()
31
+ k, v = s.split('=', 1)
32
+ if '.' not in k:
33
+ config[k] = yaml.load(v, Loader=yaml.Loader)
34
+ else:
35
+ keys = k.split('.')
36
+ if keys[0] not in config:
37
+ config[keys[0]] = {}
38
+ cur = config[keys[0]]
39
+ for idx, key in enumerate(keys[1:]):
40
+ if idx == len(keys) - 2:
41
+ cur[key] = yaml.load(v, Loader=yaml.Loader)
42
+ else:
43
+ cur[key] = {}
44
+ cur = cur[key]
45
+ return config
@@ -0,0 +1,94 @@
1
+ 0
2
+ 1
3
+ 2
4
+ 3
5
+ 4
6
+ 5
7
+ 6
8
+ 7
9
+ 8
10
+ 9
11
+ a
12
+ b
13
+ c
14
+ d
15
+ e
16
+ f
17
+ g
18
+ h
19
+ i
20
+ j
21
+ k
22
+ l
23
+ m
24
+ n
25
+ o
26
+ p
27
+ q
28
+ r
29
+ s
30
+ t
31
+ u
32
+ v
33
+ w
34
+ x
35
+ y
36
+ z
37
+ A
38
+ B
39
+ C
40
+ D
41
+ E
42
+ F
43
+ G
44
+ H
45
+ I
46
+ J
47
+ K
48
+ L
49
+ M
50
+ N
51
+ O
52
+ P
53
+ Q
54
+ R
55
+ S
56
+ T
57
+ U
58
+ V
59
+ W
60
+ X
61
+ Y
62
+ Z
63
+ !
64
+ "
65
+ #
66
+ $
67
+ %
68
+ &
69
+ '
70
+ (
71
+ )
72
+ *
73
+ +
74
+ ,
75
+ -
76
+ .
77
+ /
78
+ :
79
+ ;
80
+ <
81
+ =
82
+ >
83
+ ?
84
+ @
85
+ [
86
+ \
87
+ ]
88
+ ^
89
+ _
90
+ `
91
+ {
92
+ |
93
+ }
94
+ ~
File without changes
@@ -0,0 +1,87 @@
1
+ import os
2
+
3
+ import torch
4
+
5
+ from tools.utils.logging import get_logger
6
+
7
+
8
+ def save_ckpt(
9
+ model,
10
+ cfg,
11
+ optimizer,
12
+ lr_scheduler,
13
+ epoch,
14
+ global_step,
15
+ metrics,
16
+ is_best=False,
17
+ logger=None,
18
+ prefix=None,
19
+ ):
20
+ """
21
+ Saving checkpoints
22
+
23
+ :param epoch: current epoch number
24
+ :param log: logging information of the epoch
25
+ :param save_best: if True, rename the saved checkpoint to 'model_best.pth.tar'
26
+ """
27
+ if logger is None:
28
+ logger = get_logger()
29
+ if prefix is None:
30
+ if is_best:
31
+ save_path = os.path.join(cfg["Global"]["output_dir"], "best.pth")
32
+ else:
33
+ save_path = os.path.join(cfg["Global"]["output_dir"], "latest.pth")
34
+ else:
35
+ save_path = os.path.join(cfg["Global"]["output_dir"], prefix + ".pth")
36
+ state_dict = model.module.state_dict() if cfg["Global"]["distributed"] else model.state_dict()
37
+ state = {
38
+ "epoch": epoch,
39
+ "global_step": global_step,
40
+ "state_dict": state_dict,
41
+ "optimizer": None if is_best else optimizer.state_dict(),
42
+ "scheduler": None if is_best else lr_scheduler.state_dict(),
43
+ "config": cfg,
44
+ "metrics": metrics,
45
+ }
46
+ torch.save(state, save_path)
47
+ logger.info(f"save ckpt to {save_path}")
48
+
49
+
50
+ def load_ckpt(model, cfg, optimizer=None, lr_scheduler=None, logger=None):
51
+ """
52
+ Resume from saved checkpoints
53
+ :param checkpoint_path: Checkpoint path to be resumed
54
+ """
55
+ if logger is None:
56
+ logger = get_logger()
57
+ checkpoints = cfg["Global"].get("checkpoints")
58
+ pretrained_model = cfg["Global"].get("pretrained_model")
59
+
60
+ status = {}
61
+ if checkpoints and os.path.exists(checkpoints):
62
+ checkpoint = torch.load(checkpoints, map_location=torch.device("cpu"))
63
+ model.load_state_dict(checkpoint["state_dict"], strict=True)
64
+ if optimizer is not None:
65
+ optimizer.load_state_dict(checkpoint["optimizer"])
66
+ if lr_scheduler is not None:
67
+ lr_scheduler.load_state_dict(checkpoint["scheduler"])
68
+ logger.info(f"resume from checkpoint {checkpoints} (epoch {checkpoint['epoch']})")
69
+
70
+ status["global_step"] = checkpoint["global_step"]
71
+ status["epoch"] = checkpoint["epoch"] + 1
72
+ status["metrics"] = checkpoint["metrics"]
73
+ elif pretrained_model and os.path.exists(pretrained_model):
74
+ load_pretrained_params(model, pretrained_model, logger)
75
+ logger.info(f"finetune from checkpoint {pretrained_model}")
76
+ else:
77
+ logger.info("train from scratch")
78
+ return status
79
+
80
+
81
+ def load_pretrained_params(model, pretrained_model, logger):
82
+ checkpoint = torch.load(pretrained_model, map_location=torch.device("cpu"))
83
+ model.load_state_dict(checkpoint["state_dict"], strict=False)
84
+ for name in model.state_dict().keys():
85
+ if name not in checkpoint["state_dict"]:
86
+ logger.info(f"{name} is not in pretrained model")
87
+