phucsd commited on
Commit
2704c2c
·
verified ·
1 Parent(s): 732c30f

Upload folder using huggingface_hub (part 4)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. ocr-studio/PaddleOCR/README.md +257 -0
  2. ocr-studio/PaddleOCR/README_ch.md +254 -0
  3. ocr-studio/PaddleOCR/README_en.md +270 -0
  4. ocr-studio/PaddleOCR/RELEASING.md +194 -0
  5. ocr-studio/PaddleOCR/RELEASING_cn.md +194 -0
  6. ocr-studio/PaddleOCR/TEST_REPORT.md +71 -0
  7. ocr-studio/PaddleOCR/ppocr/optimizer/regularizer.py +51 -0
  8. ocr-studio/PaddleOCR/ppocr/postprocess/__init__.py +73 -0
  9. ocr-studio/PaddleOCR/ppocr/postprocess/cls_postprocess.py +42 -0
  10. ocr-studio/PaddleOCR/ppocr/postprocess/ct_postprocess.py +154 -0
  11. ocr-studio/PaddleOCR/ppocr/postprocess/db_postprocess.py +276 -0
  12. ocr-studio/PaddleOCR/ppocr/postprocess/drrg_postprocess.py +325 -0
  13. ocr-studio/PaddleOCR/ppocr/postprocess/east_postprocess.py +145 -0
  14. ocr-studio/PaddleOCR/ppocr/postprocess/fce_postprocess.py +241 -0
  15. ocr-studio/PaddleOCR/ppocr/postprocess/locality_aware_nms.py +200 -0
  16. ocr-studio/PaddleOCR/ppocr/postprocess/pg_postprocess.py +63 -0
  17. ocr-studio/PaddleOCR/ppocr/postprocess/picodet_postprocess.py +250 -0
  18. ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/__init__.py +15 -0
  19. ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/README.md +6 -0
  20. ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/__init__.py +29 -0
  21. ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/pse.pyx +70 -0
  22. ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/setup.py +14 -0
  23. ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse_postprocess.py +120 -0
  24. ocr-studio/PaddleOCR/ppocr/postprocess/rec_postprocess.py +1221 -0
  25. ocr-studio/PaddleOCR/ppocr/postprocess/sast_postprocess.py +357 -0
  26. ocr-studio/PaddleOCR/ppocr/postprocess/table_postprocess.py +186 -0
  27. ocr-studio/PaddleOCR/ppocr/postprocess/vqa_token_re_layoutlm_postprocess.py +95 -0
  28. ocr-studio/PaddleOCR/ppocr/postprocess/vqa_token_ser_layoutlm_postprocess.py +117 -0
  29. ocr-studio/PaddleOCR/ppocr/utils/EN_symbol_dict.txt +94 -0
  30. ocr-studio/PaddleOCR/ppocr/utils/__init__.py +13 -0
  31. ocr-studio/PaddleOCR/ppocr/utils/corpus/fi_corpus.txt +0 -0
  32. ocr-studio/PaddleOCR/ppocr/utils/dict/README.md +5 -0
  33. ocr-studio/PaddleOCR/ppocr/utils/dict/ar_dict.txt +117 -0
  34. ocr-studio/PaddleOCR/ppocr/utils/dict/arabic_dict.txt +161 -0
  35. ocr-studio/PaddleOCR/ppocr/utils/dict/be_dict.txt +145 -0
  36. ocr-studio/PaddleOCR/ppocr/utils/dict/bengali_dict.txt +74 -0
  37. ocr-studio/PaddleOCR/ppocr/utils/dict/bg_dict.txt +140 -0
  38. ocr-studio/PaddleOCR/ppocr/utils/dict/bm_dict.txt +160 -0
  39. ocr-studio/PaddleOCR/ppocr/utils/dict/bm_dict_add.txt +3219 -0
  40. ocr-studio/PaddleOCR/ppocr/utils/dict/bn_dict.txt +477 -0
  41. ocr-studio/PaddleOCR/ppocr/utils/dict/chinese_cht_dict.txt +8421 -0
  42. ocr-studio/PaddleOCR/ppocr/utils/dict/confuse.pkl +3 -0
  43. ocr-studio/PaddleOCR/ppocr/utils/dict/cyrillic_dict.txt +163 -0
  44. ocr-studio/PaddleOCR/ppocr/utils/dict/devanagari_dict.txt +167 -0
  45. ocr-studio/PaddleOCR/ppocr/utils/dict/en_dict.txt +63 -0
  46. ocr-studio/PaddleOCR/ppocr/utils/dict/fa_dict.txt +136 -0
  47. ocr-studio/PaddleOCR/ppocr/utils/dict/fi_dict.txt +80 -0
  48. ocr-studio/PaddleOCR/ppocr/utils/dict/french_dict.txt +136 -0
  49. ocr-studio/PaddleOCR/ppocr/utils/dict/german_dict.txt +143 -0
  50. ocr-studio/PaddleOCR/ppocr/utils/dict/gujarati_dict.txt +48 -0
ocr-studio/PaddleOCR/README.md ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [English](README_en.md) | 简体中文 | [हिन्दी](./doc/doc_i18n/README_हिन्द.md) | [日本語](./doc/doc_i18n/README_日本語.md) | [한국인](./doc/doc_i18n/README_한국어.md) | [Pу́сский язы́к](./doc/doc_i18n/README_Ру́сский_язы́к.md)
2
+
3
+ <p align="center">
4
+ <img src="./doc/PaddleOCR_log.png" align="middle" width = "600"/>
5
+ <p align="center">
6
+ <p align="left">
7
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202-dfd.svg"></a>
8
+ <a href="https://github.com/PaddlePaddle/PaddleOCR/releases"><img src="https://img.shields.io/github/v/release/PaddlePaddle/PaddleOCR?color=ffa"></a>
9
+ <a href=""><img src="https://img.shields.io/badge/python-3.7+-aff.svg"></a>
10
+ <a href=""><img src="https://img.shields.io/badge/os-linux%2C%20win%2C%20mac-pink.svg"></a>
11
+ <a href=""><img src="https://img.shields.io/pypi/format/PaddleOCR?color=c77"></a>
12
+ <a href="https://pypi.org/project/PaddleOCR/"><img src="https://img.shields.io/pypi/dm/PaddleOCR?color=9cf"></a>
13
+ <a href="https://github.com/PaddlePaddle/PaddleOCR/stargazers"><img src="https://img.shields.io/github/stars/PaddlePaddle/PaddleOCR?color=ccf"></a>
14
+ </p>
15
+
16
+ ## 简介
17
+
18
+ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。
19
+
20
+ <div align="center">
21
+ <img src="./doc/imgs_results/ch_ppocr_mobile_v2.0/test_add_91.jpg" width="800">
22
+ </div>
23
+
24
+ <div align="center">
25
+ <img src="./doc/imgs_results/ch_ppocr_mobile_v2.0/00006737.jpg" width="800">
26
+ </div>
27
+
28
+ ## 📣 近期更新
29
+ - **🔥[PaddleOCR 算法模型挑战赛](https://competition.atomgit.com/competitionInfo?id=d25e62a0d7f27876a8c4219bfc0be90e)** 火热开启!报名时间1/15-3/31,30万元奖金池!快来一展身手吧😎!
30
+ - **🔨2023.11 发布 [PP-ChatOCRv2](https://aistudio.baidu.com/application/detail/10368)**: 一个SDK,覆盖20+高频应用场景,支持5种文本图像智能分析能力和部署,包括通用场景关键信息抽取(快递单、营业执照和机动车行驶证等)、复杂文档场景关键信息抽取(解决生僻字、特殊标点、多页pdf、表格等难点问题)、通用OCR、文档场景专用OCR、通用表格识别。针对垂类业务场景,也支持模型训练、微调和Prompt优化。
31
+ - **🔥2023.8.7 发布 PaddleOCR [release/2.7](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.7)**
32
+ - 发布[PP-OCRv4](./doc/doc_ch/PP-OCRv4_introduction.md),提供mobile和server两种模型
33
+ - PP-OCRv4-mobile:速度可比情况下,中文场景效果相比于PP-OCRv3再提升4.5%,英文场景提升10%,80语种多语言模型平均识别准确率提升8%以上
34
+ - PP-OCRv4-server:发布了目前精度最高的OCR模型,中英文场景上检测模型精度提升4.9%, 识别模型精度提升2%
35
+ 可参考[快速开始](./doc/doc_ch/quickstart.md) 一行命令快速使用,同时也可在飞桨AI套件(PaddleX)中的[通用OCR产业方案](https://aistudio.baidu.com/aistudio/modelsdetail?modelId=286)中低代码完成模型训练、推理、高性能部署全流程
36
+ - 发布[PP-ChatOCR](https://aistudio.baidu.com/aistudio/modelsdetail?modelId=332) ,使用融合PP-OCR模型和文心大模型的通用场景关键信息抽取全新方案
37
+ - 🔨**2022.11 新增实现[4种前沿算法](doc/doc_ch/algorithm_overview.md)**:文本检测 [DRRG](doc/doc_ch/algorithm_det_drrg.md), 文本识别 [RFL](doc/doc_ch/algorithm_rec_rfl.md), 文本超分[Text Telescope](doc/doc_ch/algorithm_sr_telescope.md),公式识别[CAN](doc/doc_ch/algorithm_rec_can.md)
38
+ - **2022.10 优化[JS版PP-OCRv3模型](./deploy/paddlejs/README_ch.md)**:模型大小仅4.3M,预测速度提升8倍,配套web demo开箱即用
39
+ - **💥 直播回放:PaddleOCR研发团队详解PP-StructureV2优化策略**。微信扫描[下方二维码](#开源社区),关注公众号并填写问卷后进入官方交流群,获取直播回放链接与20G重磅OCR学习大礼包(内含PDF转Word应用程序、10种垂类模型、《动手学OCR》电子书等)
40
+ - **🔥2022.8.24 发布 PaddleOCR [release/2.6](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.6)**
41
+ - 发布[PP-StructureV2](./ppstructure/README_ch.md),系统功能性能全面升级,适配中文场景,新增支持[版面复原](./ppstructure/recovery/README_ch.md),支持**一行命令完成PDF转Word**;
42
+ - [版面分析](./ppstructure/layout/README_ch.md)模型优化:模型存储减少95%,速度提升11倍,平均CPU耗时仅需41ms;
43
+ - [表格识别](./ppstructure/table/README_ch.md)模型优化:设计3大优化策略,预测耗时不变情况下,模型精度提升6%;
44
+ - [关键信息抽取](./ppstructure/kie/README_ch.md)模型优化:设计视觉无关模型结构,语义实体识别精度提升2.8%,关系抽取精度提升9.1%。
45
+ - 🔥**2022.8 发布 [OCR场景应用集合](./applications)**:包含数码管、液晶屏、车牌、高精度SVTR模型、手写体识别等**9���垂类模型**,覆盖通用,制造、金融、交通行业的主要OCR垂类应用。
46
+
47
+ > [更多](./doc/doc_ch/update.md)
48
+
49
+ ## 🌟 特性
50
+
51
+ 支持多种OCR相关前沿算法,在此基础上打造产业级特色模型[PP-OCR](./doc/doc_ch/ppocr_introduction.md)、[PP-Structure](./ppstructure/README_ch.md)和[PP-ChatOCRv2](https://aistudio.baidu.com/projectdetail/paddlex/7050167),并打通数据生产、模型训练、压缩、预测部署全流程。
52
+
53
+ <div align="center">
54
+ <img src="https://raw.githubusercontent.com/tink2123/test/master/ppocrv4.png">
55
+ </div>
56
+
57
+ > 上述内容的使用方法建议从文档教程中的快速开始体验
58
+
59
+
60
+ ## ⚡ 快速开始
61
+
62
+ - 在线免费体验:
63
+ - PP-OCRv4 在线体验地址:https://aistudio.baidu.com/application/detail/7658
64
+ - PP-ChatOCRv2 在线体验地址:https://aistudio.baidu.com/application/detail/10368
65
+
66
+ - 一行命令快速使用:[快速开始(中英文/多语言/文档分析)](./doc/doc_ch/quickstart.md)
67
+ - 移动端demo体验:[安装包DEMO下载地址](https://ai.baidu.com/easyedge/app/openSource?from=paddlelite)(基于EasyEdge和Paddle-Lite, 支持iOS和Android系统)
68
+
69
+ <a name="技术交流合作"></a>
70
+ ## 📖 技术交流合作
71
+ - 飞桨AI套件([PaddleX](http://10.136.157.23:8080/paddle/paddleX))提供了飞桨模型训压推一站式全流程高效率开发平台,其使命是助力AI技术快速落地,愿景是使人人成为AI Developer!
72
+ - PaddleX 目前覆盖图像分类、目标检测、图像分割、3D、OCR和时序预测等领域方向,已内置了36种基础单模型,例如RT-DETR、PP-YOLOE、PP-HGNet、PP-LCNet、PP-LiteSeg等;集成了12种实用的产业方案,例如PP-OCRv4、PP-ChatOCR、PP-ShiTu、PP-TS、车载路面垃圾检测、野生动物违禁制品识别等。
73
+ - PaddleX 提供了“工具箱”和“开发者”两种AI开发模式。工具箱模式可以无代码调优关键超参,开发者模式可以低代码进行单模型训压推和多模型串联推理,同时支持云端和本地端。
74
+ - PaddleX 还支持联创开发,利润分成!目前 PaddleX 正在快速迭代,欢迎广大的个人开发者和企业开发者参与进来,共创繁荣的 AI 技术生态!
75
+
76
+ - PaddleX官网地址:https://aistudio.baidu.com/intro/paddlex
77
+
78
+ - PaddleX官方交流频道:https://aistudio.baidu.com/community/channel/610
79
+
80
+ <a name="电子书"></a>
81
+ ## 📚《动手学OCR》电子书
82
+ - [《动手学OCR》电子书](./doc/doc_ch/ocr_book.md)
83
+
84
+ <a name="开源共建"></a>
85
+ ## 🚀 开源共建
86
+ - **👫 加入社区**:感谢大家长久以来对 PaddleOCR 的支持和关注,与广大开发者共同构建一个专业、和谐、相互帮助的开源社区是 PaddleOCR 的目标。我们非常欢迎各位开发者参与到飞桨社区的开源建设中,加入开源、共建飞桨。**为感谢社区开发者在 PaddleOCR release2.7 中做出的代码贡献,我们将为贡献者制作与邮寄[开源贡献证书](https://github.com/PaddlePaddle/community/blob/master/contributors/certificate-inspection.md),烦请[填写问卷](https://paddle.wjx.cn/vm/wFNr6w7.aspx)提供必要的邮寄信息。**
87
+ - **🤩 社区活动**:飞桨开源社区长期运营与发布各类丰富的活动与开发任务,在 PaddleOCR 社区,你可以关注以下社区活动,并选择自己感兴趣的内容参与开源共建:
88
+ - **🎁 飞桨套件快乐开源常规赛 | [传送门](https://github.com/PaddlePaddle/PaddleOCR/issues/10223)**:OCR 社区常规赛升级版,以建设更好用的 OCR 套件为目标,包括但不限于学术前沿模型训练与推理、打磨优化 OCR 工具与应用项目开发等,任何有利于社区意见流动和问题解决的行为都热切希望大家的参与。让我们共同成长为飞桨套件的重要 Contributor 🎉🎉🎉。
89
+ - **💡 新需求征集 | [传送门](https://github.com/PaddlePaddle/PaddleOCR/issues/10334)**:你在日常研究和实践深度学习过程中,有哪些你期望的 feature 亟待实现?请按照格式描述你想实现的 feature 和你提出的初步实现思路,我们会定期沟通与讨论这些需求,并将其纳入未来的版本规划中。
90
+ - **💬 PP-SIG 技术研讨会 | [传送门](https://github.com/PaddlePaddle/community/tree/master/ppsigs)**:PP-SIG 是飞桨社区开发者由于相同的兴趣汇聚在一起形成的虚拟组织,通过定期召开技术研讨会的方式,分享行业前沿动态、探讨社区需求与技术开发细节、发起社区联合贡献任务。PaddleOCR 希望可以通过 AI 的力量助力任何一位有梦想的开发者实现自己的想法,享受创造价值带来的愉悦。
91
+ - **📑 项目合作**:如果你有企业中明确的 OCR 垂类应用需求,我们推荐你使用训压推一站式全流程高效率开发平台 PaddleX,助力 AI 技术快速落地。PaddleX 还支持联创开发,利润分成!欢迎广大的个人开发者和企业开发者参与进来,共创繁荣的 AI 技术生态!
92
+
93
+
94
+ <a name="模型下��"></a>
95
+ ## 🛠️ PP-OCR系列模型列表(更新中)
96
+
97
+ | 模型简介 | 模型名称 | 推荐场景 | 检测模型 | 方向分类器 | 识别模型 |
98
+ | ------------------------------------- | ----------------------- | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
99
+ | 中英文超轻量PP-OCRv4模型(15.8M) | ch_PP-OCRv4_xx | 移动端&服务器端 | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_train.tar) |
100
+ | 中英文超轻量PP-OCRv3模型(16.2M) | ch_PP-OCRv3_xx | 移动端&服务器端 | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_train.tar) |
101
+ | 英文超轻量PP-OCRv3模型(13.4M) | en_PP-OCRv3_xx | 移动端&服务器端 | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_distill_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar) |
102
+
103
+ - 超轻量OCR系列更多模型下载(包括多语言),可以参考[PP-OCR系列模型下载](./doc/doc_ch/models_list.md),文档分析相关模型参考[PP-Structure系列模型下载](./ppstructure/docs/models_list.md)
104
+
105
+ ### PaddleOCR场景应用模型
106
+
107
+ | 行业 | 类别 | 亮点 | 文档说明 | 模型下载 |
108
+ | ---- | ------------ | ---------------------------------- | ------------------------------------------------------------ | --------------------------------------------- |
109
+ | 制造 | 数码管识别 | 数码管数据合成、漏识别调优 | [光功率计数码管字符识别](./applications/光功率计数码管字符识别/光功率计数码管字符识别.md) | [下载链接](./applications/README.md#模型下载) |
110
+ | 金融 | 通用表单识别 | 多模态通用表单结构化提取 | [多模态表单识别](./applications/多模态表单识别.md) | [下载链接](./applications/README.md#模型下载) |
111
+ | 交通 | 车牌识别 | 多角度图像处理、轻量模型、端侧部署 | [轻量级车牌识别](./applications/轻量级车牌识别.md) | [下载链接](./applications/README.md#模型下载) |
112
+
113
+ - 更多制造、金融、交通行业的主要OCR垂类应用模型(如电表、液晶屏、高精度SVTR模型等),可参考[场景应用模型下载](./applications)
114
+
115
+ <a name="文档教程"></a>
116
+
117
+ ## 📖 文档教程
118
+
119
+ - [运行环境准备](./doc/doc_ch/environment.md)
120
+ - [PP-OCR文本检测识别🔥](./doc/doc_ch/ppocr_introduction.md)
121
+ - [快速开始](./doc/doc_ch/quickstart.md)
122
+ - [模型库](./doc/doc_ch/models_list.md)
123
+ - [模型训练](./doc/doc_ch/training.md)
124
+ - [文本检测](./doc/doc_ch/detection.md)
125
+ - [文本识别](./doc/doc_ch/recognition.md)
126
+ - [文本方向分类器](./doc/doc_ch/angle_class.md)
127
+ - 模型压缩
128
+ - [模型量化](./deploy/slim/quantization/README.md)
129
+ - [模型裁剪](./deploy/slim/prune/README.md)
130
+ - [知识蒸馏](./doc/doc_ch/knowledge_distillation.md)
131
+ - [推理部署](./deploy/README_ch.md)
132
+ - [基于Python预测引擎推理](./doc/doc_ch/inference_ppocr.md)
133
+ - [基于C++预测引擎推理](./deploy/cpp_infer/readme_ch.md)
134
+ - [服务化部署](./deploy/pdserving/README_CN.md)
135
+ - [端侧部署](./deploy/lite/readme.md)
136
+ - [Paddle2ONNX模型转化与预测](./deploy/paddle2onnx/readme.md)
137
+ - [云上飞桨部署工具](./deploy/paddlecloud/README.md)
138
+ - [Benchmark](./doc/doc_ch/benchmark.md)
139
+ - [PP-Structure文档分析🔥](./ppstructure/README_ch.md)
140
+ - [快速开始](./ppstructure/docs/quickstart.md)
141
+ - [模型库](./ppstructure/docs/models_list.md)
142
+ - [模型训练](./doc/doc_ch/training.md)
143
+ - [版面分析](./ppstructure/layout/README_ch.md)
144
+ - [表格识别](./ppstructure/table/README_ch.md)
145
+ - [关键信息提取](./ppstructure/kie/README_ch.md)
146
+ - [推理部署](./deploy/README_ch.md)
147
+ - [基于Python预测引擎推理](./ppstructure/docs/inference.md)
148
+ - [基于C++预测引擎推理](./deploy/cpp_infer/readme_ch.md)
149
+ - [服务化部署](./deploy/hubserving/readme.md)
150
+ - [前沿算法与模型🚀](./doc/doc_ch/algorithm_overview.md)
151
+ - [文本检测算法](./doc/doc_ch/algorithm_overview.md)
152
+ - [文本识别算法](./doc/doc_ch/algorithm_overview.md)
153
+ - [端到端OCR算法](./doc/doc_ch/algorithm_overview.md)
154
+ - [表格识别算法](./doc/doc_ch/algorithm_overview.md)
155
+ - [关键信息抽取算法](./doc/doc_ch/algorithm_overview.md)
156
+ - [使用PaddleOCR架构添加新算法](./doc/doc_ch/add_new_algorithm.md)
157
+ - [场景应用](./applications)
158
+ - 数据标注与合成
159
+ - [半自动标注工具PPOCRLabel](./PPOCRLabel/README_ch.md)
160
+ - [数据合成工具Style-Text](./StyleText/README_ch.md)
161
+ - [其它数据标注工具](./doc/doc_ch/data_annotation.md)
162
+ - [其它数据合成工具](./doc/doc_ch/data_synthesis.md)
163
+ - 数据集
164
+ - [通用中英文OCR数据集](doc/doc_ch/dataset/datasets.md)
165
+ - [手写中文OCR数据集](doc/doc_ch/dataset/handwritten_datasets.md)
166
+ - [垂类多语言OCR数据集](doc/doc_ch/dataset/vertical_and_multilingual_datasets.md)
167
+ - [版面分析数据集](doc/doc_ch/dataset/layout_datasets.md)
168
+ - [表格识别数据集](doc/doc_ch/dataset/table_datasets.md)
169
+ - [关键信息提取数据集](doc/doc_ch/dataset/kie_datasets.md)
170
+ - [代码组织结构](./doc/doc_ch/tree.md)
171
+ - [效果展示](#效果展示)
172
+ - [《动手学OCR》电子书📚](./doc/doc_ch/ocr_book.md)
173
+ - [开源社区](#开源社区)
174
+ - FAQ
175
+ - [通用问题](./doc/doc_ch/FAQ.md)
176
+ - [PaddleOCR实战问题](./doc/doc_ch/FAQ.md)
177
+ - [参考文献](./doc/doc_ch/reference.md)
178
+ - [许可证书](#许可证书)
179
+
180
+
181
+ <a name="效果展示"></a>
182
+
183
+ ## 👀 效果展示 [more](./doc/doc_ch/visualization.md)
184
+
185
+ <details open>
186
+ <summary>PP-OCRv3 中文模型</summary>
187
+
188
+ <div align="center">
189
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic001.jpg" width="800">
190
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic002.jpg" width="800">
191
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic003.jpg" width="800">
192
+ </div>
193
+
194
+ </details>
195
+
196
+
197
+ <details open>
198
+ <summary>PP-OCRv3 英文模型</summary>
199
+
200
+ <div align="center">
201
+ <img src="doc/imgs_results/PP-OCRv3/en/en_1.png" width="800">
202
+ <img src="doc/imgs_results/PP-OCRv3/en/en_2.png" width="800">
203
+ </div>
204
+
205
+ </details>
206
+
207
+
208
+ <details open>
209
+ <summary>PP-OCRv3 多语言模型</summary>
210
+
211
+ <div align="center">
212
+ <img src="doc/imgs_results/PP-OCRv3/multi_lang/japan_2.jpg" width="800">
213
+ <img src="doc/imgs_results/PP-OCRv3/multi_lang/korean_1.jpg" width="800">
214
+ </div>
215
+
216
+ </details>
217
+
218
+ <details open>
219
+ <summary>PP-Structure 文档分析</summary>
220
+
221
+ - 版面分析+表格识别
222
+ <div align="center">
223
+ <img src="./ppstructure/docs/table/ppstructure.GIF" width="800">
224
+ </div>
225
+
226
+ - SER(语义实体识别)
227
+ <div align="center">
228
+ <img src="https://user-images.githubusercontent.com/14270174/185310636-6ce02f7c-790d-479f-b163-ea97a5a04808.jpg" width="600">
229
+ </div>
230
+
231
+ <div align="center">
232
+ <img src="https://user-images.githubusercontent.com/14270174/185539517-ccf2372a-f026-4a7c-ad28-c741c770f60a.png" width="600">
233
+ </div>
234
+
235
+ <div align="center">
236
+ <img src="https://user-images.githubusercontent.com/14270174/197464552-69de557f-edff-4c7f-acbf-069df1ba097f.png" width="600">
237
+ </div>
238
+
239
+ - RE(关系提取)
240
+ <div align="center">
241
+ <img src="https://user-images.githubusercontent.com/14270174/185393805-c67ff571-cf7e-4217-a4b0-8b396c4f22bb.jpg" width="600">
242
+ </div>
243
+
244
+ <div align="center">
245
+ <img src="https://user-images.githubusercontent.com/14270174/185540080-0431e006-9235-4b6d-b63d-0b3c6e1de48f.jpg" width="600">
246
+ </div>
247
+
248
+ <div align="center">
249
+ <img src="https://user-images.githubusercontent.com/25809855/186094813-3a8e16cc-42e5-4982-b9f4-0134dfb5688d.png" width="600">
250
+ </div>
251
+
252
+ </details>
253
+
254
+ <a name="许可证书"></a>
255
+
256
+ ## 许可证书
257
+ 本项目的发布受<a href="https://github.com/PaddlePaddle/PaddleOCR/blob/master/LICENSE">Apache 2.0 license</a>许可认证。
ocr-studio/PaddleOCR/README_ch.md ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [English](README.md) | 简体中文 | [हिन्दी](./doc/doc_i18n/README_हिन्द.md) | [日本語](./doc/doc_i18n/README_日本語.md) | [한국인](./doc/doc_i18n/README_한국어.md) | [Pу́сский язы́к](./doc/doc_i18n/README_Ру́сский_язы́к.md)
2
+
3
+ <p align="center">
4
+ <img src="./doc/PaddleOCR_log.png" align="middle" width = "600"/>
5
+ <p align="center">
6
+ <p align="left">
7
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202-dfd.svg"></a>
8
+ <a href="https://github.com/PaddlePaddle/PaddleOCR/releases"><img src="https://img.shields.io/github/v/release/PaddlePaddle/PaddleOCR?color=ffa"></a>
9
+ <a href=""><img src="https://img.shields.io/badge/python-3.7+-aff.svg"></a>
10
+ <a href=""><img src="https://img.shields.io/badge/os-linux%2C%20win%2C%20mac-pink.svg"></a>
11
+ <a href=""><img src="https://img.shields.io/pypi/format/PaddleOCR?color=c77"></a>
12
+ <a href="https://pypi.org/project/PaddleOCR/"><img src="https://img.shields.io/pypi/dm/PaddleOCR?color=9cf"></a>
13
+ <a href="https://github.com/PaddlePaddle/PaddleOCR/stargazers"><img src="https://img.shields.io/github/stars/PaddlePaddle/PaddleOCR?color=ccf"></a>
14
+ </p>
15
+
16
+ ## 简介
17
+
18
+ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。
19
+
20
+ <div align="center">
21
+ <img src="./doc/imgs_results/ch_ppocr_mobile_v2.0/test_add_91.jpg" width="800">
22
+ </div>
23
+
24
+ <div align="center">
25
+ <img src="./doc/imgs_results/ch_ppocr_mobile_v2.0/00006737.jpg" width="800">
26
+ </div>
27
+
28
+ ## 📣 近期更新
29
+
30
+ - **🔥2023.3.10 PaddleOCR集成了高性能、全场景模型部署方案FastDeploy,欢迎参考[指南](https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/deploy/fastdeploy)试用(注意使用dygraph分支)。**
31
+ - 📚**2022.12 发布[《OCR产业范例20讲》电子书](./applications/README.md)**,新增蒙古文、身份证、液晶屏缺陷等**7个场景应用范例**
32
+ - 🔨**2022.11 新增实现[4种前沿算法](doc/doc_ch/algorithm_overview.md)**:文本检测 [DRRG](doc/doc_ch/algorithm_det_drrg.md), 文本识别 [RFL](doc/doc_ch/algorithm_rec_rfl.md), 文本超分[Text Telescope](doc/doc_ch/algorithm_sr_telescope.md),公式识别[CAN](doc/doc_ch/algorithm_rec_can.md)
33
+ - **2022.10 优化[JS版PP-OCRv3模型](./deploy/paddlejs/README_ch.md)**:模型大小仅4.3M,预测速度提升8倍,配套web demo开箱即用
34
+ - **💥 直播回放:PaddleOCR研发团队详解PP-StructureV2优化策略**。微信扫描[下方二维码](#开源社区),关注公众号并填写问卷后进入官方交流群,获取直播回放链接与20G重磅OCR学习大礼包(内含PDF转Word应用程序、10种垂类模型、《动手学OCR》电子书等)
35
+
36
+ - **🔥2022.8.24 发布 PaddleOCR [release/2.6](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.6)**
37
+ - 发布[PP-StructureV2](./ppstructure/README_ch.md),系统功能性能全面升级,适配中文场景,新增支持[版面复原](./ppstructure/recovery/README_ch.md),支持**一行命令完成PDF转Word**;
38
+ - [版面分析](./ppstructure/layout/README_ch.md)模型优化:模型存储减少95%,速度提升11倍,平均CPU耗时仅需41ms;
39
+ - [表格识别](./ppstructure/table/README_ch.md)模型优化:设计3大优化策略,预测耗时不变情况下,模型精度提升6%;
40
+ - [关键信息抽取](./ppstructure/kie/README_ch.md)模型优化:设计视觉无关模型结构,语义实体识别精度提升2.8%,关系抽取精度提升9.1%。
41
+ - **2022.8 发布 [OCR场景应用集合](./applications)**:包含数码管、液晶屏、车牌、高精度SVTR模型、手写体识别等**9个垂类模型**,覆盖通用,制造、金融、交通行业的主要OCR垂类应用。
42
+ - **2022.8 新增实现[8种前沿算法](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_overview.md)**
43
+ - 文本检测:[FCENet](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_det_fcenet.md), [DB++](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_det_db.md)
44
+ - 文本识别:[ViTSTR](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_rec_vitstr.md), [ABINet](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_rec_abinet.md), [VisionLAN](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_rec_visionlan.md), [SPIN](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_rec_spin.md), [RobustScanner](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_rec_robustscanner.md)
45
+ - 表格识别:[TableMaster](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6rc/doc/doc_ch/algorithm_table_master.md)
46
+
47
+ - **2022.5.9 发布 PaddleOCR [release/2.5](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.5)**
48
+ - 发布[PP-OCRv3](./doc/doc_ch/ppocr_introduction.md#pp-ocrv3),速度可比情况下,中文场景效果相比于PP-OCRv2再提升5%,英文场景提升11%,80语种多语言模型平均识别准确率提升5%以上;
49
+ - 发布半自动标注工具[PPOCRLabelv2](./PPOCRLabel):新增表格文字图像、图像关键信息抽取任务和不规则文字图像的标注功能;
50
+ - 发布OCR产业落地工具集:打通22种训练部署软硬件环境与方式,覆盖企业90%的训练部署环境需求;
51
+ - 发布交互式OCR开源电子书[《动手学OCR》](./doc/doc_ch/ocr_book.md),覆盖OCR全栈技术的前沿理论与代码实践,并配套教学视频。
52
+
53
+ > [更多](./doc/doc_ch/update.md)
54
+
55
+ ## 🌟 特性
56
+
57
+ 支持多种OCR相关前沿算法,在此基础上打造产业级特色模型[PP-OCR](./doc/doc_ch/ppocr_introduction.md)和[PP-Structure](./ppstructure/README_ch.md),并打通数据生产、模型训练、压缩、预测部署全流程。
58
+
59
+ <div align="center">
60
+ <img src="https://user-images.githubusercontent.com/25809855/186170862-b8f80f6c-fee7-4b26-badc-de9c327c76ce.png">
61
+ </div>
62
+
63
+ > 上述内容的使用方法建议从文档教程中的快速开始体验
64
+
65
+
66
+ ## ⚡ 快速开始
67
+
68
+ - 在线网站体验:超轻量PP-OCR mobile模型体验地址:https://www.paddlepaddle.org.cn/hub/scene/ocr
69
+ - 移动端demo体验:[安装包DEMO下载地址](https://ai.baidu.com/easyedge/app/openSource?from=paddlelite)(基于EasyEdge和Paddle-Lite, 支持iOS和Android系统)
70
+ - 一行命令快速使用:[快速开始(中英文/多语言/文档分析)](./doc/doc_ch/quickstart.md)
71
+
72
+ <a name="电子书"></a>
73
+ ## 📚《动手学OCR》电子书
74
+ - [《动手学OCR》电子书](./doc/doc_ch/ocr_book.md)
75
+
76
+ <a name="开源社区"></a>
77
+
78
+ ## 👫 开源社区
79
+ - **📑项目合作:** 如果您是企业开发者且有明确的OCR垂类应用需求,填写[问卷](https://paddle.wjx.cn/vj/QwF7GKw.aspx)后可免费与官方团队展开不同层次的合作。
80
+ - **👫加入社区:** **微信扫描二维码并填写问卷之后,加入交流群领取20G重磅OCR学习大礼包**
81
+ - **包括《动手学OCR》电子书** ,配套讲解视频和notebook项目;**PaddleOCR历次发版直播课回放链接**;
82
+ - **OCR场景应用模型集合:** 包含数码管、液晶屏、车牌、高精度SVTR模型、手写体识别等垂类模型,覆盖通用,制造、金融、交通行业的主要OCR垂类应用。
83
+ - PDF2Word应用程序;OCR社区优秀开发者项目分享视频。
84
+ - **🏅️社区项目**:[社区项目](./doc/doc_ch/thirdparty.md)文档中包含了社区用户**使用PaddleOCR开发的各种工具、应用**以及**为PaddleOCR贡献的功能、优化的文档与代码**等,是官方为社区开发者打造的荣誉墙,也是帮助优质项目宣传的广播站。
85
+ - **🎁社区常规赛**:社区常规赛是面向OCR开发者的积分赛事,覆盖文档、代码、模型和应用四大类型,以季度为单位评选并发放奖励,赛题详情与报名方法可参考[链接](https://github.com/PaddlePaddle/PaddleOCR/issues/4982)。
86
+
87
+ <div align="center">
88
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/dygraph/doc/joinus.PNG" width = "150" height = "150",caption='' />
89
+ <p>PaddleOCR官方交流群二维码</p>
90
+ </div>
91
+
92
+ <a name="模型下载"></a>
93
+ ## 🛠️ PP-OCR系列模型列表(更新中)
94
+
95
+ | 模型简介 | 模型名称 | 推荐场景 | 检测模型 | 方向分类器 | 识别模型 |
96
+ | ------------------------------------- | ----------------------- | --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
97
+ | 中英文超轻量PP-OCRv3模型(16.2M) | ch_PP-OCRv3_xx | 移动端&服务器端 | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_train.tar) |
98
+ | 英文超轻量PP-OCRv3模型(13.4M) | en_PP-OCRv3_xx | 移动端&服务器端 | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_distill_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [推理模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar) |
99
+
100
+ - 超轻量OCR系列更多模型下载(包括多语言),可以参考[PP-OCR系列模型下载](./doc/doc_ch/models_list.md),文档分析相关模型参考[PP-Structure系列模型下载](./ppstructure/docs/models_list.md)
101
+
102
+ ### PaddleOCR场景应用模型
103
+
104
+ | 行业 | 类别 | 亮点 | 文档说明 | 模型下载 |
105
+ | ---- | ------------ | ---------------------------------- | ------------------------------------------------------------ | --------------------------------------------- |
106
+ | 制造 | 数码管识别 | 数码管数据合成、漏识别调优 | [光功率计数码管字符识别](./applications/光功率计数码管字符识别/光功率计数码管字符识别.md) | [下载链接](./applications/README.md#模型下载) |
107
+ | 金融 | 通用表单识别 | 多模态通用表单结构化提取 | [多模态表单识别](./applications/多模态表单识别.md) | [下载链接](./applications/README.md#模型下载) |
108
+ | 交通 | 车牌识别 | 多角度图像处理、轻量模型、端侧部署 | [轻量级车牌识别](./applications/轻量级车牌识别.md) | [下载链接](./applications/README.md#模型下载) |
109
+
110
+ - 更多制造、金融、交通行业的主要OCR垂类应用模型(如电表、液晶屏、高精度SVTR模型等),可参考[场景应用模型下载](./applications)
111
+
112
+ <a name="文档教程"></a>
113
+
114
+ ## 📖 文档教程
115
+
116
+ - [运行环境准备](./doc/doc_ch/environment.md)
117
+ - [PP-OCR文本检测识别🔥](./doc/doc_ch/ppocr_introduction.md)
118
+ - [快速开始](./doc/doc_ch/quickstart.md)
119
+ - [模型库](./doc/doc_ch/models_list.md)
120
+ - [模型训练](./doc/doc_ch/training.md)
121
+ - [文本检测](./doc/doc_ch/detection.md)
122
+ - [文本识别](./doc/doc_ch/recognition.md)
123
+ - [文本方向分类器](./doc/doc_ch/angle_class.md)
124
+ - 模型压缩
125
+ - [模型量化](./deploy/slim/quantization/README.md)
126
+ - [模型裁剪](./deploy/slim/prune/README.md)
127
+ - [知识蒸馏](./doc/doc_ch/knowledge_distillation.md)
128
+ - [推理部署](./deploy/README_ch.md)
129
+ - [基于Python预测引擎推理](./doc/doc_ch/inference_ppocr.md)
130
+ - [基于C++预测引擎推理](./deploy/cpp_infer/readme_ch.md)
131
+ - [服务化部署](./deploy/pdserving/README_CN.md)
132
+ - [端侧部署](./deploy/lite/readme.md)
133
+ - [Paddle2ONNX模型转化与预测](./deploy/paddle2onnx/readme.md)
134
+ - [云上飞桨部署工具](./deploy/paddlecloud/README.md)
135
+ - [Benchmark](./doc/doc_ch/benchmark.md)
136
+ - [PP-Structure文档分析🔥](./ppstructure/README_ch.md)
137
+ - [快速开始](./ppstructure/docs/quickstart.md)
138
+ - [模型库](./ppstructure/docs/models_list.md)
139
+ - [模型训练](./doc/doc_ch/training.md)
140
+ - [版面分析](./ppstructure/layout/README_ch.md)
141
+ - [表格识别](./ppstructure/table/README_ch.md)
142
+ - [关键信息提取](./ppstructure/kie/README_ch.md)
143
+ - [推理部署](./deploy/README_ch.md)
144
+ - [基于Python预测引擎推理](./ppstructure/docs/inference.md)
145
+ - [基于C++预测引擎推理](./deploy/cpp_infer/readme_ch.md)
146
+ - [服务化部署](./deploy/hubserving/readme.md)
147
+ - [前沿算法与模型🚀](./doc/doc_ch/algorithm_overview.md)
148
+ - [文本检测算法](./doc/doc_ch/algorithm_overview.md)
149
+ - [文本识别算法](./doc/doc_ch/algorithm_overview.md)
150
+ - [端到端OCR算法](./doc/doc_ch/algorithm_overview.md)
151
+ - [表格识别算法](./doc/doc_ch/algorithm_overview.md)
152
+ - [关键信息抽取算法](./doc/doc_ch/algorithm_overview.md)
153
+ - [使用PaddleOCR架构添加新算法](./doc/doc_ch/add_new_algorithm.md)
154
+ - [场景应用](./applications)
155
+ - 数据标注与合成
156
+ - [半自动标注工具PPOCRLabel](./PPOCRLabel/README_ch.md)
157
+ - [数据合成工具Style-Text](./StyleText/README_ch.md)
158
+ - [其它数据标注工具](./doc/doc_ch/data_annotation.md)
159
+ - [其它数据合成工具](./doc/doc_ch/data_synthesis.md)
160
+ - 数据集
161
+ - [通用中英文OCR数据集](doc/doc_ch/dataset/datasets.md)
162
+ - [手写中文OCR数据集](doc/doc_ch/dataset/handwritten_datasets.md)
163
+ - [垂类多语言OCR数据集](doc/doc_ch/dataset/vertical_and_multilingual_datasets.md)
164
+ - [版面分析数据集](doc/doc_ch/dataset/layout_datasets.md)
165
+ - [表格识别数据集](doc/doc_ch/dataset/table_datasets.md)
166
+ - [关键信息提取数据集](doc/doc_ch/dataset/kie_datasets.md)
167
+ - [代码组织结构](./doc/doc_ch/tree.md)
168
+ - [效果展示](#效果展示)
169
+ - [《动手学OCR》电子书📚](./doc/doc_ch/ocr_book.md)
170
+ - [开源社区](#开源社区)
171
+ - FAQ
172
+ - [通用问题](./doc/doc_ch/FAQ.md)
173
+ - [PaddleOCR实战问题](./doc/doc_ch/FAQ.md)
174
+ - [参考文献](./doc/doc_ch/reference.md)
175
+ - [许可证书](#许可证书)
176
+
177
+
178
+ <a name="效果展示"></a>
179
+
180
+ ## 👀 效果展示 [more](./doc/doc_ch/visualization.md)
181
+
182
+ <details open>
183
+ <summary>PP-OCRv3 中文模型</summary>
184
+
185
+ <div align="center">
186
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic001.jpg" width="800">
187
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic002.jpg" width="800">
188
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic003.jpg" width="800">
189
+ </div>
190
+
191
+ </details>
192
+
193
+
194
+ <details open>
195
+ <summary>PP-OCRv3 英文模型</summary>
196
+
197
+ <div align="center">
198
+ <img src="doc/imgs_results/PP-OCRv3/en/en_1.png" width="800">
199
+ <img src="doc/imgs_results/PP-OCRv3/en/en_2.png" width="800">
200
+ </div>
201
+
202
+ </details>
203
+
204
+
205
+ <details open>
206
+ <summary>PP-OCRv3 多语言模型</summary>
207
+
208
+ <div align="center">
209
+ <img src="doc/imgs_results/PP-OCRv3/multi_lang/japan_2.jpg" width="800">
210
+ <img src="doc/imgs_results/PP-OCRv3/multi_lang/korean_1.jpg" width="800">
211
+ </div>
212
+
213
+ </details>
214
+
215
+ <details open>
216
+ <summary>PP-Structure 文档分析</summary>
217
+
218
+ - 版面分析+表格识别
219
+ <div align="center">
220
+ <img src="./ppstructure/docs/table/ppstructure.GIF" width="800">
221
+ </div>
222
+
223
+ - SER(语义实体识别)
224
+ <div align="center">
225
+ <img src="https://user-images.githubusercontent.com/14270174/185310636-6ce02f7c-790d-479f-b163-ea97a5a04808.jpg" width="600">
226
+ </div>
227
+
228
+ <div align="center">
229
+ <img src="https://user-images.githubusercontent.com/14270174/185539517-ccf2372a-f026-4a7c-ad28-c741c770f60a.png" width="600">
230
+ </div>
231
+
232
+ <div align="center">
233
+ <img src="https://user-images.githubusercontent.com/14270174/197464552-69de557f-edff-4c7f-acbf-069df1ba097f.png" width="600">
234
+ </div>
235
+
236
+ - RE(关系提取)
237
+ <div align="center">
238
+ <img src="https://user-images.githubusercontent.com/14270174/185393805-c67ff571-cf7e-4217-a4b0-8b396c4f22bb.jpg" width="600">
239
+ </div>
240
+
241
+ <div align="center">
242
+ <img src="https://user-images.githubusercontent.com/14270174/185540080-0431e006-9235-4b6d-b63d-0b3c6e1de48f.jpg" width="600">
243
+ </div>
244
+
245
+ <div align="center">
246
+ <img src="https://user-images.githubusercontent.com/25809855/186094813-3a8e16cc-42e5-4982-b9f4-0134dfb5688d.png" width="600">
247
+ </div>
248
+
249
+ </details>
250
+
251
+ <a name="许可证书"></a>
252
+
253
+ ## 许可证书
254
+ 本项目的发布受<a href="https://github.com/PaddlePaddle/PaddleOCR/blob/master/LICENSE">Apache 2.0 license</a>许可认证。
ocr-studio/PaddleOCR/README_en.md ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ English | [简体中文](README_ch.md) | [हिन्दी](./doc/doc_i18n/README_हिन्द.md) | [日本語](./doc/doc_i18n/README_日本語.md) | [한국인](./doc/doc_i18n/README_한국어.md) | [Pу́сский язы́к](./doc/doc_i18n/README_Ру́сский_язы́к.md)
2
+
3
+ <p align="center">
4
+ <img src="./doc/PaddleOCR_log.png" align="middle" width = "600"/>
5
+ <p align="center">
6
+ <p align="left">
7
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202-dfd.svg"></a>
8
+ <a href="https://github.com/PaddlePaddle/PaddleOCR/releases"><img src="https://img.shields.io/github/v/release/PaddlePaddle/PaddleOCR?color=ffa"></a>
9
+ <a href=""><img src="https://img.shields.io/badge/python-3.7+-aff.svg"></a>
10
+ <a href=""><img src="https://img.shields.io/badge/os-linux%2C%20win%2C%20mac-pink.svg"></a>
11
+ <a href=""><img src="https://img.shields.io/pypi/format/PaddleOCR?color=c77"></a>
12
+ <a href="https://pypi.org/project/PaddleOCR/"><img src="https://img.shields.io/pypi/dm/PaddleOCR?color=9cf"></a>
13
+ <a href="https://github.com/PaddlePaddle/PaddleOCR/stargazers"><img src="https://img.shields.io/github/stars/PaddlePaddle/PaddleOCR?color=ccf"></a>
14
+ </p>
15
+
16
+ ## Introduction
17
+
18
+ PaddleOCR aims to create multilingual, awesome, leading, and practical OCR tools that help users train better models and apply them into practice.
19
+
20
+ <div align="center">
21
+ <img src="./doc/imgs_results/PP-OCRv3/en/en_4.png" width="800">
22
+ </div>
23
+
24
+ <div align="center">
25
+ <img src="./doc/imgs_results/ch_ppocr_mobile_v2.0/00006737.jpg" width="800">
26
+ </div>
27
+
28
+ ## 📣 Recent updates
29
+ - **🔥2023.8.7 Release PaddleOCR[release/2.7](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.7)**
30
+ - Release [PP-OCRv4](./doc/doc_ch/PP-OCRv4_introduction.md), support mobile version and server version
31
+ - PP-OCRv4-mobile:When the speed is comparable, the effect of the Chinese scene is improved by 4.5% compared with PP-OCRv3, the English scene is improved by 10%, and the average recognition accuracy of the 80-language multilingual model is increased by more than 8%.
32
+ - PP-OCRv4-server:Release the OCR model with the highest accuracy at present, the detection model accuracy increased by 4.9% in the Chinese and English scenes, and the recognition model accuracy increased by 2%
33
+ refer [quickstart](./doc/doc_en/quickstart_en.md) quick use by one line command, At the same time, the whole process of model training, reasoning, and high-performance deployment can also be completed with few code in the [General OCR Industry Solution](https://aistudio.baidu.com/aistudio/modelsdetail?modelId=286) in PaddleX.
34
+ - Release[PP-ChatOCR](https://aistudio.baidu.com/aistudio/modelsdetail?modelId=332), a new scheme for extracting key information of general scenes using PP-OCR model and ERNIE LLM.
35
+ - 🔨**2022.11 Add implementation of [4 cutting-edge algorithms](doc/doc_ch/algorithm_overview_en.md)**:Text Detection [DRRG](doc/doc_en/algorithm_det_drrg_en.md), Text Recognition [RFL](./doc/doc_en/algorithm_rec_rfl_en.md), Image Super-Resolution [Text Telescope](doc/doc_en/algorithm_sr_telescope_en.md),Handwritten Mathematical Expression Recognition [CAN](doc/doc_en/algorithm_rec_can_en.md)
36
+ - **2022.10 release [optimized JS version PP-OCRv3 model](./deploy/paddlejs/README.md)** with 4.3M model size, 8x faster inference time, and a ready-to-use web demo
37
+ - 💥 **Live Playback: Introduction to PP-StructureV2 optimization strategy**. Scan [the QR code below](#Community) using WeChat, follow the PaddlePaddle official account and fill out the questionnaire to join the WeChat group, get the live link and 20G OCR learning materials (including PDF2Word application, 10 models in vertical scenarios, etc.)
38
+
39
+
40
+ - **🔥2022.8.24 Release PaddleOCR [release/2.6](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.6)**
41
+ - Release [PP-StructureV2](./ppstructure/),with functions and performance fully upgraded, adapted to Chinese scenes, and new support for [Layout Recovery](./ppstructure/recovery) and **one line command to convert PDF to Word**;
42
+ - [Layout Analysis](./ppstructure/layout) optimization: model storage reduced by 95%, while speed increased by 11 times, and the average CPU time-cost is only 41ms;
43
+ - [Table Recognition](./ppstructure/table) optimization: 3 optimization strategies are designed, and the model accuracy is improved by 6% under comparable time consumption;
44
+ - [Key Information Extraction](./ppstructure/kie) optimization:a visual-independent model structure is designed, the accuracy of semantic entity recognition is increased by 2.8%, and the accuracy of relation extraction is increased by 9.1%.
45
+ - **🔥2022.8 Release [OCR scene application collection](./applications/README_en.md)**
46
+ - Release **9 vertical models** such as digital tube, LCD screen, license plate, handwriting recognition model, high-precision SVTR model, etc, covering the main OCR vertical applications in general, manufacturing, finance, and transportation industries.
47
+ - **2022.8 Add implementation of [8 cutting-edge algorithms](doc/doc_en/algorithm_overview_en.md)**
48
+ - Text Detection: [FCENet](doc/doc_en/algorithm_det_fcenet_en.md), [DB++](doc/doc_en/algorithm_det_db_en.md)
49
+ - Text Recognition: [ViTSTR](doc/doc_en/algorithm_rec_vitstr_en.md), [ABINet](doc/doc_en/algorithm_rec_abinet_en.md), [VisionLAN](doc/doc_en/algorithm_rec_visionlan_en.md), [SPIN](doc/doc_en/algorithm_rec_spin_en.md), [RobustScanner](doc/doc_en/algorithm_rec_robustscanner_en.md)
50
+ - Table Recognition: [TableMaster](doc/doc_en/algorithm_table_master_en.md)
51
+ - **2022.5.9 Release PaddleOCR [release/2.5](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.5)**
52
+ - Release [PP-OCRv3](./doc/doc_en/ppocr_introduction_en.md#pp-ocrv3): With comparable speed, the effect of Chinese scene is further improved by 5% compared with PP-OCRv2, the effect of English scene is improved by 11%, and the average recognition accuracy of 80 language multilingual models is improved by more than 5%.
53
+ - Release [PPOCRLabelv2](./PPOCRLabel): Add the annotation function for table recognition task, key information extraction task and irregular text image.
54
+ - Release interactive e-book [*"Dive into OCR"*](./doc/doc_en/ocr_book_en.md), covers the cutting-edge theory and code practice of OCR full stack technology.
55
+ - [more](./doc/doc_en/update_en.md)
56
+
57
+
58
+ ## 🌟 Features
59
+
60
+ PaddleOCR support a variety of cutting-edge algorithms related to OCR, and developed industrial featured models/solution [PP-OCR](./doc/doc_en/ppocr_introduction_en.md)、 [PP-Structure](./ppstructure/README.md) and [PP-ChatOCR](https://aistudio.baidu.com/aistudio/projectdetail/6488689) on this basis, and get through the whole process of data production, model training, compression, inference and deployment.
61
+
62
+ <div align="center">
63
+ <img src="https://user-images.githubusercontent.com/25809855/186171245-40abc4d7-904f-4949-ade1-250f86ed3a90.png">
64
+ </div>
65
+
66
+ > It is recommended to start with the “quick experience” in the document tutorial
67
+
68
+
69
+ ## ⚡ Quick Experience
70
+
71
+ - Web online experience
72
+ - PP-OCRv4 online experience:https://aistudio.baidu.com/application/detail/7658
73
+ - PP-ChatOCR online experience:https://aistudio.baidu.com/application/detail/7709
74
+
75
+ - One line of code quick use: [Quick Start(Chinese/English/Multilingual/Document Analysis](./doc/doc_en/quickstart_en.md)
76
+ - Full-process experience of training, inference, and high-performance deployment in the Paddle AI suite (PaddleX):
77
+ - PP-OCRv4:https://aistudio.baidu.com/projectdetail/paddlex/6796224
78
+ - PP-ChatOCR:https://aistudio.baidu.com/projectdetail/paddlex/6796372
79
+ - Mobile demo experience:[Installation DEMO](https://ai.baidu.com/easyedge/app/openSource?from=paddlelite)(Based on EasyEdge and Paddle-Lite, support iOS and Android systems)
80
+
81
+ <a name="Technical exchange and cooperation"></a>
82
+
83
+ ## 📖 Technical exchange and cooperation
84
+ - PaddleX —— A one-stop development platform for practical models of selected industries. Includes the following features:
85
+ * [High-quality algorithm library] Contains 36 selected models in 10 major task areas, enabling the development of model algorithms for different tasks in one platform. More domain models continue to be enriched! PaddleX also provides complete model training and inference benchmark data, allowing developers to choose the most appropriate model based on business needs.
86
+ * [Simple development method] Toolbox/developer dual-mode linkage, no-code + low-code development method, complete the full process of AI development of data, training, verification, and deployment in four steps.
87
+ * [Efficient training deployment] Precipitate the best tuning strategy of Baidu algorithm team to achieve the fastest and optimal convergence of each model. Complete deployment SDK support enables rapid industrial-level deployment across platforms and hardware (service-based deployment capabilities are being improved).
88
+ * [Rich domestic hardware support] In addition to being used on the AIStudio cloud, PaddleX has also precipitated the Windows local side and is enriching the Linux version, Kunlun Core version, Ascend version, and Cambrian version.
89
+ * [Win-win joint creation and co-construction] In addition to conveniently developing AI applications, PaddleX also provides everyone with opportunities to obtain business benefits and explore more business space for enterprises.
90
+
91
+ PaddleX Official website address:https://www.paddlepaddle.org.cn/paddle/paddleX
92
+
93
+ Scan the QR code below on WeChat to add operation students, and reply [paddlex], operation students will invite you to join the official communication group for more efficient questions and answers.
94
+
95
+ <div align="center">
96
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/dygraph/doc/joinus_paddlex.jpg" width = "150" height = "150",caption='' />
97
+ <p>[PaddleX] technology exchange group QR code</p>
98
+ </div>
99
+
100
+ <a name="book"></a>
101
+ ## 📚 E-book: *Dive Into OCR*
102
+ - [Dive Into OCR ](./doc/doc_en/ocr_book_en.md)
103
+
104
+ <a name="Community"></a>
105
+
106
+ ## 👫 Community
107
+
108
+ - For international developers, we regard [PaddleOCR Discussions](https://github.com/PaddlePaddle/PaddleOCR/discussions) as our international community platform. All ideas and questions can be discussed here in English.
109
+
110
+ - For Chinese develops, Scan the QR code below with your Wechat, you can join the official technical discussion group. For richer community content, please refer to [中文README](README_ch.md), looking forward to your participation.
111
+
112
+ <div align="center">
113
+ <img src="https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/dygraph/doc/joinus.PNG" width = "150" height = "150" />
114
+ </div>
115
+
116
+ <a name="Supported-Chinese-model-list"></a>
117
+
118
+ ## 🛠️ PP-OCR Series Model List(Update on September 8th)
119
+
120
+ | Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model |
121
+ | ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
122
+ | Chinese and English ultra-lightweight PP-OCRv4 model(16.2M) | ch_PP-OCRv4_xx | Mobile & Server | [inference model](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_distill_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_train.tar) |
123
+ | Chinese and English ultra-lightweight PP-OCRv3 model(16.2M) | ch_PP-OCRv3_xx | Mobile & Server | [inference model](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_train.tar) |
124
+ | English ultra-lightweight PP-OCRv3 model(13.4M) | en_PP-OCRv3_xx | Mobile & Server | [inference model](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_distill_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar) |
125
+
126
+ - For more model downloads (including multiple languages), please refer to [PP-OCR series model downloads](./doc/doc_en/models_list_en.md).
127
+ - For a new language request, please refer to [Guideline for new language_requests](#language_requests).
128
+ - For structural document analysis models, please refer to [PP-Structure models](./ppstructure/docs/models_list_en.md).
129
+
130
+ <a name="tutorials"></a>
131
+ ## 📖 Tutorials
132
+ - [Environment Preparation](./doc/doc_en/environment_en.md)
133
+ - [PP-OCR 🔥](./doc/doc_en/ppocr_introduction_en.md)
134
+ - [Quick Start](./doc/doc_en/quickstart_en.md)
135
+ - [Model Zoo](./doc/doc_en/models_en.md)
136
+ - [Model training](./doc/doc_en/training_en.md)
137
+ - [Text Detection](./doc/doc_en/detection_en.md)
138
+ - [Text Recognition](./doc/doc_en/recognition_en.md)
139
+ - [Text Direction Classification](./doc/doc_en/angle_class_en.md)
140
+ - Model Compression
141
+ - [Model Quantization](./deploy/slim/quantization/README_en.md)
142
+ - [Model Pruning](./deploy/slim/prune/README_en.md)
143
+ - [Knowledge Distillation](./doc/doc_en/knowledge_distillation_en.md)
144
+ - [Inference and Deployment](./deploy/README.md)
145
+ - [Python Inference](./doc/doc_en/inference_ppocr_en.md)
146
+ - [C++ Inference](./deploy/cpp_infer/readme.md)
147
+ - [Serving](./deploy/pdserving/README.md)
148
+ - [Mobile](./deploy/lite/readme.md)
149
+ - [Paddle2ONNX](./deploy/paddle2onnx/readme.md)
150
+ - [PaddleCloud](./deploy/paddlecloud/README.md)
151
+ - [Benchmark](./doc/doc_en/benchmark_en.md)
152
+ - [PP-Structure 🔥](./ppstructure/README.md)
153
+ - [Quick Start](./ppstructure/docs/quickstart_en.md)
154
+ - [Model Zoo](./ppstructure/docs/models_list_en.md)
155
+ - [Model training](./doc/doc_en/training_en.md)
156
+ - [Layout Analysis](./ppstructure/layout/README.md)
157
+ - [Table Recognition](./ppstructure/table/README.md)
158
+ - [Key Information Extraction](./ppstructure/kie/README.md)
159
+ - [Inference and Deployment](./deploy/README.md)
160
+ - [Python Inference](./ppstructure/docs/inference_en.md)
161
+ - [C++ Inference](./deploy/cpp_infer/readme.md)
162
+ - [Serving](./deploy/hubserving/readme_en.md)
163
+ - [Academic Algorithms](./doc/doc_en/algorithm_overview_en.md)
164
+ - [Text detection](./doc/doc_en/algorithm_overview_en.md)
165
+ - [Text recognition](./doc/doc_en/algorithm_overview_en.md)
166
+ - [End-to-end OCR](./doc/doc_en/algorithm_overview_en.md)
167
+ - [Table Recognition](./doc/doc_en/algorithm_overview_en.md)
168
+ - [Key Information Extraction](./doc/doc_en/algorithm_overview_en.md)
169
+ - [Add New Algorithms to PaddleOCR](./doc/doc_en/add_new_algorithm_en.md)
170
+ - Data Annotation and Synthesis
171
+ - [Semi-automatic Annotation Tool: PPOCRLabel](./PPOCRLabel/README.md)
172
+ - [Data Synthesis Tool: Style-Text](./StyleText/README.md)
173
+ - [Other Data Annotation Tools](./doc/doc_en/data_annotation_en.md)
174
+ - [Other Data Synthesis Tools](./doc/doc_en/data_synthesis_en.md)
175
+ - Datasets
176
+ - [General OCR Datasets(Chinese/English)](doc/doc_en/dataset/datasets_en.md)
177
+ - [HandWritten_OCR_Datasets(Chinese)](doc/doc_en/dataset/handwritten_datasets_en.md)
178
+ - [Various OCR Datasets(multilingual)](doc/doc_en/dataset/vertical_and_multilingual_datasets_en.md)
179
+ - [Layout Analysis](doc/doc_en/dataset/layout_datasets_en.md)
180
+ - [Table Recognition](doc/doc_en/dataset/table_datasets_en.md)
181
+ - [Key Information Extraction](doc/doc_en/dataset/kie_datasets_en.md)
182
+ - [Code Structure](./doc/doc_en/tree_en.md)
183
+ - [Visualization](#Visualization)
184
+ - [Community](#Community)
185
+ - [New language requests](#language_requests)
186
+ - [FAQ](./doc/doc_en/FAQ_en.md)
187
+ - [References](./doc/doc_en/reference_en.md)
188
+ - [License](#LICENSE)
189
+
190
+
191
+ <a name="Visualization"></a>
192
+ ## 👀 Visualization [more](./doc/doc_en/visualization_en.md)
193
+
194
+ <details open>
195
+ <summary>PP-OCRv3 Chinese model</summary>
196
+ <div align="center">
197
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic001.jpg" width="800">
198
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic002.jpg" width="800">
199
+ <img src="doc/imgs_results/PP-OCRv3/ch/PP-OCRv3-pic003.jpg" width="800">
200
+ </div>
201
+ </details>
202
+
203
+ <details open>
204
+ <summary>PP-OCRv3 English model</summary>
205
+ <div align="center">
206
+ <img src="doc/imgs_results/PP-OCRv3/en/en_1.png" width="800">
207
+ <img src="doc/imgs_results/PP-OCRv3/en/en_2.png" width="800">
208
+ </div>
209
+ </details>
210
+
211
+ <details open>
212
+ <summary>PP-OCRv3 Multilingual model</summary>
213
+ <div align="center">
214
+ <img src="doc/imgs_results/PP-OCRv3/multi_lang/japan_2.jpg" width="800">
215
+ <img src="doc/imgs_results/PP-OCRv3/multi_lang/korean_1.jpg" width="800">
216
+ </div>
217
+ </details>
218
+
219
+ <details open>
220
+ <summary>PP-StructureV2</summary>
221
+
222
+ - layout analysis + table recognition
223
+ <div align="center">
224
+ <img src="./ppstructure/docs/table/ppstructure.GIF" width="800">
225
+ </div>
226
+
227
+ - SER (Semantic entity recognition)
228
+ <div align="center">
229
+ <img src="https://user-images.githubusercontent.com/14270174/197464552-69de557f-edff-4c7f-acbf-069df1ba097f.png" width="600">
230
+ </div>
231
+
232
+ <div align="center">
233
+ <img src="https://user-images.githubusercontent.com/14270174/185310636-6ce02f7c-790d-479f-b163-ea97a5a04808.jpg" width="600">
234
+ </div>
235
+
236
+ <div align="center">
237
+ <img src="https://user-images.githubusercontent.com/14270174/185539517-ccf2372a-f026-4a7c-ad28-c741c770f60a.png" width="600">
238
+ </div>
239
+
240
+ - RE (Relation Extraction)
241
+ <div align="center">
242
+ <img src="https://user-images.githubusercontent.com/25809855/186094813-3a8e16cc-42e5-4982-b9f4-0134dfb5688d.png" width="600">
243
+ </div>
244
+
245
+ <div align="center">
246
+ <img src="https://user-images.githubusercontent.com/14270174/185393805-c67ff571-cf7e-4217-a4b0-8b396c4f22bb.jpg" width="600">
247
+ </div>
248
+
249
+ <div align="center">
250
+ <img src="https://user-images.githubusercontent.com/14270174/185540080-0431e006-9235-4b6d-b63d-0b3c6e1de48f.jpg" width="600">
251
+ </div>
252
+
253
+ </details>
254
+
255
+ <a name="language_requests"></a>
256
+ ## 🇺🇳 Guideline for New Language Requests
257
+
258
+ If you want to request a new language support, a PR with 1 following files are needed:
259
+
260
+ 1. In folder [ppocr/utils/dict](./ppocr/utils/dict),
261
+ it is necessary to submit the dict text to this path and name it with `{language}_dict.txt` that contains a list of all characters. Please see the format example from other files in that folder.
262
+
263
+ If your language has unique elements, please tell me in advance within any way, such as useful links, wikipedia and so on.
264
+
265
+ More details, please refer to [Multilingual OCR Development Plan](https://github.com/PaddlePaddle/PaddleOCR/issues/1048).
266
+
267
+
268
+ <a name="LICENSE"></a>
269
+ ## 📄 License
270
+ This project is released under <a href="https://github.com/PaddlePaddle/PaddleOCR/blob/master/LICENSE">Apache 2.0 license</a>
ocr-studio/PaddleOCR/RELEASING.md ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PaddleOCR Release SOP
2
+
3
+ [中文](./RELEASING_cn.md)
4
+
5
+ ## Scope
6
+
7
+ This document describes the standard release process for PaddleOCR.
8
+
9
+ ## Release Types
10
+
11
+ The current process supports the following two release types:
12
+
13
+ - `bump patch`: for example, `3.4.0 -> 3.4.1`
14
+ - `bump minor`: for example, `3.4.x -> 3.5.0`
15
+
16
+ For `bump major`:
17
+
18
+ - The current process does not directly support this scenario
19
+ - A major release process should be discussed and designed separately, for example by introducing an additional branch or a new preparation flow
20
+
21
+ ## Release Principles
22
+
23
+ - Daily development happens on `main`
24
+ - Official releases are made only from `release/X.Y`
25
+ - Official tags must use `vX.Y.Z`
26
+ - Do not create official release tags on `main`
27
+
28
+ ## Standard Release Process
29
+
30
+ ### 1. Confirm the release target
31
+
32
+ First confirm which release line this release belongs to and what the target version is.
33
+
34
+ Examples:
35
+
36
+ - Release `3.4.1` on `release/3.4`
37
+ - Release `3.5.0` on `release/3.5`
38
+
39
+ ### 2. Create or switch to the release branch
40
+
41
+ If the release line does not exist yet, create the corresponding `release/X.Y` branch from `main`.
42
+ If it already exists, switch to that branch and continue release preparation there.
43
+
44
+ Requirements:
45
+
46
+ - One minor release line corresponds to one fixed `release/X.Y` branch
47
+ - That branch should contain only the release content and patch fixes for that line
48
+
49
+ ### 3. Pick release content from main
50
+
51
+ Based on the release scope, `cherry-pick` the required commits from `main` into `release/X.Y` until the release content is ready.
52
+
53
+ Requirements:
54
+
55
+ - Only pick what is needed for the current release
56
+ - Avoid bringing unrelated new features into the release branch
57
+ - If there are release-specific fixes on the release branch, keep them limited to the current release scope
58
+
59
+ ### 4. Complete pre-release checks
60
+
61
+ Complete pre-release checks on `release/X.Y`.
62
+
63
+ At minimum, this should include:
64
+
65
+ - The current branch is correct
66
+ - The working tree is clean
67
+ - The version is as expected
68
+ - Key functionality is verified
69
+ - Required tests, builds, packaging, and regression checks have passed
70
+ - Release notes are ready
71
+
72
+ ### 5. Create the official tag
73
+
74
+ Once the release is ready, create the official tag on `release/X.Y`:
75
+
76
+ - The tag format must be `vX.Y.Z`
77
+
78
+ Examples:
79
+
80
+ - `v3.4.1`
81
+ - `v3.5.0`
82
+
83
+ Requirements:
84
+
85
+ - The tag must be created on the release branch for the current official release
86
+ - Do not use development tags as official release tags
87
+
88
+ ### 6. Publish the GitHub Release
89
+
90
+ Create a GitHub Release based on the official tag for this release.
91
+
92
+ ### 7. Update dependency constraints and release notes
93
+
94
+ If this release is the first release of a new minor line, or if it changes PaddleX dependency requirements, update the related release materials before or after the official tag is published.
95
+
96
+ At minimum, this should include:
97
+
98
+ - Checking whether the `paddlex` dependency constraints in `pyproject.toml` match the target release
99
+ - Checking whether installation docs, upgrade notes, and release notes are aligned with the release version
100
+
101
+ Completion criteria:
102
+
103
+ - The `paddlex` dependency constraints match the target release
104
+ - The version information in the documentation matches the released version
105
+
106
+ ### 8. Sync the release branch lineage back to main
107
+
108
+ After the first official release of a new `release/X.Y` line is completed, sync the lineage of that `release/X.Y` branch back to `main`.
109
+
110
+ This is a fixed step in the current workflow and should be done at least once for each new minor release line.
111
+
112
+ Purpose:
113
+
114
+ - Ensure `main` correctly reflects that the release line has produced an official version
115
+ - Keep subsequent development and release cadence aligned
116
+
117
+ Requirements:
118
+
119
+ - Perform this once after the first official release of each new `release/X.Y`
120
+ - For later patch releases on the same `release/X.Y`, it is usually not necessary to repeat it
121
+
122
+ ### 9. Move on to the next development cycle or patch release
123
+
124
+ After the release:
125
+
126
+ - `main` continues with ongoing development
127
+ - `release/X.Y` continues to maintain that release line
128
+
129
+ If more patch releases are needed later on the same line:
130
+
131
+ - Continue preparing patches on `release/X.Y`
132
+ - `cherry-pick` from `main` as needed
133
+ - Repeat the relevant steps in this SOP
134
+
135
+ ## How to Handle Different Bump Types
136
+
137
+ ### Patch Release
138
+
139
+ Applicable scenarios:
140
+
141
+ - Fixing production issues
142
+ - Small compatibility fixes
143
+ - Documentation, dependency, or stability patches
144
+
145
+ How to handle it:
146
+
147
+ - Continue preparing changes on the existing `release/X.Y`
148
+ - Create the next patch tag, for example `v3.4.2`
149
+
150
+ ### Minor Release
151
+
152
+ Applicable scenarios:
153
+
154
+ - Starting a new release line
155
+ - Releasing the next stable version, for example `3.5.0`
156
+
157
+ How to handle it:
158
+
159
+ - Create a new `release/X.Y` from `main`
160
+ - Prepare the release following the standard process
161
+ - Create the first official tag, for example `v3.5.0`
162
+ - Update `paddlex` dependency constraints if needed
163
+ - Sync the lineage of that release branch back to `main` after the release
164
+
165
+ ### Major Release
166
+
167
+ Current conclusion:
168
+
169
+ - It is not included in this SOP for now
170
+ - A separate process needs to be discussed and designed later
171
+
172
+ Before a dedicated solution is defined, do not directly reuse the current minor/patch process for a major release.
173
+
174
+ ## Release Checklist
175
+
176
+ Before each release, confirm the following:
177
+
178
+ - The target version and corresponding release branch have been confirmed
179
+ - The content on the release branch is ready
180
+ - The release scope has been finalized
181
+ - Key tests and regression checks have passed
182
+ - Release notes are ready
183
+ - The official tag uses the `vX.Y.Z` format
184
+ - The GitHub Release has been created
185
+ - If this is the first official release on `release/X.Y`, its lineage has been synced back to `main`
186
+
187
+ ## Daily Maintenance Recommendations
188
+
189
+ - New features should go to `main` first
190
+ - Official releases should always be performed through `release/X.Y`
191
+ - Patch releases should always be maintained on the corresponding `release/X.Y`
192
+ - For each new `release/X.Y`, sync its lineage once after the first official release
193
+
194
+ If the current process changes, this document should be updated accordingly.
ocr-studio/PaddleOCR/RELEASING_cn.md ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PaddleOCR Release SOP
2
+
3
+ [English](./RELEASING.md)
4
+
5
+ ## 适用范围
6
+
7
+ 本文档用于说明 PaddleOCR 的标准发版流程。
8
+
9
+ ## 版本类型
10
+
11
+ 当前流程支持以下两类发布:
12
+
13
+ - `bump patch`:例如 `3.4.0 -> 3.4.1`
14
+ - `bump minor`:例如 `3.4.x -> 3.5.0`
15
+
16
+ 对于 `bump major`:
17
+
18
+ - 当前流程暂不支持直接覆盖这类场景
19
+ - 如需发布大版本,需要单独讨论并设计额外流程,例如引入额外分支或新的版本准备方式
20
+
21
+ ## 发版原则
22
+
23
+ - 日常开发在 `main` 分支进行
24
+ - 正式发布只在 `release/X.Y` 分支进行
25
+ - 正式标签只使用 `vX.Y.Z`
26
+ - 不在 `main` 分支打正式发布标签
27
+
28
+ ## 标准发版流程
29
+
30
+ ### 1. 确认发布目标
31
+
32
+ 先确认本次发布属于哪一条版本线,以及目标版本号。
33
+
34
+ 示例:
35
+
36
+ - 发布 `3.4.1`,对应分支为 `release/3.4`
37
+ - 发布 `3.5.0`,对应分支为 `release/3.5`
38
+
39
+ ### 2. 创建或切换到 release 分支
40
+
41
+ 如果该版本线尚未建立,则从 `main` 创建对应的 `release/X.Y` 分支。
42
+ 如果该版本线已存在,则直接切换到该分支继续发版准备。
43
+
44
+ 要求:
45
+
46
+ - 一个 minor 版本线对应一个固定的 `release/X.Y` 分支
47
+ - 该分支只承载该版本线的发布内容和补丁修复
48
+
49
+ ### 3. 从 main 挑选发布内容
50
+
51
+ 根据本次发布范围,从 `main` 将需要发布的提交按需 `cherry-pick` 到 `release/X.Y`,直到版本内容 ready。
52
+
53
+ 要求:
54
+
55
+ - 只挑选本次发布需要的内容
56
+ - 避免把与本次发布无关的新功能带入 release 分支
57
+ - 如果 release 分支上出现专门的发布修复,也应仅限于本次发布范围
58
+
59
+ ### 4. 完成发布前检查
60
+
61
+ 在 `release/X.Y` 上完成发布前检查。
62
+
63
+ 至少应包括:
64
+
65
+ - 当前分支正确
66
+ - 工作区干净
67
+ - 版本号符合预期
68
+ - 关键功能验证通过
69
+ - 必要的测试、构建、打包和回归通过
70
+ - 发布说明已经准备好
71
+
72
+ ### 5. 打正式标签
73
+
74
+ 确认版本 ready 后,在 `release/X.Y` 分支上打正式标签:
75
+
76
+ - 标签格式必须为 `vX.Y.Z`
77
+
78
+ 示例:
79
+
80
+ - `v3.4.1`
81
+ - `v3.5.0`
82
+
83
+ 要求:
84
+
85
+ - 标签必须打在本次正式发布对应的 release 分支上
86
+ - 不使用开发态标签作为正式发布标签
87
+
88
+ ### 6. 发布 GitHub Release
89
+
90
+ 在 GitHub 上基于本次正式标签创建 Release。
91
+
92
+ ### 7. 更新依赖约束与发布说明
93
+
94
+ 如果本次发布是新的 minor 版本首发,或本次发布涉及 PaddleX 依赖变化,则在正式标签发布前后同步完成相关更新。
95
+
96
+ 至少应包括:
97
+
98
+ - 检查 `pyproject.toml` 中 `paddlex` 相关依赖约束是否与本次发布版本匹配
99
+ - 检查安装说明、升级说明和发布说明中的版本信息是否与本次发布一致
100
+
101
+ 完成要求:
102
+
103
+ - `paddlex` 相关依赖约束与本次发布目标一致
104
+ - 文档中的版本信息与本次发布版本一致
105
+
106
+ ### 8. 将 release 分支的 lineage 同步回 main
107
+
108
+ 当一条新的 `release/X.Y` 发布线完成首个正式版本发布后,需要将该 `release/X.Y` 的 lineage 同步回 `main`。
109
+
110
+ 这一步是当前流程中的固定步骤,每条新的 minor 发布线至少执行一次。
111
+
112
+ 目的:
113
+
114
+ - 让 `main` 正确感知该发布线已经完成的正式版本
115
+ - 保持后续开发与发布节奏一致
116
+
117
+ 要求:
118
+
119
+ - 每条新的 `release/X.Y` 在首个正式版本发布后执行一次
120
+ - 同一条 `release/X.Y` 后续如果继续发布补丁版本,通常不要求重复执行
121
+
122
+ ### 9. 进入下一轮开发或补丁发布
123
+
124
+ 发布完成后:
125
+
126
+ - `main` 继续进行后续开发
127
+ - `release/X.Y` 继续维护该版本线
128
+
129
+ 如果后续还要发布该版本线的补丁版本:
130
+
131
+ - 继续在 `release/X.Y` 上准备补丁
132
+ - 从 `main` 按需 `cherry-pick`
133
+ - 重复执行本 SOP 中的发布步骤
134
+
135
+ ## 不同 bump 类型的处理方式
136
+
137
+ ### Patch 发布
138
+
139
+ 适用场景:
140
+
141
+ - 修复线上问题
142
+ - 小范围兼容性修复
143
+ - 文档、依赖或稳定性补丁
144
+
145
+ 处理方式:
146
+
147
+ - 在现有 `release/X.Y` 分支上继续准备内容
148
+ - 打下一个 patch 标签,例如 `v3.4.2`
149
+
150
+ ### Minor 发布
151
+
152
+ 适用场景:
153
+
154
+ - 开启一条新的发布线
155
+ - 发布下一阶段稳定版本,例如 `3.5.0`
156
+
157
+ 处理方式:
158
+
159
+ - 从 `main` 建立新的 `release/X.Y`
160
+ - 按标准流程准备版本内容
161
+ - 打首个正式标签,例如 `v3.5.0`
162
+ - 如有需要,同步更新 `paddlex` 相关依赖约束
163
+ - 发布后将该 release 分支的 lineage 同步回 `main`
164
+
165
+ ### Major 发布
166
+
167
+ 当前结论:
168
+
169
+ - 暂不纳入本 SOP
170
+ - 后续需要单独讨论并设计流程
171
+
172
+ 在新的方案明确之前,不建议直接套用当前 minor/patch 的做法处理 major 发布。
173
+
174
+ ## 发布检查清单
175
+
176
+ 每次发版前,请确认以下事项:
177
+
178
+ - 已确认目标版本号和对应 release 分支
179
+ - release 分支中的内容已经 ready
180
+ - 发布范围已经收敛
181
+ - 关键测试和��归已通过
182
+ - 发布说明已准备完成
183
+ - 正式标签格式为 `vX.Y.Z`
184
+ - GitHub Release 已创建
185
+ - 如本次是该 `release/X.Y` 的首个正式版本,发布完成后已将 lineage 同步回 `main`
186
+
187
+ ## 日常维护建议
188
+
189
+ - 新功能优先进入 `main`
190
+ - 正式发布始终通过 `release/X.Y` 执行
191
+ - 补丁版本始终在对应的 `release/X.Y` 上维护
192
+ - 每条新的 `release/X.Y` 在首个正式版本发布后执行一次 lineage 同步
193
+
194
+ 如当前流程发生调整,应同步更新本文档。
ocr-studio/PaddleOCR/TEST_REPORT.md ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PaddleOCR API SDK 集成测试报告
2
+
3
+ **测试分支**: feature/api-sdk (PR #18049)
4
+ **测试环境**: macOS Darwin 24.3.0, Python 3.9.6, requests 2.32.5
5
+ **API Endpoint**: https://paddleocr.aistudio-app.com/api/v2/ocr/jobs
6
+
7
+ ---
8
+
9
+ ## 测试结果总览
10
+
11
+ | # | 测试项                | 结果  | 耗时 | 说明                       |
12
+ | -----| ---------------------------------------| --------| ------| ---------------------------------------------------|
13
+ | 1 | OCR URL (PP-OCRv5)          | ✅ PASS | 3.6s | URL 输入,默认参数                |
14
+ | 2 | OCR URL + 自定义 Options       | ✅ PASS | 3.6s | 设置 use_doc_orientation_classify=True      |
15
+ | 3 | Doc Parsing URL (PP-StructureV3)   | ✅ PASS | 3.7s | 文档版面解析                   |
16
+ | 4 | Submit + Poll 分步调用        | ✅ PASS | 3.7s | 非阻塞 API:submit → get_result → wait_for_result |
17
+ | 5 | OCR 本地文件上传           | ✅ PASS | 4.3s | file_path 模式                  |
18
+ | 6 | 错误处理 (无效 token)         | ✅ PASS | 0.2s | 正确抛出 AuthError                |
19
+ | 7 | 输入校验               | ✅ PASS | 0.0s | 缺少输入 / 互斥参数均正确拦截           |
20
+ | 8 | Context Manager (with)        | ✅ PASS | 3.6s | with 语句正常工作                 |
21
+ | 9 | PaddleOCR-VL 模型           | ✅ PASS | 3.6s | VL 模型正常返回 markdown             |
22
+ | 10 | PaddleOCR-VL-1.5 模型         | ✅ PASS | 3.6s | VL-1.5 模型正常返回 markdown           |
23
+ | 11 | Doc Parsing 文件上传 (PP-StructureV3) | ✅ PASS | 4.3s | 本地文件上传 + 文档解析              |
24
+
25
+ **总计: 11 passed, 0 failed**
26
+
27
+ ---
28
+
29
+ ## 发现的 Bug(已修复验证)
30
+
31
+ ### 🔴 阻塞性 Bug: `fetch_jsonl` 请求 BOS 签名 URL 时携带了多余的 Authorization header
32
+
33
+ **文件**: `paddleocr/_api_client/_http.py` (同步) + `async_client.py` (异步)
34
+
35
+ **现象**: 任务提交和轮询均成功,但在最后一步下载 JSONL 结果文件时,SDK 使用带有 `Authorization: bearer <paddle_token>` 的 session 去请求百度 BOS 对象存储的预签名 URL。BOS 不认识这个 header,返回 400 Bad Request。
36
+
37
+ **根因**: `HTTPClient.fetch_jsonl()` 使用 `self._session.get(url)` 发起请求,而 session 在初始化时设置了 `Authorization` header。BOS 的预签名 URL 已经包含了自己的鉴权参数(`authorization=bce-auth-v1/...`),额外的 Authorization header 导致冲突。
38
+
39
+ **修复**: `fetch_jsonl` 应使用不带 auth header 的独立请求:
40
+ ```python
41
+ # 修复前
42
+ resp = self._session.get(url, timeout=self._timeout)
43
+
44
+ # 修复后
45
+ resp = requests.get(url, timeout=self._timeout)
46
+ ```
47
+
48
+ **影响范围**: 所有实际 API 调用(OCR、Doc Parsing、所有模型)在修复前均无法获取结果。这是一个 **必须在合入前修复的阻塞性 bug**。
49
+
50
+ ---
51
+
52
+ ## 其他已知问题(非阻塞,可后续迭代)
53
+
54
+ | 严重度 | 语言 | 问题 |
55
+ |--------|------|------|
56
+ | 中 | Python | AsyncAPIClient._poll_until_done 使用硬编码 DEFAULT_MAX_WAIT_TIME,忽略用户设置的 timeout |
57
+ | 中 | Go | submitURL/submitFile/getJobStatus 未使用 http.NewRequestWithContext,context 取消无法中断 HTTP 请求 |
58
+ | 中 | TypeScript | poller.ts 的 sleep 方法 abort listener 未设置 `{ once: true }`,长轮询会泄漏 listener |
59
+ | 中 | TypeScript | http.ts 的 fetchJsonl 未检查 resp.ok(同样的 BOS auth 问题可能也存在于 TS SDK) |
60
+ | 低 | 全部 | 轮询循环先 sleep 再 check,对已完成任务多等 3 秒 |
61
+ | 低 | Python | CLI argparse 的 store_true 传 False 而非 None,导致多余字段发送给 API |
62
+
63
+ ---
64
+
65
+ ## 结论
66
+
67
+ **修复 `fetch_jsonl` 的 auth header 问题后,Python SDK 的核心功能全部正常工作。** 4 个模型(PP-OCRv5、PP-StructureV3、PaddleOCR-VL、PaddleOCR-VL-1.5)均可正常调用,URL 输入和文件上传两种模式均可用,错误处理和输入校验逻辑正确。
68
+
69
+ **建议**:
70
+ 1. ⚠️ **合入前必须修复** `fetch_jsonl` 的 BOS auth header bug(Python 同步 + 异步,以及 Go/TypeScript SDK 中的同类问题)
71
+ 2. 其他问题可以合入后迭代修复
ocr-studio/PaddleOCR/ppocr/optimizer/regularizer.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ from __future__ import division
17
+ from __future__ import print_function
18
+ from __future__ import unicode_literals
19
+
20
+ import paddle
21
+
22
+
23
+ class L1Decay(object):
24
+ """
25
+ L1 Weight Decay Regularization, which encourages the weights to be sparse.
26
+ Args:
27
+ factor(float): regularization coeff. Default:0.0.
28
+ """
29
+
30
+ def __init__(self, factor=0.0):
31
+ super(L1Decay, self).__init__()
32
+ self.coeff = factor
33
+
34
+ def __call__(self):
35
+ reg = paddle.regularizer.L1Decay(self.coeff)
36
+ return reg
37
+
38
+
39
+ class L2Decay(object):
40
+ """
41
+ L2 Weight Decay Regularization, which helps to prevent the model over-fitting.
42
+ Args:
43
+ factor(float): regularization coeff. Default:0.0.
44
+ """
45
+
46
+ def __init__(self, factor=0.0):
47
+ super(L2Decay, self).__init__()
48
+ self.coeff = float(factor)
49
+
50
+ def __call__(self):
51
+ return self.coeff
ocr-studio/PaddleOCR/ppocr/postprocess/__init__.py ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ from __future__ import division
17
+ from __future__ import print_function
18
+ from __future__ import unicode_literals
19
+
20
+ import copy
21
+
22
+ __all__ = ['build_post_process']
23
+
24
+ from .db_postprocess import DBPostProcess, DistillationDBPostProcess
25
+ from .east_postprocess import EASTPostProcess
26
+ from .sast_postprocess import SASTPostProcess
27
+ from .fce_postprocess import FCEPostProcess
28
+ from .rec_postprocess import CTCLabelDecode, AttnLabelDecode, SRNLabelDecode, \
29
+ DistillationCTCLabelDecode, NRTRLabelDecode, SARLabelDecode, \
30
+ SEEDLabelDecode, PRENLabelDecode, ViTSTRLabelDecode, ABINetLabelDecode, \
31
+ SPINLabelDecode, VLLabelDecode, RFLLabelDecode, SATRNLabelDecode, ParseQLabelDecode, \
32
+ CPPDLabelDecode
33
+ from .cls_postprocess import ClsPostProcess
34
+ from .pg_postprocess import PGPostProcess
35
+ from .vqa_token_ser_layoutlm_postprocess import VQASerTokenLayoutLMPostProcess, DistillationSerPostProcess
36
+ from .vqa_token_re_layoutlm_postprocess import VQAReTokenLayoutLMPostProcess, DistillationRePostProcess
37
+ from .table_postprocess import TableMasterLabelDecode, TableLabelDecode
38
+ from .picodet_postprocess import PicoDetPostProcess
39
+ from .ct_postprocess import CTPostProcess
40
+ from .drrg_postprocess import DRRGPostprocess
41
+ from .rec_postprocess import CANLabelDecode
42
+
43
+
44
+ def build_post_process(config, global_config=None):
45
+ support_dict = [
46
+ 'DBPostProcess', 'EASTPostProcess', 'SASTPostProcess', 'FCEPostProcess',
47
+ 'CTCLabelDecode', 'AttnLabelDecode', 'ClsPostProcess', 'SRNLabelDecode',
48
+ 'PGPostProcess', 'DistillationCTCLabelDecode', 'TableLabelDecode',
49
+ 'DistillationDBPostProcess', 'NRTRLabelDecode', 'SARLabelDecode',
50
+ 'SEEDLabelDecode', 'VQASerTokenLayoutLMPostProcess',
51
+ 'VQAReTokenLayoutLMPostProcess', 'PRENLabelDecode',
52
+ 'DistillationSARLabelDecode', 'ViTSTRLabelDecode', 'ABINetLabelDecode',
53
+ 'TableMasterLabelDecode', 'SPINLabelDecode',
54
+ 'DistillationSerPostProcess', 'DistillationRePostProcess',
55
+ 'VLLabelDecode', 'PicoDetPostProcess', 'CTPostProcess',
56
+ 'RFLLabelDecode', 'DRRGPostprocess', 'CANLabelDecode',
57
+ 'SATRNLabelDecode', 'ParseQLabelDecode', 'CPPDLabelDecode'
58
+ ]
59
+
60
+ if config['name'] == 'PSEPostProcess':
61
+ from .pse_postprocess import PSEPostProcess
62
+ support_dict.append('PSEPostProcess')
63
+
64
+ config = copy.deepcopy(config)
65
+ module_name = config.pop('name')
66
+ if module_name == "None":
67
+ return
68
+ if global_config is not None:
69
+ config.update(global_config)
70
+ assert module_name in support_dict, Exception(
71
+ 'post process only support {}'.format(support_dict))
72
+ module_class = eval(module_name)(**config)
73
+ return module_class
ocr-studio/PaddleOCR/ppocr/postprocess/cls_postprocess.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import paddle
15
+
16
+
17
+ class ClsPostProcess(object):
18
+ """ Convert between text-label and text-index """
19
+
20
+ def __init__(self, label_list=None, key=None, **kwargs):
21
+ super(ClsPostProcess, self).__init__()
22
+ self.label_list = label_list
23
+ self.key = key
24
+
25
+ def __call__(self, preds, label=None, *args, **kwargs):
26
+ if self.key is not None:
27
+ preds = preds[self.key]
28
+
29
+ label_list = self.label_list
30
+ if label_list is None:
31
+ label_list = {idx: idx for idx in range(preds.shape[-1])}
32
+
33
+ if isinstance(preds, paddle.Tensor):
34
+ preds = preds.numpy()
35
+
36
+ pred_idxs = preds.argmax(axis=1)
37
+ decode_out = [(label_list[idx], preds[i, idx])
38
+ for i, idx in enumerate(pred_idxs)]
39
+ if label is None:
40
+ return decode_out
41
+ label = [(label_list[idx], 1.0) for idx in label]
42
+ return decode_out, label
ocr-studio/PaddleOCR/ppocr/postprocess/ct_postprocess.py ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ """
15
+ This code is refered from:
16
+ https://github.com/shengtao96/CentripetalText/blob/main/test.py
17
+ """
18
+
19
+ from __future__ import absolute_import
20
+ from __future__ import division
21
+ from __future__ import print_function
22
+
23
+ import os
24
+ import os.path as osp
25
+ import numpy as np
26
+ import cv2
27
+ import paddle
28
+ import pyclipper
29
+
30
+
31
+ class CTPostProcess(object):
32
+ """
33
+ The post process for Centripetal Text (CT).
34
+ """
35
+
36
+ def __init__(self, min_score=0.88, min_area=16, box_type='poly', **kwargs):
37
+ self.min_score = min_score
38
+ self.min_area = min_area
39
+ self.box_type = box_type
40
+
41
+ self.coord = np.zeros((2, 300, 300), dtype=np.int32)
42
+ for i in range(300):
43
+ for j in range(300):
44
+ self.coord[0, i, j] = j
45
+ self.coord[1, i, j] = i
46
+
47
+ def __call__(self, preds, batch):
48
+ outs = preds['maps']
49
+ out_scores = preds['score']
50
+
51
+ if isinstance(outs, paddle.Tensor):
52
+ outs = outs.numpy()
53
+ if isinstance(out_scores, paddle.Tensor):
54
+ out_scores = out_scores.numpy()
55
+
56
+ batch_size = outs.shape[0]
57
+ boxes_batch = []
58
+ for idx in range(batch_size):
59
+ bboxes = []
60
+ scores = []
61
+
62
+ img_shape = batch[idx]
63
+
64
+ org_img_size = img_shape[:3]
65
+ img_shape = img_shape[3:]
66
+ img_size = img_shape[:2]
67
+
68
+ out = np.expand_dims(outs[idx], axis=0)
69
+ outputs = dict()
70
+
71
+ score = np.expand_dims(out_scores[idx], axis=0)
72
+
73
+ kernel = out[:, 0, :, :] > 0.2
74
+ loc = out[:, 1:, :, :].astype("float32")
75
+
76
+ score = score[0].astype(np.float32)
77
+ kernel = kernel[0].astype(np.uint8)
78
+ loc = loc[0].astype(np.float32)
79
+
80
+ label_num, label_kernel = cv2.connectedComponents(
81
+ kernel, connectivity=4)
82
+
83
+ for i in range(1, label_num):
84
+ ind = (label_kernel == i)
85
+ if ind.sum(
86
+ ) < 10: # pixel number less than 10, treated as background
87
+ label_kernel[ind] = 0
88
+
89
+ label = np.zeros_like(label_kernel)
90
+ h, w = label_kernel.shape
91
+ pixels = self.coord[:, :h, :w].reshape(2, -1)
92
+ points = pixels.transpose([1, 0]).astype(np.float32)
93
+
94
+ off_points = (points + 10. / 4. * loc[:, pixels[1], pixels[0]].T
95
+ ).astype(np.int32)
96
+ off_points[:, 0] = np.clip(off_points[:, 0], 0, label.shape[1] - 1)
97
+ off_points[:, 1] = np.clip(off_points[:, 1], 0, label.shape[0] - 1)
98
+
99
+ label[pixels[1], pixels[0]] = label_kernel[off_points[:, 1],
100
+ off_points[:, 0]]
101
+ label[label_kernel > 0] = label_kernel[label_kernel > 0]
102
+
103
+ score_pocket = [0.0]
104
+ for i in range(1, label_num):
105
+ ind = (label_kernel == i)
106
+ if ind.sum() == 0:
107
+ score_pocket.append(0.0)
108
+ continue
109
+ score_i = np.mean(score[ind])
110
+ score_pocket.append(score_i)
111
+
112
+ label_num = np.max(label) + 1
113
+ label = cv2.resize(
114
+ label, (img_size[1], img_size[0]),
115
+ interpolation=cv2.INTER_NEAREST)
116
+
117
+ scale = (float(org_img_size[1]) / float(img_size[1]),
118
+ float(org_img_size[0]) / float(img_size[0]))
119
+
120
+ for i in range(1, label_num):
121
+ ind = (label == i)
122
+ points = np.array(np.where(ind)).transpose((1, 0))
123
+
124
+ if points.shape[0] < self.min_area:
125
+ continue
126
+
127
+ score_i = score_pocket[i]
128
+ if score_i < self.min_score:
129
+ continue
130
+
131
+ if self.box_type == 'rect':
132
+ rect = cv2.minAreaRect(points[:, ::-1])
133
+ bbox = cv2.boxPoints(rect) * scale
134
+ z = bbox.mean(0)
135
+ bbox = z + (bbox - z) * 0.85
136
+ elif self.box_type == 'poly':
137
+ binary = np.zeros(label.shape, dtype='uint8')
138
+ binary[ind] = 1
139
+ try:
140
+ _, contours, _ = cv2.findContours(
141
+ binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
142
+ except BaseException:
143
+ contours, _ = cv2.findContours(
144
+ binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
145
+
146
+ bbox = contours[0] * scale
147
+
148
+ bbox = bbox.astype('int32')
149
+ bboxes.append(bbox.reshape(-1, 2))
150
+ scores.append(score_i)
151
+
152
+ boxes_batch.append({'points': bboxes})
153
+
154
+ return boxes_batch
ocr-studio/PaddleOCR/ppocr/postprocess/db_postprocess.py ADDED
@@ -0,0 +1,276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ """
15
+ This code is refered from:
16
+ https://github.com/WenmuZhou/DBNet.pytorch/blob/master/post_processing/seg_detector_representer.py
17
+ """
18
+ from __future__ import absolute_import
19
+ from __future__ import division
20
+ from __future__ import print_function
21
+
22
+ import numpy as np
23
+ import cv2
24
+ import paddle
25
+ from shapely.geometry import Polygon
26
+ import pyclipper
27
+
28
+
29
+ class DBPostProcess(object):
30
+ """
31
+ The post process for Differentiable Binarization (DB).
32
+ """
33
+
34
+ def __init__(self,
35
+ thresh=0.3,
36
+ box_thresh=0.7,
37
+ max_candidates=1000,
38
+ unclip_ratio=2.0,
39
+ use_dilation=False,
40
+ score_mode="fast",
41
+ box_type='quad',
42
+ **kwargs):
43
+ self.thresh = thresh
44
+ self.box_thresh = box_thresh
45
+ self.max_candidates = max_candidates
46
+ self.unclip_ratio = unclip_ratio
47
+ self.min_size = 3
48
+ self.score_mode = score_mode
49
+ self.box_type = box_type
50
+ assert score_mode in [
51
+ "slow", "fast"
52
+ ], "Score mode must be in [slow, fast] but got: {}".format(score_mode)
53
+
54
+ self.dilation_kernel = None if not use_dilation else np.array(
55
+ [[1, 1], [1, 1]])
56
+
57
+ def polygons_from_bitmap(self, pred, _bitmap, dest_width, dest_height):
58
+ '''
59
+ _bitmap: single map with shape (1, H, W),
60
+ whose values are binarized as {0, 1}
61
+ '''
62
+
63
+ bitmap = _bitmap
64
+ height, width = bitmap.shape
65
+
66
+ boxes = []
67
+ scores = []
68
+
69
+ contours, _ = cv2.findContours((bitmap * 255).astype(np.uint8),
70
+ cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
71
+
72
+ for contour in contours[:self.max_candidates]:
73
+ epsilon = 0.002 * cv2.arcLength(contour, True)
74
+ approx = cv2.approxPolyDP(contour, epsilon, True)
75
+ points = approx.reshape((-1, 2))
76
+ if points.shape[0] < 4:
77
+ continue
78
+
79
+ score = self.box_score_fast(pred, points.reshape(-1, 2))
80
+ if self.box_thresh > score:
81
+ continue
82
+
83
+ if points.shape[0] > 2:
84
+ box = self.unclip(points, self.unclip_ratio)
85
+ if len(box) > 1:
86
+ continue
87
+ else:
88
+ continue
89
+ box = box.reshape(-1, 2)
90
+
91
+ _, sside = self.get_mini_boxes(box.reshape((-1, 1, 2)))
92
+ if sside < self.min_size + 2:
93
+ continue
94
+
95
+ box = np.array(box)
96
+ box[:, 0] = np.clip(
97
+ np.round(box[:, 0] / width * dest_width), 0, dest_width)
98
+ box[:, 1] = np.clip(
99
+ np.round(box[:, 1] / height * dest_height), 0, dest_height)
100
+ boxes.append(box.tolist())
101
+ scores.append(score)
102
+ return boxes, scores
103
+
104
+ def boxes_from_bitmap(self, pred, _bitmap, dest_width, dest_height):
105
+ '''
106
+ _bitmap: single map with shape (1, H, W),
107
+ whose values are binarized as {0, 1}
108
+ '''
109
+
110
+ bitmap = _bitmap
111
+ height, width = bitmap.shape
112
+
113
+ outs = cv2.findContours((bitmap * 255).astype(np.uint8), cv2.RETR_LIST,
114
+ cv2.CHAIN_APPROX_SIMPLE)
115
+ if len(outs) == 3:
116
+ img, contours, _ = outs[0], outs[1], outs[2]
117
+ elif len(outs) == 2:
118
+ contours, _ = outs[0], outs[1]
119
+
120
+ num_contours = min(len(contours), self.max_candidates)
121
+
122
+ boxes = []
123
+ scores = []
124
+ for index in range(num_contours):
125
+ contour = contours[index]
126
+ points, sside = self.get_mini_boxes(contour)
127
+ if sside < self.min_size:
128
+ continue
129
+ points = np.array(points)
130
+ if self.score_mode == "fast":
131
+ score = self.box_score_fast(pred, points.reshape(-1, 2))
132
+ else:
133
+ score = self.box_score_slow(pred, contour)
134
+ if self.box_thresh > score:
135
+ continue
136
+
137
+ box = self.unclip(points, self.unclip_ratio).reshape(-1, 1, 2)
138
+ box, sside = self.get_mini_boxes(box)
139
+ if sside < self.min_size + 2:
140
+ continue
141
+ box = np.array(box)
142
+
143
+ box[:, 0] = np.clip(
144
+ np.round(box[:, 0] / width * dest_width), 0, dest_width)
145
+ box[:, 1] = np.clip(
146
+ np.round(box[:, 1] / height * dest_height), 0, dest_height)
147
+ boxes.append(box.astype("int32"))
148
+ scores.append(score)
149
+ return np.array(boxes, dtype="int32"), scores
150
+
151
+ def unclip(self, box, unclip_ratio):
152
+ poly = Polygon(box)
153
+ distance = poly.area * unclip_ratio / poly.length
154
+ offset = pyclipper.PyclipperOffset()
155
+ offset.AddPath(box, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)
156
+ expanded = np.array(offset.Execute(distance))
157
+ return expanded
158
+
159
+ def get_mini_boxes(self, contour):
160
+ bounding_box = cv2.minAreaRect(contour)
161
+ points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0])
162
+
163
+ index_1, index_2, index_3, index_4 = 0, 1, 2, 3
164
+ if points[1][1] > points[0][1]:
165
+ index_1 = 0
166
+ index_4 = 1
167
+ else:
168
+ index_1 = 1
169
+ index_4 = 0
170
+ if points[3][1] > points[2][1]:
171
+ index_2 = 2
172
+ index_3 = 3
173
+ else:
174
+ index_2 = 3
175
+ index_3 = 2
176
+
177
+ box = [
178
+ points[index_1], points[index_2], points[index_3], points[index_4]
179
+ ]
180
+ return box, min(bounding_box[1])
181
+
182
+ def box_score_fast(self, bitmap, _box):
183
+ '''
184
+ box_score_fast: use bbox mean score as the mean score
185
+ '''
186
+ h, w = bitmap.shape[:2]
187
+ box = _box.copy()
188
+ xmin = np.clip(np.floor(box[:, 0].min()).astype("int32"), 0, w - 1)
189
+ xmax = np.clip(np.ceil(box[:, 0].max()).astype("int32"), 0, w - 1)
190
+ ymin = np.clip(np.floor(box[:, 1].min()).astype("int32"), 0, h - 1)
191
+ ymax = np.clip(np.ceil(box[:, 1].max()).astype("int32"), 0, h - 1)
192
+
193
+ mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8)
194
+ box[:, 0] = box[:, 0] - xmin
195
+ box[:, 1] = box[:, 1] - ymin
196
+ cv2.fillPoly(mask, box.reshape(1, -1, 2).astype("int32"), 1)
197
+ return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0]
198
+
199
+ def box_score_slow(self, bitmap, contour):
200
+ '''
201
+ box_score_slow: use polyon mean score as the mean score
202
+ '''
203
+ h, w = bitmap.shape[:2]
204
+ contour = contour.copy()
205
+ contour = np.reshape(contour, (-1, 2))
206
+
207
+ xmin = np.clip(np.min(contour[:, 0]), 0, w - 1)
208
+ xmax = np.clip(np.max(contour[:, 0]), 0, w - 1)
209
+ ymin = np.clip(np.min(contour[:, 1]), 0, h - 1)
210
+ ymax = np.clip(np.max(contour[:, 1]), 0, h - 1)
211
+
212
+ mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8)
213
+
214
+ contour[:, 0] = contour[:, 0] - xmin
215
+ contour[:, 1] = contour[:, 1] - ymin
216
+
217
+ cv2.fillPoly(mask, contour.reshape(1, -1, 2).astype("int32"), 1)
218
+ return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0]
219
+
220
+ def __call__(self, outs_dict, shape_list):
221
+ pred = outs_dict['maps']
222
+ if isinstance(pred, paddle.Tensor):
223
+ pred = pred.numpy()
224
+ pred = pred[:, 0, :, :]
225
+ segmentation = pred > self.thresh
226
+
227
+ boxes_batch = []
228
+ for batch_index in range(pred.shape[0]):
229
+ src_h, src_w, ratio_h, ratio_w = shape_list[batch_index]
230
+ if self.dilation_kernel is not None:
231
+ mask = cv2.dilate(
232
+ np.array(segmentation[batch_index]).astype(np.uint8),
233
+ self.dilation_kernel)
234
+ else:
235
+ mask = segmentation[batch_index]
236
+ if self.box_type == 'poly':
237
+ boxes, scores = self.polygons_from_bitmap(pred[batch_index],
238
+ mask, src_w, src_h)
239
+ elif self.box_type == 'quad':
240
+ boxes, scores = self.boxes_from_bitmap(pred[batch_index], mask,
241
+ src_w, src_h)
242
+ else:
243
+ raise ValueError("box_type can only be one of ['quad', 'poly']")
244
+
245
+ boxes_batch.append({'points': boxes})
246
+ return boxes_batch
247
+
248
+
249
+ class DistillationDBPostProcess(object):
250
+ def __init__(self,
251
+ model_name=["student"],
252
+ key=None,
253
+ thresh=0.3,
254
+ box_thresh=0.6,
255
+ max_candidates=1000,
256
+ unclip_ratio=1.5,
257
+ use_dilation=False,
258
+ score_mode="fast",
259
+ box_type='quad',
260
+ **kwargs):
261
+ self.model_name = model_name
262
+ self.key = key
263
+ self.post_process = DBPostProcess(
264
+ thresh=thresh,
265
+ box_thresh=box_thresh,
266
+ max_candidates=max_candidates,
267
+ unclip_ratio=unclip_ratio,
268
+ use_dilation=use_dilation,
269
+ score_mode=score_mode,
270
+ box_type=box_type)
271
+
272
+ def __call__(self, predicts, shape_list):
273
+ results = {}
274
+ for k in self.model_name:
275
+ results[k] = self.post_process(predicts[k], shape_list=shape_list)
276
+ return results
ocr-studio/PaddleOCR/ppocr/postprocess/drrg_postprocess.py ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2022 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ """
15
+ This code is refer from:
16
+ https://github.com/open-mmlab/mmocr/blob/main/mmocr/models/textdet/postprocess/drrg_postprocessor.py
17
+ """
18
+
19
+ import functools
20
+ import operator
21
+
22
+ import numpy as np
23
+ import paddle
24
+ from numpy.linalg import norm
25
+ import cv2
26
+
27
+
28
+ class Node:
29
+ def __init__(self, ind):
30
+ self.__ind = ind
31
+ self.__links = set()
32
+
33
+ @property
34
+ def ind(self):
35
+ return self.__ind
36
+
37
+ @property
38
+ def links(self):
39
+ return set(self.__links)
40
+
41
+ def add_link(self, link_node):
42
+ self.__links.add(link_node)
43
+ link_node.__links.add(self)
44
+
45
+
46
+ def graph_propagation(edges, scores, text_comps, edge_len_thr=50.):
47
+ assert edges.ndim == 2
48
+ assert edges.shape[1] == 2
49
+ assert edges.shape[0] == scores.shape[0]
50
+ assert text_comps.ndim == 2
51
+ assert isinstance(edge_len_thr, float)
52
+
53
+ edges = np.sort(edges, axis=1)
54
+ score_dict = {}
55
+ for i, edge in enumerate(edges):
56
+ if text_comps is not None:
57
+ box1 = text_comps[edge[0], :8].reshape(4, 2)
58
+ box2 = text_comps[edge[1], :8].reshape(4, 2)
59
+ center1 = np.mean(box1, axis=0)
60
+ center2 = np.mean(box2, axis=0)
61
+ distance = norm(center1 - center2)
62
+ if distance > edge_len_thr:
63
+ scores[i] = 0
64
+ if (edge[0], edge[1]) in score_dict:
65
+ score_dict[edge[0], edge[1]] = 0.5 * (
66
+ score_dict[edge[0], edge[1]] + scores[i])
67
+ else:
68
+ score_dict[edge[0], edge[1]] = scores[i]
69
+
70
+ nodes = np.sort(np.unique(edges.flatten()))
71
+ mapping = -1 * np.ones((np.max(nodes) + 1), dtype=np.int32)
72
+ mapping[nodes] = np.arange(nodes.shape[0])
73
+ order_inds = mapping[edges]
74
+ vertices = [Node(node) for node in nodes]
75
+ for ind in order_inds:
76
+ vertices[ind[0]].add_link(vertices[ind[1]])
77
+
78
+ return vertices, score_dict
79
+
80
+
81
+ def connected_components(nodes, score_dict, link_thr):
82
+ assert isinstance(nodes, list)
83
+ assert all([isinstance(node, Node) for node in nodes])
84
+ assert isinstance(score_dict, dict)
85
+ assert isinstance(link_thr, float)
86
+
87
+ clusters = []
88
+ nodes = set(nodes)
89
+ while nodes:
90
+ node = nodes.pop()
91
+ cluster = {node}
92
+ node_queue = [node]
93
+ while node_queue:
94
+ node = node_queue.pop(0)
95
+ neighbors = set([
96
+ neighbor for neighbor in node.links if
97
+ score_dict[tuple(sorted([node.ind, neighbor.ind]))] >= link_thr
98
+ ])
99
+ neighbors.difference_update(cluster)
100
+ nodes.difference_update(neighbors)
101
+ cluster.update(neighbors)
102
+ node_queue.extend(neighbors)
103
+ clusters.append(list(cluster))
104
+ return clusters
105
+
106
+
107
+ def clusters2labels(clusters, num_nodes):
108
+ assert isinstance(clusters, list)
109
+ assert all([isinstance(cluster, list) for cluster in clusters])
110
+ assert all(
111
+ [isinstance(node, Node) for cluster in clusters for node in cluster])
112
+ assert isinstance(num_nodes, int)
113
+
114
+ node_labels = np.zeros(num_nodes)
115
+ for cluster_ind, cluster in enumerate(clusters):
116
+ for node in cluster:
117
+ node_labels[node.ind] = cluster_ind
118
+ return node_labels
119
+
120
+
121
+ def remove_single(text_comps, comp_pred_labels):
122
+ assert text_comps.ndim == 2
123
+ assert text_comps.shape[0] == comp_pred_labels.shape[0]
124
+
125
+ single_flags = np.zeros_like(comp_pred_labels)
126
+ pred_labels = np.unique(comp_pred_labels)
127
+ for label in pred_labels:
128
+ current_label_flag = (comp_pred_labels == label)
129
+ if np.sum(current_label_flag) == 1:
130
+ single_flags[np.where(current_label_flag)[0][0]] = 1
131
+ keep_ind = [i for i in range(len(comp_pred_labels)) if not single_flags[i]]
132
+ filtered_text_comps = text_comps[keep_ind, :]
133
+ filtered_labels = comp_pred_labels[keep_ind]
134
+
135
+ return filtered_text_comps, filtered_labels
136
+
137
+
138
+ def norm2(point1, point2):
139
+ return ((point1[0] - point2[0])**2 + (point1[1] - point2[1])**2)**0.5
140
+
141
+
142
+ def min_connect_path(points):
143
+ assert isinstance(points, list)
144
+ assert all([isinstance(point, list) for point in points])
145
+ assert all([isinstance(coord, int) for point in points for coord in point])
146
+
147
+ points_queue = points.copy()
148
+ shortest_path = []
149
+ current_edge = [[], []]
150
+
151
+ edge_dict0 = {}
152
+ edge_dict1 = {}
153
+ current_edge[0] = points_queue[0]
154
+ current_edge[1] = points_queue[0]
155
+ points_queue.remove(points_queue[0])
156
+ while points_queue:
157
+ for point in points_queue:
158
+ length0 = norm2(point, current_edge[0])
159
+ edge_dict0[length0] = [point, current_edge[0]]
160
+ length1 = norm2(current_edge[1], point)
161
+ edge_dict1[length1] = [current_edge[1], point]
162
+ key0 = min(edge_dict0.keys())
163
+ key1 = min(edge_dict1.keys())
164
+
165
+ if key0 <= key1:
166
+ start = edge_dict0[key0][0]
167
+ end = edge_dict0[key0][1]
168
+ shortest_path.insert(0, [points.index(start), points.index(end)])
169
+ points_queue.remove(start)
170
+ current_edge[0] = start
171
+ else:
172
+ start = edge_dict1[key1][0]
173
+ end = edge_dict1[key1][1]
174
+ shortest_path.append([points.index(start), points.index(end)])
175
+ points_queue.remove(end)
176
+ current_edge[1] = end
177
+
178
+ edge_dict0 = {}
179
+ edge_dict1 = {}
180
+
181
+ shortest_path = functools.reduce(operator.concat, shortest_path)
182
+ shortest_path = sorted(set(shortest_path), key=shortest_path.index)
183
+
184
+ return shortest_path
185
+
186
+
187
+ def in_contour(cont, point):
188
+ x, y = point
189
+ is_inner = cv2.pointPolygonTest(cont, (int(x), int(y)), False) > 0.5
190
+ return is_inner
191
+
192
+
193
+ def fix_corner(top_line, bot_line, start_box, end_box):
194
+ assert isinstance(top_line, list)
195
+ assert all(isinstance(point, list) for point in top_line)
196
+ assert isinstance(bot_line, list)
197
+ assert all(isinstance(point, list) for point in bot_line)
198
+ assert start_box.shape == end_box.shape == (4, 2)
199
+
200
+ contour = np.array(top_line + bot_line[::-1])
201
+ start_left_mid = (start_box[0] + start_box[3]) / 2
202
+ start_right_mid = (start_box[1] + start_box[2]) / 2
203
+ end_left_mid = (end_box[0] + end_box[3]) / 2
204
+ end_right_mid = (end_box[1] + end_box[2]) / 2
205
+ if not in_contour(contour, start_left_mid):
206
+ top_line.insert(0, start_box[0].tolist())
207
+ bot_line.insert(0, start_box[3].tolist())
208
+ elif not in_contour(contour, start_right_mid):
209
+ top_line.insert(0, start_box[1].tolist())
210
+ bot_line.insert(0, start_box[2].tolist())
211
+ if not in_contour(contour, end_left_mid):
212
+ top_line.append(end_box[0].tolist())
213
+ bot_line.append(end_box[3].tolist())
214
+ elif not in_contour(contour, end_right_mid):
215
+ top_line.append(end_box[1].tolist())
216
+ bot_line.append(end_box[2].tolist())
217
+ return top_line, bot_line
218
+
219
+
220
+ def comps2boundaries(text_comps, comp_pred_labels):
221
+ assert text_comps.ndim == 2
222
+ assert len(text_comps) == len(comp_pred_labels)
223
+ boundaries = []
224
+ if len(text_comps) < 1:
225
+ return boundaries
226
+ for cluster_ind in range(0, int(np.max(comp_pred_labels)) + 1):
227
+ cluster_comp_inds = np.where(comp_pred_labels == cluster_ind)
228
+ text_comp_boxes = text_comps[cluster_comp_inds, :8].reshape(
229
+ (-1, 4, 2)).astype(np.int32)
230
+ score = np.mean(text_comps[cluster_comp_inds, -1])
231
+
232
+ if text_comp_boxes.shape[0] < 1:
233
+ continue
234
+
235
+ elif text_comp_boxes.shape[0] > 1:
236
+ centers = np.mean(text_comp_boxes, axis=1).astype(np.int32).tolist()
237
+ shortest_path = min_connect_path(centers)
238
+ text_comp_boxes = text_comp_boxes[shortest_path]
239
+ top_line = np.mean(
240
+ text_comp_boxes[:, 0:2, :], axis=1).astype(np.int32).tolist()
241
+ bot_line = np.mean(
242
+ text_comp_boxes[:, 2:4, :], axis=1).astype(np.int32).tolist()
243
+ top_line, bot_line = fix_corner(
244
+ top_line, bot_line, text_comp_boxes[0], text_comp_boxes[-1])
245
+ boundary_points = top_line + bot_line[::-1]
246
+
247
+ else:
248
+ top_line = text_comp_boxes[0, 0:2, :].astype(np.int32).tolist()
249
+ bot_line = text_comp_boxes[0, 2:4:-1, :].astype(np.int32).tolist()
250
+ boundary_points = top_line + bot_line
251
+
252
+ boundary = [p for coord in boundary_points for p in coord] + [score]
253
+ boundaries.append(boundary)
254
+
255
+ return boundaries
256
+
257
+
258
+ class DRRGPostprocess(object):
259
+ """Merge text components and construct boundaries of text instances.
260
+
261
+ Args:
262
+ link_thr (float): The edge score threshold.
263
+ """
264
+
265
+ def __init__(self, link_thr, **kwargs):
266
+ assert isinstance(link_thr, float)
267
+ self.link_thr = link_thr
268
+
269
+ def __call__(self, preds, shape_list):
270
+ """
271
+ Args:
272
+ edges (ndarray): The edge array of shape N * 2, each row is a node
273
+ index pair that makes up an edge in graph.
274
+ scores (ndarray): The edge score array of shape (N,).
275
+ text_comps (ndarray): The text components.
276
+
277
+ Returns:
278
+ List[list[float]]: The predicted boundaries of text instances.
279
+ """
280
+ edges, scores, text_comps = preds
281
+ if edges is not None:
282
+ if isinstance(edges, paddle.Tensor):
283
+ edges = edges.numpy()
284
+ if isinstance(scores, paddle.Tensor):
285
+ scores = scores.numpy()
286
+ if isinstance(text_comps, paddle.Tensor):
287
+ text_comps = text_comps.numpy()
288
+ assert len(edges) == len(scores)
289
+ assert text_comps.ndim == 2
290
+ assert text_comps.shape[1] == 9
291
+
292
+ vertices, score_dict = graph_propagation(edges, scores, text_comps)
293
+ clusters = connected_components(vertices, score_dict, self.link_thr)
294
+ pred_labels = clusters2labels(clusters, text_comps.shape[0])
295
+ text_comps, pred_labels = remove_single(text_comps, pred_labels)
296
+ boundaries = comps2boundaries(text_comps, pred_labels)
297
+ else:
298
+ boundaries = []
299
+
300
+ boundaries, scores = self.resize_boundary(
301
+ boundaries, (1 / shape_list[0, 2:]).tolist()[::-1])
302
+ boxes_batch = [dict(points=boundaries, scores=scores)]
303
+ return boxes_batch
304
+
305
+ def resize_boundary(self, boundaries, scale_factor):
306
+ """Rescale boundaries via scale_factor.
307
+
308
+ Args:
309
+ boundaries (list[list[float]]): The boundary list. Each boundary
310
+ with size 2k+1 with k>=4.
311
+ scale_factor(ndarray): The scale factor of size (4,).
312
+
313
+ Returns:
314
+ boundaries (list[list[float]]): The scaled boundaries.
315
+ """
316
+ boxes = []
317
+ scores = []
318
+ for b in boundaries:
319
+ sz = len(b)
320
+ scores.append(b[-1])
321
+ b = (np.array(b[:sz - 1]) *
322
+ (np.tile(scale_factor[:2], int(
323
+ (sz - 1) / 2)).reshape(1, sz - 1))).flatten().tolist()
324
+ boxes.append(np.array(b).reshape([-1, 2]))
325
+ return boxes, scores
ocr-studio/PaddleOCR/ppocr/postprocess/east_postprocess.py ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ from __future__ import division
17
+ from __future__ import print_function
18
+
19
+ import numpy as np
20
+ from .locality_aware_nms import nms_locality
21
+ import cv2
22
+ import paddle
23
+
24
+ import os
25
+ from ppocr.utils.utility import check_install
26
+ import sys
27
+
28
+
29
+ class EASTPostProcess(object):
30
+ """
31
+ The post process for EAST.
32
+ """
33
+
34
+ def __init__(self,
35
+ score_thresh=0.8,
36
+ cover_thresh=0.1,
37
+ nms_thresh=0.2,
38
+ **kwargs):
39
+
40
+ self.score_thresh = score_thresh
41
+ self.cover_thresh = cover_thresh
42
+ self.nms_thresh = nms_thresh
43
+
44
+ def restore_rectangle_quad(self, origin, geometry):
45
+ """
46
+ Restore rectangle from quadrangle.
47
+ """
48
+ # quad
49
+ origin_concat = np.concatenate(
50
+ (origin, origin, origin, origin), axis=1) # (n, 8)
51
+ pred_quads = origin_concat - geometry
52
+ pred_quads = pred_quads.reshape((-1, 4, 2)) # (n, 4, 2)
53
+ return pred_quads
54
+
55
+ def detect(self,
56
+ score_map,
57
+ geo_map,
58
+ score_thresh=0.8,
59
+ cover_thresh=0.1,
60
+ nms_thresh=0.2):
61
+ """
62
+ restore text boxes from score map and geo map
63
+ """
64
+
65
+ score_map = score_map[0]
66
+ geo_map = np.swapaxes(geo_map, 1, 0)
67
+ geo_map = np.swapaxes(geo_map, 1, 2)
68
+ # filter the score map
69
+ xy_text = np.argwhere(score_map > score_thresh)
70
+ if len(xy_text) == 0:
71
+ return []
72
+ # sort the text boxes via the y axis
73
+ xy_text = xy_text[np.argsort(xy_text[:, 0])]
74
+ #restore quad proposals
75
+ text_box_restored = self.restore_rectangle_quad(
76
+ xy_text[:, ::-1] * 4, geo_map[xy_text[:, 0], xy_text[:, 1], :])
77
+ boxes = np.zeros((text_box_restored.shape[0], 9), dtype=np.float32)
78
+ boxes[:, :8] = text_box_restored.reshape((-1, 8))
79
+ boxes[:, 8] = score_map[xy_text[:, 0], xy_text[:, 1]]
80
+
81
+ try:
82
+ check_install('lanms', 'lanms-nova')
83
+ import lanms
84
+ boxes = lanms.merge_quadrangle_n9(boxes, nms_thresh)
85
+ except:
86
+ print(
87
+ 'You should install lanms by pip3 install lanms-nova to speed up nms_locality'
88
+ )
89
+ boxes = nms_locality(boxes.astype(np.float64), nms_thresh)
90
+ if boxes.shape[0] == 0:
91
+ return []
92
+ # Here we filter some low score boxes by the average score map,
93
+ # this is different from the orginal paper.
94
+ for i, box in enumerate(boxes):
95
+ mask = np.zeros_like(score_map, dtype=np.uint8)
96
+ cv2.fillPoly(mask, box[:8].reshape(
97
+ (-1, 4, 2)).astype(np.int32) // 4, 1)
98
+ boxes[i, 8] = cv2.mean(score_map, mask)[0]
99
+ boxes = boxes[boxes[:, 8] > cover_thresh]
100
+ return boxes
101
+
102
+ def sort_poly(self, p):
103
+ """
104
+ Sort polygons.
105
+ """
106
+ min_axis = np.argmin(np.sum(p, axis=1))
107
+ p = p[[min_axis, (min_axis + 1) % 4,\
108
+ (min_axis + 2) % 4, (min_axis + 3) % 4]]
109
+ if abs(p[0, 0] - p[1, 0]) > abs(p[0, 1] - p[1, 1]):
110
+ return p
111
+ else:
112
+ return p[[0, 3, 2, 1]]
113
+
114
+ def __call__(self, outs_dict, shape_list):
115
+ score_list = outs_dict['f_score']
116
+ geo_list = outs_dict['f_geo']
117
+ if isinstance(score_list, paddle.Tensor):
118
+ score_list = score_list.numpy()
119
+ geo_list = geo_list.numpy()
120
+ img_num = len(shape_list)
121
+ dt_boxes_list = []
122
+ for ino in range(img_num):
123
+ score = score_list[ino]
124
+ geo = geo_list[ino]
125
+ boxes = self.detect(
126
+ score_map=score,
127
+ geo_map=geo,
128
+ score_thresh=self.score_thresh,
129
+ cover_thresh=self.cover_thresh,
130
+ nms_thresh=self.nms_thresh)
131
+ boxes_norm = []
132
+ if len(boxes) > 0:
133
+ h, w = score.shape[1:]
134
+ src_h, src_w, ratio_h, ratio_w = shape_list[ino]
135
+ boxes = boxes[:, :8].reshape((-1, 4, 2))
136
+ boxes[:, :, 0] /= ratio_w
137
+ boxes[:, :, 1] /= ratio_h
138
+ for i_box, box in enumerate(boxes):
139
+ box = self.sort_poly(box.astype(np.int32))
140
+ if np.linalg.norm(box[0] - box[1]) < 5 \
141
+ or np.linalg.norm(box[3] - box[0]) < 5:
142
+ continue
143
+ boxes_norm.append(box)
144
+ dt_boxes_list.append({'points': np.array(boxes_norm)})
145
+ return dt_boxes_list
ocr-studio/PaddleOCR/ppocr/postprocess/fce_postprocess.py ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2022 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ """
15
+ This code is refer from:
16
+ https://github.com/open-mmlab/mmocr/blob/v0.3.0/mmocr/models/textdet/postprocess/wrapper.py
17
+ """
18
+
19
+ import cv2
20
+ import paddle
21
+ import numpy as np
22
+ from numpy.fft import ifft
23
+ from ppocr.utils.poly_nms import poly_nms, valid_boundary
24
+
25
+
26
+ def fill_hole(input_mask):
27
+ h, w = input_mask.shape
28
+ canvas = np.zeros((h + 2, w + 2), np.uint8)
29
+ canvas[1:h + 1, 1:w + 1] = input_mask.copy()
30
+
31
+ mask = np.zeros((h + 4, w + 4), np.uint8)
32
+
33
+ cv2.floodFill(canvas, mask, (0, 0), 1)
34
+ canvas = canvas[1:h + 1, 1:w + 1].astype(np.bool_)
35
+
36
+ return ~canvas | input_mask
37
+
38
+
39
+ def fourier2poly(fourier_coeff, num_reconstr_points=50):
40
+ """ Inverse Fourier transform
41
+ Args:
42
+ fourier_coeff (ndarray): Fourier coefficients shaped (n, 2k+1),
43
+ with n and k being candidates number and Fourier degree
44
+ respectively.
45
+ num_reconstr_points (int): Number of reconstructed polygon points.
46
+ Returns:
47
+ Polygons (ndarray): The reconstructed polygons shaped (n, n')
48
+ """
49
+
50
+ a = np.zeros((len(fourier_coeff), num_reconstr_points), dtype='complex')
51
+ k = (len(fourier_coeff[0]) - 1) // 2
52
+
53
+ a[:, 0:k + 1] = fourier_coeff[:, k:]
54
+ a[:, -k:] = fourier_coeff[:, :k]
55
+
56
+ poly_complex = ifft(a) * num_reconstr_points
57
+ polygon = np.zeros((len(fourier_coeff), num_reconstr_points, 2))
58
+ polygon[:, :, 0] = poly_complex.real
59
+ polygon[:, :, 1] = poly_complex.imag
60
+ return polygon.astype('int32').reshape((len(fourier_coeff), -1))
61
+
62
+
63
+ class FCEPostProcess(object):
64
+ """
65
+ The post process for FCENet.
66
+ """
67
+
68
+ def __init__(self,
69
+ scales,
70
+ fourier_degree=5,
71
+ num_reconstr_points=50,
72
+ decoding_type='fcenet',
73
+ score_thr=0.3,
74
+ nms_thr=0.1,
75
+ alpha=1.0,
76
+ beta=1.0,
77
+ box_type='poly',
78
+ **kwargs):
79
+
80
+ self.scales = scales
81
+ self.fourier_degree = fourier_degree
82
+ self.num_reconstr_points = num_reconstr_points
83
+ self.decoding_type = decoding_type
84
+ self.score_thr = score_thr
85
+ self.nms_thr = nms_thr
86
+ self.alpha = alpha
87
+ self.beta = beta
88
+ self.box_type = box_type
89
+
90
+ def __call__(self, preds, shape_list):
91
+ score_maps = []
92
+ for key, value in preds.items():
93
+ if isinstance(value, paddle.Tensor):
94
+ value = value.numpy()
95
+ cls_res = value[:, :4, :, :]
96
+ reg_res = value[:, 4:, :, :]
97
+ score_maps.append([cls_res, reg_res])
98
+
99
+ return self.get_boundary(score_maps, shape_list)
100
+
101
+ def resize_boundary(self, boundaries, scale_factor):
102
+ """Rescale boundaries via scale_factor.
103
+
104
+ Args:
105
+ boundaries (list[list[float]]): The boundary list. Each boundary
106
+ with size 2k+1 with k>=4.
107
+ scale_factor(ndarray): The scale factor of size (4,).
108
+
109
+ Returns:
110
+ boundaries (list[list[float]]): The scaled boundaries.
111
+ """
112
+ boxes = []
113
+ scores = []
114
+ for b in boundaries:
115
+ sz = len(b)
116
+ valid_boundary(b, True)
117
+ scores.append(b[-1])
118
+ b = (np.array(b[:sz - 1]) *
119
+ (np.tile(scale_factor[:2], int(
120
+ (sz - 1) / 2)).reshape(1, sz - 1))).flatten().tolist()
121
+ boxes.append(np.array(b).reshape([-1, 2]))
122
+
123
+ return np.array(boxes, dtype=np.float32), scores
124
+
125
+ def get_boundary(self, score_maps, shape_list):
126
+ assert len(score_maps) == len(self.scales)
127
+ boundaries = []
128
+ for idx, score_map in enumerate(score_maps):
129
+ scale = self.scales[idx]
130
+ boundaries = boundaries + self._get_boundary_single(score_map,
131
+ scale)
132
+
133
+ # nms
134
+ boundaries = poly_nms(boundaries, self.nms_thr)
135
+ boundaries, scores = self.resize_boundary(
136
+ boundaries, (1 / shape_list[0, 2:]).tolist()[::-1])
137
+
138
+ boxes_batch = [dict(points=boundaries, scores=scores)]
139
+ return boxes_batch
140
+
141
+ def _get_boundary_single(self, score_map, scale):
142
+ assert len(score_map) == 2
143
+ assert score_map[1].shape[1] == 4 * self.fourier_degree + 2
144
+
145
+ return self.fcenet_decode(
146
+ preds=score_map,
147
+ fourier_degree=self.fourier_degree,
148
+ num_reconstr_points=self.num_reconstr_points,
149
+ scale=scale,
150
+ alpha=self.alpha,
151
+ beta=self.beta,
152
+ box_type=self.box_type,
153
+ score_thr=self.score_thr,
154
+ nms_thr=self.nms_thr)
155
+
156
+ def fcenet_decode(self,
157
+ preds,
158
+ fourier_degree,
159
+ num_reconstr_points,
160
+ scale,
161
+ alpha=1.0,
162
+ beta=2.0,
163
+ box_type='poly',
164
+ score_thr=0.3,
165
+ nms_thr=0.1):
166
+ """Decoding predictions of FCENet to instances.
167
+
168
+ Args:
169
+ preds (list(Tensor)): The head output tensors.
170
+ fourier_degree (int): The maximum Fourier transform degree k.
171
+ num_reconstr_points (int): The points number of the polygon
172
+ reconstructed from predicted Fourier coefficients.
173
+ scale (int): The down-sample scale of the prediction.
174
+ alpha (float) : The parameter to calculate final scores. Score_{final}
175
+ = (Score_{text region} ^ alpha)
176
+ * (Score_{text center region}^ beta)
177
+ beta (float) : The parameter to calculate final score.
178
+ box_type (str): Boundary encoding type 'poly' or 'quad'.
179
+ score_thr (float) : The threshold used to filter out the final
180
+ candidates.
181
+ nms_thr (float) : The threshold of nms.
182
+
183
+ Returns:
184
+ boundaries (list[list[float]]): The instance boundary and confidence
185
+ list.
186
+ """
187
+ assert isinstance(preds, list)
188
+ assert len(preds) == 2
189
+ assert box_type in ['poly', 'quad']
190
+
191
+ cls_pred = preds[0][0]
192
+ tr_pred = cls_pred[0:2]
193
+ tcl_pred = cls_pred[2:]
194
+
195
+ reg_pred = preds[1][0].transpose([1, 2, 0])
196
+ x_pred = reg_pred[:, :, :2 * fourier_degree + 1]
197
+ y_pred = reg_pred[:, :, 2 * fourier_degree + 1:]
198
+
199
+ score_pred = (tr_pred[1]**alpha) * (tcl_pred[1]**beta)
200
+ tr_pred_mask = (score_pred) > score_thr
201
+ tr_mask = fill_hole(tr_pred_mask)
202
+
203
+ tr_contours, _ = cv2.findContours(
204
+ tr_mask.astype(np.uint8), cv2.RETR_TREE,
205
+ cv2.CHAIN_APPROX_SIMPLE) # opencv4
206
+
207
+ mask = np.zeros_like(tr_mask)
208
+ boundaries = []
209
+ for cont in tr_contours:
210
+ deal_map = mask.copy().astype(np.int8)
211
+ cv2.drawContours(deal_map, [cont], -1, 1, -1)
212
+
213
+ score_map = score_pred * deal_map
214
+ score_mask = score_map > 0
215
+ xy_text = np.argwhere(score_mask)
216
+ dxy = xy_text[:, 1] + xy_text[:, 0] * 1j
217
+
218
+ x, y = x_pred[score_mask], y_pred[score_mask]
219
+ c = x + y * 1j
220
+ c[:, fourier_degree] = c[:, fourier_degree] + dxy
221
+ c *= scale
222
+
223
+ polygons = fourier2poly(c, num_reconstr_points)
224
+ score = score_map[score_mask].reshape(-1, 1)
225
+ polygons = poly_nms(np.hstack((polygons, score)).tolist(), nms_thr)
226
+
227
+ boundaries = boundaries + polygons
228
+
229
+ boundaries = poly_nms(boundaries, nms_thr)
230
+
231
+ if box_type == 'quad':
232
+ new_boundaries = []
233
+ for boundary in boundaries:
234
+ poly = np.array(boundary[:-1]).reshape(-1, 2).astype(np.float32)
235
+ score = boundary[-1]
236
+ points = cv2.boxPoints(cv2.minAreaRect(poly))
237
+ points = np.int64(points)
238
+ new_boundaries.append(points.reshape(-1).tolist() + [score])
239
+ boundaries = new_boundaries
240
+
241
+ return boundaries
ocr-studio/PaddleOCR/ppocr/postprocess/locality_aware_nms.py ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Locality aware nms.
3
+ This code is refered from: https://github.com/songdejia/EAST/blob/master/locality_aware_nms.py
4
+ """
5
+
6
+ import numpy as np
7
+ from shapely.geometry import Polygon
8
+
9
+
10
+ def intersection(g, p):
11
+ """
12
+ Intersection.
13
+ """
14
+ g = Polygon(g[:8].reshape((4, 2)))
15
+ p = Polygon(p[:8].reshape((4, 2)))
16
+ g = g.buffer(0)
17
+ p = p.buffer(0)
18
+ if not g.is_valid or not p.is_valid:
19
+ return 0
20
+ inter = Polygon(g).intersection(Polygon(p)).area
21
+ union = g.area + p.area - inter
22
+ if union == 0:
23
+ return 0
24
+ else:
25
+ return inter / union
26
+
27
+
28
+ def intersection_iog(g, p):
29
+ """
30
+ Intersection_iog.
31
+ """
32
+ g = Polygon(g[:8].reshape((4, 2)))
33
+ p = Polygon(p[:8].reshape((4, 2)))
34
+ if not g.is_valid or not p.is_valid:
35
+ return 0
36
+ inter = Polygon(g).intersection(Polygon(p)).area
37
+ #union = g.area + p.area - inter
38
+ union = p.area
39
+ if union == 0:
40
+ print("p_area is very small")
41
+ return 0
42
+ else:
43
+ return inter / union
44
+
45
+
46
+ def weighted_merge(g, p):
47
+ """
48
+ Weighted merge.
49
+ """
50
+ g[:8] = (g[8] * g[:8] + p[8] * p[:8]) / (g[8] + p[8])
51
+ g[8] = (g[8] + p[8])
52
+ return g
53
+
54
+
55
+ def standard_nms(S, thres):
56
+ """
57
+ Standard nms.
58
+ """
59
+ order = np.argsort(S[:, 8])[::-1]
60
+ keep = []
61
+ while order.size > 0:
62
+ i = order[0]
63
+ keep.append(i)
64
+ ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])
65
+
66
+ inds = np.where(ovr <= thres)[0]
67
+ order = order[inds + 1]
68
+
69
+ return S[keep]
70
+
71
+
72
+ def standard_nms_inds(S, thres):
73
+ """
74
+ Standard nms, retun inds.
75
+ """
76
+ order = np.argsort(S[:, 8])[::-1]
77
+ keep = []
78
+ while order.size > 0:
79
+ i = order[0]
80
+ keep.append(i)
81
+ ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])
82
+
83
+ inds = np.where(ovr <= thres)[0]
84
+ order = order[inds + 1]
85
+
86
+ return keep
87
+
88
+
89
+ def nms(S, thres):
90
+ """
91
+ nms.
92
+ """
93
+ order = np.argsort(S[:, 8])[::-1]
94
+ keep = []
95
+ while order.size > 0:
96
+ i = order[0]
97
+ keep.append(i)
98
+ ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])
99
+
100
+ inds = np.where(ovr <= thres)[0]
101
+ order = order[inds + 1]
102
+
103
+ return keep
104
+
105
+
106
+ def soft_nms(boxes_in, Nt_thres=0.3, threshold=0.8, sigma=0.5, method=2):
107
+ """
108
+ soft_nms
109
+ :para boxes_in, N x 9 (coords + score)
110
+ :para threshould, eliminate cases min score(0.001)
111
+ :para Nt_thres, iou_threshi
112
+ :para sigma, gaussian weght
113
+ :method, linear or gaussian
114
+ """
115
+ boxes = boxes_in.copy()
116
+ N = boxes.shape[0]
117
+ if N is None or N < 1:
118
+ return np.array([])
119
+ pos, maxpos = 0, 0
120
+ weight = 0.0
121
+ inds = np.arange(N)
122
+ tbox, sbox = boxes[0].copy(), boxes[0].copy()
123
+ for i in range(N):
124
+ maxscore = boxes[i, 8]
125
+ maxpos = i
126
+ tbox = boxes[i].copy()
127
+ ti = inds[i]
128
+ pos = i + 1
129
+ #get max box
130
+ while pos < N:
131
+ if maxscore < boxes[pos, 8]:
132
+ maxscore = boxes[pos, 8]
133
+ maxpos = pos
134
+ pos = pos + 1
135
+ #add max box as a detection
136
+ boxes[i, :] = boxes[maxpos, :]
137
+ inds[i] = inds[maxpos]
138
+ #swap
139
+ boxes[maxpos, :] = tbox
140
+ inds[maxpos] = ti
141
+ tbox = boxes[i].copy()
142
+ pos = i + 1
143
+ #NMS iteration
144
+ while pos < N:
145
+ sbox = boxes[pos].copy()
146
+ ts_iou_val = intersection(tbox, sbox)
147
+ if ts_iou_val > 0:
148
+ if method == 1:
149
+ if ts_iou_val > Nt_thres:
150
+ weight = 1 - ts_iou_val
151
+ else:
152
+ weight = 1
153
+ elif method == 2:
154
+ weight = np.exp(-1.0 * ts_iou_val**2 / sigma)
155
+ else:
156
+ if ts_iou_val > Nt_thres:
157
+ weight = 0
158
+ else:
159
+ weight = 1
160
+ boxes[pos, 8] = weight * boxes[pos, 8]
161
+ #if box score falls below thresold, discard the box by
162
+ #swaping last box update N
163
+ if boxes[pos, 8] < threshold:
164
+ boxes[pos, :] = boxes[N - 1, :]
165
+ inds[pos] = inds[N - 1]
166
+ N = N - 1
167
+ pos = pos - 1
168
+ pos = pos + 1
169
+
170
+ return boxes[:N]
171
+
172
+
173
+ def nms_locality(polys, thres=0.3):
174
+ """
175
+ locality aware nms of EAST
176
+ :param polys: a N*9 numpy array. first 8 coordinates, then prob
177
+ :return: boxes after nms
178
+ """
179
+ S = []
180
+ p = None
181
+ for g in polys:
182
+ if p is not None and intersection(g, p) > thres:
183
+ p = weighted_merge(g, p)
184
+ else:
185
+ if p is not None:
186
+ S.append(p)
187
+ p = g
188
+ if p is not None:
189
+ S.append(p)
190
+
191
+ if len(S) == 0:
192
+ return np.array([])
193
+ return standard_nms(np.array(S), thres)
194
+
195
+
196
+ if __name__ == '__main__':
197
+ # 343,350,448,135,474,143,369,359
198
+ print(
199
+ Polygon(np.array([[343, 350], [448, 135], [474, 143], [369, 359]]))
200
+ .area)
ocr-studio/PaddleOCR/ppocr/postprocess/pg_postprocess.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ from __future__ import division
17
+ from __future__ import print_function
18
+
19
+ import os
20
+ import sys
21
+
22
+ __dir__ = os.path.dirname(__file__)
23
+ sys.path.append(__dir__)
24
+ sys.path.append(os.path.join(__dir__, '..'))
25
+ from ppocr.utils.e2e_utils.pgnet_pp_utils import PGNet_PostProcess
26
+
27
+
28
+ class PGPostProcess(object):
29
+ """
30
+ The post process for PGNet.
31
+ """
32
+
33
+ def __init__(self,
34
+ character_dict_path,
35
+ valid_set,
36
+ score_thresh,
37
+ mode,
38
+ point_gather_mode=None,
39
+ **kwargs):
40
+ self.character_dict_path = character_dict_path
41
+ self.valid_set = valid_set
42
+ self.score_thresh = score_thresh
43
+ self.mode = mode
44
+ self.point_gather_mode = point_gather_mode
45
+
46
+ # c++ la-nms is faster, but only support python 3.5
47
+ self.is_python35 = False
48
+ if sys.version_info.major == 3 and sys.version_info.minor == 5:
49
+ self.is_python35 = True
50
+
51
+ def __call__(self, outs_dict, shape_list):
52
+ post = PGNet_PostProcess(
53
+ self.character_dict_path,
54
+ self.valid_set,
55
+ self.score_thresh,
56
+ outs_dict,
57
+ shape_list,
58
+ point_gather_mode=self.point_gather_mode)
59
+ if self.mode == 'fast':
60
+ data = post.pg_postprocess_fast()
61
+ else:
62
+ data = post.pg_postprocess_slow()
63
+ return data
ocr-studio/PaddleOCR/ppocr/postprocess/picodet_postprocess.py ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+ from scipy.special import softmax
17
+
18
+
19
+ def hard_nms(box_scores, iou_threshold, top_k=-1, candidate_size=200):
20
+ """
21
+ Args:
22
+ box_scores (N, 5): boxes in corner-form and probabilities.
23
+ iou_threshold: intersection over union threshold.
24
+ top_k: keep top_k results. If k <= 0, keep all the results.
25
+ candidate_size: only consider the candidates with the highest scores.
26
+ Returns:
27
+ picked: a list of indexes of the kept boxes
28
+ """
29
+ scores = box_scores[:, -1]
30
+ boxes = box_scores[:, :-1]
31
+ picked = []
32
+ indexes = np.argsort(scores)
33
+ indexes = indexes[-candidate_size:]
34
+ while len(indexes) > 0:
35
+ current = indexes[-1]
36
+ picked.append(current)
37
+ if 0 < top_k == len(picked) or len(indexes) == 1:
38
+ break
39
+ current_box = boxes[current, :]
40
+ indexes = indexes[:-1]
41
+ rest_boxes = boxes[indexes, :]
42
+ iou = iou_of(
43
+ rest_boxes,
44
+ np.expand_dims(
45
+ current_box, axis=0), )
46
+ indexes = indexes[iou <= iou_threshold]
47
+
48
+ return box_scores[picked, :]
49
+
50
+
51
+ def iou_of(boxes0, boxes1, eps=1e-5):
52
+ """Return intersection-over-union (Jaccard index) of boxes.
53
+ Args:
54
+ boxes0 (N, 4): ground truth boxes.
55
+ boxes1 (N or 1, 4): predicted boxes.
56
+ eps: a small number to avoid 0 as denominator.
57
+ Returns:
58
+ iou (N): IoU values.
59
+ """
60
+ overlap_left_top = np.maximum(boxes0[..., :2], boxes1[..., :2])
61
+ overlap_right_bottom = np.minimum(boxes0[..., 2:], boxes1[..., 2:])
62
+
63
+ overlap_area = area_of(overlap_left_top, overlap_right_bottom)
64
+ area0 = area_of(boxes0[..., :2], boxes0[..., 2:])
65
+ area1 = area_of(boxes1[..., :2], boxes1[..., 2:])
66
+ return overlap_area / (area0 + area1 - overlap_area + eps)
67
+
68
+
69
+ def area_of(left_top, right_bottom):
70
+ """Compute the areas of rectangles given two corners.
71
+ Args:
72
+ left_top (N, 2): left top corner.
73
+ right_bottom (N, 2): right bottom corner.
74
+ Returns:
75
+ area (N): return the area.
76
+ """
77
+ hw = np.clip(right_bottom - left_top, 0.0, None)
78
+ return hw[..., 0] * hw[..., 1]
79
+
80
+
81
+ class PicoDetPostProcess(object):
82
+ """
83
+ Args:
84
+ input_shape (int): network input image size
85
+ ori_shape (int): ori image shape of before padding
86
+ scale_factor (float): scale factor of ori image
87
+ enable_mkldnn (bool): whether to open MKLDNN
88
+ """
89
+
90
+ def __init__(self,
91
+ layout_dict_path,
92
+ strides=[8, 16, 32, 64],
93
+ score_threshold=0.4,
94
+ nms_threshold=0.5,
95
+ nms_top_k=1000,
96
+ keep_top_k=100):
97
+ self.labels = self.load_layout_dict(layout_dict_path)
98
+ self.strides = strides
99
+ self.score_threshold = score_threshold
100
+ self.nms_threshold = nms_threshold
101
+ self.nms_top_k = nms_top_k
102
+ self.keep_top_k = keep_top_k
103
+
104
+ def load_layout_dict(self, layout_dict_path):
105
+ with open(layout_dict_path, 'r', encoding='utf-8') as fp:
106
+ labels = fp.readlines()
107
+ return [label.strip('\n') for label in labels]
108
+
109
+ def warp_boxes(self, boxes, ori_shape):
110
+ """Apply transform to boxes
111
+ """
112
+ width, height = ori_shape[1], ori_shape[0]
113
+ n = len(boxes)
114
+ if n:
115
+ # warp points
116
+ xy = np.ones((n * 4, 3))
117
+ xy[:, :2] = boxes[:, [0, 1, 2, 3, 0, 3, 2, 1]].reshape(
118
+ n * 4, 2) # x1y1, x2y2, x1y2, x2y1
119
+ # xy = xy @ M.T # transform
120
+ xy = (xy[:, :2] / xy[:, 2:3]).reshape(n, 8) # rescale
121
+ # create new boxes
122
+ x = xy[:, [0, 2, 4, 6]]
123
+ y = xy[:, [1, 3, 5, 7]]
124
+ xy = np.concatenate(
125
+ (x.min(1), y.min(1), x.max(1), y.max(1))).reshape(4, n).T
126
+ # clip boxes
127
+ xy[:, [0, 2]] = xy[:, [0, 2]].clip(0, width)
128
+ xy[:, [1, 3]] = xy[:, [1, 3]].clip(0, height)
129
+ return xy.astype(np.float32)
130
+ else:
131
+ return boxes
132
+
133
+ def img_info(self, ori_img, img):
134
+ origin_shape = ori_img.shape
135
+ resize_shape = img.shape
136
+ im_scale_y = resize_shape[2] / float(origin_shape[0])
137
+ im_scale_x = resize_shape[3] / float(origin_shape[1])
138
+ scale_factor = np.array([im_scale_y, im_scale_x], dtype=np.float32)
139
+ img_shape = np.array(img.shape[2:], dtype=np.float32)
140
+
141
+ input_shape = np.array(img).astype('float32').shape[2:]
142
+ ori_shape = np.array((img_shape, )).astype('float32')
143
+ scale_factor = np.array((scale_factor, )).astype('float32')
144
+ return ori_shape, input_shape, scale_factor
145
+
146
+ def __call__(self, ori_img, img, preds):
147
+ scores, raw_boxes = preds['boxes'], preds['boxes_num']
148
+ batch_size = raw_boxes[0].shape[0]
149
+ reg_max = int(raw_boxes[0].shape[-1] / 4 - 1)
150
+ out_boxes_num = []
151
+ out_boxes_list = []
152
+ results = []
153
+ ori_shape, input_shape, scale_factor = self.img_info(ori_img, img)
154
+
155
+ for batch_id in range(batch_size):
156
+ # generate centers
157
+ decode_boxes = []
158
+ select_scores = []
159
+ for stride, box_distribute, score in zip(self.strides, raw_boxes,
160
+ scores):
161
+ box_distribute = box_distribute[batch_id]
162
+ score = score[batch_id]
163
+ # centers
164
+ fm_h = input_shape[0] / stride
165
+ fm_w = input_shape[1] / stride
166
+ h_range = np.arange(fm_h)
167
+ w_range = np.arange(fm_w)
168
+ ww, hh = np.meshgrid(w_range, h_range)
169
+ ct_row = (hh.flatten() + 0.5) * stride
170
+ ct_col = (ww.flatten() + 0.5) * stride
171
+ center = np.stack((ct_col, ct_row, ct_col, ct_row), axis=1)
172
+
173
+ # box distribution to distance
174
+ reg_range = np.arange(reg_max + 1)
175
+ box_distance = box_distribute.reshape((-1, reg_max + 1))
176
+ box_distance = softmax(box_distance, axis=1)
177
+ box_distance = box_distance * np.expand_dims(reg_range, axis=0)
178
+ box_distance = np.sum(box_distance, axis=1).reshape((-1, 4))
179
+ box_distance = box_distance * stride
180
+
181
+ # top K candidate
182
+ topk_idx = np.argsort(score.max(axis=1))[::-1]
183
+ topk_idx = topk_idx[:self.nms_top_k]
184
+ center = center[topk_idx]
185
+ score = score[topk_idx]
186
+ box_distance = box_distance[topk_idx]
187
+
188
+ # decode box
189
+ decode_box = center + [-1, -1, 1, 1] * box_distance
190
+
191
+ select_scores.append(score)
192
+ decode_boxes.append(decode_box)
193
+
194
+ # nms
195
+ bboxes = np.concatenate(decode_boxes, axis=0)
196
+ confidences = np.concatenate(select_scores, axis=0)
197
+ picked_box_probs = []
198
+ picked_labels = []
199
+ for class_index in range(0, confidences.shape[1]):
200
+ probs = confidences[:, class_index]
201
+ mask = probs > self.score_threshold
202
+ probs = probs[mask]
203
+ if probs.shape[0] == 0:
204
+ continue
205
+ subset_boxes = bboxes[mask, :]
206
+ box_probs = np.concatenate(
207
+ [subset_boxes, probs.reshape(-1, 1)], axis=1)
208
+ box_probs = hard_nms(
209
+ box_probs,
210
+ iou_threshold=self.nms_threshold,
211
+ top_k=self.keep_top_k, )
212
+ picked_box_probs.append(box_probs)
213
+ picked_labels.extend([class_index] * box_probs.shape[0])
214
+
215
+ if len(picked_box_probs) == 0:
216
+ out_boxes_list.append(np.empty((0, 4)))
217
+ out_boxes_num.append(0)
218
+
219
+ else:
220
+ picked_box_probs = np.concatenate(picked_box_probs)
221
+
222
+ # resize output boxes
223
+ picked_box_probs[:, :4] = self.warp_boxes(
224
+ picked_box_probs[:, :4], ori_shape[batch_id])
225
+ im_scale = np.concatenate([
226
+ scale_factor[batch_id][::-1], scale_factor[batch_id][::-1]
227
+ ])
228
+ picked_box_probs[:, :4] /= im_scale
229
+ # clas score box
230
+ out_boxes_list.append(
231
+ np.concatenate(
232
+ [
233
+ np.expand_dims(
234
+ np.array(picked_labels),
235
+ axis=-1), np.expand_dims(
236
+ picked_box_probs[:, 4], axis=-1),
237
+ picked_box_probs[:, :4]
238
+ ],
239
+ axis=1))
240
+ out_boxes_num.append(len(picked_labels))
241
+
242
+ out_boxes_list = np.concatenate(out_boxes_list, axis=0)
243
+ out_boxes_num = np.asarray(out_boxes_num).astype(np.int32)
244
+
245
+ for dt in out_boxes_list:
246
+ clsid, bbox, score = int(dt[0]), dt[2:], dt[1]
247
+ label = self.labels[clsid]
248
+ result = {'bbox': bbox, 'label': label}
249
+ results.append(result)
250
+ return results
ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/__init__.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from .pse_postprocess import PSEPostProcess
ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/README.md ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ ## 编译
2
+ This code is refer from:
3
+ https://github.com/whai362/PSENet/blob/python3/models/post_processing/pse
4
+ ```python
5
+ python3 setup.py build_ext --inplace
6
+ ```
ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/__init__.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import sys
15
+ import os
16
+ import subprocess
17
+
18
+ python_path = sys.executable
19
+
20
+ ori_path = os.getcwd()
21
+ os.chdir('ppocr/postprocess/pse_postprocess/pse')
22
+ if subprocess.call(
23
+ '{} setup.py build_ext --inplace'.format(python_path), shell=True) != 0:
24
+ raise RuntimeError(
25
+ 'Cannot compile pse: {}, if your system is windows, you need to install all the default components of `desktop development using C++` in visual studio 2019+'.
26
+ format(os.path.dirname(os.path.realpath(__file__))))
27
+ os.chdir(ori_path)
28
+
29
+ from .pse import pse
ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/pse.pyx ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import numpy as np
3
+ import cv2
4
+ cimport numpy as np
5
+ cimport cython
6
+ cimport libcpp
7
+ cimport libcpp.pair
8
+ cimport libcpp.queue
9
+ from libcpp.pair cimport *
10
+ from libcpp.queue cimport *
11
+
12
+ @cython.boundscheck(False)
13
+ @cython.wraparound(False)
14
+ cdef np.ndarray[np.int32_t, ndim=2] _pse(np.ndarray[np.uint8_t, ndim=3] kernels,
15
+ np.ndarray[np.int32_t, ndim=2] label,
16
+ int kernel_num,
17
+ int label_num,
18
+ float min_area=0):
19
+ cdef np.ndarray[np.int32_t, ndim=2] pred
20
+ pred = np.zeros((label.shape[0], label.shape[1]), dtype=np.int32)
21
+
22
+ for label_idx in range(1, label_num):
23
+ if np.sum(label == label_idx) < min_area:
24
+ label[label == label_idx] = 0
25
+
26
+ cdef libcpp.queue.queue[libcpp.pair.pair[np.int16_t,np.int16_t]] que = \
27
+ queue[libcpp.pair.pair[np.int16_t,np.int16_t]]()
28
+ cdef libcpp.queue.queue[libcpp.pair.pair[np.int16_t,np.int16_t]] nxt_que = \
29
+ queue[libcpp.pair.pair[np.int16_t,np.int16_t]]()
30
+ cdef np.int16_t* dx = [-1, 1, 0, 0]
31
+ cdef np.int16_t* dy = [0, 0, -1, 1]
32
+ cdef np.int16_t tmpx, tmpy
33
+
34
+ points = np.array(np.where(label > 0)).transpose((1, 0))
35
+ for point_idx in range(points.shape[0]):
36
+ tmpx, tmpy = points[point_idx, 0], points[point_idx, 1]
37
+ que.push(pair[np.int16_t,np.int16_t](tmpx, tmpy))
38
+ pred[tmpx, tmpy] = label[tmpx, tmpy]
39
+
40
+ cdef libcpp.pair.pair[np.int16_t,np.int16_t] cur
41
+ cdef int cur_label
42
+ for kernel_idx in range(kernel_num - 1, -1, -1):
43
+ while not que.empty():
44
+ cur = que.front()
45
+ que.pop()
46
+ cur_label = pred[cur.first, cur.second]
47
+
48
+ is_edge = True
49
+ for j in range(4):
50
+ tmpx = cur.first + dx[j]
51
+ tmpy = cur.second + dy[j]
52
+ if tmpx < 0 or tmpx >= label.shape[0] or tmpy < 0 or tmpy >= label.shape[1]:
53
+ continue
54
+ if kernels[kernel_idx, tmpx, tmpy] == 0 or pred[tmpx, tmpy] > 0:
55
+ continue
56
+
57
+ que.push(pair[np.int16_t,np.int16_t](tmpx, tmpy))
58
+ pred[tmpx, tmpy] = cur_label
59
+ is_edge = False
60
+ if is_edge:
61
+ nxt_que.push(cur)
62
+
63
+ que, nxt_que = nxt_que, que
64
+
65
+ return pred
66
+
67
+ def pse(kernels, min_area):
68
+ kernel_num = kernels.shape[0]
69
+ label_num, label = cv2.connectedComponents(kernels[-1], connectivity=4)
70
+ return _pse(kernels[:-1], label, kernel_num, label_num, min_area)
ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse/setup.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from distutils.core import setup, Extension
2
+ from Cython.Build import cythonize
3
+ import numpy
4
+
5
+ setup(ext_modules=cythonize(Extension(
6
+ 'pse',
7
+ sources=['pse.pyx'],
8
+ language='c++',
9
+ include_dirs=[numpy.get_include()],
10
+ library_dirs=[],
11
+ libraries=[],
12
+ extra_compile_args=['-O3'],
13
+ extra_link_args=[]
14
+ )))
ocr-studio/PaddleOCR/ppocr/postprocess/pse_postprocess/pse_postprocess.py ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ """
15
+ This code is refer from:
16
+ https://github.com/whai362/PSENet/blob/python3/models/head/psenet_head.py
17
+ """
18
+
19
+ from __future__ import absolute_import
20
+ from __future__ import division
21
+ from __future__ import print_function
22
+
23
+ import numpy as np
24
+ import cv2
25
+ import paddle
26
+ from paddle.nn import functional as F
27
+
28
+ from ppocr.postprocess.pse_postprocess.pse import pse
29
+
30
+
31
+ class PSEPostProcess(object):
32
+ """
33
+ The post process for PSE.
34
+ """
35
+
36
+ def __init__(self,
37
+ thresh=0.5,
38
+ box_thresh=0.85,
39
+ min_area=16,
40
+ box_type='quad',
41
+ scale=4,
42
+ **kwargs):
43
+ assert box_type in ['quad', 'poly'], 'Only quad and poly is supported'
44
+ self.thresh = thresh
45
+ self.box_thresh = box_thresh
46
+ self.min_area = min_area
47
+ self.box_type = box_type
48
+ self.scale = scale
49
+
50
+ def __call__(self, outs_dict, shape_list):
51
+ pred = outs_dict['maps']
52
+ if not isinstance(pred, paddle.Tensor):
53
+ pred = paddle.to_tensor(pred)
54
+ pred = F.interpolate(
55
+ pred, scale_factor=4 // self.scale, mode='bilinear')
56
+
57
+ score = F.sigmoid(pred[:, 0, :, :])
58
+
59
+ kernels = (pred > self.thresh).astype('float32')
60
+ text_mask = kernels[:, 0, :, :]
61
+ text_mask = paddle.unsqueeze(text_mask, axis=1)
62
+
63
+ kernels[:, 0:, :, :] = kernels[:, 0:, :, :] * text_mask
64
+
65
+ score = score.numpy()
66
+ kernels = kernels.numpy().astype(np.uint8)
67
+
68
+ boxes_batch = []
69
+ for batch_index in range(pred.shape[0]):
70
+ boxes, scores = self.boxes_from_bitmap(score[batch_index],
71
+ kernels[batch_index],
72
+ shape_list[batch_index])
73
+
74
+ boxes_batch.append({'points': boxes, 'scores': scores})
75
+ return boxes_batch
76
+
77
+ def boxes_from_bitmap(self, score, kernels, shape):
78
+ label = pse(kernels, self.min_area)
79
+ return self.generate_box(score, label, shape)
80
+
81
+ def generate_box(self, score, label, shape):
82
+ src_h, src_w, ratio_h, ratio_w = shape
83
+ label_num = np.max(label) + 1
84
+
85
+ boxes = []
86
+ scores = []
87
+ for i in range(1, label_num):
88
+ ind = label == i
89
+ points = np.array(np.where(ind)).transpose((1, 0))[:, ::-1]
90
+
91
+ if points.shape[0] < self.min_area:
92
+ label[ind] = 0
93
+ continue
94
+
95
+ score_i = np.mean(score[ind])
96
+ if score_i < self.box_thresh:
97
+ label[ind] = 0
98
+ continue
99
+
100
+ if self.box_type == 'quad':
101
+ rect = cv2.minAreaRect(points)
102
+ bbox = cv2.boxPoints(rect)
103
+ elif self.box_type == 'poly':
104
+ box_height = np.max(points[:, 1]) + 10
105
+ box_width = np.max(points[:, 0]) + 10
106
+
107
+ mask = np.zeros((box_height, box_width), np.uint8)
108
+ mask[points[:, 1], points[:, 0]] = 255
109
+
110
+ contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL,
111
+ cv2.CHAIN_APPROX_SIMPLE)
112
+ bbox = np.squeeze(contours[0], 1)
113
+ else:
114
+ raise NotImplementedError
115
+
116
+ bbox[:, 0] = np.clip(np.round(bbox[:, 0] / ratio_w), 0, src_w)
117
+ bbox[:, 1] = np.clip(np.round(bbox[:, 1] / ratio_h), 0, src_h)
118
+ boxes.append(bbox)
119
+ scores.append(score_i)
120
+ return boxes, scores
ocr-studio/PaddleOCR/ppocr/postprocess/rec_postprocess.py ADDED
@@ -0,0 +1,1221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+ import paddle
17
+ from paddle.nn import functional as F
18
+ import re
19
+
20
+
21
+ class BaseRecLabelDecode(object):
22
+ """ Convert between text-label and text-index """
23
+
24
+ def __init__(self, character_dict_path=None, use_space_char=False):
25
+ self.beg_str = "sos"
26
+ self.end_str = "eos"
27
+ self.reverse = False
28
+ self.character_str = []
29
+
30
+ if character_dict_path is None:
31
+ self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz"
32
+ dict_character = list(self.character_str)
33
+ else:
34
+ with open(character_dict_path, "rb") as fin:
35
+ lines = fin.readlines()
36
+ for line in lines:
37
+ line = line.decode('utf-8').strip("\n").strip("\r\n")
38
+ self.character_str.append(line)
39
+ if use_space_char:
40
+ self.character_str.append(" ")
41
+ dict_character = list(self.character_str)
42
+ if 'arabic' in character_dict_path:
43
+ self.reverse = True
44
+
45
+ dict_character = self.add_special_char(dict_character)
46
+ self.dict = {}
47
+ for i, char in enumerate(dict_character):
48
+ self.dict[char] = i
49
+ self.character = dict_character
50
+
51
+ def pred_reverse(self, pred):
52
+ pred_re = []
53
+ c_current = ''
54
+ for c in pred:
55
+ if not bool(re.search('[a-zA-Z0-9 :*./%+-]', c)):
56
+ if c_current != '':
57
+ pred_re.append(c_current)
58
+ pred_re.append(c)
59
+ c_current = ''
60
+ else:
61
+ c_current += c
62
+ if c_current != '':
63
+ pred_re.append(c_current)
64
+
65
+ return ''.join(pred_re[::-1])
66
+
67
+ def add_special_char(self, dict_character):
68
+ return dict_character
69
+
70
+ def get_word_info(self, text, selection):
71
+ """
72
+ Group the decoded characters and record the corresponding decoded positions.
73
+
74
+ Args:
75
+ text: the decoded text
76
+ selection: the bool array that identifies which columns of features are decoded as non-separated characters
77
+ Returns:
78
+ word_list: list of the grouped words
79
+ word_col_list: list of decoding positions corresponding to each character in the grouped word
80
+ state_list: list of marker to identify the type of grouping words, including two types of grouping words:
81
+ - 'cn': continous chinese characters (e.g., 你好啊)
82
+ - 'en&num': continous english characters (e.g., hello), number (e.g., 123, 1.123), or mixed of them connected by '-' (e.g., VGG-16)
83
+ The remaining characters in text are treated as separators between groups (e.g., space, '(', ')', etc.).
84
+ """
85
+ state = None
86
+ word_content = []
87
+ word_col_content = []
88
+ word_list = []
89
+ word_col_list = []
90
+ state_list = []
91
+ valid_col = np.where(selection==True)[0]
92
+
93
+ for c_i, char in enumerate(text):
94
+ if '\u4e00' <= char <= '\u9fff':
95
+ c_state = 'cn'
96
+ elif bool(re.search('[a-zA-Z0-9]', char)):
97
+ c_state = 'en&num'
98
+ else:
99
+ c_state = 'splitter'
100
+
101
+ if char == '.' and state == 'en&num' and c_i + 1 < len(text) and bool(re.search('[0-9]', text[c_i+1])): # grouping floting number
102
+ c_state = 'en&num'
103
+ if char == '-' and state == "en&num": # grouping word with '-', such as 'state-of-the-art'
104
+ c_state = 'en&num'
105
+
106
+ if state == None:
107
+ state = c_state
108
+
109
+ if state != c_state:
110
+ if len(word_content) != 0:
111
+ word_list.append(word_content)
112
+ word_col_list.append(word_col_content)
113
+ state_list.append(state)
114
+ word_content = []
115
+ word_col_content = []
116
+ state = c_state
117
+
118
+ if state != "splitter":
119
+ word_content.append(char)
120
+ word_col_content.append(valid_col[c_i])
121
+
122
+ if len(word_content) != 0:
123
+ word_list.append(word_content)
124
+ word_col_list.append(word_col_content)
125
+ state_list.append(state)
126
+
127
+ return word_list, word_col_list, state_list
128
+
129
+ def decode(self,
130
+ text_index,
131
+ text_prob=None,
132
+ is_remove_duplicate=False,
133
+ return_word_box=False):
134
+ """ convert text-index into text-label. """
135
+ result_list = []
136
+ ignored_tokens = self.get_ignored_tokens()
137
+ batch_size = len(text_index)
138
+ for batch_idx in range(batch_size):
139
+ selection = np.ones(len(text_index[batch_idx]), dtype=bool)
140
+ if is_remove_duplicate:
141
+ selection[1:] = text_index[batch_idx][1:] != text_index[
142
+ batch_idx][:-1]
143
+ for ignored_token in ignored_tokens:
144
+ selection &= text_index[batch_idx] != ignored_token
145
+
146
+ char_list = [
147
+ self.character[text_id]
148
+ for text_id in text_index[batch_idx][selection]
149
+ ]
150
+ if text_prob is not None:
151
+ conf_list = text_prob[batch_idx][selection]
152
+ else:
153
+ conf_list = [1] * len(selection)
154
+ if len(conf_list) == 0:
155
+ conf_list = [0]
156
+
157
+ text = ''.join(char_list)
158
+
159
+ if self.reverse: # for arabic rec
160
+ text = self.pred_reverse(text)
161
+
162
+ if return_word_box:
163
+ word_list, word_col_list, state_list = self.get_word_info(
164
+ text, selection)
165
+ result_list.append((text, np.mean(conf_list).tolist(), [
166
+ len(text_index[batch_idx]), word_list, word_col_list,
167
+ state_list
168
+ ]))
169
+ else:
170
+ result_list.append((text, np.mean(conf_list).tolist()))
171
+ return result_list
172
+
173
+ def get_ignored_tokens(self):
174
+ return [0] # for ctc blank
175
+
176
+
177
+ class CTCLabelDecode(BaseRecLabelDecode):
178
+ """ Convert between text-label and text-index """
179
+
180
+ def __init__(self, character_dict_path=None, use_space_char=False,
181
+ **kwargs):
182
+ super(CTCLabelDecode, self).__init__(character_dict_path,
183
+ use_space_char)
184
+
185
+ def __call__(self,
186
+ preds,
187
+ label=None,
188
+ return_word_box=False,
189
+ *args,
190
+ **kwargs):
191
+ if isinstance(preds, tuple) or isinstance(preds, list):
192
+ preds = preds[-1]
193
+ if isinstance(preds, paddle.Tensor):
194
+ preds = preds.numpy()
195
+ preds_idx = preds.argmax(axis=2)
196
+ preds_prob = preds.max(axis=2)
197
+ text = self.decode(
198
+ preds_idx,
199
+ preds_prob,
200
+ is_remove_duplicate=True,
201
+ return_word_box=return_word_box)
202
+ if return_word_box:
203
+ for rec_idx, rec in enumerate(text):
204
+ wh_ratio = kwargs['wh_ratio_list'][rec_idx]
205
+ max_wh_ratio = kwargs['max_wh_ratio']
206
+ rec[2][0] = rec[2][0] * (wh_ratio / max_wh_ratio)
207
+ if label is None:
208
+ return text
209
+ label = self.decode(label)
210
+ return text, label
211
+
212
+ def add_special_char(self, dict_character):
213
+ dict_character = ['blank'] + dict_character
214
+ return dict_character
215
+
216
+
217
+ class DistillationCTCLabelDecode(CTCLabelDecode):
218
+ """
219
+ Convert
220
+ Convert between text-label and text-index
221
+ """
222
+
223
+ def __init__(self,
224
+ character_dict_path=None,
225
+ use_space_char=False,
226
+ model_name=["student"],
227
+ key=None,
228
+ multi_head=False,
229
+ **kwargs):
230
+ super(DistillationCTCLabelDecode, self).__init__(character_dict_path,
231
+ use_space_char)
232
+ if not isinstance(model_name, list):
233
+ model_name = [model_name]
234
+ self.model_name = model_name
235
+
236
+ self.key = key
237
+ self.multi_head = multi_head
238
+
239
+ def __call__(self, preds, label=None, *args, **kwargs):
240
+ output = dict()
241
+ for name in self.model_name:
242
+ pred = preds[name]
243
+ if self.key is not None:
244
+ pred = pred[self.key]
245
+ if self.multi_head and isinstance(pred, dict):
246
+ pred = pred['ctc']
247
+ output[name] = super().__call__(pred, label=label, *args, **kwargs)
248
+ return output
249
+
250
+
251
+ class AttnLabelDecode(BaseRecLabelDecode):
252
+ """ Convert between text-label and text-index """
253
+
254
+ def __init__(self, character_dict_path=None, use_space_char=False,
255
+ **kwargs):
256
+ super(AttnLabelDecode, self).__init__(character_dict_path,
257
+ use_space_char)
258
+
259
+ def add_special_char(self, dict_character):
260
+ self.beg_str = "sos"
261
+ self.end_str = "eos"
262
+ dict_character = dict_character
263
+ dict_character = [self.beg_str] + dict_character + [self.end_str]
264
+ return dict_character
265
+
266
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
267
+ """ convert text-index into text-label. """
268
+ result_list = []
269
+ ignored_tokens = self.get_ignored_tokens()
270
+ [beg_idx, end_idx] = self.get_ignored_tokens()
271
+ batch_size = len(text_index)
272
+ for batch_idx in range(batch_size):
273
+ char_list = []
274
+ conf_list = []
275
+ for idx in range(len(text_index[batch_idx])):
276
+ if text_index[batch_idx][idx] in ignored_tokens:
277
+ continue
278
+ if int(text_index[batch_idx][idx]) == int(end_idx):
279
+ break
280
+ if is_remove_duplicate:
281
+ # only for predict
282
+ if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
283
+ batch_idx][idx]:
284
+ continue
285
+ char_list.append(self.character[int(text_index[batch_idx][
286
+ idx])])
287
+ if text_prob is not None:
288
+ conf_list.append(text_prob[batch_idx][idx])
289
+ else:
290
+ conf_list.append(1)
291
+ text = ''.join(char_list)
292
+ result_list.append((text, np.mean(conf_list).tolist()))
293
+ return result_list
294
+
295
+ def __call__(self, preds, label=None, *args, **kwargs):
296
+ """
297
+ text = self.decode(text)
298
+ if label is None:
299
+ return text
300
+ else:
301
+ label = self.decode(label, is_remove_duplicate=False)
302
+ return text, label
303
+ """
304
+ if isinstance(preds, paddle.Tensor):
305
+ preds = preds.numpy()
306
+
307
+ preds_idx = preds.argmax(axis=2)
308
+ preds_prob = preds.max(axis=2)
309
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
310
+ if label is None:
311
+ return text
312
+ label = self.decode(label, is_remove_duplicate=False)
313
+ return text, label
314
+
315
+ def get_ignored_tokens(self):
316
+ beg_idx = self.get_beg_end_flag_idx("beg")
317
+ end_idx = self.get_beg_end_flag_idx("end")
318
+ return [beg_idx, end_idx]
319
+
320
+ def get_beg_end_flag_idx(self, beg_or_end):
321
+ if beg_or_end == "beg":
322
+ idx = np.array(self.dict[self.beg_str])
323
+ elif beg_or_end == "end":
324
+ idx = np.array(self.dict[self.end_str])
325
+ else:
326
+ assert False, "unsupport type %s in get_beg_end_flag_idx" \
327
+ % beg_or_end
328
+ return idx
329
+
330
+
331
+ class RFLLabelDecode(BaseRecLabelDecode):
332
+ """ Convert between text-label and text-index """
333
+
334
+ def __init__(self, character_dict_path=None, use_space_char=False,
335
+ **kwargs):
336
+ super(RFLLabelDecode, self).__init__(character_dict_path,
337
+ use_space_char)
338
+
339
+ def add_special_char(self, dict_character):
340
+ self.beg_str = "sos"
341
+ self.end_str = "eos"
342
+ dict_character = dict_character
343
+ dict_character = [self.beg_str] + dict_character + [self.end_str]
344
+ return dict_character
345
+
346
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
347
+ """ convert text-index into text-label. """
348
+ result_list = []
349
+ ignored_tokens = self.get_ignored_tokens()
350
+ [beg_idx, end_idx] = self.get_ignored_tokens()
351
+ batch_size = len(text_index)
352
+ for batch_idx in range(batch_size):
353
+ char_list = []
354
+ conf_list = []
355
+ for idx in range(len(text_index[batch_idx])):
356
+ if text_index[batch_idx][idx] in ignored_tokens:
357
+ continue
358
+ if int(text_index[batch_idx][idx]) == int(end_idx):
359
+ break
360
+ if is_remove_duplicate:
361
+ # only for predict
362
+ if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
363
+ batch_idx][idx]:
364
+ continue
365
+ char_list.append(self.character[int(text_index[batch_idx][
366
+ idx])])
367
+ if text_prob is not None:
368
+ conf_list.append(text_prob[batch_idx][idx])
369
+ else:
370
+ conf_list.append(1)
371
+ text = ''.join(char_list)
372
+ result_list.append((text, np.mean(conf_list).tolist()))
373
+ return result_list
374
+
375
+ def __call__(self, preds, label=None, *args, **kwargs):
376
+ # if seq_outputs is not None:
377
+ if isinstance(preds, tuple) or isinstance(preds, list):
378
+ cnt_outputs, seq_outputs = preds
379
+ if isinstance(seq_outputs, paddle.Tensor):
380
+ seq_outputs = seq_outputs.numpy()
381
+ preds_idx = seq_outputs.argmax(axis=2)
382
+ preds_prob = seq_outputs.max(axis=2)
383
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
384
+
385
+ if label is None:
386
+ return text
387
+ label = self.decode(label, is_remove_duplicate=False)
388
+ return text, label
389
+
390
+ else:
391
+ cnt_outputs = preds
392
+ if isinstance(cnt_outputs, paddle.Tensor):
393
+ cnt_outputs = cnt_outputs.numpy()
394
+ cnt_length = []
395
+ for lens in cnt_outputs:
396
+ length = round(np.sum(lens))
397
+ cnt_length.append(length)
398
+ if label is None:
399
+ return cnt_length
400
+ label = self.decode(label, is_remove_duplicate=False)
401
+ length = [len(res[0]) for res in label]
402
+ return cnt_length, length
403
+
404
+ def get_ignored_tokens(self):
405
+ beg_idx = self.get_beg_end_flag_idx("beg")
406
+ end_idx = self.get_beg_end_flag_idx("end")
407
+ return [beg_idx, end_idx]
408
+
409
+ def get_beg_end_flag_idx(self, beg_or_end):
410
+ if beg_or_end == "beg":
411
+ idx = np.array(self.dict[self.beg_str])
412
+ elif beg_or_end == "end":
413
+ idx = np.array(self.dict[self.end_str])
414
+ else:
415
+ assert False, "unsupport type %s in get_beg_end_flag_idx" \
416
+ % beg_or_end
417
+ return idx
418
+
419
+
420
+ class SEEDLabelDecode(BaseRecLabelDecode):
421
+ """ Convert between text-label and text-index """
422
+
423
+ def __init__(self, character_dict_path=None, use_space_char=False,
424
+ **kwargs):
425
+ super(SEEDLabelDecode, self).__init__(character_dict_path,
426
+ use_space_char)
427
+
428
+ def add_special_char(self, dict_character):
429
+ self.padding_str = "padding"
430
+ self.end_str = "eos"
431
+ self.unknown = "unknown"
432
+ dict_character = dict_character + [
433
+ self.end_str, self.padding_str, self.unknown
434
+ ]
435
+ return dict_character
436
+
437
+ def get_ignored_tokens(self):
438
+ end_idx = self.get_beg_end_flag_idx("eos")
439
+ return [end_idx]
440
+
441
+ def get_beg_end_flag_idx(self, beg_or_end):
442
+ if beg_or_end == "sos":
443
+ idx = np.array(self.dict[self.beg_str])
444
+ elif beg_or_end == "eos":
445
+ idx = np.array(self.dict[self.end_str])
446
+ else:
447
+ assert False, "unsupport type %s in get_beg_end_flag_idx" % beg_or_end
448
+ return idx
449
+
450
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
451
+ """ convert text-index into text-label. """
452
+ result_list = []
453
+ [end_idx] = self.get_ignored_tokens()
454
+ batch_size = len(text_index)
455
+ for batch_idx in range(batch_size):
456
+ char_list = []
457
+ conf_list = []
458
+ for idx in range(len(text_index[batch_idx])):
459
+ if int(text_index[batch_idx][idx]) == int(end_idx):
460
+ break
461
+ if is_remove_duplicate:
462
+ # only for predict
463
+ if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
464
+ batch_idx][idx]:
465
+ continue
466
+ char_list.append(self.character[int(text_index[batch_idx][
467
+ idx])])
468
+ if text_prob is not None:
469
+ conf_list.append(text_prob[batch_idx][idx])
470
+ else:
471
+ conf_list.append(1)
472
+ text = ''.join(char_list)
473
+ result_list.append((text, np.mean(conf_list).tolist()))
474
+ return result_list
475
+
476
+ def __call__(self, preds, label=None, *args, **kwargs):
477
+ """
478
+ text = self.decode(text)
479
+ if label is None:
480
+ return text
481
+ else:
482
+ label = self.decode(label, is_remove_duplicate=False)
483
+ return text, label
484
+ """
485
+ preds_idx = preds["rec_pred"]
486
+ if isinstance(preds_idx, paddle.Tensor):
487
+ preds_idx = preds_idx.numpy()
488
+ if "rec_pred_scores" in preds:
489
+ preds_idx = preds["rec_pred"]
490
+ preds_prob = preds["rec_pred_scores"]
491
+ else:
492
+ preds_idx = preds["rec_pred"].argmax(axis=2)
493
+ preds_prob = preds["rec_pred"].max(axis=2)
494
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
495
+ if label is None:
496
+ return text
497
+ label = self.decode(label, is_remove_duplicate=False)
498
+ return text, label
499
+
500
+
501
+ class SRNLabelDecode(BaseRecLabelDecode):
502
+ """ Convert between text-label and text-index """
503
+
504
+ def __init__(self, character_dict_path=None, use_space_char=False,
505
+ **kwargs):
506
+ super(SRNLabelDecode, self).__init__(character_dict_path,
507
+ use_space_char)
508
+ self.max_text_length = kwargs.get('max_text_length', 25)
509
+
510
+ def __call__(self, preds, label=None, *args, **kwargs):
511
+ pred = preds['predict']
512
+ char_num = len(self.character_str) + 2
513
+ if isinstance(pred, paddle.Tensor):
514
+ pred = pred.numpy()
515
+ pred = np.reshape(pred, [-1, char_num])
516
+
517
+ preds_idx = np.argmax(pred, axis=1)
518
+ preds_prob = np.max(pred, axis=1)
519
+
520
+ preds_idx = np.reshape(preds_idx, [-1, self.max_text_length])
521
+
522
+ preds_prob = np.reshape(preds_prob, [-1, self.max_text_length])
523
+
524
+ text = self.decode(preds_idx, preds_prob)
525
+
526
+ if label is None:
527
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
528
+ return text
529
+ label = self.decode(label)
530
+ return text, label
531
+
532
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
533
+ """ convert text-index into text-label. """
534
+ result_list = []
535
+ ignored_tokens = self.get_ignored_tokens()
536
+ batch_size = len(text_index)
537
+
538
+ for batch_idx in range(batch_size):
539
+ char_list = []
540
+ conf_list = []
541
+ for idx in range(len(text_index[batch_idx])):
542
+ if text_index[batch_idx][idx] in ignored_tokens:
543
+ continue
544
+ if is_remove_duplicate:
545
+ # only for predict
546
+ if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
547
+ batch_idx][idx]:
548
+ continue
549
+ char_list.append(self.character[int(text_index[batch_idx][
550
+ idx])])
551
+ if text_prob is not None:
552
+ conf_list.append(text_prob[batch_idx][idx])
553
+ else:
554
+ conf_list.append(1)
555
+
556
+ text = ''.join(char_list)
557
+ result_list.append((text, np.mean(conf_list).tolist()))
558
+ return result_list
559
+
560
+ def add_special_char(self, dict_character):
561
+ dict_character = dict_character + [self.beg_str, self.end_str]
562
+ return dict_character
563
+
564
+ def get_ignored_tokens(self):
565
+ beg_idx = self.get_beg_end_flag_idx("beg")
566
+ end_idx = self.get_beg_end_flag_idx("end")
567
+ return [beg_idx, end_idx]
568
+
569
+ def get_beg_end_flag_idx(self, beg_or_end):
570
+ if beg_or_end == "beg":
571
+ idx = np.array(self.dict[self.beg_str])
572
+ elif beg_or_end == "end":
573
+ idx = np.array(self.dict[self.end_str])
574
+ else:
575
+ assert False, "unsupport type %s in get_beg_end_flag_idx" \
576
+ % beg_or_end
577
+ return idx
578
+
579
+
580
+ class ParseQLabelDecode(BaseRecLabelDecode):
581
+ """ Convert between text-label and text-index """
582
+ BOS = '[B]'
583
+ EOS = '[E]'
584
+ PAD = '[P]'
585
+
586
+ def __init__(self, character_dict_path=None, use_space_char=False,
587
+ **kwargs):
588
+ super(ParseQLabelDecode, self).__init__(character_dict_path,
589
+ use_space_char)
590
+ self.max_text_length = kwargs.get('max_text_length', 25)
591
+
592
+ def __call__(self, preds, label=None, *args, **kwargs):
593
+ if isinstance(preds, dict):
594
+ pred = preds['predict']
595
+ else:
596
+ pred = preds
597
+
598
+ char_num = len(
599
+ self.character_str
600
+ ) + 1 # We don't predict <bos> nor <pad>, with only addition <eos>
601
+ if isinstance(pred, paddle.Tensor):
602
+ pred = pred.numpy()
603
+ B, L = pred.shape[:2]
604
+ pred = np.reshape(pred, [-1, char_num])
605
+
606
+ preds_idx = np.argmax(pred, axis=1)
607
+ preds_prob = np.max(pred, axis=1)
608
+
609
+ preds_idx = np.reshape(preds_idx, [B, L])
610
+ preds_prob = np.reshape(preds_prob, [B, L])
611
+
612
+ if label is None:
613
+ text = self.decode(preds_idx, preds_prob, raw=False)
614
+ return text
615
+
616
+ text = self.decode(preds_idx, preds_prob, raw=False)
617
+ label = self.decode(label, None, False)
618
+
619
+ return text, label
620
+
621
+ def decode(self, text_index, text_prob=None, raw=False):
622
+ """ convert text-index into text-label. """
623
+ result_list = []
624
+ ignored_tokens = self.get_ignored_tokens()
625
+ batch_size = len(text_index)
626
+
627
+ for batch_idx in range(batch_size):
628
+ char_list = []
629
+ conf_list = []
630
+
631
+ index = text_index[batch_idx, :]
632
+ prob = None
633
+ if text_prob is not None:
634
+ prob = text_prob[batch_idx, :]
635
+
636
+ if not raw:
637
+ index, prob = self._filter(index, prob)
638
+
639
+ for idx in range(len(index)):
640
+ if index[idx] in ignored_tokens:
641
+ continue
642
+ char_list.append(self.character[int(index[idx])])
643
+ if text_prob is not None:
644
+ conf_list.append(prob[idx])
645
+ else:
646
+ conf_list.append(1)
647
+
648
+ text = ''.join(char_list)
649
+ result_list.append((text, np.mean(conf_list).tolist()))
650
+
651
+ return result_list
652
+
653
+ def add_special_char(self, dict_character):
654
+ dict_character = [self.EOS] + dict_character + [self.BOS, self.PAD]
655
+ return dict_character
656
+
657
+ def _filter(self, ids, probs=None):
658
+ ids = ids.tolist()
659
+ try:
660
+ eos_idx = ids.index(self.dict[self.EOS])
661
+ except ValueError:
662
+ eos_idx = len(ids) # Nothing to truncate.
663
+ # Truncate after EOS
664
+ ids = ids[:eos_idx]
665
+ if probs is not None:
666
+ probs = probs[:eos_idx +
667
+ 1] # but include prob. for EOS (if it exists)
668
+ return ids, probs
669
+
670
+ def get_ignored_tokens(self):
671
+ return [self.dict[self.BOS], self.dict[self.EOS], self.dict[self.PAD]]
672
+
673
+
674
+ class SARLabelDecode(BaseRecLabelDecode):
675
+ """ Convert between text-label and text-index """
676
+
677
+ def __init__(self, character_dict_path=None, use_space_char=False,
678
+ **kwargs):
679
+ super(SARLabelDecode, self).__init__(character_dict_path,
680
+ use_space_char)
681
+
682
+ self.rm_symbol = kwargs.get('rm_symbol', False)
683
+
684
+ def add_special_char(self, dict_character):
685
+ beg_end_str = "<BOS/EOS>"
686
+ unknown_str = "<UKN>"
687
+ padding_str = "<PAD>"
688
+ dict_character = dict_character + [unknown_str]
689
+ self.unknown_idx = len(dict_character) - 1
690
+ dict_character = dict_character + [beg_end_str]
691
+ self.start_idx = len(dict_character) - 1
692
+ self.end_idx = len(dict_character) - 1
693
+ dict_character = dict_character + [padding_str]
694
+ self.padding_idx = len(dict_character) - 1
695
+ return dict_character
696
+
697
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
698
+ """ convert text-index into text-label. """
699
+ result_list = []
700
+ ignored_tokens = self.get_ignored_tokens()
701
+
702
+ batch_size = len(text_index)
703
+ for batch_idx in range(batch_size):
704
+ char_list = []
705
+ conf_list = []
706
+ for idx in range(len(text_index[batch_idx])):
707
+ if text_index[batch_idx][idx] in ignored_tokens:
708
+ continue
709
+ if int(text_index[batch_idx][idx]) == int(self.end_idx):
710
+ if text_prob is None and idx == 0:
711
+ continue
712
+ else:
713
+ break
714
+ if is_remove_duplicate:
715
+ # only for predict
716
+ if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
717
+ batch_idx][idx]:
718
+ continue
719
+ char_list.append(self.character[int(text_index[batch_idx][
720
+ idx])])
721
+ if text_prob is not None:
722
+ conf_list.append(text_prob[batch_idx][idx])
723
+ else:
724
+ conf_list.append(1)
725
+ text = ''.join(char_list)
726
+ if self.rm_symbol:
727
+ comp = re.compile('[^A-Z^a-z^0-9^\u4e00-\u9fa5]')
728
+ text = text.lower()
729
+ text = comp.sub('', text)
730
+ result_list.append((text, np.mean(conf_list).tolist()))
731
+ return result_list
732
+
733
+ def __call__(self, preds, label=None, *args, **kwargs):
734
+ if isinstance(preds, paddle.Tensor):
735
+ preds = preds.numpy()
736
+ preds_idx = preds.argmax(axis=2)
737
+ preds_prob = preds.max(axis=2)
738
+
739
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
740
+
741
+ if label is None:
742
+ return text
743
+ label = self.decode(label, is_remove_duplicate=False)
744
+ return text, label
745
+
746
+ def get_ignored_tokens(self):
747
+ return [self.padding_idx]
748
+
749
+
750
+ class SATRNLabelDecode(BaseRecLabelDecode):
751
+ """ Convert between text-label and text-index """
752
+
753
+ def __init__(self, character_dict_path=None, use_space_char=False,
754
+ **kwargs):
755
+ super(SATRNLabelDecode, self).__init__(character_dict_path,
756
+ use_space_char)
757
+
758
+ self.rm_symbol = kwargs.get('rm_symbol', False)
759
+
760
+ def add_special_char(self, dict_character):
761
+ beg_end_str = "<BOS/EOS>"
762
+ unknown_str = "<UKN>"
763
+ padding_str = "<PAD>"
764
+ dict_character = dict_character + [unknown_str]
765
+ self.unknown_idx = len(dict_character) - 1
766
+ dict_character = dict_character + [beg_end_str]
767
+ self.start_idx = len(dict_character) - 1
768
+ self.end_idx = len(dict_character) - 1
769
+ dict_character = dict_character + [padding_str]
770
+ self.padding_idx = len(dict_character) - 1
771
+ return dict_character
772
+
773
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
774
+ """ convert text-index into text-label. """
775
+ result_list = []
776
+ ignored_tokens = self.get_ignored_tokens()
777
+
778
+ batch_size = len(text_index)
779
+ for batch_idx in range(batch_size):
780
+ char_list = []
781
+ conf_list = []
782
+ for idx in range(len(text_index[batch_idx])):
783
+ if text_index[batch_idx][idx] in ignored_tokens:
784
+ continue
785
+ if int(text_index[batch_idx][idx]) == int(self.end_idx):
786
+ if text_prob is None and idx == 0:
787
+ continue
788
+ else:
789
+ break
790
+ if is_remove_duplicate:
791
+ # only for predict
792
+ if idx > 0 and text_index[batch_idx][idx - 1] == text_index[
793
+ batch_idx][idx]:
794
+ continue
795
+ char_list.append(self.character[int(text_index[batch_idx][
796
+ idx])])
797
+ if text_prob is not None:
798
+ conf_list.append(text_prob[batch_idx][idx])
799
+ else:
800
+ conf_list.append(1)
801
+ text = ''.join(char_list)
802
+ if self.rm_symbol:
803
+ comp = re.compile('[^A-Z^a-z^0-9^\u4e00-\u9fa5]')
804
+ text = text.lower()
805
+ text = comp.sub('', text)
806
+ result_list.append((text, np.mean(conf_list).tolist()))
807
+ return result_list
808
+
809
+ def __call__(self, preds, label=None, *args, **kwargs):
810
+ if isinstance(preds, paddle.Tensor):
811
+ preds = preds.numpy()
812
+ preds_idx = preds.argmax(axis=2)
813
+ preds_prob = preds.max(axis=2)
814
+
815
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
816
+
817
+ if label is None:
818
+ return text
819
+ label = self.decode(label, is_remove_duplicate=False)
820
+ return text, label
821
+
822
+ def get_ignored_tokens(self):
823
+ return [self.padding_idx]
824
+
825
+
826
+ class DistillationSARLabelDecode(SARLabelDecode):
827
+ """
828
+ Convert
829
+ Convert between text-label and text-index
830
+ """
831
+
832
+ def __init__(self,
833
+ character_dict_path=None,
834
+ use_space_char=False,
835
+ model_name=["student"],
836
+ key=None,
837
+ multi_head=False,
838
+ **kwargs):
839
+ super(DistillationSARLabelDecode, self).__init__(character_dict_path,
840
+ use_space_char)
841
+ if not isinstance(model_name, list):
842
+ model_name = [model_name]
843
+ self.model_name = model_name
844
+
845
+ self.key = key
846
+ self.multi_head = multi_head
847
+
848
+ def __call__(self, preds, label=None, *args, **kwargs):
849
+ output = dict()
850
+ for name in self.model_name:
851
+ pred = preds[name]
852
+ if self.key is not None:
853
+ pred = pred[self.key]
854
+ if self.multi_head and isinstance(pred, dict):
855
+ pred = pred['sar']
856
+ output[name] = super().__call__(pred, label=label, *args, **kwargs)
857
+ return output
858
+
859
+
860
+ class PRENLabelDecode(BaseRecLabelDecode):
861
+ """ Convert between text-label and text-index """
862
+
863
+ def __init__(self, character_dict_path=None, use_space_char=False,
864
+ **kwargs):
865
+ super(PRENLabelDecode, self).__init__(character_dict_path,
866
+ use_space_char)
867
+
868
+ def add_special_char(self, dict_character):
869
+ padding_str = '<PAD>' # 0
870
+ end_str = '<EOS>' # 1
871
+ unknown_str = '<UNK>' # 2
872
+
873
+ dict_character = [padding_str, end_str, unknown_str] + dict_character
874
+ self.padding_idx = 0
875
+ self.end_idx = 1
876
+ self.unknown_idx = 2
877
+
878
+ return dict_character
879
+
880
+ def decode(self, text_index, text_prob=None):
881
+ """ convert text-index into text-label. """
882
+ result_list = []
883
+ batch_size = len(text_index)
884
+
885
+ for batch_idx in range(batch_size):
886
+ char_list = []
887
+ conf_list = []
888
+ for idx in range(len(text_index[batch_idx])):
889
+ if text_index[batch_idx][idx] == self.end_idx:
890
+ break
891
+ if text_index[batch_idx][idx] in \
892
+ [self.padding_idx, self.unknown_idx]:
893
+ continue
894
+ char_list.append(self.character[int(text_index[batch_idx][
895
+ idx])])
896
+ if text_prob is not None:
897
+ conf_list.append(text_prob[batch_idx][idx])
898
+ else:
899
+ conf_list.append(1)
900
+
901
+ text = ''.join(char_list)
902
+ if len(text) > 0:
903
+ result_list.append((text, np.mean(conf_list).tolist()))
904
+ else:
905
+ # here confidence of empty recog result is 1
906
+ result_list.append(('', 1))
907
+ return result_list
908
+
909
+ def __call__(self, preds, label=None, *args, **kwargs):
910
+ if isinstance(preds, paddle.Tensor):
911
+ preds = preds.numpy()
912
+ preds_idx = preds.argmax(axis=2)
913
+ preds_prob = preds.max(axis=2)
914
+ text = self.decode(preds_idx, preds_prob)
915
+ if label is None:
916
+ return text
917
+ label = self.decode(label)
918
+ return text, label
919
+
920
+
921
+ class NRTRLabelDecode(BaseRecLabelDecode):
922
+ """ Convert between text-label and text-index """
923
+
924
+ def __init__(self, character_dict_path=None, use_space_char=True, **kwargs):
925
+ super(NRTRLabelDecode, self).__init__(character_dict_path,
926
+ use_space_char)
927
+
928
+ def __call__(self, preds, label=None, *args, **kwargs):
929
+
930
+ if len(preds) == 2:
931
+ preds_id = preds[0]
932
+ preds_prob = preds[1]
933
+ if isinstance(preds_id, paddle.Tensor):
934
+ preds_id = preds_id.numpy()
935
+ if isinstance(preds_prob, paddle.Tensor):
936
+ preds_prob = preds_prob.numpy()
937
+ if preds_id[0][0] == 2:
938
+ preds_idx = preds_id[:, 1:]
939
+ preds_prob = preds_prob[:, 1:]
940
+ else:
941
+ preds_idx = preds_id
942
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
943
+ if label is None:
944
+ return text
945
+ label = self.decode(label[:, 1:])
946
+ else:
947
+ if isinstance(preds, paddle.Tensor):
948
+ preds = preds.numpy()
949
+ preds_idx = preds.argmax(axis=2)
950
+ preds_prob = preds.max(axis=2)
951
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
952
+ if label is None:
953
+ return text
954
+ label = self.decode(label[:, 1:])
955
+ return text, label
956
+
957
+ def add_special_char(self, dict_character):
958
+ dict_character = ['blank', '<unk>', '<s>', '</s>'] + dict_character
959
+ return dict_character
960
+
961
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
962
+ """ convert text-index into text-label. """
963
+ result_list = []
964
+ batch_size = len(text_index)
965
+ for batch_idx in range(batch_size):
966
+ char_list = []
967
+ conf_list = []
968
+ for idx in range(len(text_index[batch_idx])):
969
+ try:
970
+ char_idx = self.character[int(text_index[batch_idx][idx])]
971
+ except:
972
+ continue
973
+ if char_idx == '</s>': # end
974
+ break
975
+ char_list.append(char_idx)
976
+ if text_prob is not None:
977
+ conf_list.append(text_prob[batch_idx][idx])
978
+ else:
979
+ conf_list.append(1)
980
+ text = ''.join(char_list)
981
+ result_list.append((text, np.mean(conf_list).tolist()))
982
+ return result_list
983
+
984
+
985
+ class ViTSTRLabelDecode(NRTRLabelDecode):
986
+ """ Convert between text-label and text-index """
987
+
988
+ def __init__(self, character_dict_path=None, use_space_char=False,
989
+ **kwargs):
990
+ super(ViTSTRLabelDecode, self).__init__(character_dict_path,
991
+ use_space_char)
992
+
993
+ def __call__(self, preds, label=None, *args, **kwargs):
994
+ if isinstance(preds, paddle.Tensor):
995
+ preds = preds[:, 1:].numpy()
996
+ else:
997
+ preds = preds[:, 1:]
998
+ preds_idx = preds.argmax(axis=2)
999
+ preds_prob = preds.max(axis=2)
1000
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
1001
+ if label is None:
1002
+ return text
1003
+ label = self.decode(label[:, 1:])
1004
+ return text, label
1005
+
1006
+ def add_special_char(self, dict_character):
1007
+ dict_character = ['<s>', '</s>'] + dict_character
1008
+ return dict_character
1009
+
1010
+
1011
+ class ABINetLabelDecode(NRTRLabelDecode):
1012
+ """ Convert between text-label and text-index """
1013
+
1014
+ def __init__(self, character_dict_path=None, use_space_char=False,
1015
+ **kwargs):
1016
+ super(ABINetLabelDecode, self).__init__(character_dict_path,
1017
+ use_space_char)
1018
+
1019
+ def __call__(self, preds, label=None, *args, **kwargs):
1020
+ if isinstance(preds, dict):
1021
+ preds = preds['align'][-1].numpy()
1022
+ elif isinstance(preds, paddle.Tensor):
1023
+ preds = preds.numpy()
1024
+ else:
1025
+ preds = preds
1026
+
1027
+ preds_idx = preds.argmax(axis=2)
1028
+ preds_prob = preds.max(axis=2)
1029
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
1030
+ if label is None:
1031
+ return text
1032
+ label = self.decode(label)
1033
+ return text, label
1034
+
1035
+ def add_special_char(self, dict_character):
1036
+ dict_character = ['</s>'] + dict_character
1037
+ return dict_character
1038
+
1039
+
1040
+ class SPINLabelDecode(AttnLabelDecode):
1041
+ """ Convert between text-label and text-index """
1042
+
1043
+ def __init__(self, character_dict_path=None, use_space_char=False,
1044
+ **kwargs):
1045
+ super(SPINLabelDecode, self).__init__(character_dict_path,
1046
+ use_space_char)
1047
+
1048
+ def add_special_char(self, dict_character):
1049
+ self.beg_str = "sos"
1050
+ self.end_str = "eos"
1051
+ dict_character = dict_character
1052
+ dict_character = [self.beg_str] + [self.end_str] + dict_character
1053
+ return dict_character
1054
+
1055
+
1056
+ class VLLabelDecode(BaseRecLabelDecode):
1057
+ """ Convert between text-label and text-index """
1058
+
1059
+ def __init__(self, character_dict_path=None, use_space_char=False,
1060
+ **kwargs):
1061
+ super(VLLabelDecode, self).__init__(character_dict_path, use_space_char)
1062
+ self.max_text_length = kwargs.get('max_text_length', 25)
1063
+ self.nclass = len(self.character) + 1
1064
+
1065
+ def decode(self, text_index, text_prob=None, is_remove_duplicate=False):
1066
+ """ convert text-index into text-label. """
1067
+ result_list = []
1068
+ ignored_tokens = self.get_ignored_tokens()
1069
+ batch_size = len(text_index)
1070
+ for batch_idx in range(batch_size):
1071
+ selection = np.ones(len(text_index[batch_idx]), dtype=bool)
1072
+ if is_remove_duplicate:
1073
+ selection[1:] = text_index[batch_idx][1:] != text_index[
1074
+ batch_idx][:-1]
1075
+ for ignored_token in ignored_tokens:
1076
+ selection &= text_index[batch_idx] != ignored_token
1077
+
1078
+ char_list = [
1079
+ self.character[text_id - 1]
1080
+ for text_id in text_index[batch_idx][selection]
1081
+ ]
1082
+ if text_prob is not None:
1083
+ conf_list = text_prob[batch_idx][selection]
1084
+ else:
1085
+ conf_list = [1] * len(selection)
1086
+ if len(conf_list) == 0:
1087
+ conf_list = [0]
1088
+
1089
+ text = ''.join(char_list)
1090
+ result_list.append((text, np.mean(conf_list).tolist()))
1091
+ return result_list
1092
+
1093
+ def __call__(self, preds, label=None, length=None, *args, **kwargs):
1094
+ if len(preds) == 2: # eval mode
1095
+ text_pre, x = preds
1096
+ b = text_pre.shape[1]
1097
+ lenText = self.max_text_length
1098
+ nsteps = self.max_text_length
1099
+
1100
+ if not isinstance(text_pre, paddle.Tensor):
1101
+ text_pre = paddle.to_tensor(text_pre, dtype='float32')
1102
+
1103
+ out_res = paddle.zeros(
1104
+ shape=[lenText, b, self.nclass], dtype=x.dtype)
1105
+ out_length = paddle.zeros(shape=[b], dtype=x.dtype)
1106
+ now_step = 0
1107
+ for _ in range(nsteps):
1108
+ if 0 in out_length and now_step < nsteps:
1109
+ tmp_result = text_pre[now_step, :, :]
1110
+ out_res[now_step] = tmp_result
1111
+ tmp_result = tmp_result.topk(1)[1].squeeze(axis=1)
1112
+ for j in range(b):
1113
+ if out_length[j] == 0 and tmp_result[j] == 0:
1114
+ out_length[j] = now_step + 1
1115
+ now_step += 1
1116
+ for j in range(0, b):
1117
+ if int(out_length[j]) == 0:
1118
+ out_length[j] = nsteps
1119
+ start = 0
1120
+ output = paddle.zeros(
1121
+ shape=[int(out_length.sum()), self.nclass], dtype=x.dtype)
1122
+ for i in range(0, b):
1123
+ cur_length = int(out_length[i])
1124
+ output[start:start + cur_length] = out_res[0:cur_length, i, :]
1125
+ start += cur_length
1126
+ net_out = output
1127
+ length = out_length
1128
+
1129
+ else: # train mode
1130
+ net_out = preds[0]
1131
+ length = length
1132
+ net_out = paddle.concat([t[:l] for t, l in zip(net_out, length)])
1133
+ text = []
1134
+ if not isinstance(net_out, paddle.Tensor):
1135
+ net_out = paddle.to_tensor(net_out, dtype='float32')
1136
+ net_out = F.softmax(net_out, axis=1)
1137
+ for i in range(0, length.shape[0]):
1138
+ if i == 0:
1139
+ start_idx = 0
1140
+ end_idx = int(length[i])
1141
+ else:
1142
+ start_idx = int(length[:i].sum())
1143
+ end_idx = int(length[:i].sum() + length[i])
1144
+ preds_idx = net_out[start_idx:end_idx].topk(1)[1][:, 0].tolist()
1145
+ preds_text = ''.join([
1146
+ self.character[idx - 1]
1147
+ if idx > 0 and idx <= len(self.character) else ''
1148
+ for idx in preds_idx
1149
+ ])
1150
+ preds_prob = net_out[start_idx:end_idx].topk(1)[0][:, 0]
1151
+ preds_prob = paddle.exp(
1152
+ paddle.log(preds_prob).sum() / (preds_prob.shape[0] + 1e-6))
1153
+ text.append((preds_text, float(preds_prob)))
1154
+ if label is None:
1155
+ return text
1156
+ label = self.decode(label)
1157
+ return text, label
1158
+
1159
+
1160
+ class CANLabelDecode(BaseRecLabelDecode):
1161
+ """ Convert between latex-symbol and symbol-index """
1162
+
1163
+ def __init__(self, character_dict_path=None, use_space_char=False,
1164
+ **kwargs):
1165
+ super(CANLabelDecode, self).__init__(character_dict_path,
1166
+ use_space_char)
1167
+
1168
+ def decode(self, text_index, preds_prob=None):
1169
+ result_list = []
1170
+ batch_size = len(text_index)
1171
+ for batch_idx in range(batch_size):
1172
+ seq_end = text_index[batch_idx].argmin(0)
1173
+ idx_list = text_index[batch_idx][:seq_end].tolist()
1174
+ symbol_list = [self.character[idx] for idx in idx_list]
1175
+ probs = []
1176
+ if preds_prob is not None:
1177
+ probs = preds_prob[batch_idx][:len(symbol_list)].tolist()
1178
+
1179
+ result_list.append([' '.join(symbol_list), probs])
1180
+ return result_list
1181
+
1182
+ def __call__(self, preds, label=None, *args, **kwargs):
1183
+ pred_prob, _, _, _ = preds
1184
+ preds_idx = pred_prob.argmax(axis=2)
1185
+
1186
+ text = self.decode(preds_idx)
1187
+ if label is None:
1188
+ return text
1189
+ label = self.decode(label)
1190
+ return text, label
1191
+
1192
+
1193
+ class CPPDLabelDecode(NRTRLabelDecode):
1194
+ """ Convert between text-label and text-index """
1195
+
1196
+ def __init__(self, character_dict_path=None, use_space_char=False,
1197
+ **kwargs):
1198
+ super(CPPDLabelDecode, self).__init__(character_dict_path,
1199
+ use_space_char)
1200
+
1201
+ def __call__(self, preds, label=None, *args, **kwargs):
1202
+ if isinstance(preds, tuple):
1203
+ if isinstance(preds[-1], dict):
1204
+ preds = preds[-1]['align'][-1].numpy()
1205
+ else:
1206
+ preds = preds[-1].numpy()
1207
+ if isinstance(preds, paddle.Tensor):
1208
+ preds = preds.numpy()
1209
+ else:
1210
+ preds = preds
1211
+ preds_idx = preds.argmax(axis=2)
1212
+ preds_prob = preds.max(axis=2)
1213
+ text = self.decode(preds_idx, preds_prob, is_remove_duplicate=False)
1214
+ if label is None:
1215
+ return text
1216
+ label = self.decode(label)
1217
+ return text, label
1218
+
1219
+ def add_special_char(self, dict_character):
1220
+ dict_character = ['</s>'] + dict_character
1221
+ return dict_character
ocr-studio/PaddleOCR/ppocr/postprocess/sast_postprocess.py ADDED
@@ -0,0 +1,357 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import absolute_import
16
+ from __future__ import division
17
+ from __future__ import print_function
18
+
19
+ import os
20
+ import sys
21
+
22
+ __dir__ = os.path.dirname(__file__)
23
+ sys.path.append(__dir__)
24
+ sys.path.append(os.path.join(__dir__, '..'))
25
+
26
+ import numpy as np
27
+ from .locality_aware_nms import nms_locality
28
+ import paddle
29
+ import cv2
30
+ import time
31
+
32
+
33
+ class SASTPostProcess(object):
34
+ """
35
+ The post process for SAST.
36
+ """
37
+
38
+ def __init__(self,
39
+ score_thresh=0.5,
40
+ nms_thresh=0.2,
41
+ sample_pts_num=2,
42
+ shrink_ratio_of_width=0.3,
43
+ expand_scale=1.0,
44
+ tcl_map_thresh=0.5,
45
+ **kwargs):
46
+
47
+ self.score_thresh = score_thresh
48
+ self.nms_thresh = nms_thresh
49
+ self.sample_pts_num = sample_pts_num
50
+ self.shrink_ratio_of_width = shrink_ratio_of_width
51
+ self.expand_scale = expand_scale
52
+ self.tcl_map_thresh = tcl_map_thresh
53
+
54
+ # c++ la-nms is faster, but only support python 3.5
55
+ self.is_python35 = False
56
+ if sys.version_info.major == 3 and sys.version_info.minor == 5:
57
+ self.is_python35 = True
58
+
59
+ def point_pair2poly(self, point_pair_list):
60
+ """
61
+ Transfer vertical point_pairs into poly point in clockwise.
62
+ """
63
+ # constract poly
64
+ point_num = len(point_pair_list) * 2
65
+ point_list = [0] * point_num
66
+ for idx, point_pair in enumerate(point_pair_list):
67
+ point_list[idx] = point_pair[0]
68
+ point_list[point_num - 1 - idx] = point_pair[1]
69
+ return np.array(point_list).reshape(-1, 2)
70
+
71
+ def shrink_quad_along_width(self,
72
+ quad,
73
+ begin_width_ratio=0.,
74
+ end_width_ratio=1.):
75
+ """
76
+ Generate shrink_quad_along_width.
77
+ """
78
+ ratio_pair = np.array(
79
+ [[begin_width_ratio], [end_width_ratio]], dtype=np.float32)
80
+ p0_1 = quad[0] + (quad[1] - quad[0]) * ratio_pair
81
+ p3_2 = quad[3] + (quad[2] - quad[3]) * ratio_pair
82
+ return np.array([p0_1[0], p0_1[1], p3_2[1], p3_2[0]])
83
+
84
+ def expand_poly_along_width(self, poly, shrink_ratio_of_width=0.3):
85
+ """
86
+ expand poly along width.
87
+ """
88
+ point_num = poly.shape[0]
89
+ left_quad = np.array(
90
+ [poly[0], poly[1], poly[-2], poly[-1]], dtype=np.float32)
91
+ left_ratio = -shrink_ratio_of_width * np.linalg.norm(left_quad[0] - left_quad[3]) / \
92
+ (np.linalg.norm(left_quad[0] - left_quad[1]) + 1e-6)
93
+ left_quad_expand = self.shrink_quad_along_width(left_quad, left_ratio,
94
+ 1.0)
95
+ right_quad = np.array(
96
+ [
97
+ poly[point_num // 2 - 2], poly[point_num // 2 - 1],
98
+ poly[point_num // 2], poly[point_num // 2 + 1]
99
+ ],
100
+ dtype=np.float32)
101
+ right_ratio = 1.0 + \
102
+ shrink_ratio_of_width * np.linalg.norm(right_quad[0] - right_quad[3]) / \
103
+ (np.linalg.norm(right_quad[0] - right_quad[1]) + 1e-6)
104
+ right_quad_expand = self.shrink_quad_along_width(right_quad, 0.0,
105
+ right_ratio)
106
+ poly[0] = left_quad_expand[0]
107
+ poly[-1] = left_quad_expand[-1]
108
+ poly[point_num // 2 - 1] = right_quad_expand[1]
109
+ poly[point_num // 2] = right_quad_expand[2]
110
+ return poly
111
+
112
+ def restore_quad(self, tcl_map, tcl_map_thresh, tvo_map):
113
+ """Restore quad."""
114
+ xy_text = np.argwhere(tcl_map[:, :, 0] > tcl_map_thresh)
115
+ xy_text = xy_text[:, ::-1] # (n, 2)
116
+
117
+ # Sort the text boxes via the y axis
118
+ xy_text = xy_text[np.argsort(xy_text[:, 1])]
119
+
120
+ scores = tcl_map[xy_text[:, 1], xy_text[:, 0], 0]
121
+ scores = scores[:, np.newaxis]
122
+
123
+ # Restore
124
+ point_num = int(tvo_map.shape[-1] / 2)
125
+ assert point_num == 4
126
+ tvo_map = tvo_map[xy_text[:, 1], xy_text[:, 0], :]
127
+ xy_text_tile = np.tile(xy_text, (1, point_num)) # (n, point_num * 2)
128
+ quads = xy_text_tile - tvo_map
129
+
130
+ return scores, quads, xy_text
131
+
132
+ def quad_area(self, quad):
133
+ """
134
+ compute area of a quad.
135
+ """
136
+ edge = [(quad[1][0] - quad[0][0]) * (quad[1][1] + quad[0][1]),
137
+ (quad[2][0] - quad[1][0]) * (quad[2][1] + quad[1][1]),
138
+ (quad[3][0] - quad[2][0]) * (quad[3][1] + quad[2][1]),
139
+ (quad[0][0] - quad[3][0]) * (quad[0][1] + quad[3][1])]
140
+ return np.sum(edge) / 2.
141
+
142
+ def nms(self, dets):
143
+ if self.is_python35:
144
+ from ppocr.utils.utility import check_install
145
+ check_install('lanms', 'lanms-nova')
146
+ import lanms
147
+ dets = lanms.merge_quadrangle_n9(dets, self.nms_thresh)
148
+ else:
149
+ dets = nms_locality(dets, self.nms_thresh)
150
+ return dets
151
+
152
+ def cluster_by_quads_tco(self, tcl_map, tcl_map_thresh, quads, tco_map):
153
+ """
154
+ Cluster pixels in tcl_map based on quads.
155
+ """
156
+ instance_count = quads.shape[0] + 1 # contain background
157
+ instance_label_map = np.zeros(tcl_map.shape[:2], dtype=np.int32)
158
+ if instance_count == 1:
159
+ return instance_count, instance_label_map
160
+
161
+ # predict text center
162
+ xy_text = np.argwhere(tcl_map[:, :, 0] > tcl_map_thresh)
163
+ n = xy_text.shape[0]
164
+ xy_text = xy_text[:, ::-1] # (n, 2)
165
+ tco = tco_map[xy_text[:, 1], xy_text[:, 0], :] # (n, 2)
166
+ pred_tc = xy_text - tco
167
+
168
+ # get gt text center
169
+ m = quads.shape[0]
170
+ gt_tc = np.mean(quads, axis=1) # (m, 2)
171
+
172
+ pred_tc_tile = np.tile(pred_tc[:, np.newaxis, :],
173
+ (1, m, 1)) # (n, m, 2)
174
+ gt_tc_tile = np.tile(gt_tc[np.newaxis, :, :], (n, 1, 1)) # (n, m, 2)
175
+ dist_mat = np.linalg.norm(pred_tc_tile - gt_tc_tile, axis=2) # (n, m)
176
+ xy_text_assign = np.argmin(dist_mat, axis=1) + 1 # (n,)
177
+
178
+ instance_label_map[xy_text[:, 1], xy_text[:, 0]] = xy_text_assign
179
+ return instance_count, instance_label_map
180
+
181
+ def estimate_sample_pts_num(self, quad, xy_text):
182
+ """
183
+ Estimate sample points number.
184
+ """
185
+ eh = (np.linalg.norm(quad[0] - quad[3]) +
186
+ np.linalg.norm(quad[1] - quad[2])) / 2.0
187
+ ew = (np.linalg.norm(quad[0] - quad[1]) +
188
+ np.linalg.norm(quad[2] - quad[3])) / 2.0
189
+
190
+ dense_sample_pts_num = max(2, int(ew))
191
+ dense_xy_center_line = xy_text[np.linspace(
192
+ 0,
193
+ xy_text.shape[0] - 1,
194
+ dense_sample_pts_num,
195
+ endpoint=True,
196
+ dtype=np.float32).astype(np.int32)]
197
+
198
+ dense_xy_center_line_diff = dense_xy_center_line[
199
+ 1:] - dense_xy_center_line[:-1]
200
+ estimate_arc_len = np.sum(
201
+ np.linalg.norm(
202
+ dense_xy_center_line_diff, axis=1))
203
+
204
+ sample_pts_num = max(2, int(estimate_arc_len / eh))
205
+ return sample_pts_num
206
+
207
+ def detect_sast(self,
208
+ tcl_map,
209
+ tvo_map,
210
+ tbo_map,
211
+ tco_map,
212
+ ratio_w,
213
+ ratio_h,
214
+ src_w,
215
+ src_h,
216
+ shrink_ratio_of_width=0.3,
217
+ tcl_map_thresh=0.5,
218
+ offset_expand=1.0,
219
+ out_strid=4.0):
220
+ """
221
+ first resize the tcl_map, tvo_map and tbo_map to the input_size, then restore the polys
222
+ """
223
+ # restore quad
224
+ scores, quads, xy_text = self.restore_quad(tcl_map, tcl_map_thresh,
225
+ tvo_map)
226
+ dets = np.hstack((quads, scores)).astype(np.float32, copy=False)
227
+ dets = self.nms(dets)
228
+ if dets.shape[0] == 0:
229
+ return []
230
+ quads = dets[:, :-1].reshape(-1, 4, 2)
231
+
232
+ # Compute quad area
233
+ quad_areas = []
234
+ for quad in quads:
235
+ quad_areas.append(-self.quad_area(quad))
236
+
237
+ # instance segmentation
238
+ # instance_count, instance_label_map = cv2.connectedComponents(tcl_map.astype(np.uint8), connectivity=8)
239
+ instance_count, instance_label_map = self.cluster_by_quads_tco(
240
+ tcl_map, tcl_map_thresh, quads, tco_map)
241
+
242
+ # restore single poly with tcl instance.
243
+ poly_list = []
244
+ for instance_idx in range(1, instance_count):
245
+ xy_text = np.argwhere(instance_label_map == instance_idx)[:, ::-1]
246
+ quad = quads[instance_idx - 1]
247
+ q_area = quad_areas[instance_idx - 1]
248
+ if q_area < 5:
249
+ continue
250
+
251
+ #
252
+ len1 = float(np.linalg.norm(quad[0] - quad[1]))
253
+ len2 = float(np.linalg.norm(quad[1] - quad[2]))
254
+ min_len = min(len1, len2)
255
+ if min_len < 3:
256
+ continue
257
+
258
+ # filter small CC
259
+ if xy_text.shape[0] <= 0:
260
+ continue
261
+
262
+ # filter low confidence instance
263
+ xy_text_scores = tcl_map[xy_text[:, 1], xy_text[:, 0], 0]
264
+ if np.sum(xy_text_scores) / quad_areas[instance_idx - 1] < 0.1:
265
+ # if np.sum(xy_text_scores) / quad_areas[instance_idx - 1] < 0.05:
266
+ continue
267
+
268
+ # sort xy_text
269
+ left_center_pt = np.array(
270
+ [[(quad[0, 0] + quad[-1, 0]) / 2.0,
271
+ (quad[0, 1] + quad[-1, 1]) / 2.0]]) # (1, 2)
272
+ right_center_pt = np.array(
273
+ [[(quad[1, 0] + quad[2, 0]) / 2.0,
274
+ (quad[1, 1] + quad[2, 1]) / 2.0]]) # (1, 2)
275
+ proj_unit_vec = (right_center_pt - left_center_pt) / \
276
+ (np.linalg.norm(right_center_pt - left_center_pt) + 1e-6)
277
+ proj_value = np.sum(xy_text * proj_unit_vec, axis=1)
278
+ xy_text = xy_text[np.argsort(proj_value)]
279
+
280
+ # Sample pts in tcl map
281
+ if self.sample_pts_num == 0:
282
+ sample_pts_num = self.estimate_sample_pts_num(quad, xy_text)
283
+ else:
284
+ sample_pts_num = self.sample_pts_num
285
+ xy_center_line = xy_text[np.linspace(
286
+ 0,
287
+ xy_text.shape[0] - 1,
288
+ sample_pts_num,
289
+ endpoint=True,
290
+ dtype=np.float32).astype(np.int32)]
291
+
292
+ point_pair_list = []
293
+ for x, y in xy_center_line:
294
+ # get corresponding offset
295
+ offset = tbo_map[y, x, :].reshape(2, 2)
296
+ if offset_expand != 1.0:
297
+ offset_length = np.linalg.norm(
298
+ offset, axis=1, keepdims=True)
299
+ expand_length = np.clip(
300
+ offset_length * (offset_expand - 1),
301
+ a_min=0.5,
302
+ a_max=3.0)
303
+ offset_detal = offset / offset_length * expand_length
304
+ offset = offset + offset_detal
305
+ # original point
306
+ ori_yx = np.array([y, x], dtype=np.float32)
307
+ point_pair = (ori_yx + offset)[:, ::-1] * out_strid / np.array(
308
+ [ratio_w, ratio_h]).reshape(-1, 2)
309
+ point_pair_list.append(point_pair)
310
+
311
+ # ndarry: (x, 2), expand poly along width
312
+ detected_poly = self.point_pair2poly(point_pair_list)
313
+ detected_poly = self.expand_poly_along_width(detected_poly,
314
+ shrink_ratio_of_width)
315
+ detected_poly[:, 0] = np.clip(
316
+ detected_poly[:, 0], a_min=0, a_max=src_w)
317
+ detected_poly[:, 1] = np.clip(
318
+ detected_poly[:, 1], a_min=0, a_max=src_h)
319
+ poly_list.append(detected_poly)
320
+
321
+ return poly_list
322
+
323
+ def __call__(self, outs_dict, shape_list):
324
+ score_list = outs_dict['f_score']
325
+ border_list = outs_dict['f_border']
326
+ tvo_list = outs_dict['f_tvo']
327
+ tco_list = outs_dict['f_tco']
328
+ if isinstance(score_list, paddle.Tensor):
329
+ score_list = score_list.numpy()
330
+ border_list = border_list.numpy()
331
+ tvo_list = tvo_list.numpy()
332
+ tco_list = tco_list.numpy()
333
+
334
+ img_num = len(shape_list)
335
+ poly_lists = []
336
+ for ino in range(img_num):
337
+ p_score = score_list[ino].transpose((1, 2, 0))
338
+ p_border = border_list[ino].transpose((1, 2, 0))
339
+ p_tvo = tvo_list[ino].transpose((1, 2, 0))
340
+ p_tco = tco_list[ino].transpose((1, 2, 0))
341
+ src_h, src_w, ratio_h, ratio_w = shape_list[ino]
342
+
343
+ poly_list = self.detect_sast(
344
+ p_score,
345
+ p_tvo,
346
+ p_border,
347
+ p_tco,
348
+ ratio_w,
349
+ ratio_h,
350
+ src_w,
351
+ src_h,
352
+ shrink_ratio_of_width=self.shrink_ratio_of_width,
353
+ tcl_map_thresh=self.tcl_map_thresh,
354
+ offset_expand=self.expand_scale)
355
+ poly_lists.append({'points': np.array(poly_list)})
356
+
357
+ return poly_lists
ocr-studio/PaddleOCR/ppocr/postprocess/table_postprocess.py ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+ import paddle
17
+
18
+ from .rec_postprocess import AttnLabelDecode
19
+
20
+
21
+ class TableLabelDecode(AttnLabelDecode):
22
+ """ """
23
+
24
+ def __init__(self,
25
+ character_dict_path,
26
+ merge_no_span_structure=False,
27
+ **kwargs):
28
+ dict_character = []
29
+ with open(character_dict_path, "rb") as fin:
30
+ lines = fin.readlines()
31
+ for line in lines:
32
+ line = line.decode('utf-8').strip("\n").strip("\r\n")
33
+ dict_character.append(line)
34
+
35
+ if merge_no_span_structure:
36
+ if "<td></td>" not in dict_character:
37
+ dict_character.append("<td></td>")
38
+ if "<td>" in dict_character:
39
+ dict_character.remove("<td>")
40
+
41
+ dict_character = self.add_special_char(dict_character)
42
+ self.dict = {}
43
+ for i, char in enumerate(dict_character):
44
+ self.dict[char] = i
45
+ self.character = dict_character
46
+ self.td_token = ['<td>', '<td', '<td></td>']
47
+
48
+ def __call__(self, preds, batch=None):
49
+ structure_probs = preds['structure_probs']
50
+ bbox_preds = preds['loc_preds']
51
+ if isinstance(structure_probs, paddle.Tensor):
52
+ structure_probs = structure_probs.numpy()
53
+ if isinstance(bbox_preds, paddle.Tensor):
54
+ bbox_preds = bbox_preds.numpy()
55
+ shape_list = batch[-1]
56
+ result = self.decode(structure_probs, bbox_preds, shape_list)
57
+ if len(batch) == 1: # only contains shape
58
+ return result
59
+
60
+ label_decode_result = self.decode_label(batch)
61
+ return result, label_decode_result
62
+
63
+ def decode(self, structure_probs, bbox_preds, shape_list):
64
+ """convert text-label into text-index.
65
+ """
66
+ ignored_tokens = self.get_ignored_tokens()
67
+ end_idx = self.dict[self.end_str]
68
+
69
+ structure_idx = structure_probs.argmax(axis=2)
70
+ structure_probs = structure_probs.max(axis=2)
71
+
72
+ structure_batch_list = []
73
+ bbox_batch_list = []
74
+ batch_size = len(structure_idx)
75
+ for batch_idx in range(batch_size):
76
+ structure_list = []
77
+ bbox_list = []
78
+ score_list = []
79
+ for idx in range(len(structure_idx[batch_idx])):
80
+ char_idx = int(structure_idx[batch_idx][idx])
81
+ if idx > 0 and char_idx == end_idx:
82
+ break
83
+ if char_idx in ignored_tokens:
84
+ continue
85
+ text = self.character[char_idx]
86
+ if text in self.td_token:
87
+ bbox = bbox_preds[batch_idx, idx]
88
+ bbox = self._bbox_decode(bbox, shape_list[batch_idx])
89
+ bbox_list.append(bbox)
90
+ structure_list.append(text)
91
+ score_list.append(structure_probs[batch_idx, idx])
92
+ structure_batch_list.append([structure_list, np.mean(score_list)])
93
+ bbox_batch_list.append(np.array(bbox_list))
94
+ result = {
95
+ 'bbox_batch_list': bbox_batch_list,
96
+ 'structure_batch_list': structure_batch_list,
97
+ }
98
+ return result
99
+
100
+ def decode_label(self, batch):
101
+ """convert text-label into text-index.
102
+ """
103
+ structure_idx = batch[1]
104
+ gt_bbox_list = batch[2]
105
+ shape_list = batch[-1]
106
+ ignored_tokens = self.get_ignored_tokens()
107
+ end_idx = self.dict[self.end_str]
108
+
109
+ structure_batch_list = []
110
+ bbox_batch_list = []
111
+ batch_size = len(structure_idx)
112
+ for batch_idx in range(batch_size):
113
+ structure_list = []
114
+ bbox_list = []
115
+ for idx in range(len(structure_idx[batch_idx])):
116
+ char_idx = int(structure_idx[batch_idx][idx])
117
+ if idx > 0 and char_idx == end_idx:
118
+ break
119
+ if char_idx in ignored_tokens:
120
+ continue
121
+ structure_list.append(self.character[char_idx])
122
+
123
+ bbox = gt_bbox_list[batch_idx][idx]
124
+ if bbox.sum() != 0:
125
+ bbox = self._bbox_decode(bbox, shape_list[batch_idx])
126
+ bbox_list.append(bbox)
127
+ structure_batch_list.append(structure_list)
128
+ bbox_batch_list.append(bbox_list)
129
+ result = {
130
+ 'bbox_batch_list': bbox_batch_list,
131
+ 'structure_batch_list': structure_batch_list,
132
+ }
133
+ return result
134
+
135
+ def _bbox_decode(self, bbox, shape):
136
+ h, w, ratio_h, ratio_w, pad_h, pad_w = shape
137
+ bbox[0::2] *= w
138
+ bbox[1::2] *= h
139
+ return bbox
140
+
141
+
142
+ class TableMasterLabelDecode(TableLabelDecode):
143
+ """ """
144
+
145
+ def __init__(self,
146
+ character_dict_path,
147
+ box_shape='ori',
148
+ merge_no_span_structure=True,
149
+ **kwargs):
150
+ super(TableMasterLabelDecode, self).__init__(character_dict_path,
151
+ merge_no_span_structure)
152
+ self.box_shape = box_shape
153
+ assert box_shape in [
154
+ 'ori', 'pad'
155
+ ], 'The shape used for box normalization must be ori or pad'
156
+
157
+ def add_special_char(self, dict_character):
158
+ self.beg_str = '<SOS>'
159
+ self.end_str = '<EOS>'
160
+ self.unknown_str = '<UKN>'
161
+ self.pad_str = '<PAD>'
162
+ dict_character = dict_character
163
+ dict_character = dict_character + [
164
+ self.unknown_str, self.beg_str, self.end_str, self.pad_str
165
+ ]
166
+ return dict_character
167
+
168
+ def get_ignored_tokens(self):
169
+ pad_idx = self.dict[self.pad_str]
170
+ start_idx = self.dict[self.beg_str]
171
+ end_idx = self.dict[self.end_str]
172
+ unknown_idx = self.dict[self.unknown_str]
173
+ return [start_idx, end_idx, pad_idx, unknown_idx]
174
+
175
+ def _bbox_decode(self, bbox, shape):
176
+ h, w, ratio_h, ratio_w, pad_h, pad_w = shape
177
+ if self.box_shape == 'pad':
178
+ h, w = pad_h, pad_w
179
+ bbox[0::2] *= w
180
+ bbox[1::2] *= h
181
+ bbox[0::2] /= ratio_w
182
+ bbox[1::2] /= ratio_h
183
+ x, y, w, h = bbox
184
+ x1, y1, x2, y2 = x - w // 2, y - h // 2, x + w // 2, y + h // 2
185
+ bbox = np.array([x1, y1, x2, y2])
186
+ return bbox
ocr-studio/PaddleOCR/ppocr/postprocess/vqa_token_re_layoutlm_postprocess.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import paddle
15
+
16
+
17
+ class VQAReTokenLayoutLMPostProcess(object):
18
+ """ Convert between text-label and text-index """
19
+
20
+ def __init__(self, **kwargs):
21
+ super(VQAReTokenLayoutLMPostProcess, self).__init__()
22
+
23
+ def __call__(self, preds, label=None, *args, **kwargs):
24
+ pred_relations = preds['pred_relations']
25
+ if isinstance(preds['pred_relations'], paddle.Tensor):
26
+ pred_relations = pred_relations.numpy()
27
+ pred_relations = self.decode_pred(pred_relations)
28
+
29
+ if label is not None:
30
+ return self._metric(pred_relations, label)
31
+ else:
32
+ return self._infer(pred_relations, *args, **kwargs)
33
+
34
+ def _metric(self, pred_relations, label):
35
+ return pred_relations, label[-1], label[-2]
36
+
37
+ def _infer(self, pred_relations, *args, **kwargs):
38
+ ser_results = kwargs['ser_results']
39
+ entity_idx_dict_batch = kwargs['entity_idx_dict_batch']
40
+
41
+ # merge relations and ocr info
42
+ results = []
43
+ for pred_relation, ser_result, entity_idx_dict in zip(
44
+ pred_relations, ser_results, entity_idx_dict_batch):
45
+ result = []
46
+ used_tail_id = []
47
+ for relation in pred_relation:
48
+ if relation['tail_id'] in used_tail_id:
49
+ continue
50
+ used_tail_id.append(relation['tail_id'])
51
+ ocr_info_head = ser_result[entity_idx_dict[relation['head_id']]]
52
+ ocr_info_tail = ser_result[entity_idx_dict[relation['tail_id']]]
53
+ result.append((ocr_info_head, ocr_info_tail))
54
+ results.append(result)
55
+ return results
56
+
57
+ def decode_pred(self, pred_relations):
58
+ pred_relations_new = []
59
+ for pred_relation in pred_relations:
60
+ pred_relation_new = []
61
+ pred_relation = pred_relation[1:pred_relation[0, 0, 0] + 1]
62
+ for relation in pred_relation:
63
+ relation_new = dict()
64
+ relation_new['head_id'] = relation[0, 0]
65
+ relation_new['head'] = tuple(relation[1])
66
+ relation_new['head_type'] = relation[2, 0]
67
+ relation_new['tail_id'] = relation[3, 0]
68
+ relation_new['tail'] = tuple(relation[4])
69
+ relation_new['tail_type'] = relation[5, 0]
70
+ relation_new['type'] = relation[6, 0]
71
+ pred_relation_new.append(relation_new)
72
+ pred_relations_new.append(pred_relation_new)
73
+ return pred_relations_new
74
+
75
+
76
+ class DistillationRePostProcess(VQAReTokenLayoutLMPostProcess):
77
+ """
78
+ DistillationRePostProcess
79
+ """
80
+
81
+ def __init__(self, model_name=["Student"], key=None, **kwargs):
82
+ super().__init__(**kwargs)
83
+ if not isinstance(model_name, list):
84
+ model_name = [model_name]
85
+ self.model_name = model_name
86
+ self.key = key
87
+
88
+ def __call__(self, preds, *args, **kwargs):
89
+ output = dict()
90
+ for name in self.model_name:
91
+ pred = preds[name]
92
+ if self.key is not None:
93
+ pred = pred[self.key]
94
+ output[name] = super().__call__(pred, *args, **kwargs)
95
+ return output
ocr-studio/PaddleOCR/ppocr/postprocess/vqa_token_ser_layoutlm_postprocess.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ import numpy as np
15
+ import paddle
16
+ from ppocr.utils.utility import load_vqa_bio_label_maps
17
+
18
+
19
+ class VQASerTokenLayoutLMPostProcess(object):
20
+ """ Convert between text-label and text-index """
21
+
22
+ def __init__(self, class_path, **kwargs):
23
+ super(VQASerTokenLayoutLMPostProcess, self).__init__()
24
+ label2id_map, self.id2label_map = load_vqa_bio_label_maps(class_path)
25
+
26
+ self.label2id_map_for_draw = dict()
27
+ for key in label2id_map:
28
+ if key.startswith("I-"):
29
+ self.label2id_map_for_draw[key] = label2id_map["B" + key[1:]]
30
+ else:
31
+ self.label2id_map_for_draw[key] = label2id_map[key]
32
+
33
+ self.id2label_map_for_show = dict()
34
+ for key in self.label2id_map_for_draw:
35
+ val = self.label2id_map_for_draw[key]
36
+ if key == "O":
37
+ self.id2label_map_for_show[val] = key
38
+ if key.startswith("B-") or key.startswith("I-"):
39
+ self.id2label_map_for_show[val] = key[2:]
40
+ else:
41
+ self.id2label_map_for_show[val] = key
42
+
43
+ def __call__(self, preds, batch=None, *args, **kwargs):
44
+ if isinstance(preds, tuple):
45
+ preds = preds[0]
46
+ if isinstance(preds, paddle.Tensor):
47
+ preds = preds.numpy()
48
+
49
+ if batch is not None:
50
+ return self._metric(preds, batch[5])
51
+ else:
52
+ return self._infer(preds, **kwargs)
53
+
54
+ def _metric(self, preds, label):
55
+ pred_idxs = preds.argmax(axis=2)
56
+ decode_out_list = [[] for _ in range(pred_idxs.shape[0])]
57
+ label_decode_out_list = [[] for _ in range(pred_idxs.shape[0])]
58
+
59
+ for i in range(pred_idxs.shape[0]):
60
+ for j in range(pred_idxs.shape[1]):
61
+ if label[i, j] != -100:
62
+ label_decode_out_list[i].append(self.id2label_map[label[i,
63
+ j]])
64
+ decode_out_list[i].append(self.id2label_map[pred_idxs[i,
65
+ j]])
66
+ return decode_out_list, label_decode_out_list
67
+
68
+ def _infer(self, preds, segment_offset_ids, ocr_infos):
69
+ results = []
70
+
71
+ for pred, segment_offset_id, ocr_info in zip(preds, segment_offset_ids,
72
+ ocr_infos):
73
+ pred = np.argmax(pred, axis=1)
74
+ pred = [self.id2label_map[idx] for idx in pred]
75
+
76
+ for idx in range(len(segment_offset_id)):
77
+ if idx == 0:
78
+ start_id = 0
79
+ else:
80
+ start_id = segment_offset_id[idx - 1]
81
+
82
+ end_id = segment_offset_id[idx]
83
+
84
+ curr_pred = pred[start_id:end_id]
85
+ curr_pred = [self.label2id_map_for_draw[p] for p in curr_pred]
86
+
87
+ if len(curr_pred) <= 0:
88
+ pred_id = 0
89
+ else:
90
+ counts = np.bincount(curr_pred)
91
+ pred_id = np.argmax(counts)
92
+ ocr_info[idx]["pred_id"] = int(pred_id)
93
+ ocr_info[idx]["pred"] = self.id2label_map_for_show[int(pred_id)]
94
+ results.append(ocr_info)
95
+ return results
96
+
97
+
98
+ class DistillationSerPostProcess(VQASerTokenLayoutLMPostProcess):
99
+ """
100
+ DistillationSerPostProcess
101
+ """
102
+
103
+ def __init__(self, class_path, model_name=["Student"], key=None, **kwargs):
104
+ super().__init__(class_path, **kwargs)
105
+ if not isinstance(model_name, list):
106
+ model_name = [model_name]
107
+ self.model_name = model_name
108
+ self.key = key
109
+
110
+ def __call__(self, preds, batch=None, *args, **kwargs):
111
+ output = dict()
112
+ for name in self.model_name:
113
+ pred = preds[name]
114
+ if self.key is not None:
115
+ pred = pred[self.key]
116
+ output[name] = super().__call__(pred, batch=batch, *args, **kwargs)
117
+ return output
ocr-studio/PaddleOCR/ppocr/utils/EN_symbol_dict.txt ADDED
@@ -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
+ ~
ocr-studio/PaddleOCR/ppocr/utils/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
ocr-studio/PaddleOCR/ppocr/utils/corpus/fi_corpus.txt ADDED
The diff for this file is too large to render. See raw diff
 
ocr-studio/PaddleOCR/ppocr/utils/dict/README.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ ## Dictionary and Corpus
2
+
3
+ Dictionary files (usually character level vocabulary) are included here for easier configuration. Corpus contributed by OSS contributors are listed here, please respect copyrights when using them at your own risk.
4
+
5
+ - Burmese corpus: https://github.com/1chimaruGin/BurmeseCorpus
ocr-studio/PaddleOCR/ppocr/utils/dict/ar_dict.txt ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ a
2
+ r
3
+ b
4
+ i
5
+ c
6
+ _
7
+ m
8
+ g
9
+ /
10
+ 1
11
+ 0
12
+ I
13
+ L
14
+ S
15
+ V
16
+ R
17
+ C
18
+ 2
19
+ v
20
+ l
21
+ 6
22
+ 3
23
+ 9
24
+ .
25
+ j
26
+ p
27
+ ا
28
+ ل
29
+ م
30
+ ر
31
+ ج
32
+ و
33
+ ح
34
+ ي
35
+ ة
36
+ 5
37
+ 8
38
+ 7
39
+ أ
40
+ ب
41
+ ض
42
+ 4
43
+ ك
44
+ س
45
+ ه
46
+ ث
47
+ ن
48
+ ط
49
+ ع
50
+ ت
51
+ غ
52
+ خ
53
+ ف
54
+ ئ
55
+ ز
56
+ إ
57
+ د
58
+ ص
59
+ ظ
60
+ ذ
61
+ ش
62
+ ى
63
+ ق
64
+ ؤ
65
+ آ
66
+ ء
67
+ s
68
+ e
69
+ n
70
+ w
71
+ t
72
+ u
73
+ z
74
+ d
75
+ A
76
+ N
77
+ G
78
+ h
79
+ o
80
+ E
81
+ T
82
+ H
83
+ O
84
+ B
85
+ y
86
+ F
87
+ U
88
+ J
89
+ X
90
+ W
91
+ P
92
+ Z
93
+ M
94
+ k
95
+ q
96
+ Y
97
+ Q
98
+ D
99
+ f
100
+ K
101
+ x
102
+ '
103
+ %
104
+ -
105
+ #
106
+ @
107
+ !
108
+ &
109
+ $
110
+ ,
111
+ :
112
+ é
113
+ ?
114
+ +
115
+ É
116
+ (
117
+
ocr-studio/PaddleOCR/ppocr/utils/dict/arabic_dict.txt ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !
2
+ #
3
+ $
4
+ %
5
+ &
6
+ '
7
+ (
8
+ +
9
+ ,
10
+ -
11
+ .
12
+ /
13
+ 0
14
+ 1
15
+ 2
16
+ 3
17
+ 4
18
+ 5
19
+ 6
20
+ 7
21
+ 8
22
+ 9
23
+ :
24
+ ?
25
+ @
26
+ A
27
+ B
28
+ C
29
+ D
30
+ E
31
+ F
32
+ G
33
+ H
34
+ I
35
+ J
36
+ K
37
+ L
38
+ M
39
+ N
40
+ O
41
+ P
42
+ Q
43
+ R
44
+ S
45
+ T
46
+ U
47
+ V
48
+ W
49
+ X
50
+ Y
51
+ Z
52
+ _
53
+ a
54
+ b
55
+ c
56
+ d
57
+ e
58
+ f
59
+ g
60
+ h
61
+ i
62
+ j
63
+ k
64
+ l
65
+ m
66
+ n
67
+ o
68
+ p
69
+ q
70
+ r
71
+ s
72
+ t
73
+ u
74
+ v
75
+ w
76
+ x
77
+ y
78
+ z
79
+ É
80
+ é
81
+ ء
82
+ آ
83
+ أ
84
+ ؤ
85
+ إ
86
+ ئ
87
+ ا
88
+ ب
89
+ ة
90
+ ت
91
+ ث
92
+ ج
93
+ ح
94
+ خ
95
+ د
96
+ ذ
97
+ ر
98
+ ز
99
+ س
100
+ ش
101
+ ص
102
+ ض
103
+ ط
104
+ ظ
105
+ ع
106
+ غ
107
+ ف
108
+ ق
109
+ ك
110
+ ل
111
+ م
112
+ ن
113
+ ه
114
+ و
115
+ ى
116
+ ي
117
+ ً
118
+ ٌ
119
+ ٍ
120
+ َ
121
+ ُ
122
+ ِ
123
+ ّ
124
+ ْ
125
+ ٓ
126
+ ٔ
127
+ ٰ
128
+ ٱ
129
+ ٹ
130
+ پ
131
+ چ
132
+ ڈ
133
+ ڑ
134
+ ژ
135
+ ک
136
+ ڭ
137
+ گ
138
+ ں
139
+ ھ
140
+ ۀ
141
+ ہ
142
+ ۂ
143
+ ۃ
144
+ ۆ
145
+ ۇ
146
+ ۈ
147
+ ۋ
148
+ ی
149
+ ې
150
+ ے
151
+ ۓ
152
+ ە
153
+ ١
154
+ ٢
155
+ ٣
156
+ ٤
157
+ ٥
158
+ ٦
159
+ ٧
160
+ ٨
161
+ ٩
ocr-studio/PaddleOCR/ppocr/utils/dict/be_dict.txt ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ b
2
+ e
3
+ _
4
+ i
5
+ m
6
+ g
7
+ /
8
+ 2
9
+ 0
10
+ I
11
+ L
12
+ S
13
+ V
14
+ R
15
+ C
16
+ 1
17
+ v
18
+ a
19
+ l
20
+ 6
21
+ 9
22
+ 4
23
+ 3
24
+ .
25
+ j
26
+ p
27
+ п
28
+ а
29
+ з
30
+ б
31
+ у
32
+ г
33
+ н
34
+ ц
35
+ ь
36
+ 8
37
+ м
38
+ л
39
+ і
40
+ о
41
+ ў
42
+ ы
43
+ 7
44
+ 5
45
+ М
46
+ х
47
+ с
48
+ р
49
+ ф
50
+ я
51
+ е
52
+ д
53
+ ж
54
+ ю
55
+ ч
56
+ й
57
+ к
58
+ Д
59
+ в
60
+ Б
61
+ т
62
+ І
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
+ s
95
+ c
96
+ n
97
+ w
98
+ M
99
+ o
100
+ t
101
+ T
102
+ E
103
+ A
104
+ B
105
+ u
106
+ h
107
+ y
108
+ k
109
+ r
110
+ H
111
+ d
112
+ Y
113
+ O
114
+ U
115
+ F
116
+ f
117
+ x
118
+ D
119
+ G
120
+ N
121
+ K
122
+ P
123
+ z
124
+ J
125
+ X
126
+ W
127
+ Z
128
+ Q
129
+ %
130
+ -
131
+ q
132
+ @
133
+ '
134
+ !
135
+ #
136
+ &
137
+ ,
138
+ :
139
+ $
140
+ (
141
+ ?
142
+ é
143
+ +
144
+ É
145
+
ocr-studio/PaddleOCR/ppocr/utils/dict/bengali_dict.txt ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ হ
2
+ থ
3
+ শ
4
+ ৫
5
+ ক
6
+ ও
7
+ য
8
+ ০
9
+ গ
10
+ দ
11
+ ড়
12
+ খ
13
+ য়
14
+ ঋ
15
+ ন
16
+ অ
17
+ ৪
18
+ এ
19
+ ব
20
+ ঠ
21
+ ঢ
22
+ ৭
23
+ ৯
24
+ ধ
25
+ ঙ
26
+ ট
27
+ ঝ
28
+ ৎ
29
+ ণ
30
+ ত
31
+ র
32
+ ২
33
+ চ
34
+ ঌ
35
+ ড
36
+ ৬
37
+ ঔ
38
+ প
39
+ ভ
40
+ ম
41
+ ঢ়
42
+ ঈ
43
+ ৮
44
+ ঘ
45
+ ১
46
+ ষ
47
+ ৩
48
+ ফ
49
+ ছ
50
+ ল
51
+ জ
52
+ আ
53
+ ।
54
+ ঊ
55
+ ই
56
+ স
57
+ ঐ
58
+ উ
59
+ ঞ
60
+ া
61
+ ্
62
+ ু
63
+ ী
64
+ ে
65
+ ং
66
+ ি
67
+ ়
68
+ ঁ
69
+ ৃ
70
+ ো
71
+ ূ
72
+ ৈ
73
+ ৌ
74
+ ঃ
ocr-studio/PaddleOCR/ppocr/utils/dict/bg_dict.txt ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !
2
+ #
3
+ $
4
+ %
5
+ &
6
+ '
7
+ (
8
+ +
9
+ ,
10
+ -
11
+ .
12
+ /
13
+ 0
14
+ 1
15
+ 2
16
+ 3
17
+ 4
18
+ 5
19
+ 6
20
+ 7
21
+ 8
22
+ 9
23
+ :
24
+ ?
25
+ @
26
+ A
27
+ B
28
+ C
29
+ D
30
+ E
31
+ F
32
+ G
33
+ H
34
+ I
35
+ J
36
+ K
37
+ L
38
+ M
39
+ N
40
+ O
41
+ P
42
+ Q
43
+ R
44
+ S
45
+ T
46
+ U
47
+ V
48
+ W
49
+ X
50
+ Y
51
+ Z
52
+ _
53
+ a
54
+ b
55
+ c
56
+ d
57
+ e
58
+ f
59
+ g
60
+ h
61
+ i
62
+ j
63
+ k
64
+ l
65
+ m
66
+ n
67
+ o
68
+ p
69
+ q
70
+ r
71
+ s
72
+ t
73
+ u
74
+ v
75
+ w
76
+ x
77
+ y
78
+ z
79
+ É
80
+ é
81
+ А
82
+ Б
83
+ В
84
+ Г
85
+ Д
86
+ Е
87
+ Ж
88
+ З
89
+ И
90
+ Й
91
+ К
92
+ Л
93
+ М
94
+ Н
95
+ О
96
+ П
97
+ Р
98
+ С
99
+ Т
100
+ У
101
+ Ф
102
+ Х
103
+ Ц
104
+ Ч
105
+ Ш
106
+ Щ
107
+ Ъ
108
+ Ю
109
+ Я
110
+ а
111
+ б
112
+ в
113
+ г
114
+ д
115
+ е
116
+ ж
117
+ з
118
+ и
119
+ й
120
+ к
121
+ л
122
+ м
123
+ н
124
+ о
125
+ п
126
+ р
127
+ с
128
+ т
129
+ у
130
+ ф
131
+ х
132
+ ц
133
+ ч
134
+ ш
135
+ щ
136
+ ъ
137
+ ь
138
+ ю
139
+ я
140
+
ocr-studio/PaddleOCR/ppocr/utils/dict/bm_dict.txt ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ က
2
+ ခ
3
+ ဂ
4
+ ဃ
5
+ င
6
+ စ
7
+ ဆ
8
+ ဇ
9
+ ဈ
10
+ ဉ
11
+ ည
12
+ ဋ
13
+ ဌ
14
+ ဍ
15
+ ဎ
16
+ ဏ
17
+ တ
18
+ ထ
19
+ ဒ
20
+ ဓ
21
+ န
22
+ ပ
23
+ ဖ
24
+ ဗ
25
+ ဘ
26
+ မ
27
+ ယ
28
+ ရ
29
+ လ
30
+ ဝ
31
+ သ
32
+ ဟ
33
+ ဠ
34
+ အ
35
+ ဢ
36
+ ဣ
37
+ ဤ
38
+ ဥ
39
+ ဦ
40
+ ဧ
41
+ ဨ
42
+ ဩ
43
+ ဪ
44
+ ါ
45
+ ာ
46
+ ိ
47
+ ီ
48
+ ု
49
+ ူ
50
+ ေ
51
+ ဲ
52
+ ဳ
53
+ ဴ
54
+ ဵ
55
+ ံ
56
+ ့
57
+ း
58
+ ္
59
+ ်
60
+ ျ
61
+ ြ
62
+ ွ
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
+ ၝ
95
+ ၞ
96
+ ၟ
97
+ ၠ
98
+ ၡ
99
+ ၢ
100
+ ၣ
101
+ ၤ
102
+ ၥ
103
+ ၦ
104
+ ၧ
105
+ ၨ
106
+ ၩ
107
+ ၪ
108
+ ၫ
109
+ ၬ
110
+ ၭ
111
+ ၮ
112
+ ၯ
113
+ ၰ
114
+ ၱ
115
+ ၲ
116
+ ၳ
117
+ ၴ
118
+ ၵ
119
+ ၶ
120
+ ၷ
121
+ ၸ
122
+ ၹ
123
+ ၺ
124
+ ၻ
125
+ ၼ
126
+ ၽ
127
+ ၾ
128
+ ၿ
129
+ ႀ
130
+ ႁ
131
+ ႂ
132
+ ႃ
133
+ ႄ
134
+ ႅ
135
+ ႆ
136
+ ႇ
137
+ ႈ
138
+ ႉ
139
+ ႊ
140
+ ႋ
141
+ ႌ
142
+ ႍ
143
+ ႎ
144
+ ႏ
145
+ ႐
146
+ ႑
147
+ ႒
148
+ ႓
149
+ ႔
150
+ ႕
151
+ ႖
152
+ ႗
153
+ ႘
154
+ ႙
155
+ ႚ
156
+ ႛ
157
+ ႜ
158
+ ႝ
159
+ ႞
160
+ ႟
ocr-studio/PaddleOCR/ppocr/utils/dict/bm_dict_add.txt ADDED
@@ -0,0 +1,3219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ က
2
+ ခ
3
+ ဂ
4
+ ဃ
5
+ င
6
+ စ
7
+ ဆ
8
+ ဇ
9
+ ဈ
10
+ ဉ
11
+ ည
12
+ ဋ
13
+ ဌ
14
+ ဍ
15
+ ဎ
16
+ ဏ
17
+ တ
18
+ ထ
19
+ ဒ
20
+ ဓ
21
+ န
22
+ ပ
23
+ ဖ
24
+ ဗ
25
+ ဘ
26
+ မ
27
+ ယ
28
+ ရ
29
+ လ
30
+ ဝ
31
+ သ
32
+ ဟ
33
+ ဠ
34
+ အ
35
+ ဢ
36
+ ဣ
37
+ ဤ
38
+ ဥ
39
+ ဦ
40
+ ဧ
41
+ ဨ
42
+ ဩ
43
+ ဪ
44
+ ါ
45
+ ာ
46
+ ိ
47
+ ီ
48
+ ု
49
+ ူ
50
+ ေ
51
+ ဲ
52
+ ဳ
53
+ ဴ
54
+ ဵ
55
+ ံ
56
+ ့
57
+ း
58
+ ္
59
+ ်
60
+ ျ
61
+ ြ
62
+ ွ
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
+ ၝ
95
+ ၞ
96
+ ၟ
97
+ ၠ
98
+ ၡ
99
+ ၢ
100
+ ၣ
101
+ ၤ
102
+ ၥ
103
+ ၦ
104
+ ၧ
105
+ ၨ
106
+ ၩ
107
+ ၪ
108
+ ၫ
109
+ ၬ
110
+ ၭ
111
+ ၮ
112
+ ၯ
113
+ ၰ
114
+ ၱ
115
+ ၲ
116
+ ၳ
117
+ ၴ
118
+ ၵ
119
+ ၶ
120
+ ၷ
121
+ ၸ
122
+ ၹ
123
+ ၺ
124
+ ၻ
125
+ ၼ
126
+ ၽ
127
+ ၾ
128
+ ၿ
129
+ ႀ
130
+ ႁ
131
+ ႂ
132
+ ႃ
133
+ ႄ
134
+ ႅ
135
+ ႆ
136
+ ႇ
137
+ ႈ
138
+ ႉ
139
+ ႊ
140
+ ႋ
141
+ ႌ
142
+ ႍ
143
+ ႎ
144
+ ႏ
145
+ ႐
146
+ ႑
147
+ ႒
148
+ ႓
149
+ ႔
150
+ ႕
151
+ ႖
152
+ ႗
153
+ ႘
154
+ ႙
155
+ ႚ
156
+ ႛ
157
+ ႜ
158
+ ႝ
159
+ ႞
160
+ ႟
161
+
162
+ Ⴀ
163
+ Ⴁ
164
+ Ⴂ
165
+ Ⴃ
166
+ Ⴄ
167
+ Ⴅ
168
+ Ⴆ
169
+ Ⴇ
170
+ Ⴈ
171
+ Ⴉ
172
+ Ⴊ
173
+ Ⴋ
174
+ ᄀ
175
+ ᄁ
176
+ ᄂ
177
+ ᄃ
178
+ ᄄ
179
+ ᄅ
180
+ ᄆ
181
+ ᄇ
182
+ ᄈ
183
+ ᄉ
184
+ ᄊ
185
+ ᄋ
186
+ ᄌ
187
+ ᄍ
188
+ ᄎ
189
+ ᄏ
190
+ ᄐ
191
+ ᄑ
192
+ ᄒ
193
+
194
+ ဠ
195
+ အ
196
+ ဢ
197
+ ဣ
198
+ ဤ
199
+ ဥ
200
+ ဦ
201
+ ဧ
202
+ ဨ
203
+ ဩ
204
+ ဪ
205
+ ါ
206
+ ာ
207
+ ိ
208
+ ီ
209
+ ု
210
+ ူ
211
+ ေ
212
+ ဲ
213
+ ဳ
214
+ ဴ
215
+ ဵ
216
+ ံ
217
+ ့
218
+ း
219
+ ္
220
+ ်
221
+ ျ
222
+ ြ
223
+ ွ
224
+ ှ
225
+ ဿ
226
+ ၀
227
+ ၁
228
+ ၂
229
+ ၃
230
+ ၄
231
+ ၅
232
+ ၆
233
+ ၇
234
+ ၈
235
+ ၉
236
+ ၊
237
+ ။
238
+ ၌
239
+ ၍
240
+ ၎
241
+ ၏
242
+ ၐ
243
+ ၑ
244
+ ၒ
245
+ ၓ
246
+ ၔ
247
+ ၕ
248
+ ၖ
249
+ ၗ
250
+ ၘ
251
+ ၙ
252
+ ၚ
253
+ ၛ
254
+ ၜ
255
+ ၝ
256
+ ၞ
257
+ ၟ
258
+ ၠ
259
+ ၡ
260
+ ၢ
261
+ ၣ
262
+ ၤ
263
+ ၥ
264
+ ၦ
265
+ ၧ
266
+ ၨ
267
+ ၩ
268
+ ၪ
269
+ ၫ
270
+ ၬ
271
+ ၭ
272
+ ၮ
273
+ ၯ
274
+ ၰ
275
+ ၱ
276
+ ၲ
277
+ ၳ
278
+ ၴ
279
+ ၵ
280
+ ၶ
281
+ ၷ
282
+ ၸ
283
+ ၹ
284
+ ၺ
285
+ ၻ
286
+ ၼ
287
+ ၽ
288
+ ၾ
289
+ ၿ
290
+ ႀ
291
+ ႁ
292
+ ႂ
293
+ ႃ
294
+ ႄ
295
+ ႅ
296
+ ႆ
297
+ ႇ
298
+ ႈ
299
+ ႉ
300
+ ႊ
301
+ ႋ
302
+ ႌ
303
+ ႍ
304
+ ႎ
305
+ ႏ
306
+ ႐
307
+ ႑
308
+ ႒
309
+ ႓
310
+ ႔
311
+ ႕
312
+ ႖
313
+ ႗
314
+ ႘
315
+ ႙
316
+ ႚ
317
+ ႛ
318
+ ႜ
319
+ ႝ
320
+ ႞
321
+ ႟
322
+
323
+ က
324
+ ခ
325
+ ဂ
326
+ ဃ
327
+ င
328
+ စ
329
+ ဆ
330
+ ဇ
331
+ ဈ
332
+ ဉ
333
+ ည
334
+ ဋ
335
+ ဌ
336
+ ဍ
337
+ ဎ
338
+ ဏ
339
+ တ
340
+ ထ
341
+ ဒ
342
+ ဓ
343
+ န
344
+ ပ
345
+ ဖ
346
+ ဗ
347
+ ဘ
348
+ မ
349
+ ယ
350
+ ရ
351
+ လ
352
+ ဝ
353
+ သ
354
+ ဟ
355
+ ဠ
356
+ အ
357
+ ဢ
358
+ ဣ
359
+ ဤ
360
+ ဥ
361
+ ဦ
362
+ ဧ
363
+ ဨ
364
+ ဩ
365
+ ဪ
366
+ ါ
367
+ ာ
368
+ ိ
369
+ ီ
370
+ ု
371
+ ူ
372
+ ေ
373
+ ဲ
374
+ ဳ
375
+ ဴ
376
+ ဵ
377
+ ံ
378
+ ့
379
+ း
380
+ ္
381
+ ်
382
+ ျ
383
+ ြ
384
+ ွ
385
+ ှ
386
+ ဿ
387
+ ၀
388
+ ၁
389
+ ၂
390
+ ၃
391
+ ၄
392
+ ၅
393
+ ၆
394
+ ၇
395
+ ၈
396
+ ၉
397
+ ၊
398
+ ။
399
+ ၌
400
+ ၍
401
+ ၎
402
+ ၏
403
+ ၐ
404
+ ၑ
405
+ ၒ
406
+ ၓ
407
+ ၔ
408
+ ၕ
409
+ ၖ
410
+ ၗ
411
+ ၘ
412
+ ၙ
413
+ ၚ
414
+ ၛ
415
+ ၜ
416
+ ၝ
417
+ ၞ
418
+ ၟ
419
+ ၠ
420
+ ၡ
421
+ ၢ
422
+ ၣ
423
+ ၤ
424
+ ၥ
425
+ ၦ
426
+ ၧ
427
+ ၨ
428
+ ၩ
429
+ ၪ
430
+ ၫ
431
+ ၬ
432
+ ၭ
433
+ ၮ
434
+ ၯ
435
+ ၰ
436
+ ၱ
437
+ ၲ
438
+ ၳ
439
+ ၴ
440
+ ၵ
441
+ ၶ
442
+ ၷ
443
+ ၸ
444
+ ၹ
445
+ ၺ
446
+ ၻ
447
+ ၼ
448
+ ၽ
449
+ ၾ
450
+ ၿ
451
+ ႀ
452
+ ႁ
453
+ ႂ
454
+ ႃ
455
+ ႄ
456
+ ႅ
457
+ ႆ
458
+ ႇ
459
+ ႈ
460
+ ႉ
461
+ ႊ
462
+ ႋ
463
+ ႌ
464
+ ႍ
465
+ ႎ
466
+ ႏ
467
+ ႐
468
+ ႑
469
+ ႒
470
+ ႓
471
+ ႔
472
+ ႕
473
+ ႖
474
+ ႗
475
+ ႘
476
+ ႙
477
+ ႚ
478
+ ႛ
479
+ ႜ
480
+ ႝ
481
+ ႞
482
+ ႟
483
+
484
+ Ⴀ
485
+ Ⴁ
486
+ Ⴂ
487
+ Ⴃ
488
+ Ⴄ
489
+ Ⴅ
490
+ Ⴆ
491
+ Ⴇ
492
+ Ⴈ
493
+ Ⴉ
494
+ Ⴊ
495
+ Ⴋ
496
+ ᄀ
497
+ ᄁ
498
+ ᄂ
499
+ ᄃ
500
+ ᄄ
501
+ ᄅ
502
+ ᄆ
503
+ ᄇ
504
+ ᄈ
505
+ ᄉ
506
+ ᄊ
507
+ ᄋ
508
+ ᄌ
509
+ ᄍ
510
+ ᄎ
511
+ ᄏ
512
+ ᄐ
513
+ ᄑ
514
+ ᄒ
515
+
516
+ ဠ
517
+ အ
518
+ ဢ
519
+ ဣ
520
+ ဤ
521
+ ဥ
522
+ ဦ
523
+ ဧ
524
+ ဨ
525
+ ဩ
526
+ ဪ
527
+ ါ
528
+ ာ
529
+ ိ
530
+ ီ
531
+ ု
532
+ ူ
533
+ ေ
534
+ ဲ
535
+ ဳ
536
+ ဴ
537
+ ဵ
538
+ ံ
539
+ ့
540
+ း
541
+ ္
542
+ ်
543
+ ျ
544
+ ြ
545
+ ွ
546
+ ှ
547
+ ဿ
548
+ ၀
549
+ ၁
550
+ ၂
551
+ ၃
552
+ ၄
553
+ ၅
554
+ ၆
555
+ ၇
556
+ ၈
557
+ ၉
558
+ ၊
559
+ ။
560
+ ၌
561
+ ၍
562
+ ၎
563
+ ၏
564
+ ၐ
565
+ ၑ
566
+ ၒ
567
+ ၓ
568
+ ၔ
569
+ ၕ
570
+ ၖ
571
+ ၗ
572
+ ၘ
573
+ ၙ
574
+ ၚ
575
+ ၛ
576
+ ၜ
577
+ ၝ
578
+ ၞ
579
+ ၟ
580
+ ၠ
581
+ ၡ
582
+ ၢ
583
+ ၣ
584
+ ၤ
585
+ ၥ
586
+ ၦ
587
+ ၧ
588
+ ၨ
589
+ ၩ
590
+ ၪ
591
+ ၫ
592
+ ၬ
593
+ ၭ
594
+ ၮ
595
+ ၯ
596
+ ၰ
597
+ ၱ
598
+ ၲ
599
+ ၳ
600
+ ၴ
601
+ ၵ
602
+ ၶ
603
+ ၷ
604
+ ၸ
605
+ ၹ
606
+ ၺ
607
+ ၻ
608
+ ၼ
609
+ ၽ
610
+ ၾ
611
+ ၿ
612
+ ႀ
613
+ ႁ
614
+ ႂ
615
+ ႃ
616
+ ႄ
617
+ ႅ
618
+ ႆ
619
+ ႇ
620
+ ႈ
621
+ ႉ
622
+ ႊ
623
+ ႋ
624
+ ႌ
625
+ ႍ
626
+ ႎ
627
+ ႏ
628
+ ႐
629
+ ႑
630
+ ႒
631
+ ႓
632
+ ႔
633
+ ႕
634
+ ႖
635
+ ႗
636
+ ႘
637
+ ႙
638
+ ႚ
639
+ ႛ
640
+ ႜ
641
+ ႝ
642
+ ႞
643
+ ႟
644
+
645
+ က
646
+ ခ
647
+ ဂ
648
+ ဃ
649
+ င
650
+ စ
651
+ ဆ
652
+ ဇ
653
+ ဈ
654
+ ဉ
655
+ ည
656
+ ဋ
657
+ ဌ
658
+ ဍ
659
+ ဎ
660
+ ဏ
661
+ တ
662
+ ထ
663
+ ဒ
664
+ ဓ
665
+ န
666
+ ပ
667
+ ဖ
668
+ ဗ
669
+ ဘ
670
+ မ
671
+ ယ
672
+ ရ
673
+ လ
674
+ ဝ
675
+ သ
676
+ ဟ
677
+ ဠ
678
+ အ
679
+ ဢ
680
+ ဣ
681
+ ဤ
682
+ ဥ
683
+ ဦ
684
+ ဧ
685
+ ဨ
686
+ ဩ
687
+ ဪ
688
+ ါ
689
+ ာ
690
+ ိ
691
+ ီ
692
+ ု
693
+ ူ
694
+ ေ
695
+ ဲ
696
+ ဳ
697
+ ဴ
698
+ ဵ
699
+ ံ
700
+ ့
701
+ း
702
+ ္
703
+ ်
704
+ ျ
705
+ ြ
706
+ ွ
707
+ ှ
708
+ ဿ
709
+ ၀
710
+ ၁
711
+ ၂
712
+ ၃
713
+ ၄
714
+ ၅
715
+ ၆
716
+ ၇
717
+ ၈
718
+ ၉
719
+ ၊
720
+ ။
721
+ ၌
722
+ ၍
723
+ ၎
724
+ ၏
725
+ ၐ
726
+ ၑ
727
+ ၒ
728
+ ၓ
729
+ ၔ
730
+ ၕ
731
+ ၖ
732
+ ၗ
733
+ ၘ
734
+ ၙ
735
+ ၚ
736
+ ၛ
737
+ ၜ
738
+ ၝ
739
+ ၞ
740
+ ၟ
741
+ ၠ
742
+ ၡ
743
+ ၢ
744
+ ၣ
745
+ ၤ
746
+ ၥ
747
+ ၦ
748
+ ၧ
749
+ ၨ
750
+ ၩ
751
+ ၪ
752
+ ၫ
753
+ ၬ
754
+ ၭ
755
+ ၮ
756
+ ၯ
757
+ ၰ
758
+ ၱ
759
+ ၲ
760
+ ၳ
761
+ ၴ
762
+ ၵ
763
+ ၶ
764
+ ၷ
765
+ ၸ
766
+ ၹ
767
+ ၺ
768
+ ၻ
769
+ ၼ
770
+ ၽ
771
+ ၾ
772
+ ၿ
773
+ ႀ
774
+ ႁ
775
+ ႂ
776
+ ႃ
777
+ ႄ
778
+ ႅ
779
+ ႆ
780
+ ႇ
781
+ ႈ
782
+ ႉ
783
+ ႊ
784
+ ႋ
785
+ ႌ
786
+ ႍ
787
+ ႎ
788
+ ႏ
789
+ ႐
790
+ ႑
791
+ ႒
792
+ ႓
793
+ ႔
794
+ ႕
795
+ ႖
796
+ ႗
797
+ ႘
798
+ ႙
799
+ ႚ
800
+ ႛ
801
+ ႜ
802
+ ႝ
803
+ ႞
804
+ ႟
805
+
806
+ Ⴀ
807
+ Ⴁ
808
+ Ⴂ
809
+ Ⴃ
810
+ Ⴄ
811
+ Ⴅ
812
+ Ⴆ
813
+ Ⴇ
814
+ Ⴈ
815
+ Ⴉ
816
+ Ⴊ
817
+ Ⴋ
818
+ ᄀ
819
+ ᄁ
820
+ ᄂ
821
+ ᄃ
822
+ ᄄ
823
+ ᄅ
824
+ ᄆ
825
+ ᄇ
826
+ ᄈ
827
+ ᄉ
828
+ ᄊ
829
+ ᄋ
830
+ ᄌ
831
+ ᄍ
832
+ ᄎ
833
+ ᄏ
834
+ ᄐ
835
+ ᄑ
836
+ ᄒ
837
+
838
+ ဠ
839
+ အ
840
+ ဢ
841
+ ဣ
842
+ ဤ
843
+ ဥ
844
+ ဦ
845
+ ဧ
846
+ ဨ
847
+ ဩ
848
+ ဪ
849
+ ါ
850
+ ာ
851
+ ိ
852
+ ီ
853
+ ု
854
+ ူ
855
+ ေ
856
+ ဲ
857
+ ဳ
858
+ ဴ
859
+ ဵ
860
+ ံ
861
+ ့
862
+ း
863
+ ္
864
+ ်
865
+ ျ
866
+ ြ
867
+ ွ
868
+ ှ
869
+ ဿ
870
+ ၀
871
+ ၁
872
+ ၂
873
+ ၃
874
+ ၄
875
+ ၅
876
+ ၆
877
+ ၇
878
+ ၈
879
+ ၉
880
+ ၊
881
+ ။
882
+ ၌
883
+ ၍
884
+ ၎
885
+ ၏
886
+ ၐ
887
+ ၑ
888
+ ၒ
889
+ ၓ
890
+ ၔ
891
+ ၕ
892
+ ၖ
893
+ ၗ
894
+ ၘ
895
+ ၙ
896
+ ၚ
897
+ ၛ
898
+ ၜ
899
+ ၝ
900
+ ၞ
901
+ ၟ
902
+ ၠ
903
+ ၡ
904
+ ၢ
905
+ ၣ
906
+ ၤ
907
+ ၥ
908
+ ၦ
909
+ ၧ
910
+ ၨ
911
+ ၩ
912
+ ၪ
913
+ ၫ
914
+ ၬ
915
+ ၭ
916
+ ၮ
917
+ ၯ
918
+ ၰ
919
+ ၱ
920
+ ၲ
921
+ ၳ
922
+ ၴ
923
+ ၵ
924
+ ၶ
925
+ ၷ
926
+ ၸ
927
+ ၹ
928
+ ၺ
929
+ ၻ
930
+ ၼ
931
+ ၽ
932
+ ၾ
933
+ ၿ
934
+ ႀ
935
+ ႁ
936
+ ႂ
937
+ ႃ
938
+ ႄ
939
+ ႅ
940
+ ႆ
941
+ ႇ
942
+ ႈ
943
+ ႉ
944
+ ႊ
945
+ ႋ
946
+ ႌ
947
+ ႍ
948
+ ႎ
949
+ ႏ
950
+ ႐
951
+ ႑
952
+ ႒
953
+ ႓
954
+ ႔
955
+ ႕
956
+ ႖
957
+ ႗
958
+ ႘
959
+ ႙
960
+ ႚ
961
+ ႛ
962
+ ႜ
963
+ ႝ
964
+ ႞
965
+ ႟
966
+
967
+ က
968
+ ခ
969
+ ဂ
970
+ ဃ
971
+ င
972
+ စ
973
+ ဆ
974
+ ဇ
975
+ ဈ
976
+ ဉ
977
+ ည
978
+ ဋ
979
+ ဌ
980
+ ဍ
981
+ ဎ
982
+ ဏ
983
+ တ
984
+ ထ
985
+ ဒ
986
+ ဓ
987
+ န
988
+ ပ
989
+ ဖ
990
+ ဗ
991
+ ဘ
992
+ မ
993
+ ယ
994
+ ရ
995
+ လ
996
+ ဝ
997
+ သ
998
+ ဟ
999
+ ဠ
1000
+ အ
1001
+ ဢ
1002
+ ဣ
1003
+ ဤ
1004
+ ဥ
1005
+ ဦ
1006
+ ဧ
1007
+ ဨ
1008
+ ဩ
1009
+ ဪ
1010
+ ါ
1011
+ ာ
1012
+ ိ
1013
+ ီ
1014
+ ု
1015
+ ူ
1016
+ ေ
1017
+ ဲ
1018
+ ဳ
1019
+ ဴ
1020
+ ဵ
1021
+ ံ
1022
+ ့
1023
+ း
1024
+ ္
1025
+ ်
1026
+ ျ
1027
+ ြ
1028
+ ွ
1029
+ ှ
1030
+ ဿ
1031
+ ၀
1032
+ ၁
1033
+ ၂
1034
+ ၃
1035
+ ၄
1036
+ ၅
1037
+ ၆
1038
+ ၇
1039
+ ၈
1040
+ ၉
1041
+ ၊
1042
+ ။
1043
+ ၌
1044
+ ၍
1045
+ ၎
1046
+ ၏
1047
+ ၐ
1048
+ ၑ
1049
+ ၒ
1050
+ ၓ
1051
+ ၔ
1052
+ ၕ
1053
+ ၖ
1054
+ ၗ
1055
+ ၘ
1056
+ ၙ
1057
+ ၚ
1058
+ ၛ
1059
+ ၜ
1060
+ ၝ
1061
+ ၞ
1062
+ ၟ
1063
+ ၠ
1064
+ ၡ
1065
+ ၢ
1066
+ ၣ
1067
+ ၤ
1068
+ ၥ
1069
+ ၦ
1070
+ ၧ
1071
+ ၨ
1072
+ ၩ
1073
+ ၪ
1074
+ ၫ
1075
+ ၬ
1076
+ ၭ
1077
+ ၮ
1078
+ ၯ
1079
+ ၰ
1080
+ ၱ
1081
+ ၲ
1082
+ ၳ
1083
+ ၴ
1084
+ ၵ
1085
+ ၶ
1086
+ ၷ
1087
+ ၸ
1088
+ ၹ
1089
+ ၺ
1090
+ ၻ
1091
+ ၼ
1092
+ ၽ
1093
+ ၾ
1094
+ ၿ
1095
+ ႀ
1096
+ ႁ
1097
+ ႂ
1098
+ ႃ
1099
+ ႄ
1100
+ ႅ
1101
+ ႆ
1102
+ ႇ
1103
+ ႈ
1104
+ ႉ
1105
+ ႊ
1106
+ ႋ
1107
+ ႌ
1108
+ ႍ
1109
+ ႎ
1110
+ ႏ
1111
+ ႐
1112
+ ႑
1113
+ ႒
1114
+ ႓
1115
+ ႔
1116
+ ႕
1117
+ ႖
1118
+ ႗
1119
+ ႘
1120
+ ႙
1121
+ ႚ
1122
+ ႛ
1123
+ ႜ
1124
+ ႝ
1125
+ ႞
1126
+ ႟
1127
+
1128
+ Ⴀ
1129
+ Ⴁ
1130
+ Ⴂ
1131
+ Ⴃ
1132
+ Ⴄ
1133
+ Ⴅ
1134
+ Ⴆ
1135
+ Ⴇ
1136
+ Ⴈ
1137
+ Ⴉ
1138
+ Ⴊ
1139
+ Ⴋ
1140
+ ᄀ
1141
+ ᄁ
1142
+ ᄂ
1143
+ ᄃ
1144
+ ᄄ
1145
+ ᄅ
1146
+ ᄆ
1147
+ ᄇ
1148
+ ᄈ
1149
+ ᄉ
1150
+ ᄊ
1151
+ ᄋ
1152
+ ᄌ
1153
+ ᄍ
1154
+ ᄎ
1155
+ ᄏ
1156
+ ᄐ
1157
+ ᄑ
1158
+ ᄒ
1159
+
1160
+ ဠ
1161
+ အ
1162
+ ဢ
1163
+ ဣ
1164
+ ဤ
1165
+ ဥ
1166
+ ဦ
1167
+ ဧ
1168
+ ဨ
1169
+ ဩ
1170
+ ဪ
1171
+ ါ
1172
+ ာ
1173
+ ိ
1174
+ ီ
1175
+ ု
1176
+ ူ
1177
+ ေ
1178
+ ဲ
1179
+ ဳ
1180
+ ဴ
1181
+ ဵ
1182
+ ံ
1183
+ ့
1184
+ း
1185
+ ္
1186
+ ်
1187
+ ျ
1188
+ ြ
1189
+ ွ
1190
+ ှ
1191
+ ဿ
1192
+ ၀
1193
+ ၁
1194
+ ၂
1195
+ ၃
1196
+ ၄
1197
+ ၅
1198
+ ၆
1199
+ ၇
1200
+ ၈
1201
+ ၉
1202
+ ၊
1203
+ ။
1204
+ ၌
1205
+ ၍
1206
+ ၎
1207
+ ၏
1208
+ ၐ
1209
+ ၑ
1210
+ ၒ
1211
+ ၓ
1212
+ ၔ
1213
+ ၕ
1214
+ ၖ
1215
+ ၗ
1216
+ ၘ
1217
+ ၙ
1218
+ ၚ
1219
+ ၛ
1220
+ ၜ
1221
+ ၝ
1222
+ ၞ
1223
+ ၟ
1224
+ ၠ
1225
+ ၡ
1226
+ ၢ
1227
+ ၣ
1228
+ ၤ
1229
+ ၥ
1230
+ ၦ
1231
+ ၧ
1232
+ ၨ
1233
+ ၩ
1234
+ ၪ
1235
+ ၫ
1236
+ ၬ
1237
+ ၭ
1238
+ ၮ
1239
+ ၯ
1240
+ ၰ
1241
+ ၱ
1242
+ ၲ
1243
+ ၳ
1244
+ ၴ
1245
+ ၵ
1246
+ ၶ
1247
+ ၷ
1248
+ ၸ
1249
+ ၹ
1250
+ ၺ
1251
+ ၻ
1252
+ ၼ
1253
+ ၽ
1254
+ ၾ
1255
+ ၿ
1256
+ ႀ
1257
+ ႁ
1258
+ ႂ
1259
+ ႃ
1260
+ ႄ
1261
+ ႅ
1262
+ ႆ
1263
+ ႇ
1264
+ ႈ
1265
+ ႉ
1266
+ ႊ
1267
+ ႋ
1268
+ ႌ
1269
+ ႍ
1270
+ ႎ
1271
+ ႏ
1272
+ ႐
1273
+ ႑
1274
+ ႒
1275
+ ႓
1276
+ ႔
1277
+ ႕
1278
+ ႖
1279
+ ႗
1280
+ ႘
1281
+ ႙
1282
+ ႚ
1283
+ ႛ
1284
+ ႜ
1285
+ ႝ
1286
+ ႞
1287
+ ႟
1288
+
1289
+ က
1290
+ ခ
1291
+ ဂ
1292
+ ဃ
1293
+ င
1294
+ စ
1295
+ ဆ
1296
+ ဇ
1297
+ ဈ
1298
+ ဉ
1299
+ ည
1300
+ ဋ
1301
+ ဌ
1302
+ ဍ
1303
+ ဎ
1304
+ ဏ
1305
+ တ
1306
+ ထ
1307
+ ဒ
1308
+ ဓ
1309
+ န
1310
+ ပ
1311
+ ဖ
1312
+ ဗ
1313
+ ဘ
1314
+ မ
1315
+ ယ
1316
+ ရ
1317
+ လ
1318
+ ဝ
1319
+ သ
1320
+ ဟ
1321
+ ဠ
1322
+ အ
1323
+ ဢ
1324
+ ဣ
1325
+ ဤ
1326
+ ဥ
1327
+ ဦ
1328
+ ဧ
1329
+ ဨ
1330
+ ဩ
1331
+ ဪ
1332
+ ါ
1333
+ ာ
1334
+ ိ
1335
+ ီ
1336
+ ု
1337
+ ူ
1338
+ ေ
1339
+ ဲ
1340
+ ဳ
1341
+ ဴ
1342
+ ဵ
1343
+ ံ
1344
+ ့
1345
+ း
1346
+ ္
1347
+ ်
1348
+ ျ
1349
+ ြ
1350
+ ွ
1351
+ ှ
1352
+ ဿ
1353
+ ၀
1354
+ ၁
1355
+ ၂
1356
+ ၃
1357
+ ၄
1358
+ ၅
1359
+ ၆
1360
+ ၇
1361
+ ၈
1362
+ ၉
1363
+ ၊
1364
+ ။
1365
+ ၌
1366
+ ၍
1367
+ ၎
1368
+ ၏
1369
+ ၐ
1370
+ ၑ
1371
+ ၒ
1372
+ ၓ
1373
+ ၔ
1374
+ ၕ
1375
+ ၖ
1376
+ ၗ
1377
+ ၘ
1378
+ ၙ
1379
+ ၚ
1380
+ ၛ
1381
+ ၜ
1382
+ ၝ
1383
+ ၞ
1384
+ ၟ
1385
+ ၠ
1386
+ ၡ
1387
+ ၢ
1388
+ ၣ
1389
+ ၤ
1390
+ ၥ
1391
+ ၦ
1392
+ ၧ
1393
+ ၨ
1394
+ ၩ
1395
+ ၪ
1396
+ ၫ
1397
+ ၬ
1398
+ ၭ
1399
+ ၮ
1400
+ ၯ
1401
+ ၰ
1402
+ ၱ
1403
+ ၲ
1404
+ ၳ
1405
+ ၴ
1406
+ ၵ
1407
+ ၶ
1408
+ ၷ
1409
+ ၸ
1410
+ ၹ
1411
+ ၺ
1412
+ ၻ
1413
+ ၼ
1414
+ ၽ
1415
+ ၾ
1416
+ ၿ
1417
+ ႀ
1418
+ ႁ
1419
+ ႂ
1420
+ ႃ
1421
+ ႄ
1422
+ ႅ
1423
+ ႆ
1424
+ ႇ
1425
+ ႈ
1426
+ ႉ
1427
+ ႊ
1428
+ ႋ
1429
+ ႌ
1430
+ ႍ
1431
+ ႎ
1432
+ ႏ
1433
+ ႐
1434
+ ႑
1435
+ ႒
1436
+ ႓
1437
+ ႔
1438
+ ႕
1439
+ ႖
1440
+ ႗
1441
+ ႘
1442
+ ႙
1443
+ ႚ
1444
+ ႛ
1445
+ ႜ
1446
+ ႝ
1447
+ ႞
1448
+ ႟
1449
+
1450
+ Ⴀ
1451
+ Ⴁ
1452
+ Ⴂ
1453
+ Ⴃ
1454
+ Ⴄ
1455
+ Ⴅ
1456
+ Ⴆ
1457
+ Ⴇ
1458
+ Ⴈ
1459
+ Ⴉ
1460
+ Ⴊ
1461
+ Ⴋ
1462
+ ᄀ
1463
+ ᄁ
1464
+ ᄂ
1465
+ ᄃ
1466
+ ᄄ
1467
+ ᄅ
1468
+ ᄆ
1469
+ ᄇ
1470
+ ᄈ
1471
+ ᄉ
1472
+ ᄊ
1473
+ ᄋ
1474
+ ᄌ
1475
+ ᄍ
1476
+ ᄎ
1477
+ ᄏ
1478
+ ᄐ
1479
+ ᄑ
1480
+ ᄒ
1481
+
1482
+ ဠ
1483
+ အ
1484
+ ဢ
1485
+ ဣ
1486
+ ဤ
1487
+ ဥ
1488
+ ဦ
1489
+ ဧ
1490
+ ဨ
1491
+ ဩ
1492
+ ဪ
1493
+ ါ
1494
+ ာ
1495
+ ိ
1496
+ ီ
1497
+ ု
1498
+ ူ
1499
+ ေ
1500
+ ဲ
1501
+ ဳ
1502
+ ဴ
1503
+ ဵ
1504
+ ံ
1505
+ ့
1506
+ း
1507
+ ္
1508
+ ်
1509
+ ျ
1510
+ ြ
1511
+ ွ
1512
+ ှ
1513
+ ဿ
1514
+ ၀
1515
+ ၁
1516
+ ၂
1517
+ ၃
1518
+ ၄
1519
+ ၅
1520
+ ၆
1521
+ ၇
1522
+ ၈
1523
+ ၉
1524
+ ၊
1525
+ ။
1526
+ ၌
1527
+ ၍
1528
+ ၎
1529
+ ၏
1530
+ ၐ
1531
+ ၑ
1532
+ ၒ
1533
+ ၓ
1534
+ ၔ
1535
+ ၕ
1536
+ ၖ
1537
+ ၗ
1538
+ ၘ
1539
+ ၙ
1540
+ ၚ
1541
+ ၛ
1542
+ ၜ
1543
+ ၝ
1544
+ ၞ
1545
+ ၟ
1546
+ ၠ
1547
+ ၡ
1548
+ ၢ
1549
+ ၣ
1550
+ ၤ
1551
+ ၥ
1552
+ ၦ
1553
+ ၧ
1554
+ ၨ
1555
+ ၩ
1556
+ ၪ
1557
+ ၫ
1558
+ ၬ
1559
+ ၭ
1560
+ ၮ
1561
+ ၯ
1562
+ ၰ
1563
+ ၱ
1564
+ ၲ
1565
+ ၳ
1566
+ ၴ
1567
+ ၵ
1568
+ ၶ
1569
+ ၷ
1570
+ ၸ
1571
+ ၹ
1572
+ ၺ
1573
+ ၻ
1574
+ ၼ
1575
+ ၽ
1576
+ ၾ
1577
+ ၿ
1578
+ ႀ
1579
+ ႁ
1580
+ ႂ
1581
+ ႃ
1582
+ ႄ
1583
+ ႅ
1584
+ ႆ
1585
+ ႇ
1586
+ ႈ
1587
+ ႉ
1588
+ ႊ
1589
+ ႋ
1590
+ ႌ
1591
+ ႍ
1592
+ ႎ
1593
+ ႏ
1594
+ ႐
1595
+ ႑
1596
+ ႒
1597
+ ႓
1598
+ ႔
1599
+ ႕
1600
+ ႖
1601
+ ႗
1602
+ ႘
1603
+ ႙
1604
+ ႚ
1605
+ ႛ
1606
+ ႜ
1607
+ ႝ
1608
+ ႞
1609
+ ႟
1610
+
1611
+ က
1612
+ ခ
1613
+ ဂ
1614
+ ဃ
1615
+ င
1616
+ စ
1617
+ ဆ
1618
+ ဇ
1619
+ ဈ
1620
+ ဉ
1621
+ ည
1622
+ ဋ
1623
+ ဌ
1624
+ ဍ
1625
+ ဎ
1626
+ ဏ
1627
+ တ
1628
+ ထ
1629
+ ဒ
1630
+ ဓ
1631
+ န
1632
+ ပ
1633
+ ဖ
1634
+ ဗ
1635
+ ဘ
1636
+ မ
1637
+ ယ
1638
+ ရ
1639
+ လ
1640
+ ဝ
1641
+ သ
1642
+ ဟ
1643
+ ဠ
1644
+ အ
1645
+ ဢ
1646
+ ဣ
1647
+ ဤ
1648
+ ဥ
1649
+ ဦ
1650
+ ဧ
1651
+ ဨ
1652
+ ဩ
1653
+ ဪ
1654
+ ါ
1655
+ ာ
1656
+ ိ
1657
+ ီ
1658
+ ု
1659
+ ူ
1660
+ ေ
1661
+ ဲ
1662
+ ဳ
1663
+ ဴ
1664
+ ဵ
1665
+ ံ
1666
+ ့
1667
+ း
1668
+ ္
1669
+ ်
1670
+ ျ
1671
+ ြ
1672
+ ွ
1673
+ ှ
1674
+ ဿ
1675
+ ၀
1676
+ ၁
1677
+ ၂
1678
+ ၃
1679
+ ၄
1680
+ ၅
1681
+ ၆
1682
+ ၇
1683
+ ၈
1684
+ ၉
1685
+ ၊
1686
+ ။
1687
+ ၌
1688
+ ၍
1689
+ ၎
1690
+ ၏
1691
+ ၐ
1692
+ ၑ
1693
+ ၒ
1694
+ ၓ
1695
+ ၔ
1696
+ ၕ
1697
+ ၖ
1698
+ ၗ
1699
+ ၘ
1700
+ ၙ
1701
+ ၚ
1702
+ ၛ
1703
+ ၜ
1704
+ ၝ
1705
+ ၞ
1706
+ ၟ
1707
+ ၠ
1708
+ ၡ
1709
+ ၢ
1710
+ ၣ
1711
+ ၤ
1712
+ ၥ
1713
+ ၦ
1714
+ ၧ
1715
+ ၨ
1716
+ ၩ
1717
+ ၪ
1718
+ ၫ
1719
+ ၬ
1720
+ ၭ
1721
+ ၮ
1722
+ ၯ
1723
+ ၰ
1724
+ ၱ
1725
+ ၲ
1726
+ ၳ
1727
+ ၴ
1728
+ ၵ
1729
+ ၶ
1730
+ ၷ
1731
+ ၸ
1732
+ ၹ
1733
+ ၺ
1734
+ ၻ
1735
+ ၼ
1736
+ ၽ
1737
+ ၾ
1738
+ ၿ
1739
+ ႀ
1740
+ ႁ
1741
+ ႂ
1742
+ ႃ
1743
+ ႄ
1744
+ ႅ
1745
+ ႆ
1746
+ ႇ
1747
+ ႈ
1748
+ ႉ
1749
+ ႊ
1750
+ ႋ
1751
+ ႌ
1752
+ ႍ
1753
+ ႎ
1754
+ ႏ
1755
+ ႐
1756
+ ႑
1757
+ ႒
1758
+ ႓
1759
+ ႔
1760
+ ႕
1761
+ ႖
1762
+ ႗
1763
+ ႘
1764
+ ႙
1765
+ ႚ
1766
+ ႛ
1767
+ ႜ
1768
+ ႝ
1769
+ ႞
1770
+ ႟
1771
+
1772
+ Ⴀ
1773
+ Ⴁ
1774
+ Ⴂ
1775
+ Ⴃ
1776
+ Ⴄ
1777
+ Ⴅ
1778
+ Ⴆ
1779
+ Ⴇ
1780
+ Ⴈ
1781
+ Ⴉ
1782
+ Ⴊ
1783
+ Ⴋ
1784
+ ᄀ
1785
+ ᄁ
1786
+ ᄂ
1787
+ ᄃ
1788
+ ᄄ
1789
+ ᄅ
1790
+ ᄆ
1791
+ ᄇ
1792
+ ᄈ
1793
+ ᄉ
1794
+ ᄊ
1795
+ ᄋ
1796
+ ᄌ
1797
+ ᄍ
1798
+ ᄎ
1799
+ ᄏ
1800
+ ᄐ
1801
+ ᄑ
1802
+ ᄒ
1803
+
1804
+ ဠ
1805
+ အ
1806
+ ဢ
1807
+ ဣ
1808
+ ဤ
1809
+ ဥ
1810
+ ဦ
1811
+ ဧ
1812
+ ဨ
1813
+ ဩ
1814
+ ဪ
1815
+ ါ
1816
+ ာ
1817
+ ိ
1818
+ ီ
1819
+ ု
1820
+ ူ
1821
+ ေ
1822
+ ဲ
1823
+ ဳ
1824
+ ဴ
1825
+ ဵ
1826
+ ံ
1827
+ ့
1828
+ း
1829
+ ္
1830
+ ်
1831
+ ျ
1832
+ ြ
1833
+ ွ
1834
+ ှ
1835
+ ဿ
1836
+ ၀
1837
+ ၁
1838
+ ၂
1839
+ ၃
1840
+ ၄
1841
+ ၅
1842
+ ၆
1843
+ ၇
1844
+ ၈
1845
+ ၉
1846
+ ၊
1847
+ ။
1848
+ ၌
1849
+ ၍
1850
+ ၎
1851
+ ၏
1852
+ ၐ
1853
+ ၑ
1854
+ ၒ
1855
+ ၓ
1856
+ ၔ
1857
+ ၕ
1858
+ ၖ
1859
+ ၗ
1860
+ ၘ
1861
+ ၙ
1862
+ ၚ
1863
+ ၛ
1864
+ ၜ
1865
+ ၝ
1866
+ ၞ
1867
+ ၟ
1868
+ ၠ
1869
+ ၡ
1870
+ ၢ
1871
+ ၣ
1872
+ ၤ
1873
+ ၥ
1874
+ ၦ
1875
+ ၧ
1876
+ ၨ
1877
+ ၩ
1878
+ ၪ
1879
+ ၫ
1880
+ ၬ
1881
+ ၭ
1882
+ ၮ
1883
+ ၯ
1884
+ ၰ
1885
+ ၱ
1886
+ ၲ
1887
+ ၳ
1888
+ ၴ
1889
+ ၵ
1890
+ ၶ
1891
+ ၷ
1892
+ ၸ
1893
+ ၹ
1894
+ ၺ
1895
+ ၻ
1896
+ ၼ
1897
+ ၽ
1898
+ ၾ
1899
+ ၿ
1900
+ ႀ
1901
+ ႁ
1902
+ ႂ
1903
+ ႃ
1904
+ ႄ
1905
+ ႅ
1906
+ ႆ
1907
+ ႇ
1908
+ ႈ
1909
+ ႉ
1910
+ ႊ
1911
+ ႋ
1912
+ ႌ
1913
+ ႍ
1914
+ ႎ
1915
+ ႏ
1916
+ ႐
1917
+ ႑
1918
+ ႒
1919
+ ႓
1920
+ ႔
1921
+ ႕
1922
+ ႖
1923
+ ႗
1924
+ ႘
1925
+ ႙
1926
+ ႚ
1927
+ ႛ
1928
+ ႜ
1929
+ ႝ
1930
+ ႞
1931
+ ႟
1932
+
1933
+ က
1934
+ ခ
1935
+ ဂ
1936
+ ဃ
1937
+ င
1938
+ စ
1939
+ ဆ
1940
+ ဇ
1941
+ ဈ
1942
+ ဉ
1943
+ ည
1944
+ ဋ
1945
+ ဌ
1946
+ ဍ
1947
+ ဎ
1948
+ ဏ
1949
+ တ
1950
+ ထ
1951
+ ဒ
1952
+ ဓ
1953
+ န
1954
+ ပ
1955
+ ဖ
1956
+ ဗ
1957
+ ဘ
1958
+ မ
1959
+ ယ
1960
+ ရ
1961
+ လ
1962
+ ဝ
1963
+ သ
1964
+ ဟ
1965
+ ဠ
1966
+ အ
1967
+ ဢ
1968
+ ဣ
1969
+ ဤ
1970
+ ဥ
1971
+ ဦ
1972
+ ဧ
1973
+ ဨ
1974
+ ဩ
1975
+ ဪ
1976
+ ါ
1977
+ ာ
1978
+ ိ
1979
+ ီ
1980
+ ု
1981
+ ူ
1982
+ ေ
1983
+ ဲ
1984
+ ဳ
1985
+ ဴ
1986
+ ဵ
1987
+ ံ
1988
+ ့
1989
+ း
1990
+ ္
1991
+ ်
1992
+ ျ
1993
+ ြ
1994
+ ွ
1995
+ ှ
1996
+ ဿ
1997
+ ၀
1998
+ ၁
1999
+ ၂
2000
+ ၃
2001
+ ၄
2002
+ ၅
2003
+ ၆
2004
+ ၇
2005
+ ၈
2006
+ ၉
2007
+ ၊
2008
+ ။
2009
+ ၌
2010
+ ၍
2011
+ ၎
2012
+ ၏
2013
+ ၐ
2014
+ ၑ
2015
+ ၒ
2016
+ ၓ
2017
+ ၔ
2018
+ ၕ
2019
+ ၖ
2020
+ ၗ
2021
+ ၘ
2022
+ ၙ
2023
+ ၚ
2024
+ ၛ
2025
+ ၜ
2026
+ ၝ
2027
+ ၞ
2028
+ ၟ
2029
+ ၠ
2030
+ ၡ
2031
+ ၢ
2032
+ ၣ
2033
+ ၤ
2034
+ ၥ
2035
+ ၦ
2036
+ ၧ
2037
+ ၨ
2038
+ ၩ
2039
+ ၪ
2040
+ ၫ
2041
+ ၬ
2042
+ ၭ
2043
+ ၮ
2044
+ ၯ
2045
+ ၰ
2046
+ ၱ
2047
+ ၲ
2048
+ ၳ
2049
+ ၴ
2050
+ ၵ
2051
+ ၶ
2052
+ ၷ
2053
+ ၸ
2054
+ ၹ
2055
+ ၺ
2056
+ ၻ
2057
+ ၼ
2058
+ ၽ
2059
+ ၾ
2060
+ ၿ
2061
+ ႀ
2062
+ ႁ
2063
+ ႂ
2064
+ ႃ
2065
+ ႄ
2066
+ ႅ
2067
+ ႆ
2068
+ ႇ
2069
+ ႈ
2070
+ ႉ
2071
+ ႊ
2072
+ ႋ
2073
+ ႌ
2074
+ ႍ
2075
+ ႎ
2076
+ ႏ
2077
+ ႐
2078
+ ႑
2079
+ ႒
2080
+ ႓
2081
+ ႔
2082
+ ႕
2083
+ ႖
2084
+ ႗
2085
+ ႘
2086
+ ႙
2087
+ ႚ
2088
+ ႛ
2089
+ ႜ
2090
+ ႝ
2091
+ ႞
2092
+ ႟
2093
+
2094
+ Ⴀ
2095
+ Ⴁ
2096
+ Ⴂ
2097
+ Ⴃ
2098
+ Ⴄ
2099
+ Ⴅ
2100
+ Ⴆ
2101
+ Ⴇ
2102
+ Ⴈ
2103
+ Ⴉ
2104
+ Ⴊ
2105
+ Ⴋ
2106
+ ᄀ
2107
+ ᄁ
2108
+ ᄂ
2109
+ ᄃ
2110
+ ᄄ
2111
+ ᄅ
2112
+ ᄆ
2113
+ ᄇ
2114
+ ᄈ
2115
+ ᄉ
2116
+ ᄊ
2117
+ ᄋ
2118
+ ᄌ
2119
+ ᄍ
2120
+ ᄎ
2121
+ ᄏ
2122
+ ᄐ
2123
+ ᄑ
2124
+ ᄒ
2125
+
2126
+ ဠ
2127
+ အ
2128
+ ဢ
2129
+ ဣ
2130
+ ဤ
2131
+ ဥ
2132
+ ဦ
2133
+ ဧ
2134
+ ဨ
2135
+ ဩ
2136
+ ဪ
2137
+ ါ
2138
+ ာ
2139
+ ိ
2140
+ ီ
2141
+ ု
2142
+ ူ
2143
+ ေ
2144
+ ဲ
2145
+ ဳ
2146
+ ဴ
2147
+ ဵ
2148
+ ံ
2149
+ ့
2150
+ း
2151
+ ္
2152
+ ်
2153
+ ျ
2154
+ ြ
2155
+ ွ
2156
+ ှ
2157
+ ဿ
2158
+ ၀
2159
+ ၁
2160
+ ၂
2161
+ ၃
2162
+ ၄
2163
+ ၅
2164
+ ၆
2165
+ ၇
2166
+ ၈
2167
+ ၉
2168
+ ၊
2169
+ ။
2170
+ ၌
2171
+ ၍
2172
+ ၎
2173
+ ၏
2174
+ ၐ
2175
+ ၑ
2176
+ ၒ
2177
+ ၓ
2178
+ ၔ
2179
+ ၕ
2180
+ ၖ
2181
+ ၗ
2182
+ ၘ
2183
+ ၙ
2184
+ ၚ
2185
+ ၛ
2186
+ ၜ
2187
+ ၝ
2188
+ ၞ
2189
+ ၟ
2190
+ ၠ
2191
+ ၡ
2192
+ ၢ
2193
+ ၣ
2194
+ ၤ
2195
+ ၥ
2196
+ ၦ
2197
+ ၧ
2198
+ ၨ
2199
+ ၩ
2200
+ ၪ
2201
+ ၫ
2202
+ ၬ
2203
+ ၭ
2204
+ ၮ
2205
+ ၯ
2206
+ ၰ
2207
+ ၱ
2208
+ ၲ
2209
+ ၳ
2210
+ ၴ
2211
+ ၵ
2212
+ ၶ
2213
+ ၷ
2214
+ ၸ
2215
+ ၹ
2216
+ ၺ
2217
+ ၻ
2218
+ ၼ
2219
+ ၽ
2220
+ ၾ
2221
+ ၿ
2222
+ ႀ
2223
+ ႁ
2224
+ ႂ
2225
+ ႃ
2226
+ ႄ
2227
+ ႅ
2228
+ ႆ
2229
+ ႇ
2230
+ ႈ
2231
+ ႉ
2232
+ ႊ
2233
+ ႋ
2234
+ ႌ
2235
+ ႍ
2236
+ ႎ
2237
+ ႏ
2238
+ ႐
2239
+ ႑
2240
+ ႒
2241
+ ႓
2242
+ ႔
2243
+ ႕
2244
+ ႖
2245
+ ႗
2246
+ ႘
2247
+ ႙
2248
+ ႚ
2249
+ ႛ
2250
+ ႜ
2251
+ ႝ
2252
+ ႞
2253
+ ႟
2254
+
2255
+ က
2256
+ ခ
2257
+ ဂ
2258
+ ဃ
2259
+ င
2260
+ စ
2261
+ ဆ
2262
+ ဇ
2263
+ ဈ
2264
+ ဉ
2265
+ ည
2266
+ ဋ
2267
+ ဌ
2268
+ ဍ
2269
+ ဎ
2270
+ ဏ
2271
+ တ
2272
+ ထ
2273
+ ဒ
2274
+ ဓ
2275
+ န
2276
+ ပ
2277
+ ဖ
2278
+ ဗ
2279
+ ဘ
2280
+ မ
2281
+ ယ
2282
+ ရ
2283
+ လ
2284
+ ဝ
2285
+ သ
2286
+ ဟ
2287
+ ဠ
2288
+ အ
2289
+ ဢ
2290
+ ဣ
2291
+ ဤ
2292
+ ဥ
2293
+ ဦ
2294
+ ဧ
2295
+ ဨ
2296
+ ဩ
2297
+ ဪ
2298
+ ါ
2299
+ ာ
2300
+ ိ
2301
+ ီ
2302
+ ု
2303
+ ူ
2304
+ ေ
2305
+ ဲ
2306
+ ဳ
2307
+ ဴ
2308
+ ဵ
2309
+ ံ
2310
+ ့
2311
+ း
2312
+ ္
2313
+ ်
2314
+ ျ
2315
+ ြ
2316
+ ွ
2317
+ ှ
2318
+ ဿ
2319
+ ၀
2320
+ ၁
2321
+ ၂
2322
+ ၃
2323
+ ၄
2324
+ ၅
2325
+ ၆
2326
+ ၇
2327
+ ၈
2328
+ ၉
2329
+ ၊
2330
+ ။
2331
+ ၌
2332
+ ၍
2333
+ ၎
2334
+ ၏
2335
+ ၐ
2336
+ ၑ
2337
+ ၒ
2338
+ ၓ
2339
+ ၔ
2340
+ ၕ
2341
+ ၖ
2342
+ ၗ
2343
+ ၘ
2344
+ ၙ
2345
+ ၚ
2346
+ ၛ
2347
+ ၜ
2348
+ ၝ
2349
+ ၞ
2350
+ ၟ
2351
+ ၠ
2352
+ ၡ
2353
+ ၢ
2354
+ ၣ
2355
+ ၤ
2356
+ ၥ
2357
+ ၦ
2358
+ ၧ
2359
+ ၨ
2360
+ ၩ
2361
+ ၪ
2362
+ ၫ
2363
+ ၬ
2364
+ ၭ
2365
+ ၮ
2366
+ ၯ
2367
+ ၰ
2368
+ ၱ
2369
+ ၲ
2370
+ ၳ
2371
+ ၴ
2372
+ ၵ
2373
+ ၶ
2374
+ ၷ
2375
+ ၸ
2376
+ ၹ
2377
+ ၺ
2378
+ ၻ
2379
+ ၼ
2380
+ ၽ
2381
+ ၾ
2382
+ ၿ
2383
+ ႀ
2384
+ ႁ
2385
+ ႂ
2386
+ ႃ
2387
+ ႄ
2388
+ ႅ
2389
+ ႆ
2390
+ ႇ
2391
+ ႈ
2392
+ ႉ
2393
+ ႊ
2394
+ ႋ
2395
+ ႌ
2396
+ ႍ
2397
+ ႎ
2398
+ ႏ
2399
+ ႐
2400
+ ႑
2401
+ ႒
2402
+ ႓
2403
+ ႔
2404
+ ႕
2405
+ ႖
2406
+ ႗
2407
+ ႘
2408
+ ႙
2409
+ ႚ
2410
+ ႛ
2411
+ ႜ
2412
+ ႝ
2413
+ ႞
2414
+ ႟
2415
+
2416
+ Ⴀ
2417
+ Ⴁ
2418
+ Ⴂ
2419
+ Ⴃ
2420
+ Ⴄ
2421
+ Ⴅ
2422
+ Ⴆ
2423
+ Ⴇ
2424
+ Ⴈ
2425
+ Ⴉ
2426
+ Ⴊ
2427
+ Ⴋ
2428
+ ᄀ
2429
+ ᄁ
2430
+ ᄂ
2431
+ ᄃ
2432
+ ᄄ
2433
+ ᄅ
2434
+ ᄆ
2435
+ ᄇ
2436
+ ᄈ
2437
+ ᄉ
2438
+ ᄊ
2439
+ ᄋ
2440
+ ᄌ
2441
+ ᄍ
2442
+ ᄎ
2443
+ ᄏ
2444
+ ᄐ
2445
+ ᄑ
2446
+ ᄒ
2447
+
2448
+ ဠ
2449
+ အ
2450
+ ဢ
2451
+ ဣ
2452
+ ဤ
2453
+ ဥ
2454
+ ဦ
2455
+ ဧ
2456
+ ဨ
2457
+ ဩ
2458
+ ဪ
2459
+ ါ
2460
+ ာ
2461
+ ိ
2462
+ ီ
2463
+ ု
2464
+ ူ
2465
+ ေ
2466
+ ဲ
2467
+ ဳ
2468
+ ဴ
2469
+ ဵ
2470
+ ံ
2471
+ ့
2472
+ း
2473
+ ္
2474
+ ်
2475
+ ျ
2476
+ ြ
2477
+ ွ
2478
+ ှ
2479
+ ဿ
2480
+ ၀
2481
+ ၁
2482
+ ၂
2483
+ ၃
2484
+ ၄
2485
+ ၅
2486
+ ၆
2487
+ ၇
2488
+ ၈
2489
+ ၉
2490
+ ၊
2491
+ ။
2492
+ ၌
2493
+ ၍
2494
+ ၎
2495
+ ၏
2496
+ ၐ
2497
+ ၑ
2498
+ ၒ
2499
+ ၓ
2500
+ ၔ
2501
+ ၕ
2502
+ ၖ
2503
+ ၗ
2504
+ ၘ
2505
+ ၙ
2506
+ ၚ
2507
+ ၛ
2508
+ ၜ
2509
+ ၝ
2510
+ ၞ
2511
+ ၟ
2512
+ ၠ
2513
+ ၡ
2514
+ ၢ
2515
+ ၣ
2516
+ ၤ
2517
+ ၥ
2518
+ ၦ
2519
+ ၧ
2520
+ ၨ
2521
+ ၩ
2522
+ ၪ
2523
+ ၫ
2524
+ ၬ
2525
+ ၭ
2526
+ ၮ
2527
+ ၯ
2528
+ ၰ
2529
+ ၱ
2530
+ ၲ
2531
+ ၳ
2532
+ ၴ
2533
+ ၵ
2534
+ ၶ
2535
+ ၷ
2536
+ ၸ
2537
+ ၹ
2538
+ ၺ
2539
+ ၻ
2540
+ ၼ
2541
+ ၽ
2542
+ ၾ
2543
+ ၿ
2544
+ ႀ
2545
+ ႁ
2546
+ ႂ
2547
+ ႃ
2548
+ ႄ
2549
+ ႅ
2550
+ ႆ
2551
+ ႇ
2552
+ ႈ
2553
+ ႉ
2554
+ ႊ
2555
+ ႋ
2556
+ ႌ
2557
+ ႍ
2558
+ ႎ
2559
+ ႏ
2560
+ ႐
2561
+ ႑
2562
+ ႒
2563
+ ႓
2564
+ ႔
2565
+ ႕
2566
+ ႖
2567
+ ႗
2568
+ ႘
2569
+ ���
2570
+ ႚ
2571
+ ႛ
2572
+ ႜ
2573
+ ႝ
2574
+ ႞
2575
+ ႟
2576
+
2577
+ က
2578
+ ခ
2579
+ ဂ
2580
+ ဃ
2581
+ င
2582
+ စ
2583
+ ဆ
2584
+ ဇ
2585
+ ဈ
2586
+ ဉ
2587
+ ည
2588
+ ဋ
2589
+ ဌ
2590
+ ဍ
2591
+ ဎ
2592
+ ဏ
2593
+ တ
2594
+ ထ
2595
+ ဒ
2596
+ ဓ
2597
+ န
2598
+ ပ
2599
+ ဖ
2600
+ ဗ
2601
+ ဘ
2602
+ မ
2603
+ ယ
2604
+ ရ
2605
+ လ
2606
+ ဝ
2607
+ သ
2608
+ ဟ
2609
+ ဠ
2610
+ အ
2611
+ ဢ
2612
+ ဣ
2613
+ ဤ
2614
+ ဥ
2615
+ ဦ
2616
+ ဧ
2617
+ ဨ
2618
+ ဩ
2619
+ ဪ
2620
+ ါ
2621
+ ာ
2622
+ ိ
2623
+ ီ
2624
+ ု
2625
+ ူ
2626
+ ေ
2627
+ ဲ
2628
+ ဳ
2629
+ ဴ
2630
+ ဵ
2631
+ ံ
2632
+ ့
2633
+ း
2634
+ ္
2635
+ ်
2636
+ ျ
2637
+ ြ
2638
+ ွ
2639
+ ှ
2640
+ ဿ
2641
+ ၀
2642
+ ၁
2643
+ ၂
2644
+ ၃
2645
+ ၄
2646
+ ၅
2647
+ ၆
2648
+ ၇
2649
+ ၈
2650
+ ၉
2651
+ ၊
2652
+ ။
2653
+ ၌
2654
+ ၍
2655
+ ၎
2656
+ ၏
2657
+ ၐ
2658
+ ၑ
2659
+ ၒ
2660
+ ၓ
2661
+ ၔ
2662
+ ၕ
2663
+ ၖ
2664
+ ၗ
2665
+ ၘ
2666
+ ၙ
2667
+ ၚ
2668
+ ၛ
2669
+ ၜ
2670
+ ၝ
2671
+ ၞ
2672
+ ၟ
2673
+ ၠ
2674
+ ၡ
2675
+ ၢ
2676
+ ၣ
2677
+ ၤ
2678
+ ၥ
2679
+ ၦ
2680
+ ၧ
2681
+ ၨ
2682
+ ၩ
2683
+ ၪ
2684
+ ၫ
2685
+ ၬ
2686
+ ၭ
2687
+ ၮ
2688
+ ၯ
2689
+ ၰ
2690
+ ၱ
2691
+ ၲ
2692
+ ၳ
2693
+ ၴ
2694
+ ၵ
2695
+ ၶ
2696
+ ၷ
2697
+ ၸ
2698
+ ၹ
2699
+ ၺ
2700
+ ၻ
2701
+ ၼ
2702
+ ၽ
2703
+ ၾ
2704
+ ၿ
2705
+ ႀ
2706
+ ႁ
2707
+ ႂ
2708
+ ႃ
2709
+ ႄ
2710
+ ႅ
2711
+ ႆ
2712
+ ႇ
2713
+ ႈ
2714
+ ႉ
2715
+ ႊ
2716
+ ႋ
2717
+ ႌ
2718
+ ႍ
2719
+ ႎ
2720
+ ႏ
2721
+ ႐
2722
+ ႑
2723
+ ႒
2724
+ ႓
2725
+ ႔
2726
+ ႕
2727
+ ႖
2728
+ ႗
2729
+ ႘
2730
+ ႙
2731
+ ႚ
2732
+ ႛ
2733
+ ႜ
2734
+ ႝ
2735
+ ႞
2736
+ ႟
2737
+
2738
+ Ⴀ
2739
+ Ⴁ
2740
+ Ⴂ
2741
+ Ⴃ
2742
+ Ⴄ
2743
+ Ⴅ
2744
+ Ⴆ
2745
+ Ⴇ
2746
+ Ⴈ
2747
+ Ⴉ
2748
+ Ⴊ
2749
+ Ⴋ
2750
+ ᄀ
2751
+ ᄁ
2752
+ ᄂ
2753
+ ᄃ
2754
+ ᄄ
2755
+ ᄅ
2756
+ ᄆ
2757
+ ᄇ
2758
+ ᄈ
2759
+ ᄉ
2760
+ ᄊ
2761
+ ᄋ
2762
+ ᄌ
2763
+ ᄍ
2764
+ ᄎ
2765
+ ᄏ
2766
+ ᄐ
2767
+ ᄑ
2768
+ ᄒ
2769
+
2770
+ ဠ
2771
+ အ
2772
+ ဢ
2773
+ ဣ
2774
+ ဤ
2775
+ ဥ
2776
+ ဦ
2777
+ ဧ
2778
+ ဨ
2779
+ ဩ
2780
+ ဪ
2781
+ ါ
2782
+ ာ
2783
+ ိ
2784
+ ီ
2785
+ ု
2786
+ ူ
2787
+ ေ
2788
+ ဲ
2789
+ ဳ
2790
+ ဴ
2791
+ ဵ
2792
+ ံ
2793
+ ့
2794
+ း
2795
+ ္
2796
+ ်
2797
+ ျ
2798
+ ြ
2799
+ ွ
2800
+ ှ
2801
+ ဿ
2802
+ ၀
2803
+ ၁
2804
+ ၂
2805
+ ၃
2806
+ ၄
2807
+ ၅
2808
+ ၆
2809
+ ၇
2810
+ ၈
2811
+ ၉
2812
+ ၊
2813
+ ။
2814
+ ၌
2815
+ ၍
2816
+ ၎
2817
+ ၏
2818
+ ၐ
2819
+ ၑ
2820
+ ၒ
2821
+ ၓ
2822
+ ၔ
2823
+ ၕ
2824
+ ၖ
2825
+ ၗ
2826
+ ၘ
2827
+ ၙ
2828
+ ၚ
2829
+ ၛ
2830
+ ၜ
2831
+ ၝ
2832
+ ၞ
2833
+ ၟ
2834
+ ၠ
2835
+ ၡ
2836
+ ၢ
2837
+ ၣ
2838
+ ၤ
2839
+ ၥ
2840
+ ၦ
2841
+ ၧ
2842
+ ၨ
2843
+ ၩ
2844
+ ၪ
2845
+ ၫ
2846
+ ၬ
2847
+ ၭ
2848
+ ၮ
2849
+ ၯ
2850
+ ၰ
2851
+ ၱ
2852
+ ၲ
2853
+ ၳ
2854
+ ၴ
2855
+ ၵ
2856
+ ၶ
2857
+ ၷ
2858
+ ၸ
2859
+ ၹ
2860
+ ၺ
2861
+ ၻ
2862
+ ၼ
2863
+ ၽ
2864
+ ၾ
2865
+ ၿ
2866
+ ႀ
2867
+ ႁ
2868
+ ႂ
2869
+ ႃ
2870
+ ႄ
2871
+ ႅ
2872
+ ႆ
2873
+ ႇ
2874
+ ႈ
2875
+ ႉ
2876
+ ႊ
2877
+ ႋ
2878
+ ႌ
2879
+ ႍ
2880
+ ႎ
2881
+ ႏ
2882
+ ႐
2883
+ ႑
2884
+ ႒
2885
+ ႓
2886
+ ႔
2887
+ ႕
2888
+ ႖
2889
+ ႗
2890
+ ႘
2891
+ ႙
2892
+ ႚ
2893
+ ႛ
2894
+ ႜ
2895
+ ႝ
2896
+ ႞
2897
+ ႟
2898
+
2899
+ က
2900
+ ခ
2901
+ ဂ
2902
+ ဃ
2903
+ င
2904
+ စ
2905
+ ဆ
2906
+ ဇ
2907
+ ဈ
2908
+ ဉ
2909
+ ည
2910
+ ဋ
2911
+ ဌ
2912
+ ဍ
2913
+ ဎ
2914
+ ဏ
2915
+ တ
2916
+ ထ
2917
+ ဒ
2918
+ ဓ
2919
+ န
2920
+ ပ
2921
+ ဖ
2922
+ ဗ
2923
+ ဘ
2924
+ မ
2925
+ ယ
2926
+ ရ
2927
+ လ
2928
+ ဝ
2929
+ သ
2930
+ ဟ
2931
+ ဠ
2932
+ အ
2933
+ ဢ
2934
+ ဣ
2935
+ ဤ
2936
+ ဥ
2937
+ ဦ
2938
+ ဧ
2939
+ ဨ
2940
+ ဩ
2941
+ ဪ
2942
+ ါ
2943
+ ာ
2944
+ ိ
2945
+ ီ
2946
+ ု
2947
+ ူ
2948
+ ေ
2949
+ ဲ
2950
+ ဳ
2951
+ ဴ
2952
+ ဵ
2953
+ ံ
2954
+ ့
2955
+ း
2956
+ ္
2957
+ ်
2958
+ ျ
2959
+ ြ
2960
+ ွ
2961
+ ှ
2962
+ ဿ
2963
+ ၀
2964
+ ၁
2965
+ ၂
2966
+ ၃
2967
+ ၄
2968
+ ၅
2969
+ ၆
2970
+ ၇
2971
+ ၈
2972
+ ၉
2973
+ ၊
2974
+ ။
2975
+ ၌
2976
+ ၍
2977
+ ၎
2978
+ ၏
2979
+ ၐ
2980
+ ၑ
2981
+ ၒ
2982
+ ၓ
2983
+ ၔ
2984
+ ၕ
2985
+ ၖ
2986
+ ၗ
2987
+ ၘ
2988
+ ၙ
2989
+ ၚ
2990
+ ၛ
2991
+ ၜ
2992
+ ၝ
2993
+ ၞ
2994
+ ၟ
2995
+ ၠ
2996
+ ၡ
2997
+ ၢ
2998
+ ၣ
2999
+ ၤ
3000
+ ၥ
3001
+ ၦ
3002
+ ၧ
3003
+ ၨ
3004
+ ၩ
3005
+ ၪ
3006
+ ၫ
3007
+ ၬ
3008
+ ၭ
3009
+ ၮ
3010
+ ၯ
3011
+ ၰ
3012
+ ၱ
3013
+ ၲ
3014
+ ၳ
3015
+ ၴ
3016
+ ၵ
3017
+ ၶ
3018
+ ၷ
3019
+ ၸ
3020
+ ၹ
3021
+ ၺ
3022
+ ၻ
3023
+ ၼ
3024
+ ၽ
3025
+ ၾ
3026
+ ၿ
3027
+ ႀ
3028
+ ႁ
3029
+ ႂ
3030
+ ႃ
3031
+ ႄ
3032
+ ႅ
3033
+ ႆ
3034
+ ႇ
3035
+ ႈ
3036
+ ႉ
3037
+ ႊ
3038
+ ႋ
3039
+ ႌ
3040
+ ႍ
3041
+ ႎ
3042
+ ႏ
3043
+ ႐
3044
+ ႑
3045
+ ႒
3046
+ ႓
3047
+ ႔
3048
+ ႕
3049
+ ႖
3050
+ ႗
3051
+ ႘
3052
+ ႙
3053
+ ႚ
3054
+ ႛ
3055
+ ႜ
3056
+ ႝ
3057
+ ႞
3058
+ ႟
3059
+
3060
+ Ⴀ
3061
+ Ⴁ
3062
+ Ⴂ
3063
+ Ⴃ
3064
+ Ⴄ
3065
+ Ⴅ
3066
+ Ⴆ
3067
+ Ⴇ
3068
+ Ⴈ
3069
+ Ⴉ
3070
+ Ⴊ
3071
+ Ⴋ
3072
+ ᄀ
3073
+ ᄁ
3074
+ ᄂ
3075
+ ᄃ
3076
+ ᄄ
3077
+ ᄅ
3078
+ ᄆ
3079
+ ᄇ
3080
+ ᄈ
3081
+ ᄉ
3082
+ ᄊ
3083
+ ᄋ
3084
+ ᄌ
3085
+ ᄍ
3086
+ ᄎ
3087
+ ᄏ
3088
+ ᄐ
3089
+ ᄑ
3090
+ ᄒ
3091
+
3092
+ ဠ
3093
+ အ
3094
+ ဢ
3095
+ ဣ
3096
+ ဤ
3097
+ ဥ
3098
+ ဦ
3099
+ ဧ
3100
+ ဨ
3101
+ ဩ
3102
+ ဪ
3103
+ ါ
3104
+ ာ
3105
+ ိ
3106
+ ီ
3107
+ ု
3108
+ ူ
3109
+ ေ
3110
+ ဲ
3111
+ ဳ
3112
+ ဴ
3113
+ ဵ
3114
+ ံ
3115
+ ့
3116
+ း
3117
+ ္
3118
+ ်
3119
+ ျ
3120
+ ြ
3121
+ ွ
3122
+ ှ
3123
+ ဿ
3124
+ ၀
3125
+ ၁
3126
+ ၂
3127
+ ၃
3128
+ ၄
3129
+ ၅
3130
+ ၆
3131
+ ၇
3132
+ ၈
3133
+ ၉
3134
+ ၊
3135
+ ။
3136
+ ၌
3137
+ ၍
3138
+ ၎
3139
+ ၏
3140
+ ၐ
3141
+ ၑ
3142
+ ၒ
3143
+ ၓ
3144
+ ၔ
3145
+ ၕ
3146
+ ၖ
3147
+ ၗ
3148
+ ၘ
3149
+ ၙ
3150
+ ၚ
3151
+ ၛ
3152
+ ၜ
3153
+ ၝ
3154
+ ၞ
3155
+ ၟ
3156
+ ၠ
3157
+ ၡ
3158
+ ၢ
3159
+ ၣ
3160
+ ၤ
3161
+ ၥ
3162
+ ၦ
3163
+ ၧ
3164
+ ၨ
3165
+ ၩ
3166
+ ၪ
3167
+ ၫ
3168
+ ၬ
3169
+ ၭ
3170
+ ၮ
3171
+ ၯ
3172
+ ၰ
3173
+ ၱ
3174
+ ၲ
3175
+ ၳ
3176
+ ၴ
3177
+ ၵ
3178
+ ၶ
3179
+ ၷ
3180
+ ၸ
3181
+ ၹ
3182
+ ၺ
3183
+ ၻ
3184
+ ၼ
3185
+ ၽ
3186
+ ၾ
3187
+ ၿ
3188
+ ႀ
3189
+ ႁ
3190
+ ႂ
3191
+ ႃ
3192
+ ႄ
3193
+ ႅ
3194
+ ႆ
3195
+ ႇ
3196
+ ႈ
3197
+ ႉ
3198
+ ႊ
3199
+ ႋ
3200
+ ႌ
3201
+ ႍ
3202
+ ႎ
3203
+ ႏ
3204
+ ႐
3205
+ ႑
3206
+ ႒
3207
+ ႓
3208
+ ႔
3209
+ ႕
3210
+ ႖
3211
+ ႗
3212
+ ႘
3213
+ ႙
3214
+ ႚ
3215
+ ႛ
3216
+ ႜ
3217
+ ႝ
3218
+ ႞
3219
+ ႟
ocr-studio/PaddleOCR/ppocr/utils/dict/bn_dict.txt ADDED
@@ -0,0 +1,477 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ !
3
+ #
4
+ $
5
+ %
6
+ &
7
+ '
8
+ (
9
+ +
10
+
11
+ -
12
+ .
13
+ /
14
+ 0
15
+ 1
16
+ 2
17
+ 3
18
+ 4
19
+ 5
20
+ 6
21
+ 7
22
+ 8
23
+ 9
24
+ :
25
+ ?
26
+ @
27
+ A
28
+ B
29
+ C
30
+ D
31
+ E
32
+ F
33
+ G
34
+ H
35
+ I
36
+ J
37
+ K
38
+ L
39
+ M
40
+ N
41
+ O
42
+ P
43
+ Q
44
+ R
45
+ S
46
+ T
47
+ U
48
+ V
49
+ W
50
+ X
51
+ Y
52
+ Z
53
+ _
54
+ a
55
+ b
56
+ c
57
+ d
58
+ e
59
+ f
60
+ g
61
+ h
62
+ i
63
+ j
64
+ k
65
+ l
66
+ m
67
+ n
68
+ o
69
+ p
70
+ q
71
+ r
72
+ s
73
+ t
74
+ u
75
+ v
76
+ w
77
+ x
78
+ y
79
+ z
80
+ É
81
+ é
82
+ '
83
+ "
84
+ ঃ
85
+ ,
86
+ ;
87
+ !
88
+ ?
89
+ ।
90
+ —
91
+ ঃ-
92
+ -
93
+ (
94
+ )
95
+ [
96
+ ]
97
+ {
98
+ }
99
+ √
100
+ ...
101
+ .
102
+ /
103
+ \
104
+ =
105
+ <
106
+ >
107
+ ৳
108
+ °
109
+ %
110
+ অ
111
+ আ
112
+ ই
113
+ ঈ
114
+ উ
115
+ ঊ
116
+ ঋ
117
+ এ
118
+ ঐ
119
+ ও
120
+ ঔ
121
+ ্‌
122
+ া
123
+ ি
124
+ ী
125
+ ু
126
+ ূ
127
+ ে
128
+ ৈ
129
+ ো
130
+ ৌ
131
+ ৃ
132
+ ‍্য
133
+ ‍্র
134
+ ‍্ব
135
+ ক
136
+ খ
137
+ গ
138
+ ঘ
139
+ ঙ
140
+ চ
141
+ ছ
142
+ জ
143
+ ঝ
144
+ ঞ
145
+ ট
146
+ ঠ
147
+ ড
148
+ ঢ
149
+ ণ
150
+ ত
151
+ থ
152
+ দ
153
+ ধ
154
+ ন
155
+ প
156
+ ফ
157
+ ব
158
+ ভ
159
+ ম
160
+ য
161
+ র
162
+ ল
163
+ শ
164
+ ষ
165
+ স
166
+ হ
167
+ ড়
168
+ ঢ়
169
+ য়
170
+ ং
171
+ ৎ
172
+ ঁ
173
+ ক্ক
174
+ ক্ট
175
+ ক্ত
176
+ ত্র
177
+ ক্ব
178
+ ক্ম
179
+ ক্য
180
+ ক্র
181
+ ক্ল
182
+ ক্ষ
183
+ ক্ষ্ণ
184
+ ক্ষ্ব
185
+ ক্ষ্ম
186
+ ক্ষ্য
187
+ ক্স
188
+ র্ক
189
+ র্ক্য
190
+ খ্য
191
+ খ্র
192
+ র্খ
193
+ গ্ণ
194
+ গ্ধ
195
+ গ্ধ্য
196
+ গ্ধ্র
197
+ গ্ন
198
+ গ্ন্য
199
+ গ্ব
200
+ গ্ম
201
+ গ্য
202
+ গ্র
203
+ গ্র্য
204
+ গ্ল
205
+ র্গ
206
+ র্গ্য
207
+ র্গ্র
208
+ ঘ্ন
209
+ ঘ্য
210
+ ঘ্র
211
+ র্ঘ্য
212
+ র্ঘ
213
+ ঙ্ক
214
+ ঙ্ক্য
215
+ ঙ্ক্ষ
216
+ ঙ্খ
217
+ ঙ্খ্য
218
+ ঙ্গ
219
+ ঙ্গ্য
220
+ ঙ্ঘ
221
+ ঙ্ঘ্য
222
+ ঙ্ঘ্র
223
+ ঙ্ম
224
+ র্ঙ্গ
225
+ চ্চ
226
+ চ্ছ
227
+ চ্ছ্ব
228
+ চ্ছ্র
229
+ চ্ঞ
230
+ চ্ব
231
+ চ্য
232
+ র্চ্য
233
+ র্চ
234
+ র্ছ
235
+ জ্জ
236
+ জ্জ্ব
237
+ জ্ঝ
238
+ জ্ঞ
239
+ জ্ব
240
+ জ্য
241
+ জ্র
242
+ র্জ্য
243
+ র্জ্জ
244
+ র্জ্ঞ
245
+ র্জ
246
+ র্ঝ
247
+ ঞ্চ
248
+ ঞ্ছ
249
+ ঞ্জ
250
+ ঞ্ঝ
251
+ ট্ট
252
+ ট্ব
253
+ ট্ম
254
+ ট্য
255
+ ট্র
256
+ র্ট
257
+ ড্ড
258
+ ড্ব
259
+ ড্ম
260
+ ড্য
261
+ ড্র
262
+ র্ড
263
+ ঢ্য
264
+ ঢ্র
265
+ র্ঢ্য
266
+ ণ্ট
267
+ ণ্ঠ
268
+ ণ্ঠ্য
269
+ ণ্ড
270
+ ণ্ড্য
271
+ ণ্ড্র
272
+ ণ্ঢ
273
+ ণ্ণ
274
+ ণ্ব
275
+ ণ্ম
276
+ ণ্য
277
+ র্ণ্য
278
+ র্ণ
279
+ ত্ত
280
+ ত্ত্ব
281
+ ত্ত্য
282
+ ত্থ
283
+ ত্ন
284
+ ত্ব
285
+ ত্ম
286
+ ত্ম্য
287
+ ত্য
288
+ ত্র
289
+ ত্র্য
290
+ র্ত্য
291
+ র্ত
292
+ র্ত্ম
293
+ র্ত্র
294
+ থ্ব
295
+ থ্য
296
+ থ্র
297
+ র্থ্য
298
+ র্থ
299
+ দ্গ
300
+ দ্ঘ
301
+ দ্দ
302
+ দ্দ্ব
303
+ দ্ধ
304
+ দ্ব
305
+ দ্ভ
306
+ দ্ভ্র
307
+ দ্ম
308
+ দ্য
309
+ দ্র
310
+ দ্র্য
311
+ র্দ
312
+ র্দ্ব
313
+ র্দ্র
314
+ ধ্ন
315
+ ধ্ব
316
+ ধ্ম
317
+ ধ্য
318
+ ধ্র
319
+ র্ধ
320
+ র্ধ্ব
321
+ ন্ট
322
+ ন্ট্র
323
+ ন্ঠ
324
+ ন্ড
325
+ ন্ড্র
326
+ ন্ত
327
+ ন্ত্ব
328
+ ন্ত্য
329
+ ন্ত্র
330
+ ন্ত্র্য
331
+ ন্থ
332
+ ন্থ্র
333
+ ন্দ
334
+ ন্দ্য
335
+ ন্দ্ব
336
+ ন্দ্র
337
+ ন্ধ
338
+ ন্ধ্য
339
+ ন্ধ্র
340
+ ন্ন
341
+ ন্ব
342
+ ন্ম
343
+ ন্য
344
+ র্ন
345
+ প্ট
346
+ প্ত
347
+ প্ন
348
+ প্প
349
+ প্য
350
+ প্র
351
+ প্র্য
352
+ প্ল
353
+ প্স
354
+ র্প
355
+ ফ্র
356
+ ফ্ল
357
+ র্ফ
358
+ ব্জ
359
+ ব্দ
360
+ ব্ধ
361
+ ব্ব
362
+ ব্য
363
+ ব্র
364
+ ব্ল
365
+ র্ব্য
366
+ র্ব
367
+ ভ্ব
368
+ ভ্য
369
+ ভ্র
370
+ ভ্ল
371
+ র্ভ
372
+ ম্ন
373
+ ম্প
374
+ ম্প্র
375
+ ম্ফ
376
+ ম্ব
377
+ ম্ব্র
378
+ ম্ভ
379
+ ম্ভ্র
380
+ ম্ম
381
+ ম্য
382
+ ম্র
383
+ ম্ল
384
+ র্ম্য
385
+ র্ম
386
+ য্য
387
+ র্য
388
+ ল্ক
389
+ ল্ক্য
390
+ ল্গ
391
+ ল্ট
392
+ ল্ড
393
+ ল্প
394
+ ল্ফ
395
+ ল্ব
396
+ ল্ভ
397
+ ল্ম
398
+ ল্য
399
+ ল্ল
400
+ র্ল
401
+ শ্চ
402
+ শ্ছ
403
+ শ্ন
404
+ শ্ব
405
+ শ্ম
406
+ শ্য
407
+ শ্র
408
+ শ্ল
409
+ র্শ্য
410
+ র্শ
411
+ র্শ্ব
412
+ ষ্ক
413
+ ষ্ক্ব
414
+ ষ্ক্র
415
+ ষ্ট
416
+ ষ্ট্য
417
+ ষ্ট্র
418
+ ষ্ঠ
419
+ ষ্ঠ্য
420
+ ষ্ণ
421
+ ষ্ণ্ব
422
+ ষ্প
423
+ ষ্প্র
424
+ ষ্ফ
425
+ ষ্ব
426
+ ষ্ম
427
+ ষ্য
428
+ র্ষ্য
429
+ র্ষ
430
+ র্ষ্ট
431
+ র্ষ্ণ
432
+ র্ষ্ণ্য
433
+ স্ক
434
+ স্ক্র
435
+ স্খ
436
+ স্ট
437
+ স্ট্র
438
+ স্ত
439
+ স্ত্ব
440
+ স্ত্য
441
+ স্ত্র
442
+ স্থ
443
+ স্থ্য
444
+ স্ন
445
+ স্ন্য
446
+ স্প
447
+ স্প্র
448
+ স্প্ল
449
+ স্ফ
450
+ স্ব
451
+ স্ম
452
+ স্য
453
+ স্র
454
+ স্ল
455
+ স্ক্ল
456
+ র্স
457
+ হ্ণ
458
+ হ্ন
459
+ হ্ব
460
+ হ্ম
461
+ হ্য
462
+ হ্র
463
+ হ্ল
464
+ র্হ্য
465
+ র্হ
466
+ ড়্গ
467
+ র্ৎ
468
+ ০
469
+ ১
470
+ ২
471
+ ৩
472
+ ৪
473
+ ৫
474
+ ৬
475
+ ৭
476
+ ৮
477
+ ৯
ocr-studio/PaddleOCR/ppocr/utils/dict/chinese_cht_dict.txt ADDED
@@ -0,0 +1,8421 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !
2
+ "
3
+ #
4
+ $
5
+ %
6
+ &
7
+ '
8
+ (
9
+ )
10
+ *
11
+ +
12
+ ,
13
+ -
14
+ .
15
+ /
16
+ 0
17
+ 1
18
+ 2
19
+ 3
20
+ 4
21
+ 5
22
+ 6
23
+ 7
24
+ 8
25
+ 9
26
+ :
27
+ ;
28
+ <
29
+ =
30
+ >
31
+ ?
32
+ @
33
+ A
34
+ B
35
+ C
36
+ D
37
+ E
38
+ F
39
+ G
40
+ H
41
+ I
42
+ J
43
+ K
44
+ L
45
+ M
46
+ N
47
+ O
48
+ P
49
+ Q
50
+ R
51
+ S
52
+ T
53
+ U
54
+ V
55
+ W
56
+ X
57
+ Y
58
+ Z
59
+ [
60
+ \
61
+ ]
62
+ ^
63
+ _
64
+ `
65
+ a
66
+ b
67
+ c
68
+ d
69
+ e
70
+ f
71
+ g
72
+ h
73
+ i
74
+ j
75
+ k
76
+ l
77
+ m
78
+ n
79
+ o
80
+ p
81
+ q
82
+ r
83
+ s
84
+ t
85
+ u
86
+ v
87
+ w
88
+ x
89
+ y
90
+ z
91
+ {
92
+ |
93
+ }
94
+ ~
95
+ ¥
96
+ ®
97
+ °
98
+ ±
99
+ ²
100
+ ´
101
+ ·
102
+ »
103
+ É
104
+ Ë
105
+ Ó
106
+ ×
107
+ Ü
108
+ à
109
+ á
110
+ ä
111
+ è
112
+ é
113
+ ì
114
+ í
115
+ ò
116
+ ó
117
+ ÷
118
+ ú
119
+ ü
120
+ ā
121
+ ē
122
+ ī
123
+ ō
124
+ ū
125
+ ǐ
126
+ ǒ
127
+ ɔ
128
+ ɡ
129
+ ʌ
130
+ ˋ
131
+ Λ
132
+ Ο
133
+ Φ
134
+ Ω
135
+ α
136
+ β
137
+ ε
138
+ θ
139
+ μ
140
+ π
141
+ З
142
+ И
143
+ Й
144
+ П
145
+ Я
146
+ г
147
+ —
148
+ ‖
149
+ ‘
150
+ ’
151
+ “
152
+ ”
153
+ •
154
+ …
155
+ ‧
156
+ ′
157
+ ″
158
+ ※
159
+ ℃
160
+ №
161
+ ™
162
+ Ⅱ
163
+ Ⅲ
164
+ Ⅳ
165
+ ←
166
+ ↑
167
+ →
168
+ ↓
169
+ ⇋
170
+ ∈
171
+ ∑
172
+ √
173
+ ∞
174
+ ∣
175
+ ∧
176
+ ∩
177
+ ∫
178
+ ∶
179
+ ≈
180
+ ≠
181
+ ≤
182
+ ≥
183
+ ⊙
184
+ ⊥
185
+ ①
186
+ ②
187
+ ③
188
+ ④
189
+ ⑧
190
+ ⑴
191
+ ⑵
192
+ ⑶
193
+ ─
194
+ │
195
+ ┅
196
+ ┌
197
+ ├
198
+ █
199
+ ▎
200
+ ▏
201
+ ▕
202
+ ■
203
+ □
204
+ ▪
205
+ ▲
206
+ △
207
+ ▼
208
+ ◆
209
+ ◇
210
+ ○
211
+ ◎
212
+ ●
213
+ ◥
214
+ ★
215
+ ☆
216
+ ❋
217
+ ❤
218
+  
219
+ 、
220
+ 。
221
+ 〇
222
+ 〉
223
+ 《
224
+ 》
225
+ 「
226
+ 」
227
+ 『
228
+ 』
229
+ 【
230
+ 】
231
+ 〔
232
+ 〕
233
+ 〖
234
+ 〗
235
+ の
236
+ サ
237
+ シ
238
+ ジ
239
+ マ
240
+ ㄱ
241
+ ㆍ
242
+ ㎏
243
+ ㎡
244
+ 㐂
245
+ 㐱
246
+ 㙟
247
+ 㴪
248
+ 㸃
249
+ 䖝
250
+ 䝉
251
+ 䰾
252
+ 䲁
253
+ 一
254
+ 丁
255
+ 七
256
+ 丄
257
+ 丈
258
+ 三
259
+ 上
260
+ 下
261
+ 丌
262
+ 不
263
+ 与
264
+ 丏
265
+ 丐
266
+ 丑
267
+ 且
268
+ 丕
269
+ 世
270
+ 丘
271
+ 丙
272
+ 丞
273
+ 丟
274
+ 両
275
+ 並
276
+ 丨
277
+ 丫
278
+ 中
279
+ 丰
280
+ 串
281
+ 丶
282
+ 丸
283
+ 丹
284
+ 主
285
+ 丼
286
+ 丿
287
+ 乂
288
+ 乃
289
+ 久
290
+ 么
291
+ 之
292
+ 乍
293
+ 乎
294
+ 乏
295
+ 乒
296
+ 乓
297
+ 乖
298
+ 乗
299
+ 乘
300
+ 乙
301
+ 乚
302
+ 乜
303
+ 九
304
+ 乞
305
+ 也
306
+ 乩
307
+ 乭
308
+ 乳
309
+ 乸
310
+ 乹
311
+ 乾
312
+ 亀
313
+ 亂
314
+ 亅
315
+ 了
316
+ 予
317
+ 亊
318
+ 事
319
+ 二
320
+ 亍
321
+ 云
322
+ 互
323
+ 亓
324
+ 五
325
+ 井
326
+ 亘
327
+ 些
328
+ 亜
329
+ 亞
330
+ 亟
331
+ 亠
332
+ 亡
333
+ 亢
334
+ 交
335
+ 亥
336
+ 亦
337
+ 亨
338
+ 享
339
+ 京
340
+ 亭
341
+ 亮
342
+ 亰
343
+ 亳
344
+ 亶
345
+ 亹
346
+ 人
347
+ 亻
348
+ 什
349
+ 仁
350
+ 仂
351
+ 仃
352
+ 仄
353
+ 仇
354
+ 仉
355
+ 今
356
+ 介
357
+ 仍
358
+ 仏
359
+ 仔
360
+ 仕
361
+ 他
362
+ 仗
363
+ 付
364
+ 仙
365
+ 仛
366
+ 仝
367
+ 仞
368
+ 仟
369
+ 仡
370
+ 代
371
+ 令
372
+ 以
373
+ 仨
374
+ 仫
375
+ 仮
376
+ 仰
377
+ 仲
378
+ 仳
379
+ 仵
380
+ 件
381
+ 仺
382
+ 任
383
+ 仼
384
+ 份
385
+ 仿
386
+ 企
387
+ 伃
388
+ 伈
389
+ 伉
390
+ 伊
391
+ 伋
392
+ 伍
393
+ 伎
394
+ 伏
395
+ 伐
396
+ 休
397
+ 伕
398
+ 伙
399
+ 伝
400
+ 伢
401
+ 伯
402
+ 估
403
+ 伱
404
+ 伴
405
+ 伶
406
+ 伷
407
+ 伸
408
+ 伺
409
+ 似
410
+ 伽
411
+ 伾
412
+ 佀
413
+ 佁
414
+ 佃
415
+ 但
416
+ 佇
417
+ 佈
418
+ 佉
419
+ 佋
420
+ 位
421
+ 低
422
+ 住
423
+ 佐
424
+ 佑
425
+ 体
426
+ 佔
427
+ 何
428
+ 佗
429
+ 佘
430
+ 余
431
+ 佚
432
+ 佛
433
+ 作
434
+ 佝
435
+ 佞
436
+ 佟
437
+ 你
438
+ 佣
439
+ 佤
440
+ 佧
441
+ 佩
442
+ 佬
443
+ 佯
444
+ 佰
445
+ 佳
446
+ 併
447
+ 佶
448
+ 佹
449
+ 佺
450
+ 佼
451
+ 佾
452
+ 使
453
+ 侁
454
+ 侃
455
+ 侄
456
+ 侅
457
+ 來
458
+ 侈
459
+ 侊
460
+ 例
461
+ 侍
462
+ 侏
463
+ 侑
464
+ 侖
465
+ 侗
466
+ 侘
467
+ 侚
468
+ 供
469
+ 依
470
+ 侞
471
+ 価
472
+ 侮
473
+ 侯
474
+ 侵
475
+ 侶
476
+ 侷
477
+ 侹
478
+ 便
479
+ 俁
480
+ 係
481
+ 促
482
+ 俄
483
+ 俅
484
+ 俊
485
+ 俋
486
+ 俌
487
+ 俍
488
+ 俎
489
+ 俏
490
+ 俐
491
+ 俑
492
+ 俗
493
+ 俘
494
+ 俚
495
+ 俛
496
+ 保
497
+ 俞
498
+ 俟
499
+ 俠
500
+ 信
501
+ 俬
502
+ 修
503
+ 俯
504
+ 俱
505
+ 俳
506
+ 俴
507
+ 俵
508
+ 俶
509
+ 俸
510
+ 俺
511
+ 俽
512
+ 俾
513
+ 倆
514
+ 倈
515
+ 倉
516
+ 個
517
+ 倌
518
+ 倍
519
+ 們
520
+ 倒
521
+ 倓
522
+ 倔
523
+ 倖
524
+ 倗
525
+ 倘
526
+ 候
527
+ 倚
528
+ 倜
529
+ 倞
530
+ 借
531
+ 倡
532
+ 倢
533
+ 倣
534
+ 値
535
+ 倦
536
+ 倧
537
+ 倩
538
+ 倪
539
+ 倫
540
+ 倬
541
+ 倭
542
+ 倮
543
+ 倻
544
+ 值
545
+ 偁
546
+ 偃
547
+ 假
548
+ 偈
549
+ 偉
550
+ 偊
551
+ 偌
552
+ 偍
553
+ 偎
554
+ 偏
555
+ 偓
556
+ 偕
557
+ 做
558
+ 停
559
+ 健
560
+ 偪
561
+ 偲
562
+ 側
563
+ 偵
564
+ 偶
565
+ 偷
566
+ 偸
567
+ 偽
568
+ 傀
569
+ 傃
570
+ 傅
571
+ 傈
572
+ 傉
573
+ 傍
574
+ 傑
575
+ 傒
576
+ 傕
577
+ 傖
578
+ 傘
579
+ 備
580
+ 傜
581
+ 傢
582
+ 傣
583
+ 催
584
+ 傭
585
+ 傲
586
+ 傳
587
+ 債
588
+ 傷
589
+ 傻
590
+ 傾
591
+ 僅
592
+ 僉
593
+ 僊
594
+ 働
595
+ 像
596
+ 僑
597
+ 僔
598
+ 僕
599
+ 僖
600
+ 僙
601
+ 僚
602
+ 僜
603
+ 僡
604
+ 僧
605
+ 僩
606
+ 僭
607
+ 僮
608
+ 僰
609
+ 僱
610
+ 僳
611
+ 僴
612
+ 僵
613
+ 價
614
+ 僻
615
+ 儀
616
+ 儁
617
+ 儂
618
+ 億
619
+ 儆
620
+ 儇
621
+ 儈
622
+ 儉
623
+ 儋
624
+ 儐
625
+ 儒
626
+ 儔
627
+ 儕
628
+ 儘
629
+ 儚
630
+ 儞
631
+ 償
632
+ 儡
633
+ 儥
634
+ 儦
635
+ 優
636
+ 儫
637
+ 儱
638
+ 儲
639
+ 儷
640
+ 儺
641
+ 儻
642
+ 儼
643
+ 兀
644
+ 允
645
+ 元
646
+ 兄
647
+ 充
648
+ 兆
649
+ 先
650
+ 光
651
+ 克
652
+ 兌
653
+ 免
654
+ 児
655
+ 兒
656
+ 兔
657
+ 兕
658
+ 兗
659
+ 兜
660
+ 入
661
+ 內
662
+ 全
663
+ 兩
664
+ 兪
665
+ 八
666
+ 公
667
+ 六
668
+ 兮
669
+ 共
670
+ 兵
671
+ 其
672
+ 具
673
+ 典
674
+ 兼
675
+ 兿
676
+ 冀
677
+ 冂
678
+ 円
679
+ 冇
680
+ 冉
681
+ 冊
682
+ 再
683
+ 冏
684
+ 冑
685
+ 冒
686
+ 冕
687
+ 冖
688
+ 冗
689
+ 冚
690
+ 冠
691
+ 冢
692
+ 冤
693
+ 冥
694
+ 冧
695
+ 冨
696
+ 冪
697
+ 冫
698
+ 冬
699
+ 冮
700
+ 冰
701
+ 冴
702
+ 冶
703
+ 冷
704
+ 冼
705
+ 冽
706
+ 凃
707
+ 凄
708
+ 准
709
+ 凈
710
+ 凋
711
+ 凌
712
+ 凍
713
+ 凖
714
+ 凜
715
+ 凝
716
+ 凞
717
+ 几
718
+ 凡
719
+ 処
720
+ 凪
721
+ 凬
722
+ 凰
723
+ 凱
724
+ 凳
725
+ 凵
726
+ 凶
727
+ 凸
728
+ 凹
729
+ 出
730
+ 函
731
+ 刀
732
+ 刁
733
+ 刂
734
+ 刃
735
+ 刄
736
+ 分
737
+ 切
738
+ 刈
739
+ 刊
740
+ 刎
741
+ 刑
742
+ 划
743
+ 列
744
+ 初
745
+ 判
746
+ 別
747
+ 刦
748
+ 刧
749
+ 刨
750
+ 利
751
+ 刪
752
+ 刮
753
+ 到
754
+ 制
755
+ 刷
756
+ 券
757
+ 刺
758
+ 刻
759
+ 刼
760
+ 剁
761
+ 剃
762
+ 則
763
+ 削
764
+ 剋
765
+ 剌
766
+ 前
767
+ 剎
768
+ 剏
769
+ 剔
770
+ 剖
771
+ 剛
772
+ 剝
773
+ 剡
774
+ 剣
775
+ 剩
776
+ 剪
777
+ 剮
778
+ 副
779
+ 割
780
+ 創
781
+ 剿
782
+ 劃
783
+ 劄
784
+ 劇
785
+ 劈
786
+ 劉
787
+ 劊
788
+ 劌
789
+ 劍
790
+ 劑
791
+ 劔
792
+ 力
793
+ 功
794
+ 加
795
+ 劣
796
+ 助
797
+ 努
798
+ 劫
799
+ 劬
800
+ 劭
801
+ 劵
802
+ 効
803
+ 劼
804
+ 劾
805
+ 勁
806
+ 勃
807
+ 勅
808
+ 勇
809
+ 勉
810
+ 勐
811
+ 勑
812
+ 勒
813
+ 勔
814
+ 動
815
+ 勖
816
+ 勗
817
+ 勘
818
+ 務
819
+ 勛
820
+ 勝
821
+ 勞
822
+ 募
823
+ 勢
824
+ 勣
825
+ 勤
826
+ 勦
827
+ 勰
828
+ 勱
829
+ 勲
830
+ 勳
831
+ 勵
832
+ 勷
833
+ 勸
834
+ 勺
835
+ 勻
836
+ 勾
837
+ 勿
838
+ 匂
839
+ 匄
840
+ 包
841
+ 匆
842
+ 匈
843
+ 匋
844
+ 匍
845
+ 匏
846
+ 匐
847
+ 匕
848
+ 化
849
+ 北
850
+ 匙
851
+ 匚
852
+ 匝
853
+ 匠
854
+ 匡
855
+ 匣
856
+ 匪
857
+ 匯
858
+ 匱
859
+ 匸
860
+ 匹
861
+ 匾
862
+ 匿
863
+ 區
864
+ 十
865
+ 千
866
+ 卅
867
+ 升
868
+ 午
869
+ 卉
870
+ 半
871
+ 卋
872
+ 卍
873
+ 卐
874
+ 卑
875
+ 卒
876
+ 卓
877
+ 協
878
+ 南
879
+ 博
880
+ 卜
881
+ 卞
882
+ 卟
883
+ 占
884
+ 卡
885
+ 卣
886
+ 卦
887
+ 卧
888
+ 卩
889
+ 卬
890
+ 卮
891
+ 卯
892
+ 印
893
+ 危
894
+ 卲
895
+ 即
896
+ 卵
897
+ 卷
898
+ 卸
899
+ 卹
900
+ 卺
901
+ 卻
902
+ 卽
903
+ 卿
904
+ 厄
905
+ 厓
906
+ 厔
907
+ 厙
908
+ 厚
909
+ 厝
910
+ 原
911
+ 厥
912
+ 厭
913
+ 厰
914
+ 厲
915
+ 厴
916
+ 厶
917
+ 去
918
+ 參
919
+ 叄
920
+ 又
921
+ 叉
922
+ 及
923
+ 友
924
+ 反
925
+ 収
926
+ 叔
927
+ 叕
928
+ 取
929
+ 受
930
+ 叛
931
+ 叟
932
+ 叡
933
+ 叢
934
+ 口
935
+ 古
936
+ 句
937
+ 另
938
+ 叨
939
+ 叩
940
+ 只
941
+ 叫
942
+ 召
943
+ 叭
944
+ 叮
945
+ 可
946
+ 台
947
+ 叱
948
+ 史
949
+ 右
950
+ 叵
951
+ 司
952
+ 叻
953
+ 叼
954
+ 吁
955
+ 吃
956
+ 各
957
+ 吆
958
+ 合
959
+ 吉
960
+ 吊
961
+ 吋
962
+ 同
963
+ 名
964
+ 后
965
+ 吏
966
+ 吐
967
+ 向
968
+ 吒
969
+ 吔
970
+ 吖
971
+ 君
972
+ 吝
973
+ 吞
974
+ 吟
975
+ 吠
976
+ 吡
977
+ 吥
978
+ 否
979
+ 吧
980
+ 吩
981
+ 含
982
+ 吮
983
+ 吱
984
+ 吲
985
+ 吳
986
+ 吵
987
+ 吶
988
+ 吸
989
+ 吹
990
+ 吻
991
+ 吼
992
+ 吾
993
+ 呀
994
+ 呂
995
+ 呃
996
+ 呈
997
+ 呉
998
+ 告
999
+ 呋
1000
+ 呎
1001
+ 呢
1002
+ 呤
1003
+ 呦
1004
+ 周
1005
+ 呱
1006
+ 味
1007
+ 呵
1008
+ 呷
1009
+ 呸
1010
+ 呼
1011
+ 命
1012
+ 呾
1013
+ 咀
1014
+ 咁
1015
+ 咂
1016
+ 咄
1017
+ 咅
1018
+ 咆
1019
+ 咋
1020
+ 和
1021
+ 咎
1022
+ 咑
1023
+ 咒
1024
+ 咔
1025
+ 咕
1026
+ 咖
1027
+ 咗
1028
+ 咘
1029
+ 咚
1030
+ 咟
1031
+ 咤
1032
+ 咥
1033
+ 咧
1034
+ 咨
1035
+ 咩
1036
+ 咪
1037
+ 咫
1038
+ 咬
1039
+ 咭
1040
+ 咯
1041
+ 咱
1042
+ 咲
1043
+ 咳
1044
+ 咸
1045
+ 咻
1046
+ 咼
1047
+ 咽
1048
+ 咾
1049
+ 咿
1050
+ 哀
1051
+ 品
1052
+ 哂
1053
+ 哄
1054
+ 哆
1055
+ 哇
1056
+ 哈
1057
+ 哉
1058
+ 哌
1059
+ 哎
1060
+ 哏
1061
+ 哐
1062
+ 哖
1063
+ 哚
1064
+ 哞
1065
+ 員
1066
+ 哥
1067
+ 哦
1068
+ 哨
1069
+ 哩
1070
+ 哪
1071
+ 哭
1072
+ 哮
1073
+ 哱
1074
+ 哲
1075
+ 哺
1076
+ 哼
1077
+ 唃
1078
+ 唄
1079
+ 唆
1080
+ 唇
1081
+ 唉
1082
+ 唏
1083
+ 唐
1084
+ 唑
1085
+ 唔
1086
+ 唘
1087
+ 唧
1088
+ 唫
1089
+ 唬
1090
+ 唭
1091
+ 售
1092
+ 唯
1093
+ 唱
1094
+ 唳
1095
+ 唵
1096
+ 唷
1097
+ 唸
1098
+ 唻
1099
+ 唾
1100
+ 啁
1101
+ 啃
1102
+ 啄
1103
+ 商
1104
+ 啉
1105
+ 啊
1106
+ 啍
1107
+ 問
1108
+ 啓
1109
+ 啖
1110
+ 啚
1111
+ 啜
1112
+ 啞
1113
+ 啟
1114
+ 啡
1115
+ 啣
1116
+ 啤
1117
+ 啥
1118
+ 啦
1119
+ 啪
1120
+ 啫
1121
+ 啯
1122
+ 啰
1123
+ 啱
1124
+ 啲
1125
+ 啵
1126
+ 啶
1127
+ 啷
1128
+ 啻
1129
+ 啼
1130
+ 啾
1131
+ 喀
1132
+ 喂
1133
+ 喃
1134
+ 善
1135
+ 喆
1136
+ 喇
1137
+ 喈
1138
+ 喉
1139
+ 喊
1140
+ 喋
1141
+ 喏
1142
+ 喔
1143
+ 喘
1144
+ 喙
1145
+ 喚
1146
+ 喜
1147
+ 喝
1148
+ 喢
1149
+ 喦
1150
+ 喧
1151
+ 喪
1152
+ 喫
1153
+ 喬
1154
+ 單
1155
+ 喰
1156
+ 喱
1157
+ 喲
1158
+ 喳
1159
+ 喵
1160
+ 喹
1161
+ 喻
1162
+ 喼
1163
+ 嗄
1164
+ 嗅
1165
+ 嗆
1166
+ 嗇
1167
+ 嗊
1168
+ 嗎
1169
+ 嗑
1170
+ 嗒
1171
+ 嗓
1172
+ 嗔
1173
+ 嗖
1174
+ 嗚
1175
+ 嗜
1176
+ 嗝
1177
+ 嗞
1178
+ 嗡
1179
+ 嗢
1180
+ 嗣
1181
+ 嗦
1182
+ 嗨
1183
+ 嗩
1184
+ 嗪
1185
+ 嗮
1186
+ 嗯
1187
+ 嗲
1188
+ 嗶
1189
+ 嗹
1190
+ 嗽
1191
+ 嘀
1192
+ 嘅
1193
+ 嘆
1194
+ 嘉
1195
+ 嘌
1196
+ 嘍
1197
+ 嘎
1198
+ 嘏
1199
+ 嘔
1200
+ 嘗
1201
+ 嘚
1202
+ 嘛
1203
+ 嘜
1204
+ 嘞
1205
+ 嘟
1206
+ 嘢
1207
+ 嘣
1208
+ 嘥
1209
+ 嘧
1210
+ 嘩
1211
+ 嘬
1212
+ 嘮
1213
+ 嘯
1214
+ 嘰
1215
+ 嘲
1216
+ 嘴
1217
+ 嘶
1218
+ 嘸
1219
+ 嘹
1220
+ 嘻
1221
+ 嘿
1222
+ 噁
1223
+ 噌
1224
+ 噍
1225
+ 噏
1226
+ 噓
1227
+ 噗
1228
+ 噝
1229
+ 噠
1230
+ 噢
1231
+ 噤
1232
+ 噥
1233
+ 噦
1234
+ 器
1235
+ 噩
1236
+ 噪
1237
+ 噬
1238
+ 噯
1239
+ 噰
1240
+ 噲
1241
+ 噴
1242
+ 噶
1243
+ 噸
1244
+ 噹
1245
+ 噻
1246
+ 嚇
1247
+ 嚈
1248
+ 嚎
1249
+ 嚏
1250
+ 嚐
1251
+ 嚒
1252
+ 嚓
1253
+ 嚕
1254
+ 嚗
1255
+ 嚙
1256
+ 嚞
1257
+ 嚟
1258
+ 嚤
1259
+ 嚦
1260
+ 嚧
1261
+ 嚨
1262
+ 嚩
1263
+ 嚮
1264
+ 嚳
1265
+ 嚴
1266
+ 嚶
1267
+ 嚷
1268
+ 嚼
1269
+ 嚿
1270
+ 囀
1271
+ 囂
1272
+ 囃
1273
+ 囉
1274
+ 囊
1275
+ 囍
1276
+ 囑
1277
+ 囒
1278
+ 囓
1279
+ 囗
1280
+ 囚
1281
+ 四
1282
+ 囝
1283
+ 回
1284
+ 因
1285
+ 囡
1286
+ 団
1287
+ 囤
1288
+ 囧
1289
+ 囪
1290
+ 囮
1291
+ 囯
1292
+ 困
1293
+ 囲
1294
+ 図
1295
+ 囶
1296
+ 囷
1297
+ 囹
1298
+ 固
1299
+ 囿
1300
+ 圂
1301
+ 圃
1302
+ 圄
1303
+ 圈
1304
+ 圉
1305
+ 國
1306
+ 圍
1307
+ 圏
1308
+ 園
1309
+ 圓
1310
+ 圖
1311
+ 圗
1312
+ 團
1313
+ 圜
1314
+ 土
1315
+ 圧
1316
+ 在
1317
+ 圩
1318
+ 圪
1319
+ 圭
1320
+ 圯
1321
+ 地
1322
+ 圳
1323
+ 圻
1324
+ 圾
1325
+ 址
1326
+ 均
1327
+ 坊
1328
+ 坋
1329
+ 坌
1330
+ 坍
1331
+ 坎
1332
+ 坐
1333
+ 坑
1334
+ 坖
1335
+ 坡
1336
+ 坣
1337
+ 坤
1338
+ 坦
1339
+ 坨
1340
+ 坩
1341
+ 坪
1342
+ 坫
1343
+ 坬
1344
+ 坭
1345
+ 坮
1346
+ 坯
1347
+ 坳
1348
+ 坵
1349
+ 坶
1350
+ 坷
1351
+ 坻
1352
+ 垂
1353
+ 垃
1354
+ 垈
1355
+ 型
1356
+ 垍
1357
+ 垓
1358
+ 垕
1359
+ 垚
1360
+ 垛
1361
+ 垞
1362
+ 垟
1363
+ 垠
1364
+ 垢
1365
+ 垣
1366
+ 垮
1367
+ 垯
1368
+ 垰
1369
+ 垵
1370
+ 垸
1371
+ 垻
1372
+ 垿
1373
+ 埃
1374
+ 埅
1375
+ 埇
1376
+ 埈
1377
+ 埋
1378
+ 埌
1379
+ 城
1380
+ 埏
1381
+ 埒
1382
+ 埔
1383
+ 埕
1384
+ 埗
1385
+ 埜
1386
+ 域
1387
+ 埠
1388
+ 埡
1389
+ 埤
1390
+ 埧
1391
+ 埨
1392
+ 埪
1393
+ 埭
1394
+ 埮
1395
+ 埴
1396
+ 埵
1397
+ 執
1398
+ 培
1399
+ 基
1400
+ 埻
1401
+ 埼
1402
+ 堀
1403
+ 堂
1404
+ 堃
1405
+ 堅
1406
+ 堆
1407
+ 堇
1408
+ 堈
1409
+ 堉
1410
+ 堊
1411
+ 堍
1412
+ 堖
1413
+ 堝
1414
+ 堡
1415
+ 堤
1416
+ 堦
1417
+ 堪
1418
+ 堮
1419
+ 堯
1420
+ 堰
1421
+ 報
1422
+ 場
1423
+ 堵
1424
+ 堷
1425
+ 堺
1426
+ 塀
1427
+ 塅
1428
+ 塆
1429
+ 塊
1430
+ 塋
1431
+ 塌
1432
+ 塍
1433
+ 塏
1434
+ 塑
1435
+ 塔
1436
+ 塗
1437
+ 塘
1438
+ 塙
1439
+ 塜
1440
+ 塞
1441
+ 塡
1442
+ 塢
1443
+ 塤
1444
+ 塨
1445
+ 塩
1446
+ 填
1447
+ 塬
1448
+ 塭
1449
+ 塰
1450
+ 塱
1451
+ 塲
1452
+ 塵
1453
+ 塹
1454
+ 塽
1455
+ 塾
1456
+ 墀
1457
+ 境
1458
+ 墅
1459
+ 墉
1460
+ 墊
1461
+ 墎
1462
+ 墓
1463
+ 増
1464
+ 墘
1465
+ 墜
1466
+ 增
1467
+ 墟
1468
+ 墡
1469
+ 墣
1470
+ 墨
1471
+ 墩
1472
+ 墫
1473
+ 墬
1474
+ 墮
1475
+ 墱
1476
+ 墳
1477
+ 墺
1478
+ 墼
1479
+ 墾
1480
+ 壁
1481
+ 壄
1482
+ 壆
1483
+ 壇
1484
+ 壋
1485
+ 壌
1486
+ 壎
1487
+ 壐
1488
+ 壑
1489
+ 壓
1490
+ 壔
1491
+ 壕
1492
+ 壘
1493
+ 壙
1494
+ 壞
1495
+ 壟
1496
+ 壠
1497
+ 壢
1498
+ 壤
1499
+ 壩
1500
+ 士
1501
+ 壬
1502
+ 壯
1503
+ 壱
1504
+ 壴
1505
+ 壹
1506
+ 壺
1507
+ 壽
1508
+ 夀
1509
+ 夆
1510
+ 変
1511
+ 夊
1512
+ 夋
1513
+ 夌
1514
+ 夏
1515
+ 夔
1516
+ 夕
1517
+ 外
1518
+ 夙
1519
+ 多
1520
+ 夜
1521
+ 夠
1522
+ 夢
1523
+ 夤
1524
+ 夥
1525
+ 大
1526
+ 天
1527
+ 太
1528
+ 夫
1529
+ 夬
1530
+ 夭
1531
+ 央
1532
+ 夯
1533
+ 失
1534
+ 夷
1535
+ 夾
1536
+ 奀
1537
+ 奄
1538
+ 奇
1539
+ 奈
1540
+ 奉
1541
+ 奎
1542
+ 奏
1543
+ 奐
1544
+ 契
1545
+ 奓
1546
+ 奔
1547
+ 奕
1548
+ 套
1549
+ 奘
1550
+ 奚
1551
+ 奠
1552
+ 奢
1553
+ 奣
1554
+ 奧
1555
+ 奩
1556
+ 奪
1557
+ 奫
1558
+ 奭
1559
+ 奮
1560
+ 女
1561
+ 奴
1562
+ 奶
1563
+ 她
1564
+ 好
1565
+ 妀
1566
+ 妁
1567
+ 如
1568
+ 妃
1569
+ 妄
1570
+ 妊
1571
+ 妍
1572
+ 妏
1573
+ 妑
1574
+ 妒
1575
+ 妓
1576
+ 妖
1577
+ 妙
1578
+ 妝
1579
+ 妞
1580
+ 妠
1581
+ 妤
1582
+ 妥
1583
+ 妧
1584
+ 妨
1585
+ 妭
1586
+ 妮
1587
+ 妯
1588
+ 妲
1589
+ 妳
1590
+ 妸
1591
+ 妹
1592
+ 妺
1593
+ 妻
1594
+ 妾
1595
+ 姀
1596
+ 姁
1597
+ 姃
1598
+ 姆
1599
+ 姈
1600
+ 姉
1601
+ 姊
1602
+ 始
1603
+ 姌
1604
+ 姍
1605
+ 姐
1606
+ 姑
1607
+ 姒
1608
+ 姓
1609
+ 委
1610
+ 姚
1611
+ 姜
1612
+ 姝
1613
+ 姣
1614
+ 姥
1615
+ 姦
1616
+ 姨
1617
+ 姪
1618
+ 姫
1619
+ 姬
1620
+ 姮
1621
+ 姵
1622
+ 姶
1623
+ 姸
1624
+ 姻
1625
+ 姿
1626
+ 威
1627
+ 娃
1628
+ 娉
1629
+ 娋
1630
+ 娌
1631
+ 娍
1632
+ 娎
1633
+ 娑
1634
+ 娖
1635
+ 娘
1636
+ 娛
1637
+ 娜
1638
+ 娟
1639
+ 娠
1640
+ 娣
1641
+ 娥
1642
+ 娩
1643
+ 娫
1644
+ 娳
1645
+ 娶
1646
+ 娸
1647
+ 娼
1648
+ 娽
1649
+ 婀
1650
+ 婁
1651
+ 婆
1652
+ 婉
1653
+ 婊
1654
+ 婑
1655
+ 婕
1656
+ 婚
1657
+ 婢
1658
+ 婦
1659
+ 婧
1660
+ 婪
1661
+ 婭
1662
+ 婯
1663
+ 婷
1664
+ 婺
1665
+ 婻
1666
+ 婼
1667
+ 婿
1668
+ 媃
1669
+ 媄
1670
+ 媊
1671
+ 媐
1672
+ 媒
1673
+ 媓
1674
+ 媖
1675
+ 媗
1676
+ 媚
1677
+ 媛
1678
+ 媜
1679
+ 媞
1680
+ 媧
1681
+ 媭
1682
+ 媯
1683
+ 媲
1684
+ 媳
1685
+ 媺
1686
+ 媼
1687
+ 媽
1688
+ 媾
1689
+ 媿
1690
+ 嫁
1691
+ 嫂
1692
+ 嫄
1693
+ 嫈
1694
+ 嫉
1695
+ 嫌
1696
+ 嫖
1697
+ 嫘
1698
+ 嫚
1699
+ 嫡
1700
+ 嫣
1701
+ 嫦
1702
+ 嫩
1703
+ 嫪
1704
+ 嫲
1705
+ 嫳
1706
+ 嫵
1707
+ 嫺
1708
+ 嫻
1709
+ 嬅
1710
+ 嬈
1711
+ 嬉
1712
+ 嬋
1713
+ 嬌
1714
+ 嬗
1715
+ 嬛
1716
+ 嬝
1717
+ 嬡
1718
+ 嬤
1719
+ 嬨
1720
+ 嬪
1721
+ 嬬
1722
+ 嬭
1723
+ 嬰
1724
+ 嬴
1725
+ 嬸
1726
+ 嬾
1727
+ 嬿
1728
+ 孀
1729
+ 孃
1730
+ 孆
1731
+ 孋
1732
+ 孌
1733
+ 子
1734
+ 孑
1735
+ 孔
1736
+ 孕
1737
+ 孖
1738
+ 字
1739
+ 存
1740
+ 孚
1741
+ 孛
1742
+ 孜
1743
+ 孝
1744
+ 孟
1745
+ 孢
1746
+ 季
1747
+ 孤
1748
+ 孩
1749
+ 孫
1750
+ 孬
1751
+ 孮
1752
+ 孰
1753
+ 孳
1754
+ 孵
1755
+ 學
1756
+ 孺
1757
+ 孻
1758
+ 孽
1759
+ 孿
1760
+ 宀
1761
+ 它
1762
+ 宅
1763
+ 宇
1764
+ 守
1765
+ 安
1766
+ 宋
1767
+ 完
1768
+ 宍
1769
+ 宏
1770
+ 宓
1771
+ 宕
1772
+ 宗
1773
+ 官
1774
+ 宙
1775
+ 定
1776
+ 宛
1777
+ 宜
1778
+ 実
1779
+ 客
1780
+ 宣
1781
+ 室
1782
+ 宥
1783
+ 宦
1784
+ 宧
1785
+ 宮
1786
+ 宰
1787
+ 害
1788
+ 宴
1789
+ 宵
1790
+ 家
1791
+ 宸
1792
+ 容
1793
+ 宿
1794
+ 寀
1795
+ 寁
1796
+ 寂
1797
+ 寄
1798
+ 寅
1799
+ 密
1800
+ 寇
1801
+ 寈
1802
+ 寊
1803
+ 富
1804
+ 寐
1805
+ 寒
1806
+ 寓
1807
+ 寔
1808
+ 寕
1809
+ 寖
1810
+ 寗
1811
+ 寘
1812
+ 寛
1813
+ 寜
1814
+ 寞
1815
+ 察
1816
+ 寡
1817
+ 寢
1818
+ 寤
1819
+ 寥
1820
+ 實
1821
+ 寧
1822
+ 寨
1823
+ 審
1824
+ 寫
1825
+ 寬
1826
+ 寮
1827
+ 寯
1828
+ 寰
1829
+ 寳
1830
+ 寵
1831
+ 寶
1832
+ 寸
1833
+ 寺
1834
+ 対
1835
+ 封
1836
+ 専
1837
+ 尃
1838
+ 射
1839
+ 將
1840
+ 專
1841
+ 尉
1842
+ 尊
1843
+ 尋
1844
+ 對
1845
+ 導
1846
+ 小
1847
+ 尐
1848
+ 少
1849
+ 尓
1850
+ 尕
1851
+ 尖
1852
+ 尗
1853
+ 尙
1854
+ 尚
1855
+ 尢
1856
+ 尤
1857
+ 尨
1858
+ 尪
1859
+ 尬
1860
+ 就
1861
+ 尷
1862
+ 尹
1863
+ 尺
1864
+ 尻
1865
+ 尼
1866
+ 尾
1867
+ 尿
1868
+ 局
1869
+ 屁
1870
+ 屄
1871
+ 居
1872
+ 屆
1873
+ 屇
1874
+ 屈
1875
+ 屋
1876
+ 屌
1877
+ 屍
1878
+ 屎
1879
+ 屏
1880
+ 屐
1881
+ 屑
1882
+ 屓
1883
+ 展
1884
+ 屚
1885
+ 屜
1886
+ 屠
1887
+ 屢
1888
+ 層
1889
+ 履
1890
+ 屬
1891
+ 屭
1892
+ 屯
1893
+ 山
1894
+ 屹
1895
+ 屺
1896
+ 屻
1897
+ 岀
1898
+ 岈
1899
+ 岌
1900
+ 岐
1901
+ 岑
1902
+ 岔
1903
+ 岡
1904
+ 岢
1905
+ 岣
1906
+ 岧
1907
+ 岩
1908
+ 岪
1909
+ 岫
1910
+ 岬
1911
+ 岰
1912
+ 岱
1913
+ 岳
1914
+ 岵
1915
+ 岷
1916
+ 岸
1917
+ 岻
1918
+ 峁
1919
+ 峅
1920
+ 峇
1921
+ 峋
1922
+ 峍
1923
+ 峒
1924
+ 峘
1925
+ 峙
1926
+ 峚
1927
+ 峠
1928
+ 峨
1929
+ 峩
1930
+ 峪
1931
+ 峭
1932
+ 峯
1933
+ 峰
1934
+ 峴
1935
+ 島
1936
+ 峻
1937
+ 峼
1938
+ 峽
1939
+ 崁
1940
+ 崆
1941
+ 崇
1942
+ 崈
1943
+ 崋
1944
+ 崍
1945
+ 崎
1946
+ 崐
1947
+ 崑
1948
+ 崒
1949
+ 崔
1950
+ 崖
1951
+ 崗
1952
+ 崘
1953
+ 崙
1954
+ 崚
1955
+ 崛
1956
+ 崞
1957
+ 崟
1958
+ 崠
1959
+ 崢
1960
+ 崤
1961
+ 崧
1962
+ 崩
1963
+ 崬
1964
+ 崮
1965
+ 崱
1966
+ 崴
1967
+ 崵
1968
+ 崶
1969
+ 崽
1970
+ 嵇
1971
+ 嵊
1972
+ 嵋
1973
+ 嵌
1974
+ 嵎
1975
+ 嵐
1976
+ 嵒
1977
+ 嵕
1978
+ 嵖
1979
+ 嵗
1980
+ 嵙
1981
+ 嵛
1982
+ 嵜
1983
+ 嵨
1984
+ 嵩
1985
+ 嵬
1986
+ 嵮
1987
+ 嵯
1988
+ 嵰
1989
+ 嵴
1990
+ 嵻
1991
+ 嵿
1992
+ 嶁
1993
+ 嶂
1994
+ 嶃
1995
+ 嶄
1996
+ 嶇
1997
+ 嶋
1998
+ 嶌
1999
+ 嶍
2000
+ 嶒
2001
+ 嶔
2002
+ 嶗
2003
+ 嶝
2004
+ 嶠
2005
+ 嶢
2006
+ 嶦
2007
+ 嶧
2008
+ 嶪
2009
+ 嶬
2010
+ 嶰
2011
+ 嶲
2012
+ 嶴
2013
+ 嶷
2014
+ 嶸
2015
+ 嶺
2016
+ 嶼
2017
+ 嶽
2018
+ 巂
2019
+ 巄
2020
+ 巆
2021
+ 巋
2022
+ 巌
2023
+ 巍
2024
+ 巎
2025
+ 巑
2026
+ 巒
2027
+ 巔
2028
+ 巖
2029
+ 巘
2030
+ 巛
2031
+ 川
2032
+ 州
2033
+ 巡
2034
+ 巢
2035
+ 工
2036
+ 左
2037
+ 巧
2038
+ 巨
2039
+ 巫
2040
+ 差
2041
+ 巰
2042
+ 己
2043
+ 已
2044
+ 巳
2045
+ 巴
2046
+ 巶
2047
+ 巷
2048
+ 巻
2049
+ 巽
2050
+ 巾
2051
+ 巿
2052
+ 市
2053
+ 布
2054
+ 帆
2055
+ 希
2056
+ 帑
2057
+ 帔
2058
+ 帕
2059
+ 帖
2060
+ 帘
2061
+ 帙
2062
+ 帚
2063
+ 帛
2064
+ 帝
2065
+ 帡
2066
+ 帢
2067
+ 帥
2068
+ 師
2069
+ 席
2070
+ 帯
2071
+ 帰
2072
+ 帳
2073
+ 帶
2074
+ 帷
2075
+ 常
2076
+ 帽
2077
+ 幀
2078
+ 幃
2079
+ 幄
2080
+ 幅
2081
+ 幌
2082
+ 幔
2083
+ 幕
2084
+ 幗
2085
+ 幚
2086
+ 幛
2087
+ 幟
2088
+ 幡
2089
+ 幢
2090
+ 幣
2091
+ 幪
2092
+ 幫
2093
+ 干
2094
+ 平
2095
+ 年
2096
+ 幵
2097
+ 幷
2098
+ 幸
2099
+ 幹
2100
+ 幺
2101
+ 幻
2102
+ 幼
2103
+ 幽
2104
+ 幾
2105
+ 庀
2106
+ 庁
2107
+ 広
2108
+ 庇
2109
+ 床
2110
+ 序
2111
+ 底
2112
+ 庖
2113
+ 店
2114
+ 庚
2115
+ 府
2116
+ 庠
2117
+ 庢
2118
+ 庥
2119
+ 度
2120
+ 座
2121
+ 庫
2122
+ 庭
2123
+ 庲
2124
+ 庵
2125
+ 庶
2126
+ 康
2127
+ 庸
2128
+ 庹
2129
+ 庼
2130
+ 庾
2131
+ 廁
2132
+ 廂
2133
+ 廄
2134
+ 廆
2135
+ 廈
2136
+ 廉
2137
+ 廊
2138
+ 廋
2139
+ 廌
2140
+ 廍
2141
+ 廑
2142
+ 廓
2143
+ 廔
2144
+ 廕
2145
+ 廖
2146
+ 廙
2147
+ 廚
2148
+ 廝
2149
+ 廞
2150
+ 廟
2151
+ 廠
2152
+ 廡
2153
+ 廢
2154
+ 廣
2155
+ 廧
2156
+ 廨
2157
+ 廩
2158
+ 廬
2159
+ 廰
2160
+ 廱
2161
+ 廳
2162
+ 延
2163
+ 廷
2164
+ 廸
2165
+ 建
2166
+ 廻
2167
+ 廼
2168
+ 廿
2169
+ 弁
2170
+ 弄
2171
+ 弅
2172
+ 弇
2173
+ 弈
2174
+ 弉
2175
+ 弊
2176
+ 弋
2177
+ 弍
2178
+ 式
2179
+ 弐
2180
+ 弒
2181
+ 弓
2182
+ 弔
2183
+ 引
2184
+ 弖
2185
+ 弗
2186
+ 弘
2187
+ 弛
2188
+ 弟
2189
+ 弢
2190
+ 弦
2191
+ 弧
2192
+ 弨
2193
+ 弩
2194
+ 弭
2195
+ 弱
2196
+ 張
2197
+ 強
2198
+ 弸
2199
+ 弼
2200
+ 弾
2201
+ 彀
2202
+ 彄
2203
+ 彅
2204
+ 彆
2205
+ 彈
2206
+ 彊
2207
+ 彌
2208
+ 彎
2209
+ 彐
2210
+ 彔
2211
+ 彖
2212
+ 彗
2213
+ 彘
2214
+ 彙
2215
+ 彜
2216
+ 彞
2217
+ 彠
2218
+ 彡
2219
+ 形
2220
+ 彣
2221
+ 彤
2222
+ 彥
2223
+ 彧
2224
+ 彩
2225
+ 彪
2226
+ 彫
2227
+ 彬
2228
+ 彭
2229
+ 彰
2230
+ 影
2231
+ 彳
2232
+ 彷
2233
+ 役
2234
+ 彼
2235
+ 彿
2236
+ 往
2237
+ 征
2238
+ 徂
2239
+ 待
2240
+ 徇
2241
+ 很
2242
+ 徉
2243
+ 徊
2244
+ 律
2245
+ 後
2246
+ 徐
2247
+ 徑
2248
+ 徒
2249
+ 得
2250
+ 徘
2251
+ 徙
2252
+ 徜
2253
+ 從
2254
+ 徠
2255
+ 御
2256
+ 徧
2257
+ 徨
2258
+ 復
2259
+ 循
2260
+ 徫
2261
+ 徬
2262
+ 徭
2263
+ 微
2264
+ 徳
2265
+ 徴
2266
+ 徵
2267
+ 德
2268
+ 徸
2269
+ 徹
2270
+ 徽
2271
+ 心
2272
+ 忄
2273
+ 必
2274
+ 忉
2275
+ 忌
2276
+ 忍
2277
+ 忐
2278
+ 忑
2279
+ 忒
2280
+ 志
2281
+ 忘
2282
+ 忙
2283
+ 応
2284
+ 忝
2285
+ 忞
2286
+ 忠
2287
+ 快
2288
+ 忬
2289
+ 忯
2290
+ 忱
2291
+ 忳
2292
+ 念
2293
+ 忻
2294
+ 忽
2295
+ 忿
2296
+ 怍
2297
+ 怎
2298
+ 怒
2299
+ 怕
2300
+ 怖
2301
+ 怙
2302
+ 怛
2303
+ 思
2304
+ 怠
2305
+ 怡
2306
+ 急
2307
+ 怦
2308
+ 性
2309
+ 怨
2310
+ 怪
2311
+ 怯
2312
+ 怵
2313
+ 恁
2314
+ 恂
2315
+ 恃
2316
+ 恆
2317
+ 恊
2318
+ 恍
2319
+ 恐
2320
+ 恕
2321
+ 恙
2322
+ 恢
2323
+ 恣
2324
+ 恤
2325
+ 恥
2326
+ 恨
2327
+ 恩
2328
+ 恪
2329
+ 恬
2330
+ 恭
2331
+ 息
2332
+ 恰
2333
+ 恵
2334
+ 恿
2335
+ 悄
2336
+ 悅
2337
+ 悆
2338
+ 悉
2339
+ 悌
2340
+ 悍
2341
+ 悔
2342
+ 悖
2343
+ 悚
2344
+ 悛
2345
+ 悝
2346
+ 悞
2347
+ 悟
2348
+ 悠
2349
+ 患
2350
+ 悧
2351
+ 您
2352
+ 悪
2353
+ 悰
2354
+ 悲
2355
+ 悳
2356
+ 悵
2357
+ 悶
2358
+ 悸
2359
+ 悼
2360
+ 情
2361
+ 惆
2362
+ 惇
2363
+ 惑
2364
+ 惔
2365
+ 惕
2366
+ 惘
2367
+ 惚
2368
+ 惜
2369
+ 惟
2370
+ 惠
2371
+ 惡
2372
+ 惣
2373
+ 惦
2374
+ 惰
2375
+ 惱
2376
+ 惲
2377
+ 想
2378
+ 惶
2379
+ 惹
2380
+ 惺
2381
+ 愁
2382
+ 愃
2383
+ 愆
2384
+ 愈
2385
+ 愉
2386
+ 愍
2387
+ 意
2388
+ 愐
2389
+ 愒
2390
+ 愔
2391
+ 愕
2392
+ 愚
2393
+ 愛
2394
+ 愜
2395
+ 感
2396
+ 愣
2397
+ 愧
2398
+ 愨
2399
+ 愫
2400
+ 愭
2401
+ 愴
2402
+ 愷
2403
+ 愼
2404
+ 愾
2405
+ 愿
2406
+ 慄
2407
+ 慈
2408
+ 態
2409
+ 慌
2410
+ 慎
2411
+ 慕
2412
+ 慘
2413
+ 慚
2414
+ 慜
2415
+ 慟
2416
+ 慢
2417
+ 慣
2418
+ 慥
2419
+ 慧
2420
+ 慨
2421
+ 慮
2422
+ 慰
2423
+ 慳
2424
+ 慵
2425
+ 慶
2426
+ 慷
2427
+ 慾
2428
+ 憂
2429
+ 憊
2430
+ 憋
2431
+ 憍
2432
+ 憎
2433
+ 憐
2434
+ 憑
2435
+ 憓
2436
+ 憕
2437
+ 憙
2438
+ 憚
2439
+ 憤
2440
+ 憧
2441
+ 憨
2442
+ 憩
2443
+ 憫
2444
+ 憬
2445
+ 憲
2446
+ 憶
2447
+ 憺
2448
+ 憻
2449
+ 憾
2450
+ 懂
2451
+ 懃
2452
+ 懇
2453
+ 懈
2454
+ 應
2455
+ 懋
2456
+ 懌
2457
+ 懍
2458
+ 懐
2459
+ 懣
2460
+ 懦
2461
+ 懮
2462
+ 懲
2463
+ 懵
2464
+ 懶
2465
+ 懷
2466
+ 懸
2467
+ 懺
2468
+ 懼
2469
+ 懽
2470
+ 懾
2471
+ 懿
2472
+ 戀
2473
+ 戇
2474
+ 戈
2475
+ 戊
2476
+ 戌
2477
+ 戍
2478
+ 戎
2479
+ 成
2480
+ 我
2481
+ 戒
2482
+ 戔
2483
+ 戕
2484
+ 或
2485
+ 戙
2486
+ 戚
2487
+ 戛
2488
+ 戟
2489
+ 戡
2490
+ 戢
2491
+ 戥
2492
+ 戦
2493
+ 戩
2494
+ 截
2495
+ 戮
2496
+ 戰
2497
+ 戱
2498
+ 戲
2499
+ 戳
2500
+ 戴
2501
+ 戶
2502
+ 戸
2503
+ 戻
2504
+ 戽
2505
+ 戾
2506
+ 房
2507
+ 所
2508
+ 扁
2509
+ 扆
2510
+ 扇
2511
+ 扈
2512
+ 扉
2513
+ 手
2514
+ 扌
2515
+ 才
2516
+ 扎
2517
+ 扒
2518
+ 打
2519
+ 扔
2520
+ 托
2521
+ 扙
2522
+ 扛
2523
+ 扞
2524
+ 扣
2525
+ 扥
2526
+ 扦
2527
+ 扭
2528
+ 扮
2529
+ 扯
2530
+ 扳
2531
+ 扶
2532
+ 批
2533
+ 扼
2534
+ 找
2535
+ 承
2536
+ 技
2537
+ 抃
2538
+ 抄
2539
+ 抇
2540
+ 抉
2541
+ 把
2542
+ 抑
2543
+ 抒
2544
+ 抓
2545
+ 投
2546
+ 抖
2547
+ 抗
2548
+ 折
2549
+ 抦
2550
+ 披
2551
+ 抬
2552
+ 抱
2553
+ 抵
2554
+ 抹
2555
+ 抻
2556
+ 押
2557
+ 抽
2558
+ 抿
2559
+ 拂
2560
+ 拆
2561
+ 拇
2562
+ 拈
2563
+ 拉
2564
+ 拋
2565
+ 拌
2566
+ 拍
2567
+ 拎
2568
+ 拏
2569
+ 拐
2570
+ 拒
2571
+ 拓
2572
+ 拔
2573
+ 拖
2574
+ 拗
2575
+ 拘
2576
+ 拙
2577
+ 拚
2578
+ 招
2579
+ 拜
2580
+ 拝
2581
+ 拡
2582
+ 括
2583
+ 拭
2584
+ 拮
2585
+ 拯
2586
+ 拱
2587
+ 拳
2588
+ 拴
2589
+ 拷
2590
+ 拺
2591
+ 拼
2592
+ 拽
2593
+ 拾
2594
+ 拿
2595
+ 持
2596
+ 指
2597
+ 按
2598
+ 挎
2599
+ 挑
2600
+ 挖
2601
+ 挙
2602
+ 挨
2603
+ 挪
2604
+ 挫
2605
+ 振
2606
+ 挲
2607
+ 挵
2608
+ 挹
2609
+ 挺
2610
+ 挻
2611
+ 挾
2612
+ 捂
2613
+ 捆
2614
+ 捉
2615
+ 捌
2616
+ 捍
2617
+ 捎
2618
+ 捏
2619
+ 捐
2620
+ 捒
2621
+ 捕
2622
+ 捜
2623
+ 捦
2624
+ 捧
2625
+ 捨
2626
+ 捩
2627
+ 捫
2628
+ 捭
2629
+ 捱
2630
+ 捲
2631
+ 捶
2632
+ 捷
2633
+ 捺
2634
+ 捻
2635
+ 掀
2636
+ 掂
2637
+ 掃
2638
+ 掄
2639
+ 掇
2640
+ 授
2641
+ 掉
2642
+ 掌
2643
+ 掏
2644
+ 掐
2645
+ 排
2646
+ 掖
2647
+ 掘
2648
+ 掙
2649
+ 掛
2650
+ 掞
2651
+ 掟
2652
+ 掠
2653
+ 採
2654
+ 探
2655
+ 掣
2656
+ 接
2657
+ 控
2658
+ 推
2659
+ 掩
2660
+ 措
2661
+ 掬
2662
+ 掰
2663
+ 掾
2664
+ 揀
2665
+ 揄
2666
+ 揆
2667
+ 揉
2668
+ 揍
2669
+ 描
2670
+ 提
2671
+ 插
2672
+ 揔
2673
+ 揖
2674
+ 揚
2675
+ 換
2676
+ 握
2677
+ 揪
2678
+ 揭
2679
+ 揮
2680
+ 援
2681
+ 揸
2682
+ 揺
2683
+ 損
2684
+ 搏
2685
+ 搐
2686
+ 搓
2687
+ 搔
2688
+ 搖
2689
+ 搗
2690
+ 搜
2691
+ 搞
2692
+ 搠
2693
+ 搢
2694
+ 搪
2695
+ 搬
2696
+ 搭
2697
+ 搳
2698
+ 搴
2699
+ 搵
2700
+ 搶
2701
+ 搽
2702
+ 搾
2703
+ 摂
2704
+ 摒
2705
+ 摔
2706
+ 摘
2707
+ 摜
2708
+ 摞
2709
+ 摟
2710
+ 摠
2711
+ 摧
2712
+ 摩
2713
+ 摭
2714
+ 摯
2715
+ 摳
2716
+ 摴
2717
+ 摵
2718
+ 摶
2719
+ 摸
2720
+ 摹
2721
+ 摺
2722
+ 摻
2723
+ 摽
2724
+ 撃
2725
+ 撇
2726
+ 撈
2727
+ 撐
2728
+ 撒
2729
+ 撓
2730
+ 撕
2731
+ 撖
2732
+ 撙
2733
+ 撚
2734
+ 撞
2735
+ 撣
2736
+ 撤
2737
+ 撥
2738
+ 撩
2739
+ 撫
2740
+ 撬
2741
+ 播
2742
+ 撮
2743
+ 撰
2744
+ 撲
2745
+ 撳
2746
+ 撻
2747
+ 撼
2748
+ 撾
2749
+ 撿
2750
+ 擀
2751
+ 擁
2752
+ 擂
2753
+ 擅
2754
+ 擇
2755
+ 擊
2756
+ 擋
2757
+ 操
2758
+ 擎
2759
+ 擒
2760
+ 擔
2761
+ 擘
2762
+ 據
2763
+ 擠
2764
+ 擢
2765
+ 擥
2766
+ 擦
2767
+ 擬
2768
+ 擯
2769
+ 擰
2770
+ 擱
2771
+ 擲
2772
+ 擴
2773
+ 擷
2774
+ 擺
2775
+ 擼
2776
+ 擾
2777
+ 攀
2778
+ 攏
2779
+ 攔
2780
+ 攖
2781
+ 攘
2782
+ 攜
2783
+ 攝
2784
+ 攞
2785
+ 攢
2786
+ 攣
2787
+ 攤
2788
+ 攪
2789
+ 攫
2790
+ 攬
2791
+ 支
2792
+ 攴
2793
+ 攵
2794
+ 收
2795
+ 攷
2796
+ 攸
2797
+ 改
2798
+ 攻
2799
+ 攽
2800
+ 放
2801
+ 政
2802
+ 故
2803
+ 效
2804
+ 敍
2805
+ 敎
2806
+ 敏
2807
+ 救
2808
+ 敔
2809
+ 敕
2810
+ 敖
2811
+ 敗
2812
+ 敘
2813
+ 教
2814
+ 敝
2815
+ 敞
2816
+ 敟
2817
+ 敢
2818
+ 散
2819
+ 敦
2820
+ 敫
2821
+ 敬
2822
+ 敭
2823
+ 敲
2824
+ 整
2825
+ 敵
2826
+ 敷
2827
+ 數
2828
+ 敻
2829
+ 敾
2830
+ 斂
2831
+ 斃
2832
+ 文
2833
+ 斌
2834
+ 斎
2835
+ 斐
2836
+ 斑
2837
+ 斕
2838
+ 斖
2839
+ 斗
2840
+ 料
2841
+ 斛
2842
+ 斜
2843
+ 斝
2844
+ 斟
2845
+ 斡
2846
+ 斤
2847
+ 斥
2848
+ 斧
2849
+ 斬
2850
+ 斯
2851
+ 新
2852
+ 斷
2853
+ 方
2854
+ 於
2855
+ 施
2856
+ 斿
2857
+ 旁
2858
+ 旂
2859
+ 旃
2860
+ 旄
2861
+ 旅
2862
+ 旉
2863
+ 旋
2864
+ 旌
2865
+ 旎
2866
+ 族
2867
+ 旖
2868
+ 旗
2869
+ 旙
2870
+ 旛
2871
+ 旡
2872
+ 既
2873
+ 日
2874
+ 旦
2875
+ 旨
2876
+ 早
2877
+ 旬
2878
+ 旭
2879
+ 旱
2880
+ 旲
2881
+ 旳
2882
+ 旺
2883
+ 旻
2884
+ 旼
2885
+ 旽
2886
+ 旾
2887
+ 旿
2888
+ 昀
2889
+ 昂
2890
+ 昃
2891
+ 昆
2892
+ 昇
2893
+ 昉
2894
+ 昊
2895
+ 昌
2896
+ 昍
2897
+ 明
2898
+ 昏
2899
+ 昐
2900
+ 易
2901
+ 昔
2902
+ 昕
2903
+ 昚
2904
+ 昛
2905
+ 昜
2906
+ 昝
2907
+ 昞
2908
+ 星
2909
+ 映
2910
+ 昡
2911
+ 昣
2912
+ 昤
2913
+ 春
2914
+ 昧
2915
+ 昨
2916
+ 昪
2917
+ 昫
2918
+ 昭
2919
+ 是
2920
+ 昰
2921
+ 昱
2922
+ 昴
2923
+ 昵
2924
+ 昶
2925
+ 昺
2926
+ 晁
2927
+ 時
2928
+ 晃
2929
+ 晈
2930
+ 晉
2931
+ 晊
2932
+ 晏
2933
+ 晗
2934
+ 晙
2935
+ 晚
2936
+ 晛
2937
+ 晝
2938
+ 晞
2939
+ 晟
2940
+ 晤
2941
+ 晦
2942
+ 晧
2943
+ 晨
2944
+ 晩
2945
+ 晪
2946
+ 晫
2947
+ 晭
2948
+ 普
2949
+ 景
2950
+ 晰
2951
+ 晳
2952
+ 晴
2953
+ 晶
2954
+ 晷
2955
+ 晸
2956
+ 智
2957
+ 晾
2958
+ 暃
2959
+ 暄
2960
+ 暅
2961
+ 暇
2962
+ 暈
2963
+ 暉
2964
+ 暊
2965
+ 暌
2966
+ 暎
2967
+ 暏
2968
+ 暐
2969
+ 暑
2970
+ 暕
2971
+ 暖
2972
+ 暗
2973
+ 暘
2974
+ 暝
2975
+ 暟
2976
+ 暠
2977
+ 暢
2978
+ 暦
2979
+ 暨
2980
+ 暫
2981
+ 暮
2982
+ 暱
2983
+ 暲
2984
+ 暴
2985
+ 暸
2986
+ 暹
2987
+ 暻
2988
+ 暾
2989
+ 曄
2990
+ 曅
2991
+ 曆
2992
+ 曇
2993
+ 曉
2994
+ 曌
2995
+ 曔
2996
+ 曖
2997
+ 曙
2998
+ 曜
2999
+ 曝
3000
+ 曠
3001
+ 曦
3002
+ 曧
3003
+ 曨
3004
+ 曩
3005
+ 曬
3006
+ 曮
3007
+ 曰
3008
+ 曲
3009
+ 曳
3010
+ 更
3011
+ 曶
3012
+ 曷
3013
+ 書
3014
+ 曹
3015
+ 曺
3016
+ 曼
3017
+ 曽
3018
+ 曾
3019
+ 替
3020
+ 最
3021
+ 會
3022
+ 月
3023
+ 有
3024
+ 朊
3025
+ 朋
3026
+ 服
3027
+ 朏
3028
+ 朐
3029
+ 朓
3030
+ 朔
3031
+ 朕
3032
+ 朖
3033
+ 朗
3034
+ 望
3035
+ 朝
3036
+ 期
3037
+ 朦
3038
+ 朧
3039
+ 木
3040
+ 未
3041
+ 末
3042
+ 本
3043
+ 札
3044
+ 朱
3045
+ 朴
3046
+ 朵
3047
+ 朶
3048
+ 朽
3049
+ 朿
3050
+ 杁
3051
+ 杉
3052
+ 杋
3053
+ 杌
3054
+ 李
3055
+ 杏
3056
+ 材
3057
+ 村
3058
+ 杓
3059
+ 杖
3060
+ 杙
3061
+ 杜
3062
+ 杞
3063
+ 束
3064
+ 杠
3065
+ 杣
3066
+ 杤
3067
+ 杧
3068
+ 杬
3069
+ 杭
3070
+ 杯
3071
+ 東
3072
+ 杲
3073
+ 杳
3074
+ 杴
3075
+ 杵
3076
+ 杷
3077
+ 杻
3078
+ 杼
3079
+ 松
3080
+ 板
3081
+ 极
3082
+ 枇
3083
+ 枉
3084
+ 枋
3085
+ 枏
3086
+ 析
3087
+ 枕
3088
+ 枖
3089
+ 林
3090
+ 枚
3091
+ 枛
3092
+ 果
3093
+ 枝
3094
+ 枠
3095
+ 枡
3096
+ 枯
3097
+ 枰
3098
+ 枱
3099
+ 枲
3100
+ 枳
3101
+ 架
3102
+ 枷
3103
+ 枸
3104
+ 枹
3105
+ 枼
3106
+ 柁
3107
+ 柃
3108
+ 柄
3109
+ 柉
3110
+ 柊
3111
+ 柎
3112
+ 柏
3113
+ 某
3114
+ 柑
3115
+ 柒
3116
+ 染
3117
+ 柔
3118
+ 柘
3119
+ 柚
3120
+ 柜
3121
+ 柝
3122
+ 柞
3123
+ 柟
3124
+ 查
3125
+ 柩
3126
+ 柬
3127
+ 柯
3128
+ 柰
3129
+ 柱
3130
+ 柳
3131
+ 柴
3132
+ 柵
3133
+ 柶
3134
+ 柷
3135
+ 査
3136
+ 柾
3137
+ 柿
3138
+ 栃
3139
+ 栄
3140
+ 栐
3141
+ 栒
3142
+ 栓
3143
+ 栜
3144
+ 栝
3145
+ 栞
3146
+ 校
3147
+ 栢
3148
+ 栨
3149
+ 栩
3150
+ 株
3151
+ 栲
3152
+ 栴
3153
+ 核
3154
+ 根
3155
+ 栻
3156
+ 格
3157
+ 栽
3158
+ 桀
3159
+ 桁
3160
+ 桂
3161
+ 桃
3162
+ 桄
3163
+ 桅
3164
+ 框
3165
+ 案
3166
+ 桉
3167
+ 桌
3168
+ 桎
3169
+ 桐
3170
+ 桑
3171
+ 桓
3172
+ 桔
3173
+ 桕
3174
+ 桖
3175
+ 桙
3176
+ 桜
3177
+ 桝
3178
+ 桫
3179
+ 桱
3180
+ 桲
3181
+ 桴
3182
+ 桶
3183
+ 桷
3184
+ 桼
3185
+ 桿
3186
+ 梀
3187
+ 梁
3188
+ 梂
3189
+ 梃
3190
+ 梅
3191
+ 梆
3192
+ 梉
3193
+ 梏
3194
+ 梓
3195
+ 梔
3196
+ 梗
3197
+ 梘
3198
+ 條
3199
+ 梟
3200
+ 梠
3201
+ 梢
3202
+ 梣
3203
+ 梧
3204
+ 梨
3205
+ 梫
3206
+ 梭
3207
+ 梯
3208
+ 械
3209
+ 梱
3210
+ 梳
3211
+ 梵
3212
+ 梶
3213
+ 梽
3214
+ 棄
3215
+ 棆
3216
+ 棉
3217
+ 棋
3218
+ 棍
3219
+ 棐
3220
+ 棒
3221
+ 棓
3222
+ 棕
3223
+ 棖
3224
+ 棗
3225
+ 棘
3226
+ 棚
3227
+ 棛
3228
+ 棟
3229
+ 棠
3230
+ 棡
3231
+ 棣
3232
+ 棧
3233
+ 棨
3234
+ 棩
3235
+ 棪
3236
+ 棫
3237
+ 森
3238
+ 棱
3239
+ 棲
3240
+ 棵
3241
+ 棶
3242
+ 棹
3243
+ 棺
3244
+ 棻
3245
+ 棼
3246
+ 棽
3247
+ 椅
3248
+ 椆
3249
+ 椇
3250
+ 椋
3251
+ 植
3252
+ 椎
3253
+ 椏
3254
+ 椒
3255
+ 椙
3256
+ 椥
3257
+ 椪
3258
+ 椰
3259
+ 椲
3260
+ 椴
3261
+ 椵
3262
+ 椹
3263
+ 椽
3264
+ 椿
3265
+ 楂
3266
+ 楊
3267
+ 楓
3268
+ 楔
3269
+ 楗
3270
+ 楙
3271
+ 楚
3272
+ 楝
3273
+ 楞
3274
+ 楠
3275
+ 楡
3276
+ 楢
3277
+ 楣
3278
+ 楤
3279
+ 楦
3280
+ 楧
3281
+ 楨
3282
+ 楫
3283
+ 業
3284
+ 楮
3285
+ 楯
3286
+ 楳
3287
+ 極
3288
+ 楷
3289
+ 楸
3290
+ 楹
3291
+ 楽
3292
+ 楿
3293
+ 概
3294
+ 榆
3295
+ 榊
3296
+ 榍
3297
+ 榎
3298
+ 榑
3299
+ 榔
3300
+ 榕
3301
+ 榖
3302
+ 榗
3303
+ 榘
3304
+ 榛
3305
+ 榜
3306
+ 榞
3307
+ 榢
3308
+ 榣
3309
+ 榤
3310
+ 榦
3311
+ 榧
3312
+ 榨
3313
+ 榫
3314
+ 榭
3315
+ 榮
3316
+ 榲
3317
+ 榴
3318
+ 榷
3319
+ 榻
3320
+ 榿
3321
+ 槀
3322
+ 槁
3323
+ 槃
3324
+ 槊
3325
+ 構
3326
+ 槌
3327
+ 槍
3328
+ 槎
3329
+ 槐
3330
+ 槓
3331
+ 槔
3332
+ 槗
3333
+ 様
3334
+ 槙
3335
+ 槤
3336
+ 槩
3337
+ 槭
3338
+ 槰
3339
+ 槱
3340
+ 槲
3341
+ 槳
3342
+ 槺
3343
+ 槻
3344
+ 槼
3345
+ 槽
3346
+ 槿
3347
+ 樀
3348
+ 樁
3349
+ 樂
3350
+ 樅
3351
+ 樆
3352
+ 樊
3353
+ 樋
3354
+ 樑
3355
+ 樓
3356
+ 樗
3357
+ 樘
3358
+ 標
3359
+ 樞
3360
+ 樟
3361
+ 模
3362
+ 樣
3363
+ 樨
3364
+ 権
3365
+ 樫
3366
+ 樵
3367
+ 樸
3368
+ 樹
3369
+ 樺
3370
+ 樻
3371
+ 樽
3372
+ 樾
3373
+ 橄
3374
+ 橇
3375
+ 橈
3376
+ 橋
3377
+ 橐
3378
+ 橒
3379
+ 橓
3380
+ 橘
3381
+ 橙
3382
+ 橚
3383
+ 機
3384
+ 橡
3385
+ 橢
3386
+ 橪
3387
+ 橫
3388
+ 橿
3389
+ 檀
3390
+ 檄
3391
+ 檇
3392
+ 檉
3393
+ 檊
3394
+ 檎
3395
+ 檐
3396
+ 檔
3397
+ 檗
3398
+ 檜
3399
+ 檞
3400
+ 檠
3401
+ 檡
3402
+ 檢
3403
+ 檣
3404
+ 檦
3405
+ 檨
3406
+ 檫
3407
+ 檬
3408
+ 檯
3409
+ 檳
3410
+ 檵
3411
+ 檸
3412
+ 檻
3413
+ 檽
3414
+ 櫂
3415
+ 櫃
3416
+ 櫆
3417
+ 櫈
3418
+ 櫓
3419
+ 櫚
3420
+ 櫛
3421
+ 櫞
3422
+ 櫟
3423
+ 櫥
3424
+ 櫨
3425
+ 櫪
3426
+ 櫱
3427
+ 櫸
3428
+ 櫻
3429
+ 櫾
3430
+ 櫿
3431
+ 欄
3432
+ 欉
3433
+ 權
3434
+ 欏
3435
+ 欒
3436
+ 欖
3437
+ 欞
3438
+ 欠
3439
+ 次
3440
+ 欣
3441
+ 欥
3442
+ 欲
3443
+ 欸
3444
+ 欹
3445
+ 欺
3446
+ 欽
3447
+ 款
3448
+ 歆
3449
+ 歇
3450
+ 歉
3451
+ 歊
3452
+ 歌
3453
+ 歎
3454
+ 歐
3455
+ 歓
3456
+ 歙
3457
+ 歛
3458
+ 歡
3459
+ 止
3460
+ 正
3461
+ 此
3462
+ 步
3463
+ 武
3464
+ 歧
3465
+ 歩
3466
+ 歪
3467
+ 歲
3468
+ 歳
3469
+ 歴
3470
+ 歷
3471
+ 歸
3472
+ 歹
3473
+ 死
3474
+ 歿
3475
+ 殂
3476
+ 殃
3477
+ 殄
3478
+ 殆
3479
+ 殉
3480
+ 殊
3481
+ 殑
3482
+ 殖
3483
+ 殘
3484
+ 殛
3485
+ 殞
3486
+ 殟
3487
+ 殤
3488
+ 殭
3489
+ 殮
3490
+ 殯
3491
+ 殲
3492
+ 殳
3493
+ 段
3494
+ 殷
3495
+ 殺
3496
+ 殻
3497
+ 殼
3498
+ 殿
3499
+ 毀
3500
+ 毅
3501
+ 毆
3502
+ 毉
3503
+ 毋
3504
+ 毌
3505
+ 母
3506
+ 毎
3507
+ 每
3508
+ 毐
3509
+ 毒
3510
+ 毓
3511
+ 比
3512
+ 毖
3513
+ 毗
3514
+ 毘
3515
+ 毛
3516
+ 毫
3517
+ 毬
3518
+ 毯
3519
+ 毴
3520
+ 毸
3521
+ 毽
3522
+ 毿
3523
+ 氂
3524
+ 氈
3525
+ 氍
3526
+ 氏
3527
+ 氐
3528
+ 民
3529
+ 氓
3530
+ 氖
3531
+ 気
3532
+ 氘
3533
+ 氙
3534
+ 氚
3535
+ 氛
3536
+ 氟
3537
+ 氣
3538
+ 氦
3539
+ 氧
3540
+ 氨
3541
+ 氪
3542
+ 氫
3543
+ 氬
3544
+ 氮
3545
+ 氯
3546
+ 氰
3547
+ 水
3548
+ 氵
3549
+ 氷
3550
+ 永
3551
+ 氹
3552
+ 氻
3553
+ 氽
3554
+ 氾
3555
+ 汀
3556
+ 汁
3557
+ 求
3558
+ 汊
3559
+ 汎
3560
+ 汐
3561
+ 汕
3562
+ 汗
3563
+ 汛
3564
+ 汜
3565
+ 汝
3566
+ 汞
3567
+ 江
3568
+ 池
3569
+ 污
3570
+ 汧
3571
+ 汨
3572
+ 汩
3573
+ 汪
3574
+ 汭
3575
+ 汰
3576
+ 汲
3577
+ 汴
3578
+ 汶
3579
+ 決
3580
+ 汽
3581
+ 汾
3582
+ 沁
3583
+ 沂
3584
+ 沃
3585
+ 沄
3586
+ 沅
3587
+ 沆
3588
+ 沇
3589
+ 沈
3590
+ 沉
3591
+ 沌
3592
+ 沍
3593
+ 沏
3594
+ 沐
3595
+ 沒
3596
+ 沓
3597
+ 沔
3598
+ 沖
3599
+ 沘
3600
+ 沙
3601
+ 沚
3602
+ 沛
3603
+ 沜
3604
+ 沢
3605
+ 沨
3606
+ 沫
3607
+ 沭
3608
+ 沮
3609
+ 沯
3610
+ 沱
3611
+ 河
3612
+ 沸
3613
+ 油
3614
+ 沺
3615
+ 治
3616
+ 沼
3617
+ 沽
3618
+ 沾
3619
+ 沿
3620
+ 況
3621
+ 泂
3622
+ 泄
3623
+ 泆
3624
+ 泇
3625
+ 泉
3626
+ 泊
3627
+ 泌
3628
+ 泐
3629
+ 泓
3630
+ 泔
3631
+ 法
3632
+ 泖
3633
+ 泗
3634
+ 泚
3635
+ 泛
3636
+ 泠
3637
+ 泡
3638
+ 波
3639
+ 泣
3640
+ 泥
3641
+ 泩
3642
+ 泫
3643
+ 泮
3644
+ 泯
3645
+ 泰
3646
+ 泱
3647
+ 泳
3648
+ 泵
3649
+ 洄
3650
+ 洋
3651
+ 洌
3652
+ 洎
3653
+ 洗
3654
+ 洙
3655
+ 洛
3656
+ 洞
3657
+ 洢
3658
+ 洣
3659
+ 洤
3660
+ 津
3661
+ 洨
3662
+ 洩
3663
+ 洪
3664
+ 洮
3665
+ 洱
3666
+ 洲
3667
+ 洳
3668
+ 洵
3669
+ 洸
3670
+ 洹
3671
+ 洺
3672
+ 活
3673
+ 洽
3674
+ 派
3675
+ 流
3676
+ 浄
3677
+ 浙
3678
+ 浚
3679
+ 浛
3680
+ 浜
3681
+ 浞
3682
+ 浟
3683
+ 浠
3684
+ 浡
3685
+ 浣
3686
+ 浤
3687
+ 浥
3688
+ 浦
3689
+ 浩
3690
+ 浪
3691
+ 浮
3692
+ 浯
3693
+ 浴
3694
+ 浵
3695
+ 海
3696
+ 浸
3697
+ 浹
3698
+ 涅
3699
+ 涇
3700
+ 消
3701
+ 涉
3702
+ 涌
3703
+ 涎
3704
+ 涑
3705
+ 涓
3706
+ 涔
3707
+ 涕
3708
+ 涙
3709
+ 涪
3710
+ 涫
3711
+ 涮
3712
+ 涯
3713
+ 液
3714
+ 涵
3715
+ 涸
3716
+ 涼
3717
+ 涿
3718
+ 淄
3719
+ 淅
3720
+ 淆
3721
+ 淇
3722
+ 淋
3723
+ 淌
3724
+ 淍
3725
+ 淎
3726
+ 淏
3727
+ 淑
3728
+ 淓
3729
+ 淖
3730
+ 淘
3731
+ 淙
3732
+ 淚
3733
+ 淛
3734
+ 淝
3735
+ 淞
3736
+ 淠
3737
+ 淡
3738
+ 淤
3739
+ 淥
3740
+ 淦
3741
+ 淨
3742
+ 淩
3743
+ 淪
3744
+ 淫
3745
+ 淬
3746
+ 淮
3747
+ 淯
3748
+ 淰
3749
+ 深
3750
+ 淳
3751
+ 淵
3752
+ 淶
3753
+ 混
3754
+ 淸
3755
+ 淹
3756
+ 淺
3757
+ 添
3758
+ 淼
3759
+ 淽
3760
+ 渃
3761
+ 清
3762
+ 済
3763
+ 渉
3764
+ 渋
3765
+ 渕
3766
+ 渙
3767
+ 渚
3768
+ 減
3769
+ 渝
3770
+ 渟
3771
+ 渠
3772
+ 渡
3773
+ 渣
3774
+ 渤
3775
+ 渥
3776
+ 渦
3777
+ 渫
3778
+ 測
3779
+ 渭
3780
+ 港
3781
+ 渲
3782
+ 渴
3783
+ 游
3784
+ 渺
3785
+ 渼
3786
+ 渽
3787
+ 渾
3788
+ 湃
3789
+ 湄
3790
+ 湉
3791
+ 湊
3792
+ 湍
3793
+ 湓
3794
+ 湔
3795
+ 湖
3796
+ 湘
3797
+ 湛
3798
+ 湜
3799
+ 湞
3800
+ 湟
3801
+ 湣
3802
+ 湥
3803
+ 湧
3804
+ 湫
3805
+ 湮
3806
+ 湯
3807
+ 湳
3808
+ 湴
3809
+ 湼
3810
+ 満
3811
+ 溁
3812
+ 溇
3813
+ 溈
3814
+ 溉
3815
+ 溋
3816
+ 溎
3817
+ 溏
3818
+ 源
3819
+ 準
3820
+ 溙
3821
+ 溜
3822
+ 溝
3823
+ 溟
3824
+ 溢
3825
+ 溥
3826
+ 溦
3827
+ 溧
3828
+ 溪
3829
+ 溫
3830
+ 溯
3831
+ 溱
3832
+ 溲
3833
+ 溴
3834
+ 溵
3835
+ 溶
3836
+ 溺
3837
+ 溼
3838
+ 滀
3839
+ 滁
3840
+ 滂
3841
+ 滄
3842
+ 滅
3843
+ 滇
3844
+ 滈
3845
+ 滉
3846
+ 滋
3847
+ 滌
3848
+ 滎
3849
+ 滏
3850
+ 滑
3851
+ 滓
3852
+ 滔
3853
+ 滕
3854
+ 滘
3855
+ 滙
3856
+ 滝
3857
+ 滬
3858
+ 滯
3859
+ 滲
3860
+ 滴
3861
+ 滷
3862
+ 滸
3863
+ 滹
3864
+ 滻
3865
+ 滽
3866
+ 滾
3867
+ 滿
3868
+ 漁
3869
+ 漂
3870
+ 漆
3871
+ 漇
3872
+ 漈
3873
+ 漎
3874
+ 漏
3875
+ 漓
3876
+ 演
3877
+ 漕
3878
+ 漚
3879
+ 漠
3880
+ 漢
3881
+ 漣
3882
+ 漩
3883
+ 漪
3884
+ 漫
3885
+ 漬
3886
+ 漯
3887
+ 漱
3888
+ 漲
3889
+ 漳
3890
+ 漴
3891
+ 漵
3892
+ 漷
3893
+ 漸
3894
+ 漼
3895
+ 漾
3896
+ 漿
3897
+ 潁
3898
+ 潑
3899
+ 潔
3900
+ 潘
3901
+ 潛
3902
+ 潞
3903
+ 潟
3904
+ 潢
3905
+ 潤
3906
+ 潭
3907
+ 潮
3908
+ 潯
3909
+ 潰
3910
+ 潲
3911
+ 潺
3912
+ 潼
3913
+ 潽
3914
+ 潾
3915
+ 潿
3916
+ 澀
3917
+ 澁
3918
+ 澂
3919
+ 澄
3920
+ 澆
3921
+ 澇
3922
+ 澈
3923
+ 澉
3924
+ 澋
3925
+ 澌
3926
+ 澍
3927
+ 澎
3928
+ 澔
3929
+ 澗
3930
+ 澠
3931
+ 澡
3932
+ 澣
3933
+ 澤
3934
+ 澥
3935
+ 澧
3936
+ 澪
3937
+ 澮
3938
+ 澯
3939
+ 澱
3940
+ 澳
3941
+ 澶
3942
+ 澹
3943
+ 澻
3944
+ 激
3945
+ 濁
3946
+ 濂
3947
+ 濃
3948
+ 濉
3949
+ 濊
3950
+ 濋
3951
+ 濕
3952
+ 濘
3953
+ 濙
3954
+ 濛
3955
+ 濞
3956
+ 濟
3957
+ 濠
3958
+ 濡
3959
+ 濤
3960
+ 濫
3961
+ 濬
3962
+ 濮
3963
+ 濯
3964
+ 濰
3965
+ 濱
3966
+ 濲
3967
+ 濶
3968
+ 濺
3969
+ 濼
3970
+ 濾
3971
+ 瀁
3972
+ 瀅
3973
+ 瀆
3974
+ 瀉
3975
+ 瀍
3976
+ 瀏
3977
+ 瀑
3978
+ 瀔
3979
+ 瀕
3980
+ 瀘
3981
+ 瀚
3982
+ 瀛
3983
+ 瀝
3984
+ 瀞
3985
+ 瀟
3986
+ 瀠
3987
+ 瀣
3988
+ 瀦
3989
+ 瀧
3990
+ 瀨
3991
+ 瀬
3992
+ 瀰
3993
+ 瀲
3994
+ 瀴
3995
+ 瀶
3996
+ 瀹
3997
+ 瀾
3998
+ 灃
3999
+ 灊
4000
+ 灌
4001
+ 灑
4002
+ 灘
4003
+ 灝
4004
+ 灞
4005
+ 灡
4006
+ 灣
4007
+ 灤
4008
+ 灧
4009
+ 火
4010
+ 灰
4011
+ 灴
4012
+ 灸
4013
+ 灼
4014
+ 災
4015
+ 炁
4016
+ 炅
4017
+ 炆
4018
+ 炊
4019
+ 炎
4020
+ 炒
4021
+ 炔
4022
+ 炕
4023
+ 炘
4024
+ 炙
4025
+ 炟
4026
+ 炣
4027
+ 炤
4028
+ 炫
4029
+ 炬
4030
+ 炭
4031
+ 炮
4032
+ 炯
4033
+ 炱
4034
+ 炲
4035
+ 炳
4036
+ 炷
4037
+ 炸
4038
+ 為
4039
+ 炻
4040
+ 烈
4041
+ 烉
4042
+ 烊
4043
+ 烋
4044
+ 烏
4045
+ 烒
4046
+ 烔
4047
+ 烘
4048
+ 烙
4049
+ 烜
4050
+ 烝
4051
+ 烤
4052
+ 烯
4053
+ 烱
4054
+ 烴
4055
+ 烷
4056
+ 烹
4057
+ 烺
4058
+ 烽
4059
+ 焃
4060
+ 焄
4061
+ 焉
4062
+ 焊
4063
+ 焌
4064
+ 焓
4065
+ 焗
4066
+ 焙
4067
+ 焚
4068
+ 焜
4069
+ 焞
4070
+ 無
4071
+ 焦
4072
+ 焯
4073
+ 焰
4074
+ 焱
4075
+ 焴
4076
+ 然
4077
+ 焻
4078
+ 焼
4079
+ 焿
4080
+ 煇
4081
+ 煉
4082
+ 煊
4083
+ 煌
4084
+ 煎
4085
+ 煐
4086
+ 煒
4087
+ 煔
4088
+ 煕
4089
+ 煖
4090
+ 煙
4091
+ 煚
4092
+ 煜
4093
+ 煞
4094
+ 煠
4095
+ 煤
4096
+ 煥
4097
+ 煦
4098
+ 照
4099
+ 煨
4100
+ 煩
4101
+ 煬
4102
+ 煮
4103
+ 煲
4104
+ 煳
4105
+ 煵
4106
+ 煶
4107
+ 煸
4108
+ 煽
4109
+ 熄
4110
+ 熅
4111
+ 熇
4112
+ 熈
4113
+ 熊
4114
+ 熏
4115
+ 熒
4116
+ 熔
4117
+ 熖
4118
+ 熗
4119
+ 熘
4120
+ 熙
4121
+ 熜
4122
+ 熟
4123
+ 熠
4124
+ 熤
4125
+ 熥
4126
+ 熨
4127
+ 熬
4128
+ 熯
4129
+ 熱
4130
+ 熲
4131
+ 熳
4132
+ 熵
4133
+ 熹
4134
+ 熺
4135
+ 熼
4136
+ 熾
4137
+ 熿
4138
+ 燁
4139
+ 燃
4140
+ 燄
4141
+ 燈
4142
+ 燉
4143
+ 燊
4144
+ 燎
4145
+ 燏
4146
+ 燐
4147
+ 燒
4148
+ 燔
4149
+ 燕
4150
+ 燘
4151
+ 燙
4152
+ 燚
4153
+ 燜
4154
+ 燝
4155
+ 營
4156
+ 燥
4157
+ 燦
4158
+ 燧
4159
+ 燫
4160
+ 燬
4161
+ 燭
4162
+ 燮
4163
+ 燴
4164
+ 燹
4165
+ 燻
4166
+ 燼
4167
+ 燾
4168
+ 燿
4169
+ 爀
4170
+ 爆
4171
+ 爌
4172
+ 爍
4173
+ 爐
4174
+ 爔
4175
+ 爚
4176
+ 爛
4177
+ 爝
4178
+ 爨
4179
+ 爪
4180
+ 爬
4181
+ 爭
4182
+ 爯
4183
+ 爰
4184
+ 爲
4185
+ 爵
4186
+ 父
4187
+ 爸
4188
+ 爹
4189
+ 爺
4190
+ 爻
4191
+ 爽
4192
+ 爾
4193
+ 爿
4194
+ 牁
4195
+ 牂
4196
+ 牆
4197
+ 片
4198
+ 版
4199
+ 牌
4200
+ 牒
4201
+ 牕
4202
+ 牖
4203
+ 牘
4204
+ 牙
4205
+ 牛
4206
+ 牝
4207
+ 牟
4208
+ 牠
4209
+ 牡
4210
+ 牢
4211
+ 牧
4212
+ 物
4213
+ 牯
4214
+ 牲
4215
+ 特
4216
+ 牻
4217
+ 牼
4218
+ 牽
4219
+ 犀
4220
+ 犁
4221
+ 犂
4222
+ 犇
4223
+ 犍
4224
+ 犎
4225
+ 犖
4226
+ 犛
4227
+ 犢
4228
+ 犧
4229
+ 犨
4230
+ 犬
4231
+ 犯
4232
+ 犰
4233
+ 犴
4234
+ 犽
4235
+ 狀
4236
+ 狂
4237
+ 狄
4238
+ 狍
4239
+ 狎
4240
+ 狐
4241
+ 狒
4242
+ 狓
4243
+ 狗
4244
+ 狙
4245
+ 狛
4246
+ 狟
4247
+ 狠
4248
+ 狡
4249
+ 狦
4250
+ 狨
4251
+ 狩
4252
+ 狳
4253
+ 狶
4254
+ 狷
4255
+ 狸
4256
+ 狹
4257
+ 狻
4258
+ 狼
4259
+ 猁
4260
+ 猄
4261
+ 猇
4262
+ 猊
4263
+ 猗
4264
+ 猙
4265
+ 猛
4266
+ 猜
4267
+ 猝
4268
+ 猞
4269
+ 猢
4270
+ 猥
4271
+ 猨
4272
+ 猩
4273
+ 猳
4274
+ 猴
4275
+ 猶
4276
+ 猷
4277
+ 猺
4278
+ 猻
4279
+ 猾
4280
+ 猿
4281
+ 獁
4282
+ 獃
4283
+ 獄
4284
+ 獅
4285
+ 獇
4286
+ 獎
4287
+ 獏
4288
+ 獐
4289
+ 獒
4290
+ 獠
4291
+ 獢
4292
+ 獣
4293
+ 獨
4294
+ 獬
4295
+ 獮
4296
+ 獯
4297
+ 獰
4298
+ 獲
4299
+ 獴
4300
+ 獵
4301
+ 獷
4302
+ 獸
4303
+ 獺
4304
+ 獻
4305
+ 獼
4306
+ 獾
4307
+ 玀
4308
+ 玄
4309
+ 玆
4310
+ 率
4311
+ 玉
4312
+ 王
4313
+ 玎
4314
+ 玏
4315
+ 玓
4316
+ 玕
4317
+ 玖
4318
+ 玗
4319
+ 玘
4320
+ 玙
4321
+ 玟
4322
+ 玠
4323
+ 玡
4324
+ 玢
4325
+ 玥
4326
+ 玧
4327
+ 玨
4328
+ 玩
4329
+ 玫
4330
+ 玭
4331
+ 玲
4332
+ 玳
4333
+ 玶
4334
+ 玷
4335
+ 玹
4336
+ 玻
4337
+ 玾
4338
+ 珀
4339
+ 珂
4340
+ 珅
4341
+ 珈
4342
+ 珉
4343
+ 珊
4344
+ 珌
4345
+ 珍
4346
+ 珎
4347
+ 珏
4348
+ 珖
4349
+ 珙
4350
+ 珝
4351
+ 珞
4352
+ 珠
4353
+ 珡
4354
+ 珣
4355
+ 珤
4356
+ 珥
4357
+ 珦
4358
+ 珧
4359
+ 珩
4360
+ 珪
4361
+ 班
4362
+ 珮
4363
+ 珵
4364
+ 珹
4365
+ 珺
4366
+ 珽
4367
+ 現
4368
+ 琁
4369
+ 球
4370
+ 琄
4371
+ 琅
4372
+ 理
4373
+ 琇
4374
+ 琉
4375
+ 琊
4376
+ 琍
4377
+ 琎
4378
+ 琚
4379
+ 琛
4380
+ 琡
4381
+ 琢
4382
+ 琤
4383
+ 琥
4384
+ 琦
4385
+ 琨
4386
+ 琪
4387
+ 琬
4388
+ 琮
4389
+ 琯
4390
+ 琰
4391
+ 琱
4392
+ 琳
4393
+ 琴
4394
+ 琵
4395
+ 琶
4396
+ 琹
4397
+ 琺
4398
+ 琿
4399
+ 瑀
4400
+ 瑁
4401
+ 瑂
4402
+ 瑄
4403
+ 瑅
4404
+ 瑆
4405
+ 瑈
4406
+ 瑊
4407
+ 瑋
4408
+ 瑑
4409
+ 瑒
4410
+ 瑕
4411
+ 瑗
4412
+ 瑙
4413
+ 瑚
4414
+ 瑛
4415
+ 瑜
4416
+ 瑝
4417
+ 瑞
4418
+ 瑟
4419
+ 瑠
4420
+ 瑢
4421
+ 瑣
4422
+ 瑤
4423
+ 瑥
4424
+ 瑧
4425
+ 瑨
4426
+ 瑩
4427
+ 瑪
4428
+ 瑭
4429
+ 瑯
4430
+ 瑰
4431
+ 瑱
4432
+ 瑳
4433
+ 瑴
4434
+ 瑺
4435
+ 瑾
4436
+ 璀
4437
+ 璁
4438
+ 璃
4439
+ 璄
4440
+ 璆
4441
+ 璇
4442
+ 璈
4443
+ 璉
4444
+ 璋
4445
+ 璌
4446
+ 璐
4447
+ 璕
4448
+ 璘
4449
+ 璙
4450
+ 璚
4451
+ 璜
4452
+ 璞
4453
+ 璟
4454
+ 璠
4455
+ 璡
4456
+ 璣
4457
+ 璥
4458
+ 璦
4459
+ 璧
4460
+ 璨
4461
+ 璩
4462
+ 璪
4463
+ 璫
4464
+ 璬
4465
+ 璮
4466
+ 環
4467
+ 璱
4468
+ 璵
4469
+ 璸
4470
+ 璹
4471
+ 璽
4472
+ 璿
4473
+ 瓈
4474
+ 瓊
4475
+ 瓌
4476
+ 瓏
4477
+ 瓑
4478
+ 瓔
4479
+ 瓖
4480
+ 瓘
4481
+ 瓚
4482
+ 瓛
4483
+ 瓜
4484
+ 瓞
4485
+ 瓠
4486
+ 瓢
4487
+ 瓣
4488
+ 瓤
4489
+ 瓦
4490
+ 瓮
4491
+ 瓴
4492
+ 瓶
4493
+ 瓷
4494
+ 瓿
4495
+ 甂
4496
+ 甄
4497
+ 甌
4498
+ 甍
4499
+ 甑
4500
+ 甕
4501
+ 甘
4502
+ 甙
4503
+ 甚
4504
+ 甜
4505
+ 生
4506
+ 甡
4507
+ 產
4508
+ 産
4509
+ 甥
4510
+ 甦
4511
+ 用
4512
+ 甩
4513
+ 甪
4514
+ 甫
4515
+ 甬
4516
+ 甯
4517
+ 田
4518
+ 由
4519
+ 甲
4520
+ 申
4521
+ 男
4522
+ 甸
4523
+ 甹
4524
+ 町
4525
+ 甾
4526
+ 畀
4527
+ 畇
4528
+ 畈
4529
+ 畊
4530
+ 畋
4531
+ 界
4532
+ 畎
4533
+ 畏
4534
+ 畐
4535
+ 畑
4536
+ 畔
4537
+ 留
4538
+ 畜
4539
+ 畝
4540
+ 畠
4541
+ 畢
4542
+ 略
4543
+ 畦
4544
+ 畧
4545
+ 番
4546
+ 畫
4547
+ 畬
4548
+ 畯
4549
+ 異
4550
+ 畲
4551
+ 畳
4552
+ 畵
4553
+ 當
4554
+ 畷
4555
+ 畸
4556
+ 畹
4557
+ 畿
4558
+ 疃
4559
+ 疆
4560
+ 疇
4561
+ 疊
4562
+ 疋
4563
+ 疌
4564
+ 疍
4565
+ 疏
4566
+ 疑
4567
+ 疒
4568
+ 疕
4569
+ 疙
4570
+ 疚
4571
+ 疝
4572
+ 疣
4573
+ 疤
4574
+ 疥
4575
+ 疫
4576
+ 疲
4577
+ 疳
4578
+ 疵
4579
+ 疸
4580
+ 疹
4581
+ 疼
4582
+ 疽
4583
+ 疾
4584
+ 痂
4585
+ 病
4586
+ 症
4587
+ 痊
4588
+ 痍
4589
+ 痔
4590
+ 痕
4591
+ 痘
4592
+ 痙
4593
+ 痛
4594
+ 痞
4595
+ 痟
4596
+ 痠
4597
+ 痢
4598
+ 痣
4599
+ 痤
4600
+ 痧
4601
+ 痩
4602
+ 痰
4603
+ 痱
4604
+ 痲
4605
+ 痴
4606
+ 痹
4607
+ 痺
4608
+ 痿
4609
+ 瘀
4610
+ 瘁
4611
+ 瘊
4612
+ 瘋
4613
+ 瘍
4614
+ 瘓
4615
+ 瘙
4616
+ 瘜
4617
+ 瘞
4618
+ 瘟
4619
+ 瘠
4620
+ 瘡
4621
+ 瘢
4622
+ 瘤
4623
+ 瘦
4624
+ 瘧
4625
+ 瘩
4626
+ 瘰
4627
+ 瘴
4628
+ 瘺
4629
+ 癀
4630
+ 療
4631
+ 癆
4632
+ 癇
4633
+ 癌
4634
+ 癒
4635
+ 癖
4636
+ 癘
4637
+ 癜
4638
+ 癟
4639
+ 癡
4640
+ 癢
4641
+ 癤
4642
+ 癥
4643
+ 癩
4644
+ 癬
4645
+ 癭
4646
+ 癮
4647
+ 癯
4648
+ 癰
4649
+ 癱
4650
+ 癲
4651
+ 癸
4652
+ 発
4653
+ 登
4654
+ 發
4655
+ 白
4656
+ 百
4657
+ 皂
4658
+ 的
4659
+ 皆
4660
+ 皇
4661
+ 皈
4662
+ 皋
4663
+ 皎
4664
+ 皐
4665
+ 皓
4666
+ 皖
4667
+ 皙
4668
+ 皚
4669
+ 皛
4670
+ 皝
4671
+ 皞
4672
+ 皮
4673
+ 皰
4674
+ 皴
4675
+ 皷
4676
+ 皸
4677
+ 皺
4678
+ 皿
4679
+ 盂
4680
+ 盃
4681
+ 盅
4682
+ 盆
4683
+ 盈
4684
+ 益
4685
+ 盋
4686
+ 盌
4687
+ 盎
4688
+ 盒
4689
+ 盔
4690
+ 盛
4691
+ 盜
4692
+ 盞
4693
+ 盟
4694
+ 盡
4695
+ 監
4696
+ 盤
4697
+ 盥
4698
+ 盦
4699
+ 盧
4700
+ 盨
4701
+ 盩
4702
+ 盪
4703
+ 盫
4704
+ 目
4705
+ 盯
4706
+ 盱
4707
+ 盲
4708
+ 直
4709
+ 盷
4710
+ 相
4711
+ 盹
4712
+ 盺
4713
+ 盼
4714
+ 盾
4715
+ 眀
4716
+ 省
4717
+ 眉
4718
+ 看
4719
+ 県
4720
+ 眙
4721
+ 眛
4722
+ 眜
4723
+ 眞
4724
+ 真
4725
+ 眠
4726
+ 眥
4727
+ 眨
4728
+ 眩
4729
+ 眭
4730
+ 眯
4731
+ 眵
4732
+ 眶
4733
+ 眷
4734
+ 眸
4735
+ 眺
4736
+ 眼
4737
+ 眾
4738
+ 着
4739
+ 睇
4740
+ 睛
4741
+ 睜
4742
+ 睞
4743
+ 睡
4744
+ 睢
4745
+ 督
4746
+ 睥
4747
+ 睦
4748
+ 睨
4749
+ 睪
4750
+ 睫
4751
+ 睭
4752
+ 睹
4753
+ 睺
4754
+ 睽
4755
+ 睾
4756
+ 睿
4757
+ 瞄
4758
+ 瞅
4759
+ 瞋
4760
+ 瞌
4761
+ 瞎
4762
+ 瞑
4763
+ 瞓
4764
+ 瞞
4765
+ 瞢
4766
+ 瞥
4767
+ 瞧
4768
+ 瞪
4769
+ 瞫
4770
+ 瞬
4771
+ 瞭
4772
+ 瞰
4773
+ 瞳
4774
+ 瞻
4775
+ 瞼
4776
+ 瞽
4777
+ 瞿
4778
+ 矇
4779
+ 矍
4780
+ 矗
4781
+ 矚
4782
+ 矛
4783
+ 矜
4784
+ 矞
4785
+ 矢
4786
+ 矣
4787
+ 知
4788
+ 矧
4789
+ 矩
4790
+ 短
4791
+ 矮
4792
+ 矯
4793
+ 石
4794
+ 矸
4795
+ 矽
4796
+ 砂
4797
+ 砋
4798
+ 砌
4799
+ 砍
4800
+ 砒
4801
+ 研
4802
+ 砝
4803
+ 砢
4804
+ 砥
4805
+ 砦
4806
+ 砧
4807
+ 砩
4808
+ 砫
4809
+ 砭
4810
+ 砮
4811
+ 砯
4812
+ 砰
4813
+ 砲
4814
+ 砳
4815
+ 破
4816
+ 砵
4817
+ 砷
4818
+ 砸
4819
+ 砼
4820
+ 硂
4821
+ 硃
4822
+ 硅
4823
+ 硇
4824
+ 硏
4825
+ 硐
4826
+ 硒
4827
+ 硓
4828
+ 硚
4829
+ 硜
4830
+ 硝
4831
+ 硤
4832
+ 硨
4833
+ 硫
4834
+ 硬
4835
+ 硭
4836
+ 硯
4837
+ 硼
4838
+ 碁
4839
+ 碇
4840
+ 碉
4841
+ 碌
4842
+ 碎
4843
+ 碑
4844
+ 碓
4845
+ 碕
4846
+ 碗
4847
+ 碘
4848
+ 碚
4849
+ 碟
4850
+ 碡
4851
+ 碣
4852
+ 碧
4853
+ 碩
4854
+ 碪
4855
+ 碭
4856
+ 碰
4857
+ 碲
4858
+ 碳
4859
+ 碴
4860
+ 碶
4861
+ 碸
4862
+ 確
4863
+ 碻
4864
+ 碼
4865
+ 碽
4866
+ 碾
4867
+ 磁
4868
+ 磅
4869
+ 磊
4870
+ 磋
4871
+ 磐
4872
+ 磔
4873
+ 磕
4874
+ 磘
4875
+ 磙
4876
+ 磚
4877
+ 磜
4878
+ 磡
4879
+ 磨
4880
+ 磪
4881
+ 磬
4882
+ 磯
4883
+ 磱
4884
+ 磲
4885
+ 磵
4886
+ 磷
4887
+ 磺
4888
+ 磻
4889
+ 磾
4890
+ 礁
4891
+ 礄
4892
+ 礎
4893
+ 礐
4894
+ 礑
4895
+ 礒
4896
+ 礙
4897
+ 礠
4898
+ 礦
4899
+ 礪
4900
+ 礫
4901
+ 礬
4902
+ 礮
4903
+ 礱
4904
+ 礴
4905
+ 示
4906
+ 礻
4907
+ 礽
4908
+ 社
4909
+ 祀
4910
+ 祁
4911
+ 祂
4912
+ 祆
4913
+ 祇
4914
+ 祈
4915
+ 祉
4916
+ 祋
4917
+ 祏
4918
+ 祐
4919
+ 祓
4920
+ 祕
4921
+ 祖
4922
+ 祗
4923
+ 祙
4924
+ 祚
4925
+ 祛
4926
+ 祜
4927
+ 祝
4928
+ 神
4929
+ 祟
4930
+ 祠
4931
+ 祥
4932
+ 祧
4933
+ 票
4934
+ 祭
4935
+ 祹
4936
+ 祺
4937
+ 祼
4938
+ 祿
4939
+ 禁
4940
+ 禃
4941
+ 禇
4942
+ 禍
4943
+ 禎
4944
+ 福
4945
+ 禑
4946
+ 禓
4947
+ 禔
4948
+ 禕
4949
+ 禘
4950
+ 禛
4951
+ 禟
4952
+ 禠
4953
+ 禤
4954
+ 禦
4955
+ 禧
4956
+ 禨
4957
+ 禩
4958
+ 禪
4959
+ 禮
4960
+ 禰
4961
+ 禱
4962
+ 禵
4963
+ 禹
4964
+ 禺
4965
+ 禼
4966
+ 禽
4967
+ 禾
4968
+ 禿
4969
+ 秀
4970
+ 私
4971
+ 秈
4972
+ 秉
4973
+ 秋
4974
+ 科
4975
+ 秒
4976
+ 秕
4977
+ 秘
4978
+ 租
4979
+ 秠
4980
+ 秣
4981
+ 秤
4982
+ 秦
4983
+ 秧
4984
+ 秩
4985
+ 秭
4986
+ 秳
4987
+ 秸
4988
+ 移
4989
+ 稀
4990
+ 稅
4991
+ 稈
4992
+ 稉
4993
+ 程
4994
+ 稍
4995
+ 稑
4996
+ 稔
4997
+ 稗
4998
+ 稘
4999
+ 稙
5000
+ 稚
5001
+ 稜
5002
+ 稞
5003
+ 稟
5004
+ 稠
5005
+ 種
5006
+ 稱
5007
+ 稲
5008
+ 稷
5009
+ 稹
5010
+ 稺
5011
+ 稻
5012
+ 稼
5013
+ 稽
5014
+ 稾
5015
+ 稿
5016
+ 穀
5017
+ 穂
5018
+ 穆
5019
+ 穈
5020
+ 穉
5021
+ 穌
5022
+ 積
5023
+ 穎
5024
+ 穗
5025
+ 穟
5026
+ 穠
5027
+ 穡
5028
+ 穢
5029
+ 穣
5030
+ 穩
5031
+ 穫
5032
+ 穰
5033
+ 穴
5034
+ 穵
5035
+ 究
5036
+ 穹
5037
+ 空
5038
+ 穿
5039
+ 突
5040
+ 窄
5041
+ 窅
5042
+ 窈
5043
+ 窋
5044
+ 窒
5045
+ 窕
5046
+ 窖
5047
+ 窗
5048
+ 窘
5049
+ 窟
5050
+ 窠
5051
+ 窣
5052
+ 窨
5053
+ 窩
5054
+ 窪
5055
+ 窮
5056
+ 窯
5057
+ 窰
5058
+ 窶
5059
+ 窺
5060
+ 窿
5061
+ 竄
5062
+ 竅
5063
+ 竇
5064
+ 竈
5065
+ 竊
5066
+ 立
5067
+ 竑
5068
+ 站
5069
+ 竜
5070
+ 竟
5071
+ 章
5072
+ 竣
5073
+ 童
5074
+ 竦
5075
+ 竩
5076
+ 竭
5077
+ 端
5078
+ 競
5079
+ 竹
5080
+ 竺
5081
+ 竻
5082
+ 竿
5083
+ 笄
5084
+ 笆
5085
+ 笈
5086
+ 笏
5087
+ 笑
5088
+ 笘
5089
+ 笙
5090
+ 笛
5091
+ 笞
5092
+ 笠
5093
+ 笥
5094
+ 符
5095
+ 笨
5096
+ 笩
5097
+ 笪
5098
+ 第
5099
+ 笭
5100
+ 笮
5101
+ 笯
5102
+ 笱
5103
+ 笳
5104
+ 笹
5105
+ 筅
5106
+ 筆
5107
+ 等
5108
+ 筊
5109
+ 筋
5110
+ 筌
5111
+ 筍
5112
+ 筏
5113
+ 筐
5114
+ 筒
5115
+ 答
5116
+ 策
5117
+ 筘
5118
+ 筠
5119
+ 筥
5120
+ 筦
5121
+ 筧
5122
+ 筬
5123
+ 筭
5124
+ 筱
5125
+ 筲
5126
+ 筳
5127
+ 筵
5128
+ 筶
5129
+ 筷
5130
+ 筻
5131
+ 箆
5132
+ 箇
5133
+ 箋
5134
+ 箍
5135
+ 箏
5136
+ 箐
5137
+ 箑
5138
+ 箒
5139
+ 箔
5140
+ 箕
5141
+ 算
5142
+ 箜
5143
+ 管
5144
+ 箬
5145
+ 箭
5146
+ 箱
5147
+ 箴
5148
+ 箸
5149
+ 節
5150
+ 篁
5151
+ 範
5152
+ 篆
5153
+ 篇
5154
+ 築
5155
+ 篊
5156
+ 篋
5157
+ 篌
5158
+ 篔
5159
+ 篙
5160
+ 篝
5161
+ 篠
5162
+ 篡
5163
+ 篤
5164
+ 篥
5165
+ 篦
5166
+ 篩
5167
+ 篪
5168
+ 篭
5169
+ 篯
5170
+ 篳
5171
+ 篷
5172
+ 簀
5173
+ 簃
5174
+ 簇
5175
+ 簉
5176
+ 簋
5177
+ 簍
5178
+ 簑
5179
+ 簕
5180
+ 簗
5181
+ 簞
5182
+ 簠
5183
+ 簡
5184
+ 簧
5185
+ 簪
5186
+ 簫
5187
+ 簷
5188
+ 簸
5189
+ 簹
5190
+ 簺
5191
+ 簽
5192
+ 簾
5193
+ 簿
5194
+ 籀
5195
+ 籃
5196
+ 籌
5197
+ 籍
5198
+ 籐
5199
+ 籙
5200
+ 籛
5201
+ 籜
5202
+ 籝
5203
+ 籟
5204
+ 籠
5205
+ 籣
5206
+ 籤
5207
+ 籥
5208
+ 籪
5209
+ 籬
5210
+ 籮
5211
+ 籲
5212
+ 米
5213
+ 籽
5214
+ 籾
5215
+ 粄
5216
+ 粉
5217
+ 粍
5218
+ 粑
5219
+ 粒
5220
+ 粕
5221
+ 粗
5222
+ 粘
5223
+ 粟
5224
+ 粢
5225
+ 粥
5226
+ 粦
5227
+ 粧
5228
+ 粩
5229
+ 粱
5230
+ 粲
5231
+ 粳
5232
+ 粵
5233
+ 粹
5234
+ 粼
5235
+ 粽
5236
+ 精
5237
+ 粿
5238
+ 糀
5239
+ 糅
5240
+ 糊
5241
+ 糌
5242
+ 糍
5243
+ 糎
5244
+ 糕
5245
+ 糖
5246
+ 糙
5247
+ 糜
5248
+ 糝
5249
+ 糞
5250
+ 糟
5251
+ 糠
5252
+ 糢
5253
+ 糧
5254
+ 糬
5255
+ 糯
5256
+ 糰
5257
+ 糴
5258
+ 糶
5259
+ 糸
5260
+ 糹
5261
+ 糺
5262
+ 系
5263
+ 糾
5264
+ 紀
5265
+ 紂
5266
+ 約
5267
+ 紅
5268
+ 紆
5269
+ 紇
5270
+ 紈
5271
+ 紉
5272
+ 紊
5273
+ 紋
5274
+ 納
5275
+ 紐
5276
+ 紑
5277
+ 紓
5278
+ 純
5279
+ 紕
5280
+ 紗
5281
+ 紘
5282
+ 紙
5283
+ 級
5284
+ 紛
5285
+ 紜
5286
+ 紝
5287
+ 紞
5288
+ 素
5289
+ 紡
5290
+ 索
5291
+ 紫
5292
+ 紮
5293
+ 累
5294
+ 細
5295
+ 紱
5296
+ 紲
5297
+ 紳
5298
+ 紵
5299
+ 紹
5300
+ 紺
5301
+ 紿
5302
+ 終
5303
+ 絃
5304
+ 組
5305
+ 絆
5306
+ 経
5307
+ 絎
5308
+ 結
5309
+ 絕
5310
+ 絛
5311
+ 絜
5312
+ 絞
5313
+ 絡
5314
+ 絢
5315
+ 給
5316
+ 絨
5317
+ 絪
5318
+ 絮
5319
+ 統
5320
+ 絲
5321
+ 絳
5322
+ 絵
5323
+ 絶
5324
+ 絹
5325
+ 絺
5326
+ 綁
5327
+ 綃
5328
+ 綈
5329
+ 綉
5330
+ 綎
5331
+ 綏
5332
+ 經
5333
+ 綖
5334
+ 継
5335
+ 続
5336
+ 綜
5337
+ 綝
5338
+ 綞
5339
+ 綠
5340
+ 綢
5341
+ 綣
5342
+ 綦
5343
+ 綧
5344
+ 綫
5345
+ 綬
5346
+ 維
5347
+ 綮
5348
+ 綰
5349
+ 綱
5350
+ 網
5351
+ 綳
5352
+ 綴
5353
+ 綸
5354
+ 綺
5355
+ 綻
5356
+ 綽
5357
+ 綾
5358
+ 綿
5359
+ 緁
5360
+ 緃
5361
+ 緄
5362
+ 緈
5363
+ 緊
5364
+ 緋
5365
+ 総
5366
+ 緑
5367
+ 緒
5368
+ 緖
5369
+ 緘
5370
+ 線
5371
+ 緜
5372
+ 緝
5373
+ 緞
5374
+ 締
5375
+ 緡
5376
+ 緣
5377
+ 緤
5378
+ 編
5379
+ 緩
5380
+ 緬
5381
+ 緯
5382
+ 緱
5383
+ 緲
5384
+ 練
5385
+ 緹
5386
+ 緻
5387
+ 縂
5388
+ 縄
5389
+ 縈
5390
+ 縉
5391
+ 縊
5392
+ 縕
5393
+ 縛
5394
+ 縝
5395
+ 縞
5396
+ 縠
5397
+ 縡
5398
+ 縣
5399
+ 縤
5400
+ 縫
5401
+ 縮
5402
+ 縯
5403
+ 縱
5404
+ 縴
5405
+ 縵
5406
+ 縷
5407
+ 縹
5408
+ 縻
5409
+ 總
5410
+ 績
5411
+ 繁
5412
+ 繃
5413
+ 繆
5414
+ 繇
5415
+ 繒
5416
+ 織
5417
+ 繕
5418
+ 繖
5419
+ 繙
5420
+ 繚
5421
+ 繞
5422
+ 繡
5423
+ 繩
5424
+ 繪
5425
+ 繫
5426
+ 繭
5427
+ 繰
5428
+ 繳
5429
+ 繹
5430
+ 繻
5431
+ 繼
5432
+ 繽
5433
+ 繾
5434
+ 纁
5435
+ 纂
5436
+ 纈
5437
+ 續
5438
+ 纍
5439
+ 纏
5440
+ 纓
5441
+ 纔
5442
+ 纕
5443
+ 纖
5444
+ 纘
5445
+ 纛
5446
+ 纜
5447
+ 缐
5448
+ 缶
5449
+ 缸
5450
+ 缺
5451
+ 缽
5452
+ 罃
5453
+ 罄
5454
+ 罅
5455
+ 罈
5456
+ 罉
5457
+ 罌
5458
+ 罍
5459
+ 罐
5460
+ 罔
5461
+ 罕
5462
+ 罘
5463
+ 罟
5464
+ 罡
5465
+ 罨
5466
+ 罩
5467
+ 罪
5468
+ 置
5469
+ 罰
5470
+ 罱
5471
+ 署
5472
+ 罳
5473
+ 罵
5474
+ 罶
5475
+ 罷
5476
+ 罹
5477
+ 罽
5478
+ 羂
5479
+ 羅
5480
+ 羆
5481
+ 羈
5482
+ 羊
5483
+ 羋
5484
+ 羌
5485
+ 美
5486
+ 羔
5487
+ 羕
5488
+ 羗
5489
+ 羙
5490
+ 羚
5491
+ 羞
5492
+ 羡
5493
+ 羣
5494
+ 群
5495
+ 羥
5496
+ 羧
5497
+ 羨
5498
+ 義
5499
+ 羯
5500
+ 羰
5501
+ 羱
5502
+ 羲
5503
+ 羸
5504
+ 羹
5505
+ 羽
5506
+ 羿
5507
+ 翀
5508
+ 翁
5509
+ 翂
5510
+ 翃
5511
+ 翅
5512
+ 翊
5513
+ 翌
5514
+ 翎
5515
+ 翏
5516
+ 習
5517
+ 翔
5518
+ 翕
5519
+ 翙
5520
+ 翜
5521
+ 翟
5522
+ 翠
5523
+ 翡
5524
+ 翥
5525
+ 翦
5526
+ 翩
5527
+ 翬
5528
+ 翮
5529
+ 翰
5530
+ 翱
5531
+ 翳
5532
+ 翹
5533
+ 翻
5534
+ 翼
5535
+ 耀
5536
+ 老
5537
+ 考
5538
+ 耄
5539
+ 者
5540
+ 耆
5541
+ 而
5542
+ 耍
5543
+ 耎
5544
+ 耐
5545
+ 耑
5546
+ 耒
5547
+ 耔
5548
+ 耕
5549
+ 耗
5550
+ 耘
5551
+ 耙
5552
+ 耜
5553
+ 耦
5554
+ 耨
5555
+ 耬
5556
+ 耳
5557
+ 耵
5558
+ 耶
5559
+ 耷
5560
+ 耽
5561
+ 耿
5562
+ 聃
5563
+ 聆
5564
+ 聊
5565
+ 聒
5566
+ 聖
5567
+ 聘
5568
+ 聚
5569
+ 聞
5570
+ 聟
5571
+ 聨
5572
+ 聯
5573
+ 聰
5574
+ 聱
5575
+ 聲
5576
+ 聳
5577
+ 聴
5578
+ 聶
5579
+ 職
5580
+ 聽
5581
+ 聾
5582
+ 聿
5583
+ 肄
5584
+ 肅
5585
+ 肆
5586
+ 肇
5587
+ 肉
5588
+ 肋
5589
+ 肌
5590
+ 肏
5591
+ 肖
5592
+ 肘
5593
+ 肚
5594
+ 肛
5595
+ 肜
5596
+ 肝
5597
+ 肟
5598
+ 股
5599
+ 肢
5600
+ 肥
5601
+ 肩
5602
+ 肪
5603
+ 肫
5604
+ 肯
5605
+ 肱
5606
+ 育
5607
+ 肸
5608
+ 肹
5609
+ 肺
5610
+ 肼
5611
+ 肽
5612
+ 胂
5613
+ 胃
5614
+ 胄
5615
+ 胅
5616
+ 胇
5617
+ 胊
5618
+ 背
5619
+ 胍
5620
+ 胎
5621
+ 胖
5622
+ 胗
5623
+ 胙
5624
+ 胚
5625
+ 胛
5626
+ 胝
5627
+ 胞
5628
+ 胡
5629
+ 胤
5630
+ 胥
5631
+ 胬
5632
+ 胭
5633
+ 胰
5634
+ 胱
5635
+ 胳
5636
+ 胴
5637
+ 胸
5638
+ 胺
5639
+ 胼
5640
+ 能
5641
+ 脂
5642
+ 脅
5643
+ 脆
5644
+ 脇
5645
+ 脈
5646
+ 脊
5647
+ 脒
5648
+ 脖
5649
+ 脘
5650
+ 脛
5651
+ 脣
5652
+ 脩
5653
+ 脫
5654
+ 脬
5655
+ 脭
5656
+ 脯
5657
+ 脲
5658
+ 脳
5659
+ 脷
5660
+ 脹
5661
+ 脾
5662
+ 腆
5663
+ 腈
5664
+ 腊
5665
+ 腋
5666
+ 腌
5667
+ 腎
5668
+ 腐
5669
+ 腑
5670
+ 腓
5671
+ 腔
5672
+ 腕
5673
+ 腥
5674
+ 腦
5675
+ 腧
5676
+ 腩
5677
+ 腫
5678
+ 腮
5679
+ 腰
5680
+ 腱
5681
+ 腳
5682
+ 腴
5683
+ 腸
5684
+ 腹
5685
+ 腺
5686
+ 腿
5687
+ 膀
5688
+ 膂
5689
+ 膈
5690
+ 膊
5691
+ 膏
5692
+ 膚
5693
+ 膛
5694
+ 膜
5695
+ 膝
5696
+ 膠
5697
+ 膣
5698
+ 膥
5699
+ 膦
5700
+ 膨
5701
+ 膩
5702
+ 膮
5703
+ 膳
5704
+ 膺
5705
+ 膽
5706
+ 膾
5707
+ 膿
5708
+ 臀
5709
+ 臂
5710
+ 臃
5711
+ 臆
5712
+ 臉
5713
+ 臊
5714
+ 臍
5715
+ 臏
5716
+ 臘
5717
+ 臚
5718
+ 臞
5719
+ 臟
5720
+ 臠
5721
+ 臣
5722
+ 臧
5723
+ 臨
5724
+ 自
5725
+ 臭
5726
+ 臯
5727
+ 至
5728
+ 致
5729
+ 臺
5730
+ 臻
5731
+ 臼
5732
+ 臾
5733
+ 舂
5734
+ 舅
5735
+ 與
5736
+ 興
5737
+ 舉
5738
+ 舊
5739
+ 舌
5740
+ 舍
5741
+ 舎
5742
+ 舒
5743
+ 舔
5744
+ 舖
5745
+ 舘
5746
+ 舛
5747
+ 舜
5748
+ 舞
5749
+ 舟
5750
+ 舢
5751
+ 舥
5752
+ 舨
5753
+ 舩
5754
+ 航
5755
+ 舫
5756
+ 般
5757
+ 舲
5758
+ 舵
5759
+ 舶
5760
+ 舷
5761
+ 舸
5762
+ 船
5763
+ 舺
5764
+ 艅
5765
+ 艇
5766
+ 艉
5767
+ 艋
5768
+ 艎
5769
+ 艏
5770
+ 艔
5771
+ 艘
5772
+ 艙
5773
+ 艚
5774
+ 艦
5775
+ 艮
5776
+ 良
5777
+ 艱
5778
+ 色
5779
+ 艶
5780
+ 艷
5781
+ 艸
5782
+ 艽
5783
+ 艾
5784
+ 艿
5785
+ 芃
5786
+ 芊
5787
+ 芋
5788
+ 芍
5789
+ 芎
5790
+ 芑
5791
+ 芒
5792
+ 芘
5793
+ 芙
5794
+ 芛
5795
+ 芝
5796
+ 芡
5797
+ 芥
5798
+ 芨
5799
+ 芩
5800
+ 芪
5801
+ 芫
5802
+ 芬
5803
+ 芭
5804
+ 芮
5805
+ 芯
5806
+ 花
5807
+ 芳
5808
+ 芴
5809
+ 芷
5810
+ 芸
5811
+ 芹
5812
+ 芻
5813
+ 芽
5814
+ 芾
5815
+ 苄
5816
+ 苅
5817
+ 苑
5818
+ 苒
5819
+ 苓
5820
+ 苔
5821
+ 苕
5822
+ 苗
5823
+ 苛
5824
+ 苜
5825
+ 苝
5826
+ 苞
5827
+ 苟
5828
+ 苡
5829
+ 苣
5830
+ 苤
5831
+ 若
5832
+ 苦
5833
+ 苧
5834
+ 苪
5835
+ 苫
5836
+ 苯
5837
+ 英
5838
+ 苳
5839
+ 苴
5840
+ 苷
5841
+ 苺
5842
+ 苻
5843
+ 苼
5844
+ 苾
5845
+ 茀
5846
+ 茁
5847
+ 茂
5848
+ 范
5849
+ 茄
5850
+ 茅
5851
+ 茆
5852
+ 茇
5853
+ 茈
5854
+ 茉
5855
+ 茌
5856
+ 茗
5857
+ 茘
5858
+ 茚
5859
+ 茛
5860
+ 茜
5861
+ 茝
5862
+ 茨
5863
+ 茫
5864
+ 茬
5865
+ 茭
5866
+ 茮
5867
+ 茯
5868
+ 茱
5869
+ 茲
5870
+ 茴
5871
+ 茵
5872
+ 茶
5873
+ 茷
5874
+ 茸
5875
+ 茹
5876
+ 茺
5877
+ 茼
5878
+ 荀
5879
+ 荃
5880
+ 荅
5881
+ 荇
5882
+ 草
5883
+ 荊
5884
+ 荎
5885
+ 荏
5886
+ 荒
5887
+ 荔
5888
+ 荖
5889
+ 荘
5890
+ 荳
5891
+ 荷
5892
+ 荸
5893
+ 荻
5894
+ 荼
5895
+ 荽
5896
+ 莆
5897
+ 莉
5898
+ 莊
5899
+ 莎
5900
+ 莒
5901
+ 莓
5902
+ 莕
5903
+ 莖
5904
+ 莘
5905
+ 莙
5906
+ 莛
5907
+ 莜
5908
+ 莞
5909
+ 莠
5910
+ 莢
5911
+ 莧
5912
+ 莨
5913
+ 莩
5914
+ 莪
5915
+ 莫
5916
+ 莽
5917
+ 莿
5918
+ 菀
5919
+ 菁
5920
+ 菅
5921
+ 菇
5922
+ 菈
5923
+ 菉
5924
+ 菊
5925
+ 菌
5926
+ 菍
5927
+ 菏
5928
+ 菑
5929
+ 菓
5930
+ 菔
5931
+ 菖
5932
+ 菘
5933
+ 菜
5934
+ 菝
5935
+ 菟
5936
+ 菠
5937
+ 菡
5938
+ 菥
5939
+ 菩
5940
+ 菪
5941
+ 菫
5942
+ 華
5943
+ 菰
5944
+ 菱
5945
+ 菲
5946
+ 菴
5947
+ 菶
5948
+ 菸
5949
+ 菹
5950
+ 菺
5951
+ 菼
5952
+ 菽
5953
+ 菾
5954
+ 萁
5955
+ 萃
5956
+ 萄
5957
+ 萇
5958
+ 萊
5959
+ 萌
5960
+ 萍
5961
+ 萎
5962
+ 萐
5963
+ 萘
5964
+ 萜
5965
+ 萠
5966
+ 萡
5967
+ 萣
5968
+ 萩
5969
+ 萬
5970
+ 萭
5971
+ 萱
5972
+ 萵
5973
+ 萸
5974
+ 萹
5975
+ 萼
5976
+ 落
5977
+ 葃
5978
+ 葆
5979
+ 葉
5980
+ 葊
5981
+ 葎
5982
+ 葑
5983
+ 葒
5984
+ 著
5985
+ 葙
5986
+ 葚
5987
+ 葛
5988
+ 葜
5989
+ 葝
5990
+ 葡
5991
+ 董
5992
+ 葦
5993
+ 葩
5994
+ 葫
5995
+ 葬
5996
+ 葭
5997
+ 葯
5998
+ 葰
5999
+ 葳
6000
+ 葵
6001
+ 葶
6002
+ 葷
6003
+ 葺
6004
+ 蒂
6005
+ 蒄
6006
+ 蒍
6007
+ 蒎
6008
+ 蒐
6009
+ 蒓
6010
+ 蒔
6011
+ 蒗
6012
+ 蒙
6013
+ 蒜
6014
+ 蒞
6015
+ 蒟
6016
+ 蒡
6017
+ 蒢
6018
+ 蒤
6019
+ 蒧
6020
+ 蒨
6021
+ 蒭
6022
+ 蒯
6023
+ 蒲
6024
+ 蒴
6025
+ 蒸
6026
+ 蒹
6027
+ 蒺
6028
+ 蒻
6029
+ 蒼
6030
+ 蒽
6031
+ 蒾
6032
+ 蒿
6033
+ 蓀
6034
+ 蓁
6035
+ 蓂
6036
+ 蓄
6037
+ 蓆
6038
+ 蓉
6039
+ 蓋
6040
+ 蓍
6041
+ 蓑
6042
+ 蓓
6043
+ 蓖
6044
+ 蓘
6045
+ 蓚
6046
+ 蓧
6047
+ 蓨
6048
+ 蓪
6049
+ 蓬
6050
+ 蓭
6051
+ 蓮
6052
+ 蓯
6053
+ 蓳
6054
+ 蓼
6055
+ 蓽
6056
+ 蓿
6057
+ 蔆
6058
+ 蔎
6059
+ 蔑
6060
+ 蔓
6061
+ 蔔
6062
+ 蔕
6063
+ 蔗
6064
+ 蔘
6065
+ 蔚
6066
+ 蔝
6067
+ 蔞
6068
+ 蔡
6069
+ 蔣
6070
+ 蔥
6071
+ 蔦
6072
+ 蔬
6073
+ 蔭
6074
+ 蔴
6075
+ 蔵
6076
+ 蔻
6077
+ 蔽
6078
+ 蕁
6079
+ 蕃
6080
+ 蕅
6081
+ 蕈
6082
+ 蕉
6083
+ 蕊
6084
+ 蕎
6085
+ 蕑
6086
+ 蕒
6087
+ 蕖
6088
+ 蕘
6089
+ 蕙
6090
+ 蕚
6091
+ 蕟
6092
+ 蕡
6093
+ 蕢
6094
+ 蕤
6095
+ 蕨
6096
+ 蕩
6097
+ 蕪
6098
+ 蕭
6099
+ 蕷
6100
+ 蕹
6101
+ 蕺
6102
+ 蕻
6103
+ 蕾
6104
+ 薀
6105
+ 薄
6106
+ 薆
6107
+ 薇
6108
+ 薈
6109
+ 薊
6110
+ 薌
6111
+ 薏
6112
+ 薐
6113
+ 薑
6114
+ 薔
6115
+ 薗
6116
+ 薘
6117
+ 薙
6118
+ 薛
6119
+ 薜
6120
+ 薞
6121
+ 薟
6122
+ 薡
6123
+ 薦
6124
+ 薨
6125
+ 薩
6126
+ 薪
6127
+ 薫
6128
+ 薬
6129
+ 薯
6130
+ 薰
6131
+ 薲
6132
+ 薷
6133
+ 薸
6134
+ 薹
6135
+ 薺
6136
+ 薾
6137
+ 薿
6138
+ 藁
6139
+ 藉
6140
+ 藍
6141
+ 藎
6142
+ 藏
6143
+ 藐
6144
+ 藔
6145
+ 藕
6146
+ 藜
6147
+ 藝
6148
+ 藟
6149
+ 藤
6150
+ 藥
6151
+ 藦
6152
+ 藨
6153
+ 藩
6154
+ 藪
6155
+ 藶
6156
+ 藸
6157
+ 藹
6158
+ 藺
6159
+ 藻
6160
+ 藿
6161
+ 蘂
6162
+ 蘄
6163
+ 蘅
6164
+ 蘆
6165
+ 蘇
6166
+ 蘊
6167
+ 蘋
6168
+ 蘐
6169
+ 蘑
6170
+ 蘓
6171
+ 蘗
6172
+ 蘘
6173
+ 蘚
6174
+ 蘞
6175
+ 蘢
6176
+ 蘧
6177
+ 蘩
6178
+ 蘭
6179
+ 蘵
6180
+ 蘶
6181
+ 蘸
6182
+ 蘼
6183
+ 蘿
6184
+ 虉
6185
+ 虎
6186
+ 虐
6187
+ 虓
6188
+ 虔
6189
+ 處
6190
+ 虖
6191
+ 虛
6192
+ 虜
6193
+ 虞
6194
+ 號
6195
+ 虢
6196
+ 虧
6197
+ 虨
6198
+ 虯
6199
+ 虱
6200
+ 虵
6201
+ 虹
6202
+ 虺
6203
+ 虻
6204
+ 蚆
6205
+ 蚊
6206
+ 蚋
6207
+ 蚌
6208
+ 蚍
6209
+ 蚓
6210
+ 蚖
6211
+ 蚜
6212
+ 蚝
6213
+ 蚡
6214
+ 蚢
6215
+ 蚣
6216
+ 蚤
6217
+ 蚧
6218
+ 蚨
6219
+ 蚩
6220
+ 蚪
6221
+ 蚯
6222
+ 蚱
6223
+ 蚴
6224
+ 蚵
6225
+ 蚶
6226
+ 蚺
6227
+ 蚼
6228
+ 蛀
6229
+ 蛄
6230
+ 蛇
6231
+ 蛉
6232
+ 蛋
6233
+ 蛍
6234
+ 蛐
6235
+ 蛑
6236
+ 蛔
6237
+ 蛙
6238
+ 蛛
6239
+ 蛞
6240
+ 蛟
6241
+ 蛤
6242
+ 蛭
6243
+ 蛯
6244
+ 蛸
6245
+ 蛹
6246
+ 蛺
6247
+ 蛻
6248
+ 蛾
6249
+ 蜀
6250
+ 蜂
6251
+ 蜃
6252
+ 蜆
6253
+ 蜇
6254
+ 蜈
6255
+ 蜉
6256
+ 蜊
6257
+ 蜍
6258
+ 蜑
6259
+ 蜒
6260
+ 蜓
6261
+ 蜘
6262
+ 蜚
6263
+ 蜛
6264
+ 蜜
6265
+ 蜞
6266
+ 蜢
6267
+ 蜣
6268
+ 蜥
6269
+ 蜨
6270
+ 蜮
6271
+ 蜯
6272
+ 蜱
6273
+ 蜴
6274
+ 蜷
6275
+ 蜻
6276
+ 蜾
6277
+ 蜿
6278
+ 蝀
6279
+ 蝌
6280
+ 蝍
6281
+ 蝎
6282
+ 蝓
6283
+ 蝕
6284
+ 蝗
6285
+ 蝘
6286
+ 蝙
6287
+ 蝚
6288
+ 蝟
6289
+ 蝠
6290
+ 蝣
6291
+ 蝤
6292
+ 蝦
6293
+ 蝨
6294
+ 蝮
6295
+ 蝯
6296
+ 蝰
6297
+ 蝲
6298
+ 蝴
6299
+ 蝶
6300
+ 蝸
6301
+ 蝽
6302
+ 螂
6303
+ 螃
6304
+ 螄
6305
+ 螅
6306
+ 螈
6307
+ 螋
6308
+ 融
6309
+ 螐
6310
+ 螔
6311
+ 螞
6312
+ 螟
6313
+ 螠
6314
+ 螢
6315
+ 螣
6316
+ 螥
6317
+ 螫
6318
+ 螭
6319
+ 螯
6320
+ 螳
6321
+ 螶
6322
+ 螺
6323
+ 螻
6324
+ 螽
6325
+ 螾
6326
+ 蟀
6327
+ 蟄
6328
+ 蟅
6329
+ 蟆
6330
+ 蟊
6331
+ 蟋
6332
+ 蟌
6333
+ 蟎
6334
+ 蟑
6335
+ 蟒
6336
+ 蟜
6337
+ 蟠
6338
+ 蟥
6339
+ 蟪
6340
+ 蟫
6341
+ 蟬
6342
+ 蟯
6343
+ 蟲
6344
+ 蟳
6345
+ 蟴
6346
+ 蟶
6347
+ 蟹
6348
+ 蟻
6349
+ 蟾
6350
+ 蠂
6351
+ 蠃
6352
+ 蠄
6353
+ 蠅
6354
+ 蠆
6355
+ 蠊
6356
+ 蠋
6357
+ 蠍
6358
+ 蠐
6359
+ 蠑
6360
+ 蠓
6361
+ 蠔
6362
+ 蠕
6363
+ 蠖
6364
+ 蠘
6365
+ 蠙
6366
+ 蠟
6367
+ 蠡
6368
+ 蠢
6369
+ 蠣
6370
+ 蠱
6371
+ 蠲
6372
+ 蠵
6373
+ 蠶
6374
+ 蠷
6375
+ 蠹
6376
+ 蠻
6377
+ 血
6378
+ 衂
6379
+ 衆
6380
+ 行
6381
+ 衍
6382
+ 衎
6383
+ 術
6384
+ 衕
6385
+ 衖
6386
+ 街
6387
+ 衙
6388
+ 衚
6389
+ 衛
6390
+ 衜
6391
+ 衝
6392
+ 衞
6393
+ 衡
6394
+ 衢
6395
+ 衣
6396
+ 表
6397
+ 衩
6398
+ 衫
6399
+ 衰
6400
+ 衲
6401
+ 衷
6402
+ 衽
6403
+ 衾
6404
+ 衿
6405
+ 袁
6406
+ 袂
6407
+ 袈
6408
+ 袋
6409
+ 袍
6410
+ 袓
6411
+ 袖
6412
+ 袛
6413
+ 袞
6414
+ 袤
6415
+ 袪
6416
+ 被
6417
+ 袱
6418
+ 袴
6419
+ 袾
6420
+ 裁
6421
+ 裂
6422
+ 裊
6423
+ 裎
6424
+ 裒
6425
+ 裔
6426
+ 裕
6427
+ 裖
6428
+ 裘
6429
+ 裙
6430
+ 補
6431
+ 裝
6432
+ 裟
6433
+ 裡
6434
+ 裨
6435
+ 裬
6436
+ 裱
6437
+ 裳
6438
+ 裴
6439
+ 裵
6440
+ 裸
6441
+ 裹
6442
+ 製
6443
+ 裾
6444
+ 裿
6445
+ 褀
6446
+ 褂
6447
+ 複
6448
+ 褌
6449
+ 褍
6450
+ 褎
6451
+ 褐
6452
+ 褒
6453
+ 褓
6454
+ 褔
6455
+ 褘
6456
+ 褙
6457
+ 褚
6458
+ 褞
6459
+ 褥
6460
+ 褧
6461
+ 褪
6462
+ 褫
6463
+ 褭
6464
+ 褲
6465
+ 褶
6466
+ 褸
6467
+ 褻
6468
+ 襄
6469
+ 襌
6470
+ 襖
6471
+ 襞
6472
+ 襟
6473
+ 襠
6474
+ 襤
6475
+ 襦
6476
+ 襪
6477
+ 襯
6478
+ 襲
6479
+ 襴
6480
+ 襶
6481
+ 襻
6482
+ 襾
6483
+ 西
6484
+ 要
6485
+ 覃
6486
+ 覆
6487
+ 覇
6488
+ 覈
6489
+ 見
6490
+ 覌
6491
+ 規
6492
+ 覓
6493
+ 視
6494
+ 覚
6495
+ 覡
6496
+ 覦
6497
+ 覧
6498
+ 親
6499
+ 覬
6500
+ 覲
6501
+ 観
6502
+ 覺
6503
+ 覽
6504
+ 覿
6505
+ 觀
6506
+ 角
6507
+ 觔
6508
+ 觙
6509
+ 觚
6510
+ 觜
6511
+ 解
6512
+ 觭
6513
+ 觱
6514
+ 觴
6515
+ 觶
6516
+ 觸
6517
+ 觿
6518
+ 言
6519
+ 訁
6520
+ 訂
6521
+ 訃
6522
+ 訇
6523
+ 計
6524
+ 訊
6525
+ 訌
6526
+ 討
6527
+ 訏
6528
+ 訐
6529
+ 訒
6530
+ 訓
6531
+ 訔
6532
+ 訕
6533
+ 訖
6534
+ 託
6535
+ 記
6536
+ 訛
6537
+ 訝
6538
+ 訟
6539
+ 訣
6540
+ 訥
6541
+ 訪
6542
+ 設
6543
+ 許
6544
+ 訴
6545
+ 訶
6546
+ 診
6547
+ 註
6548
+ 証
6549
+ 訾
6550
+ 詁
6551
+ 詆
6552
+ 詈
6553
+ 詐
6554
+ 詒
6555
+ 詔
6556
+ 評
6557
+ 詛
6558
+ 詞
6559
+ 詠
6560
+ 詡
6561
+ 詢
6562
+ 詣
6563
+ 詥
6564
+ 試
6565
+ 詧
6566
+ 詩
6567
+ 詫
6568
+ 詭
6569
+ 詮
6570
+ 詰
6571
+ 話
6572
+ 該
6573
+ 詳
6574
+ 詵
6575
+ 詹
6576
+ 詼
6577
+ 誄
6578
+ 誅
6579
+ 誇
6580
+ 誌
6581
+ 認
6582
+ 誒
6583
+ 誓
6584
+ 誕
6585
+ 誘
6586
+ 語
6587
+ 誠
6588
+ 誡
6589
+ 誣
6590
+ 誤
6591
+ 誥
6592
+ 誦
6593
+ 誨
6594
+ 說
6595
+ 説
6596
+ 読
6597
+ 誰
6598
+ 課
6599
+ 誴
6600
+ 誹
6601
+ 誼
6602
+ 誾
6603
+ 調
6604
+ 談
6605
+ 請
6606
+ 諍
6607
+ 諏
6608
+ 諒
6609
+ 論
6610
+ 諗
6611
+ 諜
6612
+ 諟
6613
+ 諠
6614
+ 諡
6615
+ 諤
6616
+ 諦
6617
+ 諧
6618
+ 諪
6619
+ 諫
6620
+ 諭
6621
+ 諮
6622
+ 諱
6623
+ 諲
6624
+ 諳
6625
+ 諴
6626
+ 諶
6627
+ 諷
6628
+ 諸
6629
+ 諺
6630
+ 諼
6631
+ 諾
6632
+ 謀
6633
+ 謁
6634
+ 謂
6635
+ 謄
6636
+ 謇
6637
+ 謊
6638
+ 謌
6639
+ 謎
6640
+ 謏
6641
+ 謐
6642
+ 謔
6643
+ 謖
6644
+ 謗
6645
+ 謙
6646
+ 謚
6647
+ 講
6648
+ 謜
6649
+ 謝
6650
+ 謠
6651
+ 謢
6652
+ 謤
6653
+ 謨
6654
+ 謩
6655
+ 謫
6656
+ 謬
6657
+ 謳
6658
+ 謹
6659
+ 謾
6660
+ 證
6661
+ 譏
6662
+ 譓
6663
+ 譔
6664
+ 識
6665
+ 譙
6666
+ 譚
6667
+ 譜
6668
+ 譞
6669
+ 警
6670
+ 譫
6671
+ 譬
6672
+ 譭
6673
+ 譯
6674
+ 議
6675
+ 譲
6676
+ 譳
6677
+ 譴
6678
+ 護
6679
+ 譽
6680
+ 譿
6681
+ 讀
6682
+ 讃
6683
+ 變
6684
+ 讌
6685
+ 讎
6686
+ 讓
6687
+ 讖
6688
+ 讙
6689
+ 讚
6690
+ 讜
6691
+ 讞
6692
+ 谷
6693
+ 谿
6694
+ 豁
6695
+ 豆
6696
+ 豇
6697
+ 豈
6698
+ 豉
6699
+ 豊
6700
+ 豌
6701
+ 豎
6702
+ 豐
6703
+ 豔
6704
+ 豕
6705
+ 豚
6706
+ 象
6707
+ 豢
6708
+ 豨
6709
+ 豪
6710
+ 豫
6711
+ 豬
6712
+ 豳
6713
+ 豸
6714
+ 豹
6715
+ 豺
6716
+ 豿
6717
+ 貂
6718
+ 貅
6719
+ 貉
6720
+ 貊
6721
+ 貌
6722
+ 貐
6723
+ 貒
6724
+ 貓
6725
+ 貔
6726
+ 貘
6727
+ 貝
6728
+ 貞
6729
+ 負
6730
+ 財
6731
+ 貢
6732
+ 貤
6733
+ 貧
6734
+ 貨
6735
+ 販
6736
+ 貪
6737
+ 貫
6738
+ 責
6739
+ 貭
6740
+ 貮
6741
+ 貯
6742
+ 貲
6743
+ 貳
6744
+ 貴
6745
+ 貶
6746
+ 買
6747
+ 貸
6748
+ 貺
6749
+ 費
6750
+ 貼
6751
+ 貽
6752
+ 貿
6753
+ 賀
6754
+ 賁
6755
+ 賂
6756
+ 賃
6757
+ 賄
6758
+ 資
6759
+ 賈
6760
+ 賊
6761
+ 賑
6762
+ 賒
6763
+ 賓
6764
+ 賔
6765
+ 賕
6766
+ 賚
6767
+ 賜
6768
+ 賞
6769
+ 賠
6770
+ 賡
6771
+ 賢
6772
+ 賣
6773
+ 賤
6774
+ 賦
6775
+ 賨
6776
+ 質
6777
+ 賬
6778
+ 賭
6779
+ 賴
6780
+ 賹
6781
+ 賺
6782
+ 賻
6783
+ 購
6784
+ 賽
6785
+ 賾
6786
+ 贄
6787
+ 贅
6788
+ 贇
6789
+ 贈
6790
+ 贊
6791
+ 贌
6792
+ 贍
6793
+ 贏
6794
+ 贓
6795
+ 贔
6796
+ 贖
6797
+ 贛
6798
+ 赤
6799
+ 赦
6800
+ 赧
6801
+ 赫
6802
+ 赬
6803
+ 赭
6804
+ 走
6805
+ 赳
6806
+ 赴
6807
+ 起
6808
+ 趁
6809
+ 超
6810
+ 越
6811
+ 趐
6812
+ 趕
6813
+ 趖
6814
+ 趙
6815
+ 趟
6816
+ 趣
6817
+ 趨
6818
+ 足
6819
+ 趴
6820
+ 趵
6821
+ 趺
6822
+ 趼
6823
+ 趾
6824
+ 跅
6825
+ 跆
6826
+ 跋
6827
+ 跌
6828
+ 跏
6829
+ 跑
6830
+ 跖
6831
+ 跗
6832
+ 跛
6833
+ 距
6834
+ 跟
6835
+ 跡
6836
+ 跣
6837
+ 跤
6838
+ 跨
6839
+ 跩
6840
+ 跪
6841
+ 路
6842
+ 跳
6843
+ 踎
6844
+ 踏
6845
+ 踐
6846
+ 踝
6847
+ 踞
6848
+ 踢
6849
+ 踩
6850
+ 踰
6851
+ 踴
6852
+ 踹
6853
+ 踺
6854
+ 蹂
6855
+ 蹄
6856
+ 蹇
6857
+ 蹈
6858
+ 蹉
6859
+ 蹊
6860
+ 蹋
6861
+ 蹕
6862
+ 蹙
6863
+ 蹟
6864
+ 蹠
6865
+ 蹤
6866
+ 蹦
6867
+ 蹬
6868
+ 蹭
6869
+ 蹯
6870
+ 蹲
6871
+ 蹴
6872
+ 蹶
6873
+ 蹺
6874
+ 蹻
6875
+ 蹼
6876
+ 躁
6877
+ 躂
6878
+ 躄
6879
+ 躉
6880
+ 躋
6881
+ 躍
6882
+ 躑
6883
+ 躒
6884
+ 躔
6885
+ 躝
6886
+ 躪
6887
+ 身
6888
+ 躬
6889
+ 躰
6890
+ 躲
6891
+ 躺
6892
+ 軀
6893
+ 車
6894
+ 軋
6895
+ 軌
6896
+ 軍
6897
+ 軎
6898
+ 軒
6899
+ 軔
6900
+ 軛
6901
+ 軟
6902
+ 転
6903
+ 軫
6904
+ 軲
6905
+ 軸
6906
+ 軹
6907
+ 軺
6908
+ 軻
6909
+ 軼
6910
+ 軽
6911
+ 軾
6912
+ 較
6913
+ 輄
6914
+ 輅
6915
+ 載
6916
+ 輋
6917
+ 輒
6918
+ 輓
6919
+ 輔
6920
+ 輕
6921
+ 輛
6922
+ 輝
6923
+ 輞
6924
+ 輟
6925
+ 輥
6926
+ 輦
6927
+ 輩
6928
+ 輪
6929
+ 輬
6930
+ 輭
6931
+ 輯
6932
+ 輶
6933
+ 輸
6934
+ 輻
6935
+ 輾
6936
+ 輿
6937
+ 轀
6938
+ 轂
6939
+ 轄
6940
+ 轅
6941
+ 轆
6942
+ 轉
6943
+ 轍
6944
+ 轎
6945
+ 轘
6946
+ 轝
6947
+ 轟
6948
+ 轤
6949
+ 辛
6950
+ 辜
6951
+ 辟
6952
+ 辣
6953
+ 辦
6954
+ 辧
6955
+ 辨
6956
+ 辭
6957
+ 辮
6958
+ 辯
6959
+ 辰
6960
+ 辱
6961
+ 農
6962
+ 辵
6963
+ 辺
6964
+ 辻
6965
+ 込
6966
+ 迂
6967
+ 迄
6968
+ 迅
6969
+ 迎
6970
+ 近
6971
+ 返
6972
+ 迢
6973
+ 迤
6974
+ 迥
6975
+ 迦
6976
+ 迪
6977
+ 迫
6978
+ 迭
6979
+ 迮
6980
+ 述
6981
+ 迴
6982
+ 迵
6983
+ 迷
6984
+ 迸
6985
+ 迺
6986
+ 追
6987
+ 退
6988
+ 送
6989
+ 逃
6990
+ 逄
6991
+ 逅
6992
+ 逆
6993
+ 逈
6994
+ 逋
6995
+ 逌
6996
+ 逍
6997
+ 逎
6998
+ 透
6999
+ 逐
7000
+ 逑
7001
+ 途
7002
+ 逕
7003
+ 逖
7004
+ 逗
7005
+ 這
7006
+ 通
7007
+ 逛
7008
+ 逝
7009
+ 逞
7010
+ 速
7011
+ 造
7012
+ 逢
7013
+ 連
7014
+ 逤
7015
+ 逨
7016
+ 逮
7017
+ 逯
7018
+ 進
7019
+ 逴
7020
+ 逵
7021
+ 逸
7022
+ 逹
7023
+ 逺
7024
+ 逼
7025
+ 逾
7026
+ 遁
7027
+ 遂
7028
+ 遄
7029
+ 遇
7030
+ 遊
7031
+ 運
7032
+ 遍
7033
+ 過
7034
+ 遏
7035
+ 遐
7036
+ 遒
7037
+ 道
7038
+ 達
7039
+ 違
7040
+ 遘
7041
+ 遙
7042
+ 遛
7043
+ 遜
7044
+ 遞
7045
+ 遠
7046
+ 遢
7047
+ 遣
7048
+ 遨
7049
+ 適
7050
+ 遭
7051
+ 遮
7052
+ 遯
7053
+ 遲
7054
+ 遴
7055
+ 遵
7056
+ 遶
7057
+ 遷
7058
+ 選
7059
+ 遹
7060
+ 遺
7061
+ 遼
7062
+ 避
7063
+ 邀
7064
+ 邁
7065
+ 邂
7066
+ 邃
7067
+ 還
7068
+ 邇
7069
+ 邈
7070
+ 邉
7071
+ 邊
7072
+ 邋
7073
+ 邏
7074
+ 邑
7075
+ 邕
7076
+ 邗
7077
+ 邙
7078
+ 邛
7079
+ 邠
7080
+ 邡
7081
+ 邢
7082
+ 那
7083
+ 邦
7084
+ 邨
7085
+ 邪
7086
+ 邯
7087
+ 邰
7088
+ 邱
7089
+ 邲
7090
+ 邳
7091
+ 邴
7092
+ 邵
7093
+ 邸
7094
+ 邽
7095
+ 邾
7096
+ 郁
7097
+ 郃
7098
+ 郄
7099
+ 郅
7100
+ 郇
7101
+ 郊
7102
+ 郋
7103
+ 郎
7104
+ 郗
7105
+ 郛
7106
+ 郜
7107
+ 郝
7108
+ 郞
7109
+ 郟
7110
+ 郡
7111
+ 郢
7112
+ 郤
7113
+ 部
7114
+ 郪
7115
+ 郫
7116
+ 郭
7117
+ 郯
7118
+ 郳
7119
+ 郴
7120
+ 郵
7121
+ 郷
7122
+ 都
7123
+ 郾
7124
+ 郿
7125
+ 鄂
7126
+ 鄃
7127
+ 鄄
7128
+ 鄆
7129
+ 鄉
7130
+ 鄋
7131
+ 鄑
7132
+ 鄒
7133
+ 鄔
7134
+ 鄖
7135
+ 鄗
7136
+ 鄘
7137
+ 鄙
7138
+ 鄚
7139
+ 鄜
7140
+ 鄞
7141
+ 鄠
7142
+ 鄢
7143
+ 鄣
7144
+ 鄤
7145
+ 鄧
7146
+ 鄩
7147
+ 鄫
7148
+ 鄭
7149
+ 鄯
7150
+ 鄰
7151
+ 鄱
7152
+ 鄲
7153
+ 鄳
7154
+ 鄴
7155
+ 鄺
7156
+ 酃
7157
+ 酆
7158
+ 酈
7159
+ 酉
7160
+ 酊
7161
+ 酋
7162
+ 酌
7163
+ 配
7164
+ 酎
7165
+ 酏
7166
+ 酐
7167
+ 酒
7168
+ 酔
7169
+ 酗
7170
+ 酚
7171
+ 酞
7172
+ 酡
7173
+ 酢
7174
+ 酣
7175
+ 酥
7176
+ 酩
7177
+ 酪
7178
+ 酬
7179
+ 酮
7180
+ 酯
7181
+ 酰
7182
+ 酴
7183
+ 酵
7184
+ 酶
7185
+ 酷
7186
+ 酸
7187
+ 酺
7188
+ 酼
7189
+ 醁
7190
+ 醂
7191
+ 醃
7192
+ 醅
7193
+ 醇
7194
+ 醉
7195
+ 醋
7196
+ 醌
7197
+ 醍
7198
+ 醐
7199
+ 醒
7200
+ 醚
7201
+ 醛
7202
+ 醜
7203
+ 醞
7204
+ 醢
7205
+ 醣
7206
+ 醪
7207
+ 醫
7208
+ 醬
7209
+ 醮
7210
+ 醯
7211
+ 醴
7212
+ 醺
7213
+ 醾
7214
+ 醿
7215
+ 釀
7216
+ 釁
7217
+ 釆
7218
+ 采
7219
+ 釉
7220
+ 釋
7221
+ 里
7222
+ 重
7223
+ 野
7224
+ 量
7225
+ 釐
7226
+ 金
7227
+ 釒
7228
+ 釓
7229
+ 釔
7230
+ 釕
7231
+ 釗
7232
+ 釘
7233
+ 釙
7234
+ 釚
7235
+ 釜
7236
+ 針
7237
+ 釣
7238
+ 釤
7239
+ 釦
7240
+ 釧
7241
+ 釩
7242
+ 釪
7243
+ 釭
7244
+ 釴
7245
+ 釵
7246
+ 釷
7247
+ 釹
7248
+ 釺
7249
+ 鈀
7250
+ 鈁
7251
+ 鈄
7252
+ 鈇
7253
+ 鈈
7254
+ 鈉
7255
+ 鈊
7256
+ 鈍
7257
+ 鈏
7258
+ 鈐
7259
+ 鈑
7260
+ 鈔
7261
+ 鈕
7262
+ 鈖
7263
+ 鈞
7264
+ 鈢
7265
+ 鈣
7266
+ 鈥
7267
+ 鈦
7268
+ 鈫
7269
+ 鈮
7270
+ 鈰
7271
+ 鈳
7272
+ 鈴
7273
+ 鈷
7274
+ 鈸
7275
+ 鈹
7276
+ 鈺
7277
+ 鈾
7278
+ 鈿
7279
+ 鉀
7280
+ 鉄
7281
+ 鉅
7282
+ 鉆
7283
+ 鉈
7284
+ 鉉
7285
+ 鉋
7286
+ 鉌
7287
+ 鉍
7288
+ 鉏
7289
+ 鉑
7290
+ 鉓
7291
+ 鉗
7292
+ 鉚
7293
+ 鉛
7294
+ 鉞
7295
+ 鉟
7296
+ 鉤
7297
+ 鉦
7298
+ 鉬
7299
+ 鉭
7300
+ 鉲
7301
+ 鉶
7302
+ 鉷
7303
+ 鉸
7304
+ 鉻
7305
+ 鉾
7306
+ 鉿
7307
+ 銀
7308
+ 銂
7309
+ 銃
7310
+ 銅
7311
+ 銋
7312
+ 銍
7313
+ 銑
7314
+ 銓
7315
+ 銕
7316
+ 銖
7317
+ 銘
7318
+ 銚
7319
+ 銜
7320
+ 銠
7321
+ 銣
7322
+ 銥
7323
+ 銦
7324
+ 銨
7325
+ 銩
7326
+ 銪
7327
+ 銫
7328
+ 銬
7329
+ 銭
7330
+ 銱
7331
+ 銲
7332
+ 銳
7333
+ 銶
7334
+ 銷
7335
+ 銹
7336
+ 銻
7337
+ 銼
7338
+ 銾
7339
+ 鋁
7340
+ 鋅
7341
+ 鋆
7342
+ 鋇
7343
+ 鋌
7344
+ 鋏
7345
+ 鋐
7346
+ 鋒
7347
+ 鋕
7348
+ 鋗
7349
+ 鋙
7350
+ 鋡
7351
+ 鋤
7352
+ 鋥
7353
+ 鋦
7354
+ 鋨
7355
+ 鋪
7356
+ 鋮
7357
+ 鋯
7358
+ 鋰
7359
+ 鋱
7360
+ 鋳
7361
+ 鋶
7362
+ 鋸
7363
+ 鋹
7364
+ 鋼
7365
+ 錀
7366
+ 錄
7367
+ 錏
7368
+ 錐
7369
+ 錒
7370
+ 錕
7371
+ 錘
7372
+ 錚
7373
+ 錞
7374
+ 錟
7375
+ 錠
7376
+ 錡
7377
+ 錢
7378
+ 錦
7379
+ 錨
7380
+ 錫
7381
+ 錬
7382
+ 錮
7383
+ 錯
7384
+ 錳
7385
+ 錶
7386
+ 錸
7387
+ 錻
7388
+ 鍀
7389
+ 鍇
7390
+ 鍈
7391
+ 鍉
7392
+ 鍊
7393
+ 鍋
7394
+ 鍍
7395
+ 鍏
7396
+ 鍔
7397
+ 鍘
7398
+ 鍛
7399
+ 鍝
7400
+ 鍟
7401
+ 鍠
7402
+ 鍥
7403
+ 鍩
7404
+ 鍬
7405
+ 鍱
7406
+ 鍳
7407
+ 鍵
7408
+ 鍶
7409
+ 鍷
7410
+ 鍺
7411
+ 鍼
7412
+ 鍾
7413
+ 鎂
7414
+ 鎅
7415
+ 鎊
7416
+ 鎌
7417
+ 鎏
7418
+ 鎓
7419
+ 鎔
7420
+ 鎖
7421
+ 鎗
7422
+ 鎘
7423
+ 鎚
7424
+ 鎛
7425
+ 鎢
7426
+ 鎣
7427
+ 鎦
7428
+ 鎧
7429
+ 鎪
7430
+ 鎬
7431
+ 鎭
7432
+ 鎮
7433
+ 鎰
7434
+ 鎳
7435
+ 鎵
7436
+ 鎻
7437
+ 鏃
7438
+ 鏇
7439
+ 鏈
7440
+ 鏊
7441
+ 鏌
7442
+ 鏐
7443
+ 鏑
7444
+ 鏓
7445
+ 鏖
7446
+ 鏗
7447
+ 鏘
7448
+ 鏜
7449
+ 鏝
7450
+ 鏞
7451
+ 鏟
7452
+ 鏡
7453
+ 鏢
7454
+ 鏤
7455
+ 鏦
7456
+ 鏳
7457
+ 鏴
7458
+ 鏵
7459
+ 鏷
7460
+ 鏻
7461
+ 鏽
7462
+ 鐃
7463
+ 鐇
7464
+ 鐈
7465
+ 鐓
7466
+ 鐔
7467
+ 鐘
7468
+ 鐙
7469
+ 鐠
7470
+ 鐡
7471
+ 鐤
7472
+ 鐦
7473
+ 鐧
7474
+ 鐫
7475
+ 鐬
7476
+ 鐭
7477
+ 鐮
7478
+ 鐲
7479
+ 鐳
7480
+ 鐵
7481
+ 鐸
7482
+ 鐺
7483
+ 鐽
7484
+ 鐿
7485
+ 鑀
7486
+ 鑁
7487
+ 鑂
7488
+ 鑄
7489
+ 鑅
7490
+ 鑊
7491
+ 鑌
7492
+ 鑑
7493
+ 鑒
7494
+ 鑛
7495
+ 鑠
7496
+ 鑣
7497
+ 鑨
7498
+ 鑪
7499
+ 鑫
7500
+ 鑭
7501
+ 鑰
7502
+ 鑲
7503
+ 鑴
7504
+ 鑷
7505
+ 鑼
7506
+ 鑽
7507
+ 鑾
7508
+ 鑿
7509
+ 長
7510
+ 門
7511
+ 閂
7512
+ 閃
7513
+ 閆
7514
+ 閉
7515
+ 開
7516
+ 閎
7517
+ 閏
7518
+ 閑
7519
+ 閒
7520
+ 間
7521
+ 閔
7522
+ 閘
7523
+ 閜
7524
+ 閞
7525
+ 閟
7526
+ 関
7527
+ 閣
7528
+ 閥
7529
+ 閦
7530
+ 閨
7531
+ 閩
7532
+ 閬
7533
+ 閭
7534
+ 閰
7535
+ 閱
7536
+ 閶
7537
+ 閹
7538
+ 閻
7539
+ 閼
7540
+ 閾
7541
+ 閿
7542
+ 闆
7543
+ 闇
7544
+ 闈
7545
+ 闊
7546
+ 闋
7547
+ 闌
7548
+ 闍
7549
+ 闐
7550
+ 闓
7551
+ 闔
7552
+ 闕
7553
+ 闖
7554
+ 闘
7555
+ 關
7556
+ 闞
7557
+ 闡
7558
+ 闢
7559
+ 闥
7560
+ 阜
7561
+ 阝
7562
+ 阡
7563
+ 阪
7564
+ 阭
7565
+ 阮
7566
+ 阯
7567
+ 阱
7568
+ 防
7569
+ 阻
7570
+ 阿
7571
+ 陀
7572
+ 陁
7573
+ 陂
7574
+ 附
7575
+ 陋
7576
+ 陌
7577
+ 降
7578
+ 限
7579
+ 陔
7580
+ 陘
7581
+ 陛
7582
+ 陜
7583
+ 陝
7584
+ 陞
7585
+ 陟
7586
+ 陡
7587
+ 院
7588
+ 陣
7589
+ 除
7590
+ 陪
7591
+ 陬
7592
+ 陰
7593
+ 陲
7594
+ 陳
7595
+ 陵
7596
+ 陶
7597
+ 陷
7598
+ 陸
7599
+ 険
7600
+ 陽
7601
+ 隄
7602
+ 隅
7603
+ 隆
7604
+ 隈
7605
+ 隊
7606
+ 隋
7607
+ 隍
7608
+ 階
7609
+ 隔
7610
+ 隕
7611
+ 隗
7612
+ 隘
7613
+ 隙
7614
+ 際
7615
+ 障
7616
+ 隣
7617
+ 隧
7618
+ 隨
7619
+ 險
7620
+ 隰
7621
+ 隱
7622
+ 隲
7623
+ 隳
7624
+ 隴
7625
+ 隷
7626
+ 隸
7627
+ 隹
7628
+ 隻
7629
+ 隼
7630
+ 雀
7631
+ 雁
7632
+ 雄
7633
+ 雅
7634
+ 集
7635
+ 雇
7636
+ 雉
7637
+ 雋
7638
+ 雌
7639
+ 雍
7640
+ 雎
7641
+ 雑
7642
+ 雒
7643
+ 雕
7644
+ 雖
7645
+ 雙
7646
+ 雛
7647
+ 雜
7648
+ 雝
7649
+ 雞
7650
+ 離
7651
+ 難
7652
+ 雨
7653
+ 雩
7654
+ 雪
7655
+ 雫
7656
+ 雯
7657
+ 雱
7658
+ 雲
7659
+ 零
7660
+ 雷
7661
+ 雹
7662
+ 電
7663
+ 需
7664
+ 霄
7665
+ 霅
7666
+ 霆
7667
+ 震
7668
+ 霈
7669
+ 霉
7670
+ 霊
7671
+ 霍
7672
+ 霎
7673
+ 霏
7674
+ 霑
7675
+ 霓
7676
+ 霖
7677
+ 霙
7678
+ 霜
7679
+ 霞
7680
+ 霤
7681
+ 霧
7682
+ 霨
7683
+ 霰
7684
+ 露
7685
+ 霶
7686
+ 霸
7687
+ 霹
7688
+ 霽
7689
+ 霾
7690
+ 靁
7691
+ 靂
7692
+ 靄
7693
+ 靈
7694
+ 靉
7695
+ 靑
7696
+ 青
7697
+ 靖
7698
+ 靚
7699
+ 靛
7700
+ 靜
7701
+ 非
7702
+ 靠
7703
+ 靡
7704
+ 面
7705
+ 革
7706
+ 靫
7707
+ 靬
7708
+ 靭
7709
+ 靳
7710
+ 靴
7711
+ 靶
7712
+ 靺
7713
+ 靼
7714
+ 鞅
7715
+ 鞆
7716
+ 鞋
7717
+ 鞍
7718
+ 鞏
7719
+ 鞘
7720
+ 鞞
7721
+ 鞠
7722
+ 鞣
7723
+ 鞥
7724
+ 鞦
7725
+ 鞨
7726
+ 鞭
7727
+ 鞮
7728
+ 鞴
7729
+ 韁
7730
+ 韃
7731
+ 韆
7732
+ 韋
7733
+ 韌
7734
+ 韑
7735
+ 韓
7736
+ 韙
7737
+ 韜
7738
+ 韞
7739
+ 韠
7740
+ 韡
7741
+ 韭
7742
+ 韮
7743
+ 音
7744
+ 韶
7745
+ 韺
7746
+ 韻
7747
+ 韾
7748
+ 響
7749
+ 頁
7750
+ 頂
7751
+ 頃
7752
+ 項
7753
+ 順
7754
+ 須
7755
+ 頊
7756
+ 頌
7757
+ 頍
7758
+ 頎
7759
+ 頏
7760
+ 預
7761
+ 頑
7762
+ 頒
7763
+ 頓
7764
+ 頔
7765
+ 頗
7766
+ 領
7767
+ 頜
7768
+ 頠
7769
+ 頡
7770
+ 頤
7771
+ 頦
7772
+ 頫
7773
+ 頭
7774
+ 頰
7775
+ 頴
7776
+ 頵
7777
+ 頷
7778
+ 頸
7779
+ 頹
7780
+ 頻
7781
+ 頼
7782
+ 顆
7783
+ 題
7784
+ 額
7785
+ 顎
7786
+ 顏
7787
+ 顒
7788
+ 顓
7789
+ 顔
7790
+ 顕
7791
+ 顗
7792
+ 願
7793
+ 顙
7794
+ 顛
7795
+ 類
7796
+ 顥
7797
+ 顧
7798
+ 顫
7799
+ 顯
7800
+ 顰
7801
+ 顱
7802
+ 顳
7803
+ 顴
7804
+ 風
7805
+ 颮
7806
+ 颯
7807
+ 颱
7808
+ 颶
7809
+ 颺
7810
+ 颼
7811
+ 飄
7812
+ 飆
7813
+ 飈
7814
+ 飛
7815
+ 食
7816
+ 飠
7817
+ 飡
7818
+ 飢
7819
+ 飥
7820
+ 飩
7821
+ 飪
7822
+ 飫
7823
+ 飬
7824
+ 飭
7825
+ 飮
7826
+ 飯
7827
+ 飲
7828
+ 飴
7829
+ 飼
7830
+ 飽
7831
+ 飾
7832
+ 餃
7833
+ 餄
7834
+ 餅
7835
+ 餉
7836
+ 養
7837
+ 餌
7838
+ 餎
7839
+ 餐
7840
+ 餒
7841
+ 餓
7842
+ 餗
7843
+ 餘
7844
+ 餚
7845
+ 餛
7846
+ 餞
7847
+ 餠
7848
+ 餡
7849
+ 館
7850
+ 餮
7851
+ 餵
7852
+ 餺
7853
+ 餾
7854
+ 餿
7855
+ 饃
7856
+ 饅
7857
+ 饋
7858
+ 饌
7859
+ 饑
7860
+ 饒
7861
+ 饕
7862
+ 饗
7863
+ 饞
7864
+ 饟
7865
+ 饢
7866
+ 首
7867
+ 馗
7868
+ 馘
7869
+ 香
7870
+ 馛
7871
+ 馥
7872
+ 馦
7873
+ 馨
7874
+ 馬
7875
+ 馭
7876
+ 馮
7877
+ 馯
7878
+ 馱
7879
+ 馳
7880
+ 馴
7881
+ 馼
7882
+ 駁
7883
+ 駄
7884
+ 駅
7885
+ 駆
7886
+ 駐
7887
+ 駑
7888
+ 駒
7889
+ 駔
7890
+ 駕
7891
+ 駘
7892
+ 駙
7893
+ 駛
7894
+ 駝
7895
+ 駟
7896
+ 駢
7897
+ 駭
7898
+ 駰
7899
+ 駱
7900
+ 駿
7901
+ 騁
7902
+ 騂
7903
+ 騄
7904
+ 騅
7905
+ 騋
7906
+ 騎
7907
+ 騏
7908
+ 験
7909
+ 騖
7910
+ 騙
7911
+ 騤
7912
+ 騨
7913
+ 騫
7914
+ 騭
7915
+ 騮
7916
+ 騰
7917
+ 騶
7918
+ 騷
7919
+ 騾
7920
+ 驁
7921
+ 驃
7922
+ 驄
7923
+ 驅
7924
+ 驊
7925
+ 驌
7926
+ 驍
7927
+ 驎
7928
+ 驒
7929
+ 驕
7930
+ 驗
7931
+ 驚
7932
+ 驛
7933
+ 驟
7934
+ 驢
7935
+ 驤
7936
+ 驥
7937
+ 驩
7938
+ 驪
7939
+ 骨
7940
+ 骯
7941
+ 骰
7942
+ 骶
7943
+ 骷
7944
+ 骸
7945
+ 骼
7946
+ 髀
7947
+ 髂
7948
+ 髎
7949
+ 髏
7950
+ 髑
7951
+ 髒
7952
+ 髓
7953
+ 體
7954
+ 高
7955
+ 髙
7956
+ 髡
7957
+ 髦
7958
+ 髪
7959
+ 髭
7960
+ 髮
7961
+ 髯
7962
+ 髲
7963
+ 髷
7964
+ 髹
7965
+ 髻
7966
+ 鬃
7967
+ 鬄
7968
+ 鬅
7969
+ 鬆
7970
+ 鬍
7971
+ 鬚
7972
+ 鬟
7973
+ 鬢
7974
+ 鬣
7975
+ 鬥
7976
+ 鬧
7977
+ 鬨
7978
+ 鬩
7979
+ 鬪
7980
+ 鬬
7981
+ 鬮
7982
+ 鬯
7983
+ 鬱
7984
+ 鬲
7985
+ 鬹
7986
+ 鬻
7987
+ 鬼
7988
+ 魁
7989
+ 魂
7990
+ 魃
7991
+ 魄
7992
+ 魅
7993
+ 魈
7994
+ 魋
7995
+ 魍
7996
+ 魎
7997
+ 魏
7998
+ 魔
7999
+ 魕
8000
+ 魘
8001
+ 魚
8002
+ 魛
8003
+ 魞
8004
+ 魟
8005
+ 魣
8006
+ 魨
8007
+ 魩
8008
+ 魮
8009
+ 魯
8010
+ 魴
8011
+ 魷
8012
+ 鮀
8013
+ 鮁
8014
+ 鮃
8015
+ 鮄
8016
+ 鮊
8017
+ 鮋
8018
+ 鮍
8019
+ 鮐
8020
+ 鮑
8021
+ 鮒
8022
+ 鮓
8023
+ 鮗
8024
+ 鮜
8025
+ 鮟
8026
+ 鮠
8027
+ 鮡
8028
+ 鮣
8029
+ 鮨
8030
+ 鮪
8031
+ 鮫
8032
+ 鮭
8033
+ 鮮
8034
+ 鮰
8035
+ 鮸
8036
+ 鮹
8037
+ 鮻
8038
+ 鯀
8039
+ 鯁
8040
+ 鯃
8041
+ 鯇
8042
+ 鯉
8043
+ 鯊
8044
+ 鯏
8045
+ 鯒
8046
+ 鯓
8047
+ 鯔
8048
+ 鯕
8049
+ 鯖
8050
+ 鯗
8051
+ 鯙
8052
+ 鯛
8053
+ 鯡
8054
+ 鯢
8055
+ 鯤
8056
+ 鯧
8057
+ 鯨
8058
+ 鯪
8059
+ 鯭
8060
+ 鯮
8061
+ 鯰
8062
+ 鯶
8063
+ 鯷
8064
+ 鯻
8065
+ 鯽
8066
+ 鯿
8067
+ 鰂
8068
+ 鰃
8069
+ 鰆
8070
+ 鰈
8071
+ 鰉
8072
+ 鰍
8073
+ 鰏
8074
+ 鰒
8075
+ 鰓
8076
+ 鰕
8077
+ 鰗
8078
+ 鰛
8079
+ 鰜
8080
+ 鰟
8081
+ 鰣
8082
+ 鰤
8083
+ 鰧
8084
+ 鰨
8085
+ 鰩
8086
+ 鰭
8087
+ 鰮
8088
+ 鰱
8089
+ 鰲
8090
+ 鰳
8091
+ 鰶
8092
+ 鰷
8093
+ 鰹
8094
+ 鰺
8095
+ 鰻
8096
+ 鰼
8097
+ 鰾
8098
+ 鱀
8099
+ 鱂
8100
+ 鱅
8101
+ 鱇
8102
+ 鱈
8103
+ 鱉
8104
+ 鱊
8105
+ 鱒
8106
+ 鱓
8107
+ 鱔
8108
+ 鱖
8109
+ 鱗
8110
+ 鱘
8111
+ 鱚
8112
+ 鱝
8113
+ 鱟
8114
+ 鱠
8115
+ 鱣
8116
+ 鱥
8117
+ 鱧
8118
+ 鱨
8119
+ 鱬
8120
+ 鱮
8121
+ 鱰
8122
+ 鱲
8123
+ 鱵
8124
+ 鱷
8125
+ 鱸
8126
+ 鱺
8127
+ 鱻
8128
+ 鳥
8129
+ 鳧
8130
+ 鳩
8131
+ 鳯
8132
+ 鳰
8133
+ 鳳
8134
+ 鳴
8135
+ 鳶
8136
+ 鳽
8137
+ 鴆
8138
+ 鴇
8139
+ 鴉
8140
+ 鴒
8141
+ 鴓
8142
+ 鴕
8143
+ 鴗
8144
+ 鴛
8145
+ 鴝
8146
+ 鴞
8147
+ 鴟
8148
+ 鴡
8149
+ 鴣
8150
+ 鴦
8151
+ 鴨
8152
+ 鴫
8153
+ 鴯
8154
+ 鴰
8155
+ 鴴
8156
+ 鴻
8157
+ 鴿
8158
+ 鵂
8159
+ 鵄
8160
+ 鵎
8161
+ 鵐
8162
+ 鵑
8163
+ 鵒
8164
+ 鵓
8165
+ 鵙
8166
+ 鵜
8167
+ 鵝
8168
+ 鵞
8169
+ 鵟
8170
+ 鵠
8171
+ 鵡
8172
+ 鵪
8173
+ 鵬
8174
+ 鵯
8175
+ 鵰
8176
+ 鵲
8177
+ 鵵
8178
+ 鵼
8179
+ 鵾
8180
+ 鶆
8181
+ 鶇
8182
+ 鶉
8183
+ 鶏
8184
+ 鶒
8185
+ 鶓
8186
+ 鶘
8187
+ 鶚
8188
+ 鶡
8189
+ 鶥
8190
+ 鶩
8191
+ 鶬
8192
+ 鶯
8193
+ 鶲
8194
+ 鶴
8195
+ 鶹
8196
+ 鶺
8197
+ 鶻
8198
+ 鶼
8199
+ 鶿
8200
+ 鷂
8201
+ 鷄
8202
+ 鷉
8203
+ 鷎
8204
+ 鷓
8205
+ 鷗
8206
+ 鷙
8207
+ 鷚
8208
+ 鷟
8209
+ 鷥
8210
+ 鷦
8211
+ 鷫
8212
+ 鷯
8213
+ 鷲
8214
+ 鷳
8215
+ 鷸
8216
+ 鷹
8217
+ 鷺
8218
+ 鸊
8219
+ 鸌
8220
+ 鸐
8221
+ 鸑
8222
+ 鸕
8223
+ 鸘
8224
+ 鸚
8225
+ 鸛
8226
+ 鸜
8227
+ 鸝
8228
+ 鸞
8229
+ 鹮
8230
+ 鹵
8231
+ 鹹
8232
+ 鹼
8233
+ 鹽
8234
+ 鹿
8235
+ 麂
8236
+ 麅
8237
+ 麇
8238
+ 麈
8239
+ 麊
8240
+ 麋
8241
+ 麐
8242
+ 麒
8243
+ 麓
8244
+ 麗
8245
+ 麝
8246
+ 麞
8247
+ 麟
8248
+ 麥
8249
+ 麩
8250
+ 麪
8251
+ 麯
8252
+ 麴
8253
+ 麵
8254
+ 麹
8255
+ 麺
8256
+ 麻
8257
+ 麼
8258
+ 麽
8259
+ 麾
8260
+ 麿
8261
+ 黁
8262
+ 黃
8263
+ 黇
8264
+ 黌
8265
+ 黍
8266
+ 黎
8267
+ 黏
8268
+ 黐
8269
+ 黑
8270
+ 黒
8271
+ 黔
8272
+ 默
8273
+ 黙
8274
+ 黛
8275
+ 黜
8276
+ 黝
8277
+ 點
8278
+ 黟
8279
+ 黥
8280
+ 黧
8281
+ 黨
8282
+ 黯
8283
+ 黴
8284
+ 黶
8285
+ 黻
8286
+ 黼
8287
+ 黽
8288
+ 黿
8289
+ 鼂
8290
+ 鼇
8291
+ 鼈
8292
+ 鼉
8293
+ 鼎
8294
+ 鼐
8295
+ 鼒
8296
+ 鼓
8297
+ 鼕
8298
+ 鼙
8299
+ 鼠
8300
+ 鼢
8301
+ 鼩
8302
+ 鼬
8303
+ 鼯
8304
+ 鼱
8305
+ 鼴
8306
+ 鼷
8307
+ 鼻
8308
+ 鼽
8309
+ 鼾
8310
+ 齊
8311
+ 齋
8312
+ 齒
8313
+ 齕
8314
+ 齡
8315
+ 齣
8316
+ 齦
8317
+ 齧
8318
+ 齲
8319
+ 齶
8320
+ 龍
8321
+ 龎
8322
+ 龐
8323
+ 龑
8324
+ 龔
8325
+ 龕
8326
+ 龜
8327
+ 龝
8328
+ 龠
8329
+ 龢
8330
+ 郎
8331
+ 凉
8332
+ ﹑
8333
+ ﹗
8334
+ ﹝
8335
+ ﹞
8336
+ ﹢
8337
+ !
8338
+ "
8339
+ #
8340
+ $
8341
+ %
8342
+ &
8343
+ '
8344
+ (
8345
+ )
8346
+ *
8347
+ +
8348
+ ,
8349
+ -
8350
+ .
8351
+ /
8352
+ 0
8353
+ 1
8354
+ 2
8355
+ 3
8356
+ 4
8357
+ 5
8358
+ 6
8359
+ 7
8360
+ 8
8361
+ 9
8362
+ :
8363
+ ;
8364
+ <
8365
+ =
8366
+ >
8367
+ ?
8368
+ A
8369
+ B
8370
+ C
8371
+ D
8372
+ E
8373
+ F
8374
+ G
8375
+ H
8376
+ I
8377
+ K
8378
+ L
8379
+ M
8380
+ N
8381
+ O
8382
+ P
8383
+ R
8384
+ S
8385
+ T
8386
+ U
8387
+ V
8388
+ W
8389
+ Y
8390
+ Z
8391
+ [
8392
+ ]
8393
+ `
8394
+ a
8395
+ b
8396
+ c
8397
+ d
8398
+ e
8399
+ f
8400
+ g
8401
+ h
8402
+ i
8403
+ j
8404
+ k
8405
+ l
8406
+ m
8407
+ n
8408
+ o
8409
+ p
8410
+ r
8411
+ s
8412
+ t
8413
+ u
8414
+ z
8415
+ {
8416
+ |
8417
+ }
8418
+ ~
8419
+ ¥
8420
+ 𣇉
8421
+
ocr-studio/PaddleOCR/ppocr/utils/dict/confuse.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:57d8aa98a781330f7534a81263179e77c159a37050bd31fe09d8ddf1880c5628
3
+ size 30912
ocr-studio/PaddleOCR/ppocr/utils/dict/cyrillic_dict.txt ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ !
3
+ #
4
+ $
5
+ %
6
+ &
7
+ '
8
+ (
9
+ +
10
+ ,
11
+ -
12
+ .
13
+ /
14
+ 0
15
+ 1
16
+ 2
17
+ 3
18
+ 4
19
+ 5
20
+ 6
21
+ 7
22
+ 8
23
+ 9
24
+ :
25
+ ?
26
+ @
27
+ A
28
+ B
29
+ C
30
+ D
31
+ E
32
+ F
33
+ G
34
+ H
35
+ I
36
+ J
37
+ K
38
+ L
39
+ M
40
+ N
41
+ O
42
+ P
43
+ Q
44
+ R
45
+ S
46
+ T
47
+ U
48
+ V
49
+ W
50
+ X
51
+ Y
52
+ Z
53
+ _
54
+ a
55
+ b
56
+ c
57
+ d
58
+ e
59
+ f
60
+ g
61
+ h
62
+ i
63
+ j
64
+ k
65
+ l
66
+ m
67
+ n
68
+ o
69
+ p
70
+ q
71
+ r
72
+ s
73
+ t
74
+ u
75
+ v
76
+ w
77
+ x
78
+ y
79
+ z
80
+ É
81
+ é
82
+ Ё
83
+ Є
84
+ І
85
+ Ј
86
+ Љ
87
+ Ў
88
+ А
89
+ Б
90
+ В
91
+ Г
92
+ Д
93
+ Е
94
+ Ж
95
+ З
96
+ И
97
+ Й
98
+ К
99
+ Л
100
+ М
101
+ Н
102
+ О
103
+ П
104
+ Р
105
+ С
106
+ Т
107
+ У
108
+ Ф
109
+ Х
110
+ Ц
111
+ Ч
112
+ Ш
113
+ Щ
114
+ Ъ
115
+ Ы
116
+ Ь
117
+ Э
118
+ Ю
119
+ Я
120
+ а
121
+ б
122
+ в
123
+ г
124
+ д
125
+ е
126
+ ж
127
+ з
128
+ и
129
+ й
130
+ к
131
+ л
132
+ м
133
+ н
134
+ о
135
+ п
136
+ р
137
+ с
138
+ т
139
+ у
140
+ ф
141
+ х
142
+ ц
143
+ ч
144
+ ш
145
+ щ
146
+ ъ
147
+ ы
148
+ ь
149
+ э
150
+ ю
151
+ я
152
+ ё
153
+ ђ
154
+ є
155
+ і
156
+ ј
157
+ љ
158
+ њ
159
+ ћ
160
+ ў
161
+ џ
162
+ Ґ
163
+ ґ
ocr-studio/PaddleOCR/ppocr/utils/dict/devanagari_dict.txt ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ !
3
+ #
4
+ $
5
+ %
6
+ &
7
+ '
8
+ (
9
+ +
10
+ ,
11
+ -
12
+ .
13
+ /
14
+ 0
15
+ 1
16
+ 2
17
+ 3
18
+ 4
19
+ 5
20
+ 6
21
+ 7
22
+ 8
23
+ 9
24
+ :
25
+ ?
26
+ @
27
+ A
28
+ B
29
+ C
30
+ D
31
+ E
32
+ F
33
+ G
34
+ H
35
+ I
36
+ J
37
+ K
38
+ L
39
+ M
40
+ N
41
+ O
42
+ P
43
+ Q
44
+ R
45
+ S
46
+ T
47
+ U
48
+ V
49
+ W
50
+ X
51
+ Y
52
+ Z
53
+ _
54
+ a
55
+ b
56
+ c
57
+ d
58
+ e
59
+ f
60
+ g
61
+ h
62
+ i
63
+ j
64
+ k
65
+ l
66
+ m
67
+ n
68
+ o
69
+ p
70
+ q
71
+ r
72
+ s
73
+ t
74
+ u
75
+ v
76
+ w
77
+ x
78
+ y
79
+ z
80
+ É
81
+ é
82
+ ँ
83
+ ं
84
+ ः
85
+ अ
86
+ आ
87
+ इ
88
+ ई
89
+ उ
90
+ ऊ
91
+ ऋ
92
+ ए
93
+ ऐ
94
+ ऑ
95
+ ओ
96
+ औ
97
+ क
98
+ ख
99
+ ग
100
+ घ
101
+ ङ
102
+ च
103
+ छ
104
+ ज
105
+ झ
106
+ ञ
107
+ ट
108
+ ठ
109
+ ड
110
+ ढ
111
+ ण
112
+ त
113
+ थ
114
+ द
115
+ ध
116
+ न
117
+ ऩ
118
+ प
119
+ फ
120
+ ब
121
+ भ
122
+ म
123
+ य
124
+ र
125
+ ऱ
126
+ ल
127
+ ळ
128
+ व
129
+ श
130
+ ष
131
+ स
132
+ ह
133
+ ़
134
+ ा
135
+ ि
136
+ ी
137
+ ु
138
+ ू
139
+ ृ
140
+ ॅ
141
+ े
142
+ ै
143
+ ॉ
144
+ ो
145
+ ौ
146
+ ्
147
+ ॒
148
+ क़
149
+ ख़
150
+ ग़
151
+ ज़
152
+ ड़
153
+ ढ़
154
+ फ़
155
+ ॠ
156
+ ।
157
+ ०
158
+ १
159
+ २
160
+ ३
161
+ ४
162
+ ५
163
+ ६
164
+ ७
165
+ ८
166
+ ९
167
+ ॰
ocr-studio/PaddleOCR/ppocr/utils/dict/en_dict.txt ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
ocr-studio/PaddleOCR/ppocr/utils/dict/fa_dict.txt ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ f
2
+ a
3
+ _
4
+ i
5
+ m
6
+ g
7
+ /
8
+ 1
9
+ 3
10
+ I
11
+ L
12
+ S
13
+ V
14
+ R
15
+ C
16
+ 2
17
+ 0
18
+ v
19
+ l
20
+ 6
21
+ 8
22
+ 5
23
+ .
24
+ j
25
+ p
26
+ و
27
+ د
28
+ ر
29
+ ك
30
+ ن
31
+ ش
32
+ ه
33
+ ا
34
+ 4
35
+ 9
36
+ ی
37
+ ج
38
+ ِ
39
+ 7
40
+ غ
41
+ ل
42
+ س
43
+ ز
44
+ ّ
45
+ ت
46
+ ک
47
+ گ
48
+ ي
49
+ م
50
+ ب
51
+ ف
52
+ چ
53
+ خ
54
+ ق
55
+ ژ
56
+ آ
57
+ ص
58
+ پ
59
+ َ
60
+ ع
61
+ ئ
62
+ ح
63
+ ٔ
64
+ ض
65
+ ُ
66
+ ذ
67
+ أ
68
+ ى
69
+ ط
70
+ ظ
71
+ ث
72
+ ة
73
+ ً
74
+ ء
75
+ ؤ
76
+ ْ
77
+ ۀ
78
+ إ
79
+ ٍ
80
+ ٌ
81
+ ٰ
82
+ ٓ
83
+ ٱ
84
+ s
85
+ c
86
+ e
87
+ n
88
+ w
89
+ N
90
+ E
91
+ W
92
+ Y
93
+ D
94
+ O
95
+ H
96
+ A
97
+ d
98
+ z
99
+ r
100
+ T
101
+ G
102
+ o
103
+ t
104
+ x
105
+ h
106
+ b
107
+ B
108
+ M
109
+ Z
110
+ u
111
+ P
112
+ F
113
+ y
114
+ q
115
+ U
116
+ K
117
+ k
118
+ J
119
+ Q
120
+ '
121
+ X
122
+ #
123
+ ?
124
+ %
125
+ $
126
+ ,
127
+ :
128
+ &
129
+ !
130
+ -
131
+ (
132
+ É
133
+ @
134
+ é
135
+ +
136
+
ocr-studio/PaddleOCR/ppocr/utils/dict/fi_dict.txt ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ !
2
+ #
3
+ $
4
+ %
5
+ &
6
+ '
7
+ (
8
+ +
9
+ ,
10
+ -
11
+ .
12
+ /
13
+ 0
14
+ 1
15
+ 2
16
+ 3
17
+ 4
18
+ 5
19
+ 6
20
+ 7
21
+ 8
22
+ 9
23
+ a
24
+ b
25
+ c
26
+ d
27
+ e
28
+ f
29
+ g
30
+ h
31
+ i
32
+ j
33
+ k
34
+ l
35
+ m
36
+ n
37
+ o
38
+ p
39
+ q
40
+ r
41
+ s
42
+ t
43
+ u
44
+ v
45
+ w
46
+ x
47
+ y
48
+ z
49
+ å
50
+ ä
51
+ ö
52
+ A
53
+ B
54
+ C
55
+ D
56
+ E
57
+ F
58
+ G
59
+ H
60
+ I
61
+ J
62
+ K
63
+ L
64
+ M
65
+ N
66
+ O
67
+ P
68
+ Q
69
+ R
70
+ S
71
+ T
72
+ U
73
+ V
74
+ W
75
+ X
76
+ Y
77
+ Z
78
+ Å
79
+ Ä
80
+ Ö
ocr-studio/PaddleOCR/ppocr/utils/dict/french_dict.txt ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ f
2
+ e
3
+ n
4
+ c
5
+ h
6
+ _
7
+ i
8
+ m
9
+ g
10
+ /
11
+ r
12
+ v
13
+ a
14
+ l
15
+ t
16
+ w
17
+ o
18
+ d
19
+ 6
20
+ 1
21
+ .
22
+ p
23
+ B
24
+ u
25
+ 2
26
+ à
27
+ 3
28
+ R
29
+ y
30
+ 4
31
+ U
32
+ E
33
+ A
34
+ 5
35
+ P
36
+ O
37
+ S
38
+ T
39
+ D
40
+ 7
41
+ Z
42
+ 8
43
+ I
44
+ N
45
+ L
46
+ G
47
+ M
48
+ H
49
+ 0
50
+ J
51
+ K
52
+ -
53
+ 9
54
+ F
55
+ C
56
+ V
57
+ é
58
+ X
59
+ '
60
+ s
61
+ Q
62
+ :
63
+ è
64
+ x
65
+ b
66
+ Y
67
+ Œ
68
+ É
69
+ z
70
+ W
71
+ Ç
72
+ È
73
+ k
74
+ Ô
75
+ ô
76
+ €
77
+ À
78
+ Ê
79
+ q
80
+ ù
81
+ °
82
+ ê
83
+ î
84
+ *
85
+ Â
86
+ j
87
+ "
88
+ ,
89
+ â
90
+ %
91
+ û
92
+ ç
93
+ ü
94
+ ?
95
+ !
96
+ ;
97
+ ö
98
+ (
99
+ )
100
+ ï
101
+ º
102
+ ó
103
+ ø
104
+ å
105
+ +
106
+ ™
107
+ á
108
+ Ë
109
+ <
110
+ ²
111
+ Á
112
+ Î
113
+ &
114
+ @
115
+ œ
116
+ ε
117
+ Ü
118
+ ë
119
+ [
120
+ ]
121
+ í
122
+ ò
123
+ Ö
124
+ ä
125
+ ß
126
+ «
127
+ »
128
+ ú
129
+ ñ
130
+ æ
131
+ µ
132
+ ³
133
+ Å
134
+ $
135
+ #
136
+
ocr-studio/PaddleOCR/ppocr/utils/dict/german_dict.txt ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ !
3
+ "
4
+ #
5
+ $
6
+ %
7
+ &
8
+ '
9
+ (
10
+ )
11
+ *
12
+ +
13
+ ,
14
+ -
15
+ .
16
+ /
17
+ 0
18
+ 1
19
+ 2
20
+ 3
21
+ 4
22
+ 5
23
+ 6
24
+ 7
25
+ 8
26
+ 9
27
+ :
28
+ ;
29
+ =
30
+ >
31
+ ?
32
+ @
33
+ A
34
+ B
35
+ C
36
+ D
37
+ E
38
+ F
39
+ G
40
+ H
41
+ I
42
+ J
43
+ K
44
+ L
45
+ M
46
+ N
47
+ O
48
+ P
49
+ Q
50
+ R
51
+ S
52
+ T
53
+ U
54
+ V
55
+ W
56
+ X
57
+ Y
58
+ Z
59
+ [
60
+ ]
61
+ _
62
+ a
63
+ b
64
+ c
65
+ d
66
+ e
67
+ f
68
+ g
69
+ h
70
+ i
71
+ j
72
+ k
73
+ l
74
+ m
75
+ n
76
+ o
77
+ p
78
+ q
79
+ r
80
+ s
81
+ t
82
+ u
83
+ v
84
+ w
85
+ x
86
+ y
87
+ z
88
+ £
89
+ §
90
+ ­
91
+ °
92
+ ´
93
+ µ
94
+ ·
95
+ º
96
+ ¿
97
+ Á
98
+ Ä
99
+ Å
100
+ É
101
+ Ï
102
+ Ô
103
+ Ö
104
+ Ü
105
+ ß
106
+ à
107
+ á
108
+ â
109
+ ã
110
+ ä
111
+ å
112
+ æ
113
+ ç
114
+ è
115
+ é
116
+ ê
117
+ ë
118
+ í
119
+ ï
120
+ ñ
121
+ ò
122
+ ó
123
+ ô
124
+ ö
125
+ ø
126
+ ù
127
+ ú
128
+ û
129
+ ü
130
+ ō
131
+ Š
132
+ Ÿ
133
+ ʒ
134
+ β
135
+ δ
136
+ з
137
+ Ṡ
138
+ ‘
139
+ €
140
+ ©
141
+ ª
142
+ «
143
+ ¬
ocr-studio/PaddleOCR/ppocr/utils/dict/gujarati_dict.txt ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ અ
2
+ આ
3
+ ઇ
4
+ ઈ
5
+ ઉ
6
+ ઊ
7
+ ઋ
8
+ ઌ
9
+ એ
10
+ ઐ
11
+ ઓ
12
+ ઔ
13
+ અં
14
+ અઃ
15
+ ક
16
+ ખ
17
+ ગ
18
+ ઘ
19
+ ઙ
20
+ ચ
21
+ છ
22
+ જ
23
+ ઝ
24
+ ઞ
25
+ ટ
26
+ ઠ
27
+ ડ
28
+ ઢ
29
+ ણ
30
+ ત
31
+ થ
32
+ દ
33
+ ધ
34
+ ન
35
+ પ
36
+ ફ
37
+ બ
38
+ ભ
39
+ મ
40
+ ય
41
+ ર
42
+ લ
43
+ ળ
44
+ વ
45
+ શ
46
+ ષ
47
+ સ
48
+ હ